第七章 Android Gradle插件

简介: 从这章开始我们就开始介绍Android Gradle插件了,会通过几章由浅入深的详细的介绍Android Gradle,本章会简单的介绍下Android Gradle插件,然后通过一个例子对其有大概的了解,最后讲下如果从原来基于Eclipse进行Android开发的方式,转到基于Android Studio,使用Android Gradle插件开发的新方式7.1 Android Gradle插件简介

从这章开始我们就开始介绍Android Gradle插件了,会通过几章由浅入深的详细的介绍Android Gradle,本章会简单的介绍下Android Gradle插件,然后通过一个例子对其有大概的了解,最后讲下如果从原来基于Eclipse进行Android开发的方式,转到基于Android Studio,使用Android Gradle插件开发的新方式


7.1 Android Gradle插件简介


从Gradle的角度看,我们知道Android其实就是Gradle的一个第三方插件,他是由Google 的Android团队开发的,但是从Android的角度看,Android插件是基于Gradle构建的,和Android Studio完美无缝搭配的新一代构建系统,它不同于Eclipse+Ant的搭配,相比于旧的构建系统,它更灵活,更容易配置,还能很方便的创建衍生的版本--也就是我们常用的多渠道包。让我们看看Android官方对它的推崇程度:


  1. 可以很容易的重用代码和资源


  1. 可以很容易的创建应用的衍生版本,所以不管你是创建多个apk,还是不同功能的应用都很方便


  1. 可以很容易的配置、扩展以及自定义构建过程


  1. 和IDE无缝整合


上面说的IDE就是Android Studio,真是Android Gradle+Android Studio搭配,工作不累。


7.2 Android Gradle插件分类


Android Gradle插件的分类其实是根据Android工程的属性分类的,在Android中有三类工程,一类是App应用工程,它可以生成一个可运行的APK应用;一类是Library库工程,它可以生成AAR包给其他的App工程公用,就和我们的Jar一样,但是它包含了Android的资源等信息,是一个特殊的Jar包;最后一类是Test测试工程,用于对App工程或者Library库工程进行单元测试。


  1. App插件id:com.android.application


  1. Library插件id:com.android.library


  1. Test插件id:com.android.test


通过应用以上三种不同的插件,就可以配置我们的工程是一个Android App工程,还是一个Android Library工程,或者是一个Android Test测试工程,然后配合着Android Studio,就可以分别对他们进行编译、测试、发布等操作。


7.3 应用Android Gradle插件


在讲Gradle插件的时候,我们讲了要应用一个插件,必须要知道他们的插件id,除此之外,如果是第三方的插件,还要配置他们的依赖classpath。Android Gradle插件就是属于第三方插件,它托管在Jcenter上,所以在应用他们之前,我们要先配置依赖classpath,这样当我们应用插件的时候,Gradle系统才能找到他们。


image.png


我们配置里仓库为jcenter,这样当我们配置依赖的时候,gradle就会去这个仓库里寻找我们的依赖。


然后我们在dependencies{}配置里我们需要的是Android Gradle1.5.0版本的插件。

buildscript{}这部分配置可以写到根工程的build.gradle脚本文件中,这样所有的子工程就不用重复配置了。


以上配置好之后,我们就可以应用我们的Android Gradle插件了。


image.png


android{}是Android插件提供的一个扩展类型,可以让我们自定义Android Gradle工程。compileSdkVersion是编译所依赖的Android SDK的版本,这里是API Level;buildToolsVersion是构建该Android工程所以的构建工具的版本。


以前应用的是一个App工程插件,应用Android Library插件和Android Test插件也类似的,只需要换成相应的id即可。


7.4 Android Gradle工程示例


Android Gradle插件继承于Java插件,具有所有Java插件的特性,它也需要在Setting文件里通过include配置包含的子工程,也需要应用Android插件等等。

下面我们就通过一个App工程的示例,来演示下App的工程目录结构以及相关的Android Gradle配置。


