编译了个能在emulator里跑的ICS,写个总结。

总的过程就是按照官方的教程来的,从这个开始:http://source.android.com/source/initializing.html

先安装软件:

yaourt -S repo-git jdk6 ccache perl-switch downgrade
downgrade make

然后找一个3.81版本的make装上,因为据说3.82版的有bug。嗯,如果downgrade没有帮你找到,那你就自己找吧,找个旧mirror或者自己编译什 么的。或者你也可以用3.82版试试,因为官方报告的bug是Mac版本的make。如果Linux上的3.82版make没有问题请留个评论。

以上列出的软件包只是需要的一部分,视机器的情况请对照官方软件列表。

其中ccache不是必须的,但如果需要多次编译它可以帮助节省大量时间。如果只编译一次,可以不装。如果安装了ccache,在.bashrc中做如下设置:

export USE_CCACHE=1
export CCACHE_DIR=<path-to-your-cache-directory>
ccache -M 50G

还要做一件事情,把/usr/lib/python指向python2而不是默认的python3。虽然repo- git帮你把repo脚本里的python改成了python2,但编译到中间还是会错。用ln改就行了,我不写了。

JDK方面的问题,有Sun/Oracle JDK6和OpenJDK6两种选择(分别对应jdk6和openjdk6软件包)。编译时会对Java版本做检查,只有 Sun/Oracle版本的可以通过。我是用Sun/Oracle版本进行编译的。如果非要用OpenJDK版本,需要修改build/core/main.mk以跳 过Java版本检查。具体可以看这个帖子:

http://groups.google.com/group/android-building/browse_thread/thread/db94ca65bfc651a9

嗯,可是我们还没有源代码呢。先按照官方教程把源代码搞下来吧。具体步骤是:

  • 下载repo文件(这步省了,用repo-git里的就行)
  • 建立工作目录
  • repo init -u https://android.googlesource.com/platform/manifest
  • repo sync

然后就等吧。全部代码大概是6.2G,自行估算时间出去吃饭即可。哦如果不幸repo sync的时候卡死了或者没反应了kill掉重来即可,或者也可以手动删除有问题的git repository然后重来(repo不就是一堆git么……)。

比较好的情况是吃完回来发现下载完了。这时还有一处源代码要修改,在development/tools/emulator/opengl/host/rendere r/Android.mk文件中需要在LOCAL_CFLAGS += -O0 -g下面加上一行LOCAL_LDLIBS += -lX11,否则编译时出错。具体参见这个帖子:

http://groups.google.com/group/android-building/browse_thread/thread/833b0386f996f7de

然后终于可以开始build了:

. build/envsetup.sh
lunch full-eng
make -j2

刚开始编译时会有这个错误:

/bin/bash: line 0: cd: cts/tools/cts-native-xml-generator/src/res: No such file or directory

但这个无害,见:

http://groups.google.com/group/android-building/browse_thread/thread/35d7bcfa6a47b1b3

一般双核的机器-j2或者-j4就行。方才下载源代码是I/O-bound,你出去吃饭了,这次是CPU- bound,你可以去洗个澡。如果是用笔记本编译的话可以在盖子和键盘中间夹两袋牛奶,洗完澡就可以回来喝热乎的了。

编译期间系统负载很大,双核CPU几乎完全100%占用(所以才能热牛奶)。不过CPU好说,renice一下就不影响其他进程工作了。而内存消耗就比较囧,到最后2 G内存全部占满,而且swap也用了500多M,机器卡的不像样子。好在还是能搞定的。不过要编译ICS,最好还是有4G左右的内存吧。

编译之后生成的目标文件和应用程序大概是12G,ccache占用了3.5G。所以编译前至少要留30G的硬盘空间吧(别忘了源代码还有6.2G)。

最后运行emulator:

#!/bin/bash

export ANDROID_PRODUCT_OUT=~/android/out/target/product/generic
export PATH=~/android/out/host/linux-x86/bin:$PATH
emulator

上图两张:

ics-1.png

ics-2.png