我的Android开发环境是在OS X搭建的,本来想按照官网上的配置在Mac上编译Android,但是因为Xcode版本很高,编译Android 4.1.1要求Xcode是4.x版本,但是我的是6.4的,所以总是出现奇怪的错误,比如xxx行有问题等等。所以,果断安装Ubuntu虚拟机。
具体的步骤不再赘述,官网上有,地址是:编译、运行Android。要翻墙,可以看我的博文:只要按照官网的步骤一步步来,编译基本不会遇到问题。我在编译过程中只遇到了两个问题,下面会详细描述。
注意事项
有些地方需要注意,仔细看官网的描述。
1.要编译2.3及以后的版本,就必须使用64位系统。
2.官网上某些要求并非是必须的,比如我没有配置Initialing Build Environment的Using a separate output directory这一节,也没有配置Building and Running的Using Cache这一节,按照需求进行选择。
3.在Initialing Build Environment的Install JDK这一节中,开始时要求在Ubuntu安装OpenJDK Java7来编译master分支上的版本。但master分支上的版本一般不稳定,是最新版本的。因此,一般研究源代码都会选择其他分支,比如我选择的是4.1.1_r3。所以,不能在Ubuntu上安装OpenJDK7来编译4.1.1。在这一节的最后会有:
To develop older versions of Android, download and install the corresponding version of the Java JDK:
Java 6: for Gingerbread through KitKat
Java 5: for Cupcake through Froyo
也就是说,要编译Android的旧版本(非master分支上的版本),就按照需要下载相应的Sun JDK。根据Android版本对照表(访问需翻墙),Cupcake是Android 1.5,Froyo是Android 2.2x,Gingerbread是Android 2.3,KitKat是Android 4.x。我要编译4.1.1,所以在Gingerbread到KitKat之间,因此需要安装Sun Java6。
4.在Building and Running的Choose a Target一节中,使用lunch命令来配置一些变量,可以给其加上命令参数,也可以不加。我建议不加,运行之后根据需要选择相应的目标机。官网上给出的lunch命令的参数与我在编译Android 4.1.1时运行lunch时的参数不同。
5.在Building and Running的Building the Code一节中,可以使用make -jN命令来指定使用N个线程同时编译代码。官网推荐将N设置为机器CPU可以同时处理的线程的1至2倍,比如机器有2个CPU,每个CPU有4核,每个核支持双线程,那么机器可以同时处理242=16个线程,这16个线程是真正的并行,因此,N可以设置为16至32。当然,N还要根据内存的大小做相应的调整。我虚拟机配置的单CPU,2核,每个核支持单线程,内存4G,我将N设置为8,虽然感觉比较卡,但主机还能正常浏览网页,编译过程也很顺利。
遇到的问题
1.错误提示类似:You may want to install switch module perl
要安装Perl的Switch模块,Ubuntu下使用命令:
sudo apt-get install libswitch-perl
安装完成后,继续make -jN。
2.错误提示类似:make * out/target/common/docs/api-stubs-timestamp error 45**
根据Google的结果,这是build/core/droiddoc.mk文件中有命名冲突,按照下面的步骤修改:
vi xxx/build/core/droiddoc.mk # xxx/是你的Android源码所在的根目录
在文件中查找类似下面的两行,可能不完全一样:
@echo Docs droiddoc: $(PRIVATE_OUT_DIR)
$ mkdir -p $(dir $(full_target)) 就是加粗的$(full_target)变量与出错了,把第二行修改为:
$(hide) mkdir -p $@
修改完之后,保存并退出编辑器,继续make -jN。
3.当源码顺利编译完成之后,按照官网上的步骤,下面就要执行命令:
emulator
来启动Android模拟器了,但是我执行之后提示“emulator: Command not found”。可以执行下面的命令来启动模拟器:
cd <your-android-source-root-directory>/
. build/envsetup.sh #注意,点”.”与build/envsetup.sh之间有空格
#lunch的参数因需而异。这里的参数必须与之前编译之前运行lunch命令时的参数要一致。
lunch 1
emulator #这次就可以顺利运行Android模拟器了。
参考文献
4.解决问题3的方法——《Android的设计与实现 卷I》 第一章第1.5.2节第2小节的步骤3 运行模拟器,在第18页。