初始化编译环境 http://blog.csdn.net/snowolf_538/article/details/6697336
近日,下载了ANDROID的源码尝试进行编译,故针对其过程,根据Google的官方说明,进行一次翻译,其原始网址为http://source.android.com/source/index.html,本文只针对Linux环境下的步骤进行翻译。
注意:源代码的大小大概2.6G,至少需要10G的空闲空间来进行编译。(snowolf_538:我下载的Gingerbread总共大概占了近6个G)
注意:使用虚拟机Linux也是可以编译ANDROID源码的,但是需要至少8G的内存/交换空间和至少12G的硬盘空间。(snowolf_538:事实上,不理解此处为什么需要8G的内存/交换空间,我使用的是Ubuntu 11.04版本的虚拟机,只设置了1G的内存和2G的交换空间,编译没有问题)
通常来讲,需要:
- Python 2.4 -- 2.7,你可以从http://www.python.org/download/下载
- JDK6(如果编译Gingerbread或者更新的版本),JDK5(Froyo或者更老的版本),你可以从http://java.sun.com/javase/downloads/下载
- Git 1.5.4或者更新,你可以从http://git-scm.com/download下载
- (可选)Valgrind,一个可以帮助发现内存泄露、栈损坏和数组越界的工具,你可以从http://valgrind.org/downloads/current.html下载
以下步骤基于Ubuntu 10.04+
安装JDK
JDK不再在Ubuntu的主包库里面,所以需要根据ANDROID的版本号下载对应的JDK。
JDK6:Gingerbread或者更新
- $ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
- $ sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"
- $ sudo apt-get update
- $ sudo apt-get install sun-java6-jdk
(snowolf_538:上面的第二句执行时会报错,说是无效的地址,我实际使用的是sudo add-apt-repository "deb http://archive.canonical.com/ubuntu lucid parter")
JDK5:Froyo或者更老
- $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu dapper main multiverse"
- $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu dapper-updates main multiverse"
- $ sudo apt-get update
- $ sudo apt-get install sun-java5-jdk
安装必需的包
安装以下必需的包以建立完整的编译环境
- $ sudo apt-get install git-core gnupg flex bison gperf build-essential \
- zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
- x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \
- libgl1-mesa-dev g++-multilib mingw32 tofrodos
(snowolf_538:以上包安装时,其中lib32ncurses5-dev、ia32-libs、lib32readline5-dev和lib32z-dev无法找到,故使用libncurses5-dev、libreadline5-dev和libz-dev来代替,ia32-libs好像没有影响)
配置USB访问
在GNU/Linux系统下(特别是在Ubuntu系统下),一般用户默认不能访问USB设备,我们需要配置使其可以访问。
推荐的方法是用root用户创建/etc/udev/rules.d/51-android.rules文件,把以下的行拷贝到该文件中。<username>必须被替换成实际使用USB去访问手机的用户名。
- # adb protocol on passion (Nexus One)
- SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
- # fastboot protocol on passion (Nexus One)
- SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
- # adb protocol on crespo (Nexus S)
- SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
- # fastboot protocol on crespo (Nexus S)
- SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
这些规则将会在下一次设备插上的时候生效。
下载源代码 http://blog.csdn.net/snowolf_538/article/details/6697530
安装Repo
在ANDROID,Repo是一个用来使Git使用更方便的工具。想了解更多的Repo的信息,请参见http://source.android.com/source/version-control.html。
为了安装、初始化和配置Repo,需要以下步骤:
- 确保在你的主目录下有一个bin目录,并且其在你的PATH环境变量中
- $ mkdir ~/bin
- $ PATH=~/bin:$PATH
- 下载Repo脚本并确保其可执行
- $ curl https://android.git.kernel.org/repo > ~/bin/repo
- $ chmod a+x ~/bin/repo
repo的MD5校验为:bbf05a064c4d184550d71595a662e098
初始化Repo客户端
安装完Repo之后,建立客户端以便能访问ANDROID源码库。
-
创建一个空目录以存放工作文件
- $ mkdir WORKING_DIRECTORY
- $ cd WORKING_DIRECTORY
-
运行repo init以下载最新的repo版本
- repo init -u git://android.git.kernel.org/platform/manifest.git
当要CHECK OUT一个特定的分支而不是主分支时,使用-b选项
- $ repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo
-
当遇到提示时,请输入你的真实姓名和电子邮件地址
当成功下载完之后,你的工作目录下将创建一个.repo目录用来存放所有的manifest信息。
获取源代码
要下载ANDROID的源代码,使用以下命令
- $ repo sync
这将下载ANDROID的源代码到你的当前目录下面。最初的sync操作将需要几分钟时间(snowolf_538:事实上,取决于你的网速)。想了解更多的repo sync命令和其他repo命令的信息,请参考http://source.android.com/source/version-control.html
验证Git标签
装载以下公钥到你的GnuPG密钥数据库里。
- $ gpg --import
拷贝和粘贴以下的密钥,然后输入EOF(Ctrl+D)结束输入。
- -----BEGIN PGP PUBLIC KEY BLOCK-----
- Version: GnuPG v1.4.2.2 (GNU/Linux)
- mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
- lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
- 8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
- u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
- wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
- /HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
- jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
- MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
- b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
- aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
- cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
- gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
- 2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
- QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
- hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
- C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
- LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+
- OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
- pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
- KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb
- N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
- vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
- G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
- hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l
- EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
- =Wi5D
- -----END PGP PUBLIC KEY BLOCK-----
导入密钥之后,可以使用以下命令来验证
- $ git tag -v TAG_NAME
编译和运行 http://blog.csdn.net/snowolf_538/article/details/6698359
编译ANDROID系统的基本顺序如下,
初始化
使用envsetup.sh脚本来初始化环境。
- $ source build/envsetup.sh
或者
- $ . build/envsetup.sh
选择编译目标
使用lunch命令来选择编译目标。确切的配置可以作为参数传进去,如:
- $ lunch full-eng
上面的例子是一个针对emulator的完整的编译,包括所有的调试信息都是使能的。
如果不带参数运行lunch,将会提示选择编译目标。
所有的编译目标使用BUILD-BUILDTYPE的格式来指定,其中BUILD指向一个特定的功能组合,如下所示:
Build Name | Device | Notes |
---|---|---|
generic | emulator | 一般普通的配置 |
full | emulator | 完整配置,包括所有的语言、应用和输入法 |
full_crespo | crespo | 完整配置,运行在Nexus S("Crespo") |
BUILDTYPE是下列之一:
Buildtype | Use |
---|---|
user | 有限制的访问,适合于产品 |
userdebug | 和user相似,但是有root访问和调试能力,适合于调试 |
eng | 开发配置,包含额外的调试工具 |
关于更多为在实际设备上运行编译的信息,请参考http://source.android.com/source/building-devices.html
编译代码
使用make来编译代码。GNU make能够使用-jN参数来指定并发任务数,通常来说N的取值是计算机上准备用来进行编译的硬件核心的1到2倍。例如,在双E5520的机器上(2个CPU,每个CPU有4个core,每个core有2个thread),最快速的编译可以指定为make -j16或者make -j32。
- $ make -j4
(snowolf_538:我在四核的机器上面指定make -j8,确实很快,4个核心都跑到100%)
运行
你可以在emulator上运行或者把它烧进实际的设备中运行。请注意你已经通过lunch选择了编译的目标,最好不要在一个不同的平台上运行。
烧进设备
我们使用fastboot来烧进设备。首先把设备置于fastboot模式,这可以通过按住特定的按键组合来实现,也可以通过以下shell命令。
- $ adb reboot bootloader
一旦设备处于fastboot模式,运行
- $ fastboot flashall -w
-w选项将擦除设备上的/data分区,这在第一次烧进设备的时候有用,但以后就不需要了。
关于更多为在实际设备上运行编译的信息,请参考http://source.android.com/source/building-devices.html
模拟ANDROID设备
emulator将会在编译过程中自动添加到你的PATH路径里,运行
- $ emulator