深度探索 Gradle 自动化构建技术

           深度探索 Gradle 自动化构建技术

1、Gradle 是什么?

1)、它是一款强大的构建工具,而不是语⾔。

2)、它使用了 Groovy 这个语言,创造了一种 DSL,但它本身不是语⾔。

2、为什么使用 Gradle?

主要基于如下 三点 原因:

1)、它是一个款最新的,功能最强大的构建工具,使用它我们能做很多事情。

2)、使用程序替代传统的 XML 配置,使得项目构建更加灵活。

3)、丰富的第三方插件,可以让我们随心所欲地使用。

3、Gradle 的构建流程

通常来说,Gradle 一次完整的构建过程通常分成如下三个部分:

初始化阶段:首先,在初始化阶段 Gradle 会决定哪些项目模块要参与构建,并且为每个项目模块创建一个与之对应的 Project 实例。

配置阶段:然后,配置工程中每个项目的模块,并执行包含其中的配置脚本。

任务执行:最后,执行每个参与构建过程的 Gradle task。

二、打包提速

掌握 Gradle 构建提速的技巧能够帮助我们节省大量的编译构建时间,并且,依赖模块越多且越大的项目节省出来的时间越多,因此是一件投入产出比相当大的事情。

1、升级最新的 Gradle 版本

将 Gradle 和 Android Gradle Plugin 的版本升至最新,所带来的的构建速度的提升效果是显而易见的,特别是当之前你所使用的版本很低的时候。

2、开启离线模式

 3、配置 AS 的最大堆内存

在默认情况下, AS 的最大堆内存为 1960MB,我们可以选择 Help => Edit Custom VM Options,此时,会打开一个 studio.vmoptions 文件,我们将第二行的 -Xmx1960m 改为 -Xmx3g 即可将可用内存提升到 3GB。

4、删除不必要的 Moudle 或合并部分 Module

5、删除Module中的无用文件

1)、如果我们不需要写单元测试代码,可以直接删除 test 目录。

2)、如果我们不需要写 UI 测试代码,也可以直接删除 androidTest 目录。

3)、此外,如果 Moudle 中只有纯代码,可以直接删除 res 目录。

6、去除项目中的无用资源

在 Android Studio 中提供了供了自动检测失效文件和删除的功能,即Remove Unused Resource功能,操作路径如下所示:

右键 => 选中 Refactor => 选中Remove Unused Resource => 直接点击REFACTOR

需要注意的是,这里不需要将 Delete unused @id declarations too 选中,如果你使用了 databinding 的话,可能会编译失败

7、优化第三方库的使用

1)、使用更小的库去替换现有的同类型的三方库。

2)、使用 exclude 来排除三方库中某些不需要或者是重复的依赖。

3)、使用 debugImplementation 来依赖仅在 debug 期间才会使用的库,如一些线下的性能检测工具。如下是一个示例代码:

// 仅在debug包启用BlockCanary进行卡顿监控和提示的话,可以这么用debugImplementation 'com.github.markzhai:blockcanary-android:1.5.0'

8、利用公司 Maven 仓库的本地缓存

当第一个开发引入了新库或者更新版本之后,公司的 Maven 仓库中就会缓存对应的库版本,通过这样的方式,其他开发同事就能够在项目构建时直接从公司的 Maven 仓库中拿到缓存。

9、Debug 构建时设置 minSdkVersion 为 21

10、配置 gradle.properties

    // 构建初始化需要执行许多任务,例如java虚拟机的启动,加载虚拟机环境,加载class文件等等,配置此项可以开启线程守护,并且仅仅第一次编译时会开启线程(Gradle 3.0版本以后默认支持)   

 org.gradle.daemon=true        

  // 配置编译时的虚拟机大小    

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

// 开启并行编译,相当使用了多线程,仅仅适用于模块化项目(存在多个 Library 库工程依赖主工程)   

 org.gradle.parallel=true          

// 最大的优势在于帮助多 Moudle 的工程提速,在编译多个 Module 相互依赖的项目时,Gradle 会按需选择进行编译,即仅仅编译相关的 Module   

 org.gradle.configureondemand=true           

// 开启构建缓存,Gradle 3.5新的缓存机制,可以缓存所有任务的输出,    

// 不同于buildCache仅仅缓存dex的外部libs,它可以复用   

 // 任何时候的构建缓存,设置包括其它分支的构建缓存    

org.gradle.caching=true

这里效果比较好一点的配置项就是配置编译时的虚拟机大小这项,我们来详细分析下其中参数的含义,如下所示:

-Xmx2048m:指定 JVM 最大允许分配的堆内存为 2048MB,它会采用按需分配的方式。

