转自:http://blog.csdn.net/eqiang8271/article/details/17144411
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

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: 整个编译任务通常由一台机器发起,在 distcc 编译环境下,这台机器被称为 client,client 必须使用 distcc 来替代原有的 GNU 编译器命令,由于 distcc 的后台编辑程序仍然是 GNU 编译器,distcc 与 gcc, g++, cc, c++ 等程序的编译参数兼容。distcc 必须与 Make 命令的 -j 参数协同使用,client 机通过指定此参数来定义并发编译的任务数。在默认情况下,一台编译机的 distcc 允许的并发任务的数量是 CPU 数量 +2。
  • distccd: distccd 是运行在编译场内各个节点上的 distcc 代理程序,distccd 的常用参数如下:

    • -j: 指定可以在本节点上运行的最大任务数;
    • -N: 如果编译节点上运行有其他重要任务,可以通过指定 -N 参数来调整编译进程的运行优先级;
    • -a: 指定 distccd 可以接受来自哪些节点的连接请求,-a 参数的值可以是一个网段,也可以是所有编辑节点主机名 (IP 地址 ) 的列表。
  • distccmon-text: 可以通过运行 distccmon-text 来通过一个字符界面监控整个编译任务,此命令唯一的参数是监控任务的刷新间隔 ( 秒 )。
  • distccmon-gnome: 是一个图形化的监控前端,下图是此程序的一个运行实例。其中,任务进度指示条颜色的意义分别为:绿色:compiling;紫色:preprocessing;蓝色:receiving;橙色:connecting;白色:idle;

负载均衡还没有研究,等研究完后继续整理。

参考文章:

搭建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 分布式编译环境中的负载均衡

(转)Android分布式编译学习(一)distcc实现分布式编译 —— Ubuntu12.04上部署distcc分布式编译的更多相关文章

  1. Android编译环境——ubuntu12.04上android2.3.4编译错误以及解决

    Android编译环境——ubuntu12.04上android2.3.4编译错误以及解决 分类: android应用开发2013-08-21 09:20 4222人阅读 评论(3) 收藏 举报 li ...

  2. [eShopOnContainers 学习系列] - 03 - 在远程 Ubuntu 16.04 上配置开发环境

    直接把 md 粘出来了,博客园的富文本编辑器换成 markdown,没啥效果呀 ,先凑合吧.实在不行换地方   # 在远程 Ubuntu 16.04 上配置开发环境 ## 零.因 为什么要用这么麻烦的 ...

  3. Ubuntu12.04下zxing源码编译

    1.下载zxing源码 git clone https://github.com/15903016222/zxing-cpp.git 2.安装依赖工具cmake sudo apt-get instal ...

  4. Ubuntu12.04编译vlc-android详细流程

    作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  5. Hadoop学习之Ubuntu12.04 Hadoop 环境搭建笔记

    SSH无密码配置 Hadoop在Ubuntu12.04上搭建环境 报错及问题 SSH无密码配置 参考:Linux(Centos)配置OpenSSH无密码登陆 注意问题: Hadoop集成环境三台机器都 ...

  6. ubuntu12.04 Qt WebKit编译

    转载自:http://my.oschina.net/u/257674/blog/167050 官方文档: http://trac.webkit.org/wiki/BuildingQtOnLinux#D ...

  7. 在Ubuntu 16.04上编译OpenJDK8的源代码

    本文将详细介绍在Ubuntu16.04上对OpenJDK8进行编译. 1.准备编译环境 使用的操作系统为Ubuntu16.04,如果读者没有安装Ubuntu,可以在Windows上使用虚拟机的方式进行 ...

  8. 利用反编译学习Android

    自从2014年底到2015年中,全民创业的热潮就已经席卷全国了,一大批新的创业公司在北上广萌芽,也造成了大量的开发人员需求.扯远了,今天不谈创业潮,聊聊如何通过反编译学习Android.本文只是个人对 ...

  9. Android源码-学习随笔

    在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...

随机推荐

  1. 每日英语:Philippine Chapel Becomes a Medical Center

    In the darkest moments of the killer storm that ripped across this coastal city on Friday, residents ...

  2. u3d中的向量 vector3 vector2

    Vector3(x,y,z)x代表左右,y代表上下,z代表前后 Vector3.magnitude 长度 计算两点之间的距离  .如果只给了一点的话.算出的长度其实就是和Vector3.zero点之间 ...

  3. 【内核】探究linux内核,超详细解析子系统

    Perface 前面已经写过一篇<嵌入式linux内核的五个子系统>,概括性比较强,也比较简略,现在对其进行补充说明. 仅留此笔记,待日后查看及补充! Linux内核的子系统 内核是操作系 ...

  4. LeetCode: Distinct Subsequences 解题报告

    Distinct Subsequences Given a string S and a string T, count the number of distinct subsequences of  ...

  5. Delphi调用JAVA的WebService上传XML文件(XE10.2+WIN764)

    相关资料:1.http://blog.csdn.net/luojianfeng/article/details/512198902.http://blog.csdn.net/avsuper/artic ...

  6. 轻量级Modal模态框插件cta.js

    今天给大家分享一款轻量级Modal模态框插件cta.js.这是一款无需使用jQuery插件,纯js编写的模态框弹出特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <se ...

  7. kafka 面试题 无答案

    kafka节点之间如何复制备份的? kafka消息是否会丢失?为什么? kafka最合理的配置是什么? kafka的leader选举机制是什么? kafka对硬件的配置有什么要求? kafka的消息保 ...

  8. 赶集网dba石展分享归纳

    字段不要使用null值.查询,索引方面不利.如果是整型,int,仅仅是设置 not null还不够.最好是这种一个默认的值0.为什么? text类型处理性能低于varchar.尽量不要使用text/b ...

  9. go语言简述

    Go是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go语言被设计成一门应用于搭建web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言.对于高性能分布式系统领域而言,Go语 ...

  10. 使用livereload实现自动刷新

    livereload是一个web开发辅助工具,当我们修改完html.css和js的时候会自动刷新浏览器,解放码农的双手.这样在双屏切图.写js代码的时候会提高很多效率.livereload有很多版本, ...