CSDN移动延续了移动开发的精髓,共同探讨移动APP、开发工具、移动游戏和引擎、智能硬件、物联网等移动开发技术热点话题如果您想投稿、参与内容翻译工作或寻求近匠的文章,请将tangxy#csdn.net(#改为@ )。
最近在忙碌的团队并行开发,主要通过将各团队的代码库化,降低耦合,为以后的模块的插件化做准备,另一方面,通过采用二进制编译,可以提高编译速度。 因为库划分有几个问题,很多必须用Gradle脚本解决,所以花了一点时间进行了研究。
虽然Gradle是为了构筑神器,但是感觉学习曲线比较陡峭。 Gradle User Guide的内容很多,但是有点太多了,很多你读不完。 《荣耀插件用户指南》中的文章主要讨论安卓相关的配置。 读完之后,可能会觉得可以随便用,但在修改一些构建过程时还不知所措。 经过一段时间的摸索,我认为要在安卓项目中很好地使用Gradle,需要做以下三件事。
理解Groovy的基本语法。 粗略阅读《雷德乐用户指南》和《雷德乐插件用户指南》。 实战,实战,还有实战。 (三次,懂吧) )相关的知识点和内容很多,不一一说明。 本文主要解答自己学习过程中的疑问,并说明相关概念和实战经验。 过程中也推荐高质量的博客文章。
Groovy语言
格雷特勒基于格雷特语言。 虽然长时间接触Gradle,也写过一点Groovy语句,但对语言本身并不了解。 为什么要用Groovy呢? Groovy在JVM上运行,基于Java语言参考脚本语言的很多特性,代码量比Java少,Groovy与Java兼容,可以进行Groovy和Java的混合编程,直接使用各种Java类库
学习Groovy语法时,建议您熟悉官方文章Differences with Java和IBM开发者工作队的Groovy。 了解基本语法有助于读写gradle脚本。 例如,请举出以下例子。
例如,为什么在gradle脚本中使用InputStream不使用import包,而使用ZipFile需要import包? 因为缺省情况下,groovy导入以下包和类,所以不需要导入。
JAVA.IO.* JAVA.LAVA.* JAVA.Math.Bigdecimal JAVA.Math.BigintegerJava.NET.* JAVA.Util.* Groovy.LAng *。 便于字符串的重叠。
defdx=tasks.find by name (dex $ { variant.name.capital ize } )下面的代码真的能读吗?
//apply是方法,plugin是参数,’ com .安卓.应用程序’应用程序插件: ‘ com .安卓.安卓’/* *建筑物目录闭包可以简单地理解为代码块或方法指针。 * */buildscript {存储库}从属关系{类路径} com.Android.tools.build 3360格雷尔德33601.2.3 ‘
以下是
Gradle概念
格雷多相关概念。 有些很重要吧。 更多的是自己去看《格雷尔用户指南》。
生命周期
Gradle构建系统有自己的生命周期,包括初始化、配置和操作三个阶段。
在初始化阶段,将读取根项目的setting.gradle的include信息,确定哪些项目将参与构建,然后创建project实例。 例如,有三个项目: 在include ‘:app ‘、’ :lib1 ‘、’ :lib2 ‘配置执行阶段,基于gradle命令传递的任务名称执行相关的依赖任务。
任务创建
在许多文章中,任务的创建如下
任务帮助{2}
最后一次
println ‘hello ‘。
}
替换}或者doLast的话,我会很无聊。 定义任务为什么这么麻烦,还要加什么doLast吗,我就这样不行吗?
任务帮助{2}
println ‘hello ‘。
}上面的写法是,“hello”在gradle的配置阶段打印,前面的写法在gradle的执行阶段打印,所以怎么写取决于你的需求。
另外task中有一个action list,task运行时会顺序执行action list中的action,doLast或者doFirst后面跟的闭包就是一个action,doLast是把action插入到list的最后面,而doFirst是把action插入到list的最前面。
任务依赖
当我们在Android工程中执行./gradlew build的时候,会有很多任务运行,因为build任务依赖了很多任务,要先执行依赖任务才能运行当前任务。任务依赖主要使用dependsOn方法,如下所示:
task A << {println ‘Hello from A’}
task B << {println ‘Hello from B’}
task C << {println ‘Hello from C’}
B.dependsOn A
C.dependsOn B
了解更多,可以看一下侦跃翻译的Gradle tip #3-Task顺序。
增量构建
你在执行gradle命令的时候,是不是经常看到有些任务后面跟着[UP-TO-DATE],这是怎么回事?
在Gradle中,每一个task都有inputs和outputs,如果在执行一个Task时,如果它的输入和输出与前一次执行时没有发生变化,那么Gradle便会认为该Task是最新的,因此Gradle将不予执行,这就是增量构建的概念。
一个task的inputs和outputs可以是一个或多个文件,可以是文件夹,还可以是project的某个property,甚至可以是某个闭包所定义的条件。自定义task默认每次执行,但通过指定inputs和outputs,可以达到增量构建的效果。
依赖传递
Gradle默认支持传递性依赖,比如当前工程依赖包A,包A依赖包B,那么当前工程会自动依赖包B。同时,Gradle支持排除和关闭依赖性传递。
之前引入远程AAR,一般会这样写:
compile ‘com.somepackage:LIBRARY_NAME:1.0.0@aar’
上面的写法会关闭依赖性传递,所以有时候可能就会出问题,为什么呢?本来以为@aar是指定下载的格式,但其实不然,远程仓库文件下载格式应该是由pom文件中packaging属性决定的,@符号的真正作用是Artifact only notation,也就是只下载文件本身,不下载依赖,相当于变相的关闭了依赖传递,可以看一下sf的这个问题,通过添加transitive=true可以解决。但其实如果远程仓库有pom文件存在,compile后面根本不需要加”@aar”,也就不会遇到这个问题了。