之前在网上找到有人分享的已经编译好的support4Demo的apk,其实就是google的sdk中所提供的support包的几个demo。所以就想着顺便把其他几个也一并导入到Android Studio中,方便查看源码学习。
首先来看一下几个Demo的目录结构
其实很简单,就是src源码和res资源两个文件夹,再加上一个AndroidManifest.xml清单文件。
###Support4Demo
我们先来导入v4 Demo包。在一个新的Project中,File->New->Import Module.将v4 Demo的源码导入。一路Next之后,Gradle就开始编译了。这时候我们会碰到第一个错误。
failed to find Build Tools revision 19.1.0
这里可以看到,错误的原因是无法找到19.1.0版本的Gradle。因为我当前使用的Gradle版本是最新的23.0.2,所以只需要将文件修改一下就可以了。在support4Demos包下的build.gradle中,修改代码:
buildToolsVersion "23.0.2"
修改之后继续编译,这时会遇到第二个问题。
错误:程序包android.support.v4.view不存在
错误信息显示,android.support.v4下的某个包不存在。这个应用是support4Demos,当然是基于v4包来展示新功能(控件)的Demo。而我们当前并没有给引用添加库,自然会报错了。
dependencies {
compile 'com.android.support:support-v4:23.1.1'
}
在build.gradle中太添加应用库,再次编译。
bingo!这次终于编译成功,可以在手机上跑起来了。
###Support7Demos
我们继续来导入v7Demo。Import Module后同样会碰到Gradle版本的错误,有了之前的经验,我们可以很轻易的解决这个问题了。
因为这次是v7包的Demo,所以我们先将appcompat-v7包添加到引用中
dependencies {
compile 'com.android.support:appcompat-v7:23.1.1'
}
按照之前的步骤,到这里我们的应用就已经可以运行了。等等,怎么又报错了?
Error retrieving parent for item: No resource found that matches given name 'android.TextAppearance.Material.Widget.Button.Inverse'
这又是什么错误呢?我们先来看看android:TextAppearance.Material.Widget.Button.Inverse是个什么属性。原来这是在SDK 23,也就是6.0之后添加的style。
因为我所下载的Support Library是最新的23.1.1版本。在这个版本中使用了6.0的style使得整体的风格能够统一。而我们默认创建项目的时候所使用的compileVersion是19,那么当然拿不到新的属性了。所以这里我们将编译版本修改一下就可以了,同样是在build.gradle下:
compileSdkVersion 23
这样就可以找到对应的resource了。可是这时候编译仍然会报错
No resource identifier found for attribute 'cardElevation' in package 'com.example.android.supportv7'
无法在当前项目中找到'cardElevation'属性。查看一下xml布局文件,我们发现这个属性是在CardView这个标签下的,原来v7Demo中所使用的控件并不再supportv7包下,而是一个独立的cardview-v7包。这样我们就清楚了,只要把这个包也引入就可以了:
dependencies {
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:cardview-v7:23.1.1'
compile 'com.android.support:mediarouter-v7:23.1.1'
compile 'com.android.support:gridlayout-v7:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'
}
除了CardView,Demo中还用到了MediaRouter、GridLayout、RecyclerView,我们把这几个独立的控件包也添加到build.gradle中来。这样应用就可以成功的编译了。
###Support13Demos 和 SupportAppNavigation
剩下的v13Demo和appNavigation的Demo,我们按照之前处理相应错误的方式就可以成功的导入到Android Studio中进行编译并安装了。
####总结
其实这几个问题在我们导入开源的项目的时候会经常遇到。但是一般总结起来大多是三个原因: 1. Gradle版本不一致。一般将Gradle改为本机上所使用的版本就可以解决了。 2. 项目所使用的库没有被引入。错误大多是无法找到resource,也就是无法使用res包下所定义的某个style、value等。这时候我们就需要将库添加到dependencies下。 3. CompileVersion不匹配。编译版本不匹配所导致的往往是项目无法调用新版本的属性,所以最完全的解决方式就是将编译版本修改为最新的。
当然,在实际操作时,往往不像我们上面所遇到的错误这样很轻松就可以找到错误发生的位置。最常见的往往是由于项目中所使用的库与我们的配置的库冲突、不一致而引起的编译失败。但是归根结底还是上面所说的三种原因,只需要将每一个库都进行检查比对,总能找到错误的原因的(但是一个成熟的上线项目那庞大的引用库...想一想也很头大)。
其实使用Eclipse来进行编译也会遇到这些错误,相比起来,Android Studio只需要添加一行代码就可以把Library引入也算是方便不少了。当然如果能够学到更多的Gradle命令的话就更简单了。