转自: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] Getting Started with Windows Azure SQL Data Sync

    Getting Started with Windows Azure SQL Data Sync In this tutorial, you learn the fundamentals of Win ...

  2. 用ubuntu的grpb2引导Remix OS或Phoenix OS

    Remix OS游戏版,这里下载:http://youxi.jide.com/ 安装简单.我这里要解决的是安装后用ubunu的grub2菜单去引导它. 方法如下: 进入ubuntu系统里修改其grub ...

  3. [DIOCP3-IocpTask说明书]基于IOCP引擎的多线程任务的投递和回调处理单元

    [说明] IocpTask是基于Iocp引擎的多线程任务投递和处理单元,可以方便的把任务进行投递到IOCP线程进行统一调度和处理,是模仿QDAC-QWorker的处理方式,支持D7以上的版本. [使用 ...

  4. animate.css源码

    /*! 动画属性: animation-name:动画名称 animation-duration:动画时间 animation-timing-function:动画的速度曲线 animation-de ...

  5. Logistic回归分析简介

    Logistic回归:实际上属于判别分析,因拥有很差的判别效率而不常用. 1. 应用范围: ①     适用于流行病学资料的危险因素分析 ②     实验室中药物的剂量-反应关系 ③     临床试验 ...

  6. TextView

    wrap_content 设置TextView的宽度和高度为 wrap_content,则其大小会自动适应文本. textSize 设置字体大小 textColor 设置字体颜色 <TextVi ...

  7. Python如何下载文件

    转载自:http://www.codecho.com/how-to-download-a-file-in-python/ 利用程序自己编写下载文件挺有意思的.Python中最流行的方法就是通过Http ...

  8. [转]自定义注释@interface的用法

    一.什么是注释     说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J ...

  9. [转]Oracle中Hint深入理解

    原文地址:http://czmmiao.iteye.com/blog/1478465 Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明 ...

  10. Python urllib2 proxy

    在 正式并入某大公司之后,网络必须设置为统一的proxy,好的方面没看到,但是立即让我一的一个小工具不能工作了.在之前使用urllib2库,无需设置proxy,一切工作正常.在必须使用proxy之后, ...