写点什么

利用 Buck 进行高效 Android 编译

  • 2015-06-30
  • 本文字数:1410 字

    阅读完需:约 5 分钟

Buck 是 Facebook 出品的高效开源 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%,因此决定以此作为突破口,这时他们发现了来自 Facebook 的 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 官方给出的教程


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-06-30 03:3011815
用户头像

发布了 268 篇内容, 共 123.1 次阅读, 收获喜欢 24 次。

关注

评论

发布
暂无评论
发现更多内容

[译]你需要知道的CSS属性isolation

南城FE

CSS 前端 布局

Native Drawing开发指导,实现HarmonyOS基本图形和字体的绘制

HarmonyOS开发者

HarmonyOS

ERP和MES的区别与联系,这篇接地气的文章终于讲明白了!

优秀

MES系统 mes ERP系统 mes和erp区别

写作训练营打卡1--最喜欢的极客时间作者

Avril

多邻国还是流利说

escray

技术人写作 21 天技术人写作行动营 21 天

Wireshark中的TCP协议包分析

小齐写代码

耗时三年开源的H5商城,强烈推荐

越长大越悲伤

Java 开源 springboot

【Android】深入Binder拦截

iofomo

android 拦截器 binder

使用 Kubernetes Agent Server 实现 GitOps

极狐GitLab

Kubernetes DevOps gitlab gitops workflow

Amazon WorkSpaces 推出 Amazon WorkSpaces Web

亚马逊云科技 (Amazon Web Services)

容器 Amazon WorkSpaces

JDK1.8 ConcurrentHashMap 核心源码(面试重点)

是月月啊2023

wing一款轻量快捷的团队开发工具

iofomo

Python 跨平台 开发工具

另一种学习 Linux kernel 的方式 —— UML

袁世超

UML Linux Kenel

14 | 排序优化:如何实现一个通用的、高性能的排序函数.md

鲁米

GPU在元宇宙中的作用—元宇宙云端解决方案

3DCAT实时渲染

元宇宙 实时渲染

一文让你知道企业真正需要一个怎样的远程协同运维平台?

行云管家

运维 远程运维 远程协同

SQL ALTER TABLE 语句- 灵活修改表结构和数据类型

小万哥

MySQL 数据库 sql 程序员 后端开发

我的2023年度关键词:迎接不一样的挑战,充实自我

芯动大师

#技术人的2023总结

Amazon WorkSpaces 现在提供使用 WorkSpaces 流协议(WSP)的 Web Access

亚马逊云科技 (Amazon Web Services)

Amazon WorkSpaces

服务器异常问题排查指南

AiDaddy

trouble shooting 线上问题排查 服务器异常排查 linux 命令

一文读懂AQS的前世今生

是月月啊2023

Java 面试题

Groovy StringBuilder类踩坑

FunTester

【EMNLP 2023】面向Stable Diffusion的自动Prompt工程算法BeautifulPrompt

阿里云大数据AI技术

2023 Flink Forward Asia 参会指南来啦!

Apache Flink

大数据 flink

🎉开发者的福音:TinyVue 组件库文档大优化!类型更详细,描述更清晰!

Kagol

开源 Vue 前端 UI组件库

喜报!MIAOYUN入选成都高新区“瞪羚企业”

MIAOYUN

云计算 MIAOYUN 瞪羚企业 成都高新梯度培育企业 企业资质

英特尔李映:开源开放是软件生态开拓进取的原动力

E科讯

“敏捷教练进阶课程”2024年1月27-28日 · A-CSM认证在线周末班【分时段模块化教学】CST导师亲授

ShineScrum

敏捷教练

面试问题总结(一)

xfgg

Java

深度|低代码开发平台和微服务架构的优势与挑战

codebee

DDD 低代码 微服务、

跨界-我今年最难的一件事

学渣汪在央企打怪升级

利用Buck进行高效Android编译_移动_张天雷_InfoQ精选文章