转自: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. [Windows Azure] Managing SQL Database using SQL Server Management Studio

    Managing Windows Azure SQL Database using SQL Server Management Studio You can use Windows Azure SQL ...

  2. 【C/C++】struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招

    本文为笔者阅读<嵌入式C精华>的摘录,推荐一下,不错的书 一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int ...

  3. 通过kafka提供的命令来查看offset消费情况

    使用kafka的bin目录下面的kafka-consumer-groups.sh命令可以查看offset消费情况,注意,如果你的offset是存在kafka集群上的,就指定kafka服务器的地址boo ...

  4. CSS实现:标题两侧画线效果

    如图: html代码: <div class="detail-news"> <h5 class="detail-news-title"> ...

  5. 显示eclipse中Problem窗口的方法

    https://blog.csdn.net/ningfuxuan/article/details/76395029 ****************************************** ...

  6. uboot命令实现举例

    之前一直在想,为什么没有人出一个完全从零写uboot和移植剪裁内核的教程,后来发现,确实这样的教程十分不容易,还有就是我们也没有必要花那么多时间去做别人已经做好的事情,所以,一般而言我们只用管怎么实现 ...

  7. 基于html5海贼王单页视差滚动特效

    分享一款基于html5海贼王单页视差滚动特效是一款流行滑落网页特效代码.效果图如下: 在线预览   源码下载 实现的代码: <div class="top"> < ...

  8. Android 开发自己的网络收音机1——功能要求及设计方案

    最近打算利用业余时间,编写一个Android的网络收音机.因为我自己偶尔也喜欢听听广播,所以打算用业余时间编写一个网络版收音机.说起收音机,其实在工作中已经编写过一个,不过那个收音机是需要硬件支持,也 ...

  9. Django的安装要点

    Django 的安装: 安装包: 百度盘里搜索"Django-1.7.tar.gz" 安装环境 WIN7 解压文件 移动到python安装目录下 python setup.py i ...

  10. 【Unity Shader】二、顶点函数(vertex)和片元函数(fragment)传递数据,及各阶段可使用的语义(semantic)

    学习资料:http://www.sikiedu.com/course/37/task/433/show 本节学习目标: 学习Shader中结构体struct的使用. 学习在片元函数(vertex)和顶 ...