Android代码庞大,如果你是做android系统开发的会经常做full build, 代码编译时间一般4核CPU你得2个小时左右吧,一天你也就编译那么几次了得了,象我们用的40核的服务器一般做full build 18分钟左右,但是一般的工程师在自己的PC上如何编译的更快呢?网上查看了一些资料大部分都是用的distcc,distcc已经好几年的使用时间了,其主要是针对C, C++进行分布式编译的,而且效果很不错。但是Android代码除了linux kernel还有一堆的库是C和C++外,很大一份的代码都是JAVA代码,distcc无法针对java做分布式编译。distcc就是利用组建编译PC群来进行分布式编译。
话说:
distcc is a program to distribute builds of C, C++, Objective C or Objective C++ code across several machines on a network. distcc should always generate the same results as a local build, is simple to install and use, and is usually much faster than a local compile.
在类 Unix 系统上,distcc 使用 sendfile 系统调用在不同工作节点之间传送文件,尽管这种网络文件传输会占用一定的时间,他们对工作机的 CPU 资源占用却很小,而且这种分发任务的方式能够简化构建环境的配置,distcc 在这方面同早期的一些基于共享文件系统的分布编译环境 (dmake, pvmmake 等等 ) 相比几乎是0 配置。
distcc 对各个编译节点的本地系统库及头文件基本没有要求,即使在不同的节点上这些组件的版本不同也不会影响到最终编译结果的正确性,实际情况是 distcc 会在本地 (client 机 ) 完成存在版本依赖的编译任务,这一点的实现原理简要说来式因为 distcc 借助了 C/C++ 编译驱动程序的以下特点:
1. cpp(C 预处理器 ) [cpp [arguments] .c 源文件输入 .i 中间文件输出 ]
2. ccl(C 编译器 ) [ccl .i 中间文件输入 .c 源文件输入 [arguments] –o .s 汇编文件输出 ]
3. as( 汇编器 ) [as [arguments] –o .o 目标文件输出 .s 汇编文件输入 ]
这个在本地做过预处理的 ASCII 源文件及其他命令行选项即可唯一确定一个目标文件,而与此任务在哪台机器上运行无关,通过分发这种任务到各个节点,即可消除对头文件的依赖。同理 distcc 通过在任务的分发节点做链接来消除对库文件的依赖。
一. Android4.4 分布式编译部署:
1. 安装distcc
sudo apt-get install distcc
和 distcc图形界面的监测程序
apt-get install distccmon-gnome
2. 修改distcc的配置文件
sudo vi /etc/default/distcc
修改STARTDISTCC的值为true。
STARTDISTCC="true"
修改 ALLOWEDNETS="192.168.0.0/16" (192.168.0.0/16表示只要前16位为192.168的合法IP地址都可以请求编译服务。)
LISTENER="192.168.4.116" (server的ip,经验证每个PC必须填写自己的IP)
3. 将android的交叉编译工具添加到distcc启动配置中
sudo vi /etc/init.d/distcc
PATH=/usr/local/bin:***:/home/username/android-4.4_r1/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:
4. 创建交叉编译的软连接到distcc
cd /usr/lib/distcc
ln -s ../../bin/distcc arm-linux-androideabi-addr2line
ln -s ../../bin/distcc arm-linux-androideabi-ar
ln -s ../../bin/distcc arm-linux-androideabi-as
ln -s ../../bin/distcc arm-linux-androideabi-c++
ln -s ../../bin/distcc arm-linux-androideabi-c++filt
ln -s ../../bin/distcc arm-linux-androideabi-cpp
******
******
5. 修改Android的编译脚本,指定使用distcc
将build/core/combo/TARGET_linux-arm.mk中的TARGET_TOOLS_PREFIX变量改为/usr/lib/distcc/arm-linux-androideabi-
6. 将交叉编译路径添加到PATH中
export PATH=/home/username/android-4.4_r1/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:$PATH
7. 将distcc添加到交叉编译路径的第一个
export PATH=/usr/lib/distcc:$PATH
8. 添加组件PC群的IP
export DISTCC_HOSTS=”192.168.4.88 192.168.4.116 192.168.4.234” (可添加多个组织的ip)
9. 各个PC都需要将distcc服务启动
sudo service distcc start
sudo service distcc start/stop/restart (启动,停止,重启)
10. 开始编译
make -j8 CC=distcc 调整主机数和本机资源情况调整job数目,以获取最快,这个需要继续研究规律。
11. 图形化监控测试工具
distccmon-gnome
3台4核PC进行编译几次下来都在1h22m, 1h24m,基本快了二十多分钟,继续探究优化中。
model name : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz
distcc分布式编译 Android 4.4 | ||||
测试 | PC数 | 开始时间 | 结束时间 | 耗时 |
第一轮 | 2台 | 12/5/2013 11:54 | 12/5/2013 13:16 | 82分钟 |
第二轮 | 3台 | 12/5/2013 15:04 | 12/5/2013 16:28 | 84分钟 |
第三轮 | 3台 | 12/6/2013 10:04 | 12/6/2013 11:26 | 82分钟 |
Android 4.4 系统普通编译 | ||||
测试 | PC数 | 开始时间 | 结束时间 | 耗时 |
第一轮 | 1 | 12/5/2013 16:43 | 12/5/2013 18:27 | 106分钟 |
有文章介绍: distcc 会安装如下可执行文件:
负载均衡还没有研究,等研究完后继续整理。
参考文章:
搭建distcc分布式编译Android源码
Android基于distcc的分布式编译及负载均衡的实现
http://code.google.com/p/distcc/
http://distcc.googlecode.com/svn/trunk/doc/web/index.html
http://os.chinaunix.net/a2009/0520/1027/000001027449.shtml 分布式编译环境中的负载均衡