利用 Buck进行高效Android编译

jopen 6年前

 

Buck 是非死book出品的高效 开源 Android编译工具,旨在鼓励开发者构建小规模可重用的程序模块,2013年发布时,InfoQ对此有过非常详细的报道。 随着版本的不断迭代和功能的不断演进,越来越多的团队开始利用Buck改进编译过程,Vine就是其中之一,该团队近期在 博客 中分享了Buck使用的经验。

相比传统的Android编译工具,Buck凭借多核及并行技术,极大加速了Android工程的编译速度。同时,多次编译过程中,它会对未变动的模块进行标记,以增量式编译的方式进一步提高速度。Buck自带编译脚本生成功能,并提供编译过程中单元测试的代码覆盖率等数据表单,还为无法用Ant 工具编译的模块提供了便捷的编译方式。Buck跟IntelliJ结合紧密,可通过简单的编译脚本生成该IDE可用的工程,极大降低了本地IDE开发后向服务器迁移的成本。

Vine团队首先介绍了开发环境,包括Android Studio、Gradle编译系统、Crashlytics等第三方插件以及Jenkins持续集成工具。在开发过程中,Vine发现虽然Gradle 编译系统支持多平台配置,但是Vine的Android版本开发过程中会遇到两个问题,一是App的体积会持续不断地增长,二是随着越来越多编译步骤的增加,编译时间越来越长。在引入Buck前,这两个问题越来越严重,一次完整编译要花费5分钟左右时间,而哪怕修改一行代码的编译都需要1分钟。对于 Vine这样的小型团队来讲,每天都要花费几个小时在等待编译完成,这让他们非常纠结。通过对过程的观察,Vine发现dex文件合并以及通过USB安装 App的时间占去了整个的90%,因此决定以此作为突破口,这时他们发现了来自非死book的Buck很精准地提供了这方面的优化,能够通过 ExoPackage模式来缩短编译时间。Buck在这方面有很多的优化,如最小编译依赖、最小dex传输等。具体来讲,Buck引入了三个基本的概念,藉此完成高效编译。编译规则(rule),规定Buck在给定输入文件后生成输出文件的过程。编译目标(target),项目中用来指定采用哪个规则编译的字符串。编译文件(file),可包含多个编译规则,可类比为Make技术中的Makefile。在上述三个概念的基础上,Buck会根据file中给定的target寻找特定编译规则集合,然后根据每个规则来对Android工程进行编译。这种分布式编译的方式,在Buck内部以依赖图的形式表示,它能够使得相互之间没有依赖关系的模块并行编译,节约编译时间,并且通过对未改动模块的标记,还可以进一步加速。

最后Vine团队用了三个工作日来将编译环境迁移至Buck,其中包含将远程jar全部放置本地,运行时修改R值,创建混合 AndroidManifest.xml文件和创建Buck配置文件等。此时一次完整编译的时间已降低至40秒钟,而且本次迁移并未破坏和影响 Gradle原本的优势,有了这样的成功,Vine团队打算下一步将Buck和Gradle之间的同步更加自动化。

总而言之,Buck面向的使用者是那些需要从单一代码库编译多个不同target的人,适合进行多平台开发的团队。值得注意的是,目前Buck不支持 Window平台,因此只能通过Mac或Linux平台进行开发。对Buck安装、快速入门、以及编译过程感兴趣的读者可参考Buck官方给出的 教程