增量构建增量构建
你在执行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",也就不会遇到这
个问题了。
Android Gradle实战
下面讲讲在Android Gradle实战中遇到的一些问题和经验,感觉还是蛮多干货的。
productFlavors
这个东西基本上已经烂大街了,gradle的项目一般都会使用Product Flavor,看完美团的文章,你应该就懂了。
美团Android自动化之旅—适配渠道包
buildTypes
很多App有内测版和正式版,怎么让他们同时安装在一个手机上?同时安装在一个手机上,要求packageName不同
的,用productFlavors可以解决,但可能不够优雅,alpha版本还要来个debug和release版本岂不是很蛋疼?可以用
buildTypes来解决,淘宝资深架构师朱鸿的文章有比较详细的讲解,但有些内容可能有些过时了,需要更改脚本。
依赖更新依赖更新
项目依赖的远程包如果有更新,会有提醒或者自动更新吗? 不会的,需要你手动设置changing标记为true,这样
gradle会每24小时检查更新,通过更改resolutionStrategy可以修改检查周期。
configurations.all {
// check for updates every build
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
dependencies {
compile group: "group",
name: "projectA", version: "1.1-SNAPSHOT", changing: true
}
之前上传aar同一版本到maven仓库,但依赖却没有更新,该怎么办呢?可以直接删除本地缓存,缓存在
~/.gradle/caches目录下,删除缓存后,下次运行就会自动重新下载远程依赖了。
上传上传aar到到Maven仓库仓库
在工程的build.gradle中添加如下脚本: