Android源代码开发入门指南
在整篇入门指南中你将学会如何建立你的本地开发环境,以及如何使用Repo来获得Android源码,并且可以学会如何在你的机器上编译代码。因为当前Android的源代码并不支持在Windows系统下编译,它仅支持在LInux和Mac OS系统下编译,这里我们推荐你使用Ubuntu操作系统。提示:下载的源代码大约占6GB的空间。并且你需要25GB的磁盘空间来进行单独编译,如果你要进行整体编译你可
在整篇入门指南中你将学会如何建立你的本地开发环境,以及如何使用Repo来获得Android源码,并且可以学会如何在你的机器上编译代码。因为当前Android的源代码并不支持在Windows系统下编译,它仅支持在LInux和Mac OS系统下编译,这里我们推荐你使用Ubuntu操作系统。
提示:下载的源代码大约占6GB的空间。并且你需要25GB的磁盘空间来进行单独编译,如果你要进行整体编译你可能需要大约80GB的磁盘空间。
一、初始化编译环境
建立Linux编译环境
这里有两种安装Ubuntu系统的方案可以使用:
- 在你的硬盘上安装Ubuntu系统
- 在虚拟机上安装Ubuntu系统(如果您想在虚拟机上安装Ubuntu系统并编译Android源代码的话,你至少需要16GB的RAM/swap和多于30GB的磁盘空间。)
通常你需要安装的工具如下:
-
Python 2.4 -- 2.7,你可以在python.org网站下载。
-
如果你想编译的是Android 2.3 Gingerbread 或者更新的版本 4.0 ICS 的话需要使用JDK 6;如果你想编译的是Android 2.2 Froyo 或者更旧的版本话需要使用JDK 5。你可以在java.sun.com网站下载。
-
Git 1.7或者更新的版本。你可以在git-scm.com网站下载。
安装JDK
Sun JDK并不在 Ubuntu的主包库中。为了下载它,你需要添加相应的库,并且指明系统应该使用哪个JDK。
Java 6:2.3以上
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
Java 5:2.2以下
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse"
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-updates main multiverse"
$ sudo apt-get update
$ sudo apt-get install sun-java5-jdk
安装需要的包
64位系统(推荐)
$ 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 python-markdown \
libxml2-utils
在最新的Ubuntu系统中(例如11.10)你可能还需要做下面的事情:
$ sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so
32位系统(试验中)
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev \
libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown \
libxml2-utils
配置USB访问权限
在Ubuntu系统下,常规用户默认不能直接访问USB设备。你需要去配置系统允许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/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on maguro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
这些新规则将在下一次设备插入的时候生效。如果你之前插入设备的话,你可能需要拔下设备再重新插上。
Setting up ccache
You can optionally tell the build to use the ccache compilation tool. Ccache acts as a compiler cache that can be used to speed-up rebuilds. This works very well if you do "make clean" often, or if you frequently switch between different build products.
Put the following in your .bashrc or equivalent.
export USE_CCACHE=1
By default the cache will be stored in ~/.ccache. If your home directory is on NFS or some other non-local filesystem, you will want to specify the directory in your .bashrc as well.
export CCACHE_DIR=<path-to-your-cache-directory>
The suggested cache size is 50-100GB. You will need to run the following command once you have downloaded the source code.
prebuilt/linux-x86/ccache/ccache -M 50G
This setting is stored in the CCACHE_DIR and is persistent.
二、下载源代码
安装 Repo
Repo是一个使得更容易在Android中使用Git工作的工具。关于Repo的更多信息,请参阅版本控制。
按照下列几步来安装、初始化和配置Repo:
-
确保在你的home目录下有bin/目录,并且在主目录下引用它:
$ mkdir ~/bin $ PATH=~/bin:$PATH
-
下载Repo脚本并且确保它是可执行的:
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo $ chmod a+x ~/bin/repo
-
校验Repo的SHA-1码是否为e1fd3bef059d152edf4d0522590725d317bc637f
初始化Repo客户端
安装完Repo后,建立你的客户端去获取android的代码仓库:
-
创建一个空的目录(随便起一个你喜欢的名字)来保存你的代码文件:
$ mkdir WORKING_DIRECTORY $ cd WORKING_DIRECTORY
-
运行
repo init来获取最新的bug修复版本的Repo代码仓库。
你必须为这个清单指定一个URL,指定在Android源代码的哪些代码库将放置在你的工作目录中。$ repo init -u https://android.googlesource.com/platform/manifest
你可以使用-b来查看主分支外的其他分支。
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
-
当有提示时,请用你的真实名字和电子邮件地址来配置Repo。为了使用Gerrit代码review工具,你将需要一个在Google账户注册的电子邮件地址。 确保这是一个你能接收信息的地址。你的名字会显示在你提交代码的属性中。
初始化成功后将会显示Repo is initialized in your working directory的信息。在你本地的目录中,应该已经包含了保存清单的.repo的目录。
获得文件
从代码库中下载文件到你的工作目录,运行如下命令
$ repo sync
Android源代码将会按照项目名放在你的工作目录中。第一次同步操作将会花一个多小时才能完成。更多关于repo sync和其他repo的命令,可以查看版本控制。
验证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
三、编译和运行
编译系统
编译命令的基本顺序如下:
初始化
用envsetup.sh初始化环境。注意替换"source"为一个点来执行脚本。
$ source build/envsetup.sh
或者
$ . build/envsetup.sh
选择一个目标
用lunch选择编译目标。确切的配置可以作为一个参数传递,例如
$ lunch full-eng
上面是一个为模拟器完全编译的的例子,所有的调试功能都已经启用。
如果在lunch后不加启动参数的话,将会让你从菜单中选择目标。
所有的编译目标都从BUILD-BUILDTYPE中取出,BUILD是一个有着特殊特性集合的研发代号:
Build name | Device | Notes |
---|---|---|
full | emulator | 所有语言、程序、输入法的完整配置 |
full_maguro | maguro | 运行在Galaxy Nexus GSM/HSPA+ ("maguro")上的完全编译 |
full_panda | panda | 运行在PandaBoard ("panda")上的完全编译 |
还有BUILDTYPE是下列项的:
Buildtype | Use |
---|---|
user | 有限的访问权限;适合生产 |
userdebug | 与"user"相似,但有root权限和debug功能;更适合debugg |
eng | 附加额外的调试工具的开发设置 |
更多关于为运行在实际硬件的编译信息,请查看为设备编译。
编译代码
使用make来编译全部代码。GNU的make可以使用-jN参数处理并行任务,很常见的使用N的方式是把它介于使用编译的计算机硬件进程的1和2的倍数。例如在一个dual-E5520机器(双4核CPU,每核心2个线程),最快的编译命令是make -j32和make -j16。
$ make -j4
运行它!
你可以运行你编译完的代码在一个模拟器上或者刷入设备。请注意,您已用lunch选择编译目标,最好不要运行在不是你编译目标的设备上。
刷写一个设备
为了刷写设备,你需要使用fastboot工具,并且包括一个成功编译后的目录。首先将设备调至fastboot模式,可以通过手动按下响应的组合键或者在shell命令行输入
$ adb reboot bootloader
如果设备已经运行在fastboot模式,执行
$ fastboot flashall -w
-w 选项是在设备上擦除/data分区;这对你第一次刷写一个特定设备是很有帮助的,但在其他情况并不必要的。
更多关于建立和运行于实际的硬件的信息,请查看为设备编译。
模拟一个Android设备
这个模拟器是由编译过程自动添加到你的路径里。运行模拟器,敲入下列命令
$ emulator
使用ccache
ccache是一个为C和C++的编译器缓存,它可以帮助编译的更快。在源码树的根处,做到以下几点:
$ export USE_CCACHE=1
$ export CCACHE_DIR=/<path_of_your_choice>/.ccache
$ prebuilt/linux-x86/ccache/ccache -M 20G
你可以使用下列命令来观察ccache:
$ watch -n1 -d prebuilt/linux-x86/ccache/ccache -s
常见编译错误的解决方法
错误的Java版本
如果你正试图使用Java 1.6编译froyo或更早的版本,或者使用Java 1.5编译gingerbread或更晚的版本,编译将会终止,并产生如下的信息:
************************************************************
You are attempting to build with the incorrect version
of java.
Your version is: WRONG_VERSION.
The correct version is: RIGHT_VERSION.
Please follow the machine setup instructions at
http://source.android.com/download
************************************************************
这可能是由下面几个原因导致的
-
在初始化那步中没有正确安装JDK。编译Android根据你编译的版本需要Sun JDK 5或6不同。
-
你之前安装的另一个JDK出现在你的路径中。你可以从你的路径中移除冲突的JDK:
$ export PATH=${PATH/\/path\/to\/jdk\/dir:/}
Python版本3
Repo是以Python 2.x为基础的特定函数,但不幸的是不兼容Pathon 3。为了使用Repo,请安装Pathon 2.x:
$ apt-get install python
没有USB权限
在大多数的Linux系统中,为授权的用户默认不能存取USB端口。如果你看见一个权限拒绝错误,按照第一步的初始化来设置USB的访问权限。
如果adb已经运行并且不能连接设备,你可以使用adb kill-server命令来杀掉adb。
这将导致adb使用新的配置重启。
更多推荐
所有评论(0)