我们可以通过Android Studio创建一个App工程,创建后我们可以看到其大概工程目录结构如下:


image.png


其目录结构和Java工程相比没有太大的变化,proguard-rules.pro是一个混淆配置文件;src目录下的androidTest、main、test分别是三个SourceSet,分别对应Android单元测试代码、Android App主代码和资源、普通的单元测试代码。我们注意到main文件夹,相比Java的,多了AndroidManifest.xml,res这两个属于Android特有的文件目录,用于描述Android App的配置和资源文件。


下面我们来看看Android Gradle的build.gradle配置文件

Android Gradle工程的配置,都是在android{}中,这是唯一的一个入口,通过它,可以对Android Gradle工程进行自定义的配置,其具体实现是com.android.build.gradle.AppExtension,是Project的一个扩展,创建原型如下:


image.png


在com.android.application插件中,getExtensionClass()返回的就是com.android.build.gradle.AppExtension,所以关于android的很多配置可以从这个类里去找,参考我们前面讲的Gradle知识,可以找到很多试用的配置或者可以利用的对象、方法或者属性等等,而这些并没有在Android文档里介绍的,这就是可以看源代码的好处。


7.4.1 compileSdkVersion


compileSdkVersion 23,是配置我们编译Android工程的SDK,这里的23是Android SDK的API Level,对应的是Android6.0的SDK,这个大家都清楚的。该配置的原型是一个compileSdkVersion方法


image.png


除此之外,他还有一个set方法,所以我们可以把它当成android的一个属性使用。


image.png


使用方式是:


image.png


这就是Gradle的灵活支出,通过不同的方法,就可以达到不同的配置方式。


7.4.2 buildToolsVersion


buildToolsVersion "23.0.1"表示我们使用的Android 构建工具的版本,我们可以在Android SDK目录里看到,它是一个工具包,包括appt,dex等工具。它的原型也是一个方法。


image.png


从以上的方法原型中可以看到,我们可以通过buildToolsVersion方法赋值,也可以通过android.buildToolsVersion这个属性读写它的值。


7.4.3 defaultConfig


defaultConfig是默认的配置,它是一个ProductFlavor,ProductFlavor允许我们根据不同的情况同时生成多个不同的APK包,比如我们后面介绍的多渠道打包。如果不针对我们自定义的ProductFlavor单独配置的话,会为这个ProductFlavor使用默认的

defaultConfig的配置。


例子中applicationId是配置我们的包名,这里是org.flysnow.app.example74

minSdkVersion 是最低支持的Android系统的API Level,这里是14

targetSdkVersion 表明我们是基于哪个Android版本开发的,这里是23

versionCode 我们的App应用内部版本号,一般用于控制App升级

versionName 我们的App应用的版本名称,用户可以看到,就是我们发布的版本,这里是1.0


以上所有配置对应的都是ProductFlavor类里的方法或者属性。


7.4.4 buildTypes


buildTypes是一个NamedDomainObjectContainer类型,是一个域对象,还记得我们讲的SourceSet吗?这个和那个一样。SourceSet里有main、test等,同样的buildTypes里有release,debug等,我们可以在buildTypes{}里新增任意多个我们需要构建的类型,比如debug,Gradle会帮我们自动创建一个对应的BuildType,名字就是我们定义的名字。


release就是一个BuildType,后面章节我们会详细介绍BuildType,例子中我们用到了两个配置


minifyEnabled 是否为该构建类型启用混淆,我们这里是false表示不启用,如果想要启用可以设置为true


proguardFiles,当我们启用混淆时,所使用的proguard的配置文件,我们可以通过它配置我们如何进行proguard混淆,比如混淆的级别,哪些类或者方法不进行混淆等等。它对应BuildType的proguardFiles方法,可以接受一个可变参数,所以我们同时可以配置多个配置文件,比如我们例子中的


proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'


getDefaultProguardFile是android扩展的一个方法,它可以获取你的Android SDK目录下的默认的proguard配置文件,在android-sdk/tools/proguard/目录下,文件名就是我们传入的参数的名字proguard-android.txt。


其他还有很多有用的配置,我们后面的章节都会一一介绍,这里只简单的介绍入门示例,让大家对Android Gradle有一个大概的了解


7.5 Android Gradle任务


我们说过Android插件是基于Java插件,所以Android插件基本上包含里所有Java插件的功能,包括继承的任务,比如assemble、check、build等等,除此之外,Android在大类上还添加了connectedCheck、deviceCheck、lint、install、uninstall等任务,这些是属于Android特有的功能。


connectedCheck 在所有链接的设备或者模拟器上运行check检查

deviceCheck 通过API连接远程设备运行checks。它被用于CI(译者注:持续集成)服务器上。


lint 在所有的ProductFlavor上运行lint检查。


install和uninstall类的任务可以直接在我们已链接的设备上安装或者卸载你的App。

除此之外,还有一些不太常用的任务,比如signingReport 可以打印App的签名;androidDependencies 可以打印android的依赖,还有其他一些类似的任务,大家可以通过./gradlew tasks来查看。


一般我们常用的任务是build、assemble 、clean、lint、以及check等,通过这些任务我们可以打包生成我们的Apk,对现有的Android工程进行lint检查等等。


7.6 从Eclipse迁移到Android Gradle工程


最开始的时候还没有Android Studio,也没有Android Gradle这个插件,我们都是使用Eclipse+ADT+Ant进行Android开发,用过Ant的,再和我们的Gradle对比一下,就会发现Gradle的灵活,还有Android Studio这个强大的IDE和Android Gradle完美配合,会使得我们开发效率大大提高,所以很多人都迫不及待的想从原来基于Eclipse+ADT+Ant,迁移到我们的Android Studio+Gradle,这一小结我们就简单的讲下如何迁移。


从Eclipse迁移到Android Studio有两种方式,一种是使用Android Studio直接导入Eclipse工程,另外一种使用Eclipse导出Android Gradle配置文件,转换为一个Gradle工程,然后再使用Android Studio把它作为一个Gradle工程导入。


7.6.1 使用Android Studio导入


这种方式比较简单,要导入到Android Studio,我们打开Android Studio,选择File->Import Project,然后会弹出一个对话框,选择我们的Eclipse ADT工程的目录,然后就会打开一个向导,按向导一步步操作,最后完成的时候,会打开一个 "import-summary.txt" 文件,里面描述的我们这次导入涉及到的文件迁移和改变等等,我们再根据我们上面讲的Android Gradle工程结构做调整即可。


以上是我导入的一个例子生成的import-summary.txt,我们可以看到有一段Moved Files,也就是说,这种导入方式,会把我们原来Eclipse+ADT项目的目录结构转换成了Android Studio的目录结构,破坏了原来的目录结构,如果对于目录结构有严格要求的,就不要使用这种方式了,可以使用我们下面讲的第二种方式,如果没有严格要求的,建议采用这种方式,因为这是Android Studio默认推荐的目录结构,也可以熟悉下,为以后的新的功能,甚至团队间的协作也方便,因为它毕竟是Android Studio的一种默认的约定,大家都熟悉,沟通交流简单。


7.6.2 从Eclipse+ADT中导出


从Eclipse导出,也非常简单,我们首先打开Eclipse,然后在其中找到我们要导出的工程,右击->Export,导出之前确保你的ADT越新越好,因为可能有些BUG会在新版里修复。


选择导出之后,会看到一个对话框,我们在其中展开Android,然后会看到Generate Gradle Build Files选项,选择它即可,然后就会打开一个向导,我们按找向导操作,就会生成Gradle Android工程需要的Setting和build脚本文件。


image.png


最后我们再打开Android Studio,然后选择File->Import Project,选择我们刚刚导出的Android工程目录,然后Next,一步步即可导入到Android Studio中。

下面我们看下这种方式生成的build.gradle脚本示例


image.png


