在整篇入门指南中你将学会如何建立你的本地开发环境,以及如何使用Repo来获得Android源码,并且可以学会如何在你的机器上编译代码。因为当前Android的源代码并不支持在Windows系统下编译,它仅支持在LInux和Mac OS系统下编译,这里我们推荐你使用Ubuntu操作系统。

提示:下载的源代码大约占6GB的空间。并且你需要25GB的磁盘空间来进行单独编译,如果你要进行整体编译你可能需要大约80GB的磁盘空间。


一、初始化编译环境


建立Linux编译环境

这里有两种安装Ubuntu系统的方案可以使用:

  1. 在你的硬盘上安装Ubuntu系统
  2. 在虚拟机上安装Ubuntu系统(如果您想在虚拟机上安装Ubuntu系统并编译Android源代码的话,你至少需要16GB的RAM/swap和多于30GB的磁盘空间。
这里安装Ubuntu系统的方法不在此处详述,如果你不会安装的话,你可以参考百度的搜索结果。在你安装完系统后,就需要为编译代码安装一些相关工具。

通常你需要安装的工具如下

  • 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使用新的配置重启。



Logo

更多推荐