开发者社区> l1ka> 正文

第七章 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权威指南


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
21037 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
30423 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
14189 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
23154 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
17507 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
21359 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14929 0
+关注
340
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载