这种方式保留了原来项目的目录结构,为了达到这个目的,又让Android Studio可以识别该项目,所以Eclipse Export功能对生成的build.gradle脚本文件做了处理,从上面的例子中我们可以看到,重写了main这个SourceSet,为Android Studio指明我们的java文件、res资源文件、assets文件、aidl文件以及manifest文件在项目中的位置,这中Android Studio才能识别他们,进而作为一个Android工程进行编译构建。


以前的Eclipse+ADT的工程结构,单元测试是放在tests目录下的,所以在这里对其单元测试目录进行了重新设置,指定我们原来的tests目录为其单元测试根目录。debug、和release这两个Build Type也类似。


以上两种迁移方式,大家根据自己的情况选择,不过还是建议大家选择第一种,迁移后就用Android Studio的目录结构来开发,不然会有很多兼容性的build脚本代码,以后Android Gradle插件升级也不容易,因为有时候会有一些兼容,导致以后的任何变动都要小心翼翼。


7.7 小结


这一章介绍了Android Gradle插件,让大家对Android Gradle以及Android Studio工程有一个简单而全面的了解,也可以基于这些知识新建自己的Android Gradle工程,并进行开发,是一个整体的认识,了解其中的一些基本的概念。


下几章会从一些现实中的项目使用到的情况来介绍Android Gradle,比如多工程打包,比如发布库工程,比如多渠道打包等等,等这些介绍完之后,相信大家已经非常熟悉和使用Android Gradle了,然后会用一章对Android Gradle做一个全面的介绍,到时候会有很多你没有见过的配置和功能等等。



本文属自学历程, 仅供参考

详情请支持原书 Android Gradle权威指南


目录
相关文章
|
6月前
|
缓存 程序员 定位技术
Android Studio 插件,那些被大厂优化的程序员们
Android Studio 插件,那些被大厂优化的程序员们
|
25天前
|
Android开发
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
|
23天前
|
Android开发
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
|
28天前
|
Java Android开发 Windows
玩转安卓之配置gradle-8.2.1
为安卓开发配置Gradle 8.2.1,包括下载和解压Gradle、配置环境变量、修改配置文件以增加国内镜像,以及在Android Studio中配置Gradle和JDK的过程。
58 0
玩转安卓之配置gradle-8.2.1
|
8天前
|
Android开发
我是一位Android工程师,用通义灵码的AS插件做开发工作助手,对比之前没有灵码,现在提效了60%
我是一位Android工程师,用通义灵码的AS插件做开发工作助手,对比之前没有灵码,现在提效了60%
20 0
|
3月前
|
Android开发
Android Studio: 解决Gradle sync failed 错误
本文介绍了解决Android Studio中出现的Gradle同步失败错误的步骤,包括从`gradle-wrapper.properties`文件中获取Gradle的下载链接,手动下载Gradle压缩包,并替换默认下载路径中的临时文件,然后重新触发Android Studio的"Try Again"来完成同步。
1048 0
Android Studio: 解决Gradle sync failed 错误
|
3月前
|
Java 开发工具 Maven
Flutter和Android中覆盖gradle中的repositories仓库地址
Flutter和Android中覆盖gradle中的repositories仓库地址
168 4
|
3月前
|
Android开发 Kotlin
The Android Gradle plugin supports only Kotlin Gradle plugin version 1.3.10 and higher
The Android Gradle plugin supports only Kotlin Gradle plugin version 1.3.10 and higher
66 3
|
3月前
|
Java 开发工具 Android开发
Android Studio利用Build.gradle导入Git commit ID、Git Branch、User等版本信息
本文介绍了在Android Studio项目中通过修改`build.gradle`脚本来自动获取并添加Git的commit ID、branch名称和用户信息到BuildConfig类中,从而实现在编译时将这些版本信息加入到APK中的方法。
61 0
|
3月前
|
IDE API 开发工具
与Android Gradle Plugin对应的Gradle版本和Android Studio版本
与Android Gradle Plugin对应的Gradle版本和Android Studio版本
349 0