盒子
盒子
Posts List
  1. 一.自定义任务
  2. 二.添加自定义任务到编译流程
    1. 前置插入
    2. 后置插入
  3. 三.执行任务
  4. 四.定制源码集合
  5. 五.优化gradle构建速度
    1. 1. 并行编译
    2. 2.移除不需要的配置过程
    3. 3.增大JVM虚拟机内存配置
    4. 4.优化依赖库
    5. 5.使用dex选项
  6. 六.输出构建结果
  7. 七.android-gradle-dsl

gradle实践系列:android gradle插件(4)

终于到激动人心的时刻,我们要自定义任务了。本篇说明如何自定义任务实现自己想要的功能。

一.自定义任务

gradle DSL定义了非常多常见的任务,如 copy , wrapper , exec ,我们可以通过简单配置来修改这些任务。

例如拷贝任务:

task copyApks(type: Copy) {
from("$buildDir/outputs/apk") {
exclude '**/*unsigned.apk', '**/*unaligned.apk'
}
into '../apks'
}

$buildDir 代表的是app/build目录
** 代表遍历下面的所有子目录
这个任务将打包出来的apk包,去除未签名的,全部拷贝到上级目录下的apks目录中。

gradle 构建分为两个阶段,配置阶段和执行阶段。在运行任何任务之前,gradle会进行配置,根据要运行的任务,生成DAG(无回路有向图),然后在执行阶段根据DAG顺序执行任务。

task printVariantNames() {
doLast {
android.applicationVariants.all {
variant -> println variant.name
}
}
}

doLast语句块运行在执行阶段,在doLast之前或者之后的语句块都运行在配置阶段。

二.添加自定义任务到编译流程

一般情况下,我们制定的任务,需要手动执行才可以,比如:

gradlew copyApks

我们可以把copyApks放置到现有的编译流程中,也就是在build任务的DAG中插入我们的任务。

使用dependsOn 将自身定义的任务以依赖的方式添加到插件提供的任务DAG中,常见使用dependsOn有前置插入和后置插入两种。

前置插入:

build.dependsOn copyApks

build的DAG默认是这样的:
….->test->check->build
其中test,check,build都是android-gradle插件提供的任务

前置插入

前置插入后,DAG变成这样:
…->test->check->copyApks->build

我们执行下build任务看下结果:

...
:app:compileFriendlyReleaseUnitTestJavaWithJavac UP-TO-DATE
:app:processFriendlyReleaseUnitTestJavaRes UP-TO-DATE
:app:compileFriendlyReleaseUnitTestSources UP-TO-DATE
:app:assembleFriendlyReleaseUnitTest UP-TO-DATE
:app:testFriendlyReleaseUnitTest UP-TO-DATE
:app:test UP-TO-DATE
:app:check
:app:copyApks UP-TO-DATE
:app:build
BUILD SUCCESSFUL

后置插入

task copyApks(type: Copy , dependsOn:assemble) {
from("$buildDir/outputs/apk") {
exclude '**/*unsigned.apk', '**/*unaligned.apk'
}
into '../apks'
}
//或者
copyApks.dependsOn assemble

我们执行gradle copyApks 会先执行assemble任务打包出apk,然后执行copyApks任务

三.执行任务

在执行任务的时候,可以选择剔除某些在后续任务中不依赖的任务,比如lint,它是一个检测类任务。

可以通过-x参数过滤lint任务

gradlew build -x lint

四.定制源码集合

sourceSets{
main{
java.srcDirs "src/main/java"
res.srcDirs "src/main/res"
}
}

通过sourceSets,我们可以指定编译的源码目录

五.优化gradle构建速度

1. 并行编译

开启并行编译,它能够加速具有两条互相不依赖DAG图的构建任务

在gradle.properties中添加

org.gradle.parallel=true

2.移除不需要的配置过程

仅仅配置需要构建的任务,gradle在构建任务之前会先执行配置操作,我们可以对不依赖的任务不进行配置

org.gradle.configureondemand=true

3.增大JVM虚拟机内存配置

org.gradle.jvmargs=-Xmx2048m -XX\:MaxPermSize\=512m -XX\:+HeapDumpOnOutOfMemoryError -Dfile.encoding\=UTF-8

4.优化依赖库

只添加需要的依赖库,对于部分库,如google play services会添加很多的依赖库

dependencies {
compile 'com.google.android.gms:play-service:7.8.0'
}

它导致添加的依赖如下:

image

如果我们仅仅需要使用google的地图服务,则可以改成

dependencies {
compile 'com.google.android.gms:play-service-maps:7.8.0'
}

这样添加的依赖就少了很多

image

5.使用dex选项

这个选项会导致增量构建加速,而clean操作更慢

dexOptions {
javaMaxHeapSize '2g'
jumboMode = true
preDexLibraries = true
}

最终优化常见版本如下:

systemProp.http.proxyHost=android-mirror.bugly.qq.com
systemProp.http.proxyPort=8080
org.gradle.jvmargs=-Xmx2048m -XX\:MaxPermSize\=512m -XX\:+HeapDumpOnOutOfMemoryError -Dfile.encoding\=UTF-8
org.gradle.parallel=true

六.输出构建结果

在gradle构建命令中增加–profile参数,可以将构建的结果输出到html文件。

gradlew -q --profile assembleRelease

输出结果在build/reports/profile目录下,结果文件名为profile-YYYY-MM-dd-hh-mm-ss.html

七.android-gradle-dsl

完整在线地址
http://google.github.io/android-gradle-dsl/current/


下一篇

gradle实践系列:gradle实践系列:一个常见gradle脚本例子

支持一下
扫一扫,支持牛头码农