-XX:MaxPermSize=512m:指定 JVM 最大允许分配的非堆内存为 512MB,同上堆内存一样也是按需分配的。

11、配置 DexOptions

我们可以将 dexOptions 配置项中的 maxProcessCount 设定为 8,这样编译时并行的最大进程数数目就可以提升到 8 个。

12、使用 walle 提升打多渠道包的效率

walle 是 Android Signature V2 Scheme 签名下的新一代渠道包打包神器,它在 Apk 中的 APK Signature Block 区块添加了自定义的渠道信息以生成渠道包,因而提高了渠道包的生成效率。此外,它也可以作为单机工具来使用,也可以部署在 HTTP 服务器上来实时处理渠道包 Apk 的升级网络请求,有需要的同学可以参考美团的walle

三、Gradle 常用命令

1)、查看构建版本

    ./gradlew -v

2)、清除 build 文件夹

    ./gradlew clean

3)、检查依赖并编译打包

    ./gradlew build

4)、编译并安装 debug 包

    ./gradlew installDebug

5)、编译并打印日志

    ./gradlew build --info

6)、编译并输出性能报告,性能报告一般在构建工程根目录 build/reports/profile 下

    ./gradlew build --profile

7)、调试模式构建并打印堆栈日志

    ./gradlew build --info --debug --stacktrace

8)、强制更新最新依赖,清除构建后再构建

    ./gradlew clean build --refresh-dependencies

9)、编译并打 Debug 包

    ./gradlew assembleDebug    # 简化版命令,取各个单词的首字母    ./gradlew aD

10)、编译并打 Release 的包

    ./gradlew assembleRelease    # 简化版命令,取各个单词的首字母    ./gradlew aR

4、Gradle 构建并安装命令

1)、Release 模式打包并安装

    ./gradlew installRelease

2)、卸载 Release 模式包

    ./gradlew uninstallRelease

3)、debug release 模式全部渠道打包

    ./gradlew assemble

5、Gradle 查看包依赖命令

1)、查看项目根目录下的依赖

    ./gradlew dependencies

2)、查看 app 模块下的依赖

    ./gradlew app:dependencies

3)、查看 app 模块下包含 implementation 关键字的依赖项目

    ./gradlew app:dependencies --configuration implementation

五、总结

Gradle 每次构建的运行时间会随着项目编译次数越来少,因此为了准确评估 Gradle 构建提速的优化效果,我们可以在优化前后分别执行以下命令进行对比分析,如下所示:

    gradlew --profile --recompile-scripts --offline --rerun-tasks assembleDebug

参数含义如下:

profile:开启性能检测。

recompile-scripts:不使用缓存,直接重新编译脚本。

offline:启用离线编译模式。

return-task:运行所有 gradle task 并忽略所有优化。

此外,Facebook 的 Buck 以及 Google 的 Bazel 都是优秀的编译工具,那么他们为什么没有使用开源的构建工具呢,主要有如下三点原因:

1)、统一编译工具:内部的所有项目都使用同一套构建工具,包括 Android、Java、iOS、Go、C++ 等。编译工具的统一优化会使所有项目受益。

2)、代码组织管理架构:Facebook 和 Google 的所有项目都放到同一个仓库里面,因此整个仓库非常庞大,并且,他们也不会使用 Git。目前 Google 使用的是Piper,Facebook 是基于HG修改的,也是一种基于分布式的文件系统。

3)、极致的性能追求:Buck 和 Bazel 的性能的确比 Gradle 更好,内部包含它们的各种编译优化。但是它们的定制型太强,而且对 Maven、JCenter 这样的外部依赖支持也不好。

参考资料资源:<https://juejin.im/post/5e924273f265da47f079379c/>

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 在 Android Studio 构建的项目中,基于 Gradle 进行项目的构建,同时使用 Android DS...
    Ant_way阅读 7,245评论 0 16
  • 1 ,Android 构建系统 构建 APK 的过程是个相当复杂的过程,Android 构建系统需要将应用的资源文...
    8ba406212441阅读 1,321评论 0 1
  •   Gradle可谓是众多学习安卓工作者的一块心病,每次项目基本上只用到引用第三方库和打包用到,其余就再不关心了,...
    WhenMeet阅读 676评论 0 4
  • 4. 构建变体 其实上面多多少少也提到了,构建变体是构建类型与产品风味的交叉产物,是 Gradle 在构建应用时使...
    wind_sky阅读 553评论 0 0
  • Gradle用户指南 版权所有©2007-2017 Hans Dockter,Adam Murdoch 本文档的副...
    丑男李狗蛋阅读 2,162评论 0 1