Android源码编译概述

2013/12/26

本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接

1.简介

通常我们编译Android系统,生成Rom,并不会直接拿Android官方源代码去编译,因为缺少device的配置文件以及device的内核源码,我们会选择Cyanogen团队基于Android源码的开发的Cyanogenmod系统,它对原生的Android代码做了很多优化,并且收集了很多的device配置以及device的内核源码,可以直接生成设备的Rom

国内很多Rom都是基于Cyanogenmod系统修改的,初期的小米系统也是如此

Cyanogenmod的官方网站是: www.cyanogenmod.org

Android官方源代码(也称aosp android open source project),见 source.android.com

接下来我们以在Ubuntu 12.04上编译cm10.1为例,讲述环境搭建过程

2.准备编译环境

1) 首先安装JDK :

1
2
3
$sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$sudo apt-get update 
$sudo apt-get install sun-java6-jdk

2) 安装需要的包

1
2
3
4
5
6
$sudo apt-get install git gnupg flex bison gperf build-essential \\
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \\
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \\
libgl1-mesa-dev g++-multilib mingw32 tofrodos \\
python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

3) 配置usb的访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER=""
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER=""
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER=""
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER=""
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER=""
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER=""
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER=""
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER=""
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER=""
# adb protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER=""
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER=""
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER=""
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER=""
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER=""
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER=""
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER=""
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER=""

4)搭建ccache,ccache是编译器使用的缓存工具,能加速源代码的编译,在~/.bashrc里添加

1
2
$export USE_CCACHE=1
$export CCACHE_DIR=~/tmp/cache

执行ccache设置缓存大小

1
$prebuilt/linux-x86/ccache/ccache -M 50G

5)调整输出目录

如果你不想让编译生成的文件放入源代码目录下,你可以通过环境变量OUT_DIR_COMMON_BASE指定编译结果输出目录 你可以在~/.bashrc里添加

1
export OUT_DIR_COMMON_BASE=""

3.下载源代码

1) 安装repo工具

Android源代码有很多工程组成,这些工程的源代码大多都用git管理,而repo工具用于管理这多个git工程,可用于同步源代码

下载Repo放到常用命令的目录 :

1
2
$curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$chmod a+x ~/bin/repo

如果~/bin/repo不是你的常用脚本目录,你需要在~/.bashrc里添加export PATH = $PATH:~/bin,将其添加到系统路径

2) 用repo初始化工作目录

新建一个存放源代码的工作目录,比如~/Cyanogenmod

1
2
3
$mkdir ~/Cyanogenmod 
$cd ~/Cyanogenmod
$repo init -u git://github.com/CyanogenMod/android.git

如果想使用默认分支之外的其它分支可以:

1
$repo init -u git://github.com/CyanogenMod/android.git -b cm-10.2

Cyanogenmod源码分支名字可在github上查询CyanogenMod下android工程的分支即可,网址:https://github.com/CyanogenMod/android

如果想使用Android官方源码:

1
$repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 

Android官方源码分支查询网址:http://source.android.com/source/build-numbers.html

初始化时会提示输入你的真名和邮箱

注意事项:

默认情况下,访问Android源码是匿名的,为了防止下载服务器压力过大,下载服务器对每个ip都有下载限制。如果和别人共享一个公网IP(和别人共享路由器时,便是如此),Android源码服务器便会阻止多人同时下载,容易报错。为了解决该问题,需要使用带授权的访问,源码服务器此时对用户进行限制,而不是对ip进行限制。方法如下:

先创建密码:the password generator

该地址也经常无法访问,需多次尝试(可相隔几分钟),若使用代理,就没法获得有用的密钥

再将密码保存在~/.netrc里

然后强制使用带授权的访问:

1
$repo init -u https://android.googlesource.com/a/platform/manifest

在国内用repo初始化时,会经常遇到101的错误,因为有墙的原因,重试多次,运气好时便可以完成,设置代理的话会更顺利一点

3) repo sync卡死问题

在工作目录里使用repo sync同步代码,期间可能会多次卡死,需要ctrl+z,然后杀掉进程,然后再次使用repo sync,因为其支持断点续传,不需要担心会从头开始下载 还可以开启多个进程同时下载,使用repo sync -j4

4.编译源代码

初始化编译环境

1
$source build/envsetup.sh

选择一个目标设备,以cm下编译htc one为例

1
$lunch cm_m7ul-eng

此时会从网站下载m7ul的device配置以及内核源代码

所有目标设备的格式为BUILD-BUILDTYPE, BUILD是选择的目标设备,比如cm_m7,而BUILD_TYPE是eng,user或者userdebug

user: 适合发布产品时使用,访问受限

userdebug: 和user类型类似,有root权限和调试能力,适合调试

eng: 开发配置,有额外的调试工具

编译源代码:

```bash $mka ```

5.总结

1) 介绍了Cyanogenmod是什么 2) 分成多个步骤介绍Android源代码的编译, 首先准备编译环境,然后下载源代码,最后编译

6.博客计划

讲述编译原理,详解编译的三个步骤:

1) source build/envsetup.sh 到底做了什么,才使得接下来可以编译,是不是还有更多有价值的东西

2) lunch cm_m7ul-eng, 这个过程发生了什么,为什么每次都需要花很长时间

3) mka, 具体怎么执行的

¥打赏5毛

取消

感谢您的支持,我会继续努力的!

扫码支持
赏个5毛,支持我把

打开支付宝扫一扫,即可进行扫码打赏哦

本篇目录