在一切开始之前,先说一下达到的目标(以下的内容部分来自网络,部分为自己摸索得到),欢迎拍砖:
a)编译android源码
b)得到编译后的sdk
c)收集source以便在eclipse中查看android源码
e)编译adt插件
准备必要的软件包:
1 |
sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev sun-java6-jdk pngcrush schedtool |
1.先下载Google改进的使用git的Python脚本文件
1 |
git clone http://android.git.kernel.org/tools/repo.git |
2.使用repo初始化
1)初始化为下载所有版本的android源码
1 |
./repo/repo init -u git://android.git.kernel.org/platform/manifest.git |
2)初始化为下载指定版本的源码
1 |
repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo |
3.下载源码
1 |
./repo/repo sync |
4.编译源码
a.修改部分文件来消除指定的错误
在编译的过程中遇到下面的错误:
1 |
************************************************************ |
2
3 |
You are attempting to build on a 32-bit system. |
4
5 |
Only 64-bit build environments are supported beyond froyo/2.2. |
6
7 |
************************************************************ |
这是因为在Makefile中检测了CPU的字长。直接把build/core/main.mk中下面的话注释掉:
1 |
#ifneq (64,$(findstring 64,$(build_arch))) |
2 |
#$(warning ************************************************************) |
3 |
#$(warning You are attempting to build on a 32-bit system.) |
4 |
#$(warning Only 64-bit build environments are supported beyond froyo/2.2.) |
5 |
#$(warning ************************************************************) |
6 |
#$(error stop) |
7 |
#endif |
接下来又遇到下面的错误:
01 |
Docs droiddoc: out/target/common/docs/api-stubs |
02
03 |
Could not load‘clearsilver-jni’ |
04
05 |
java.library.path = out/host/linux-x86/lib |
06
07 |
make: *** [out/target/common/docs/api-stubs-timestamp] Error 45 |
08
09 |
make: *** Waiting for unfinished jobs…. |
10
11 |
Could not load‘clearsilver-jni’ |
12
13 |
java.library.path = out/host/linux-x86/lib |
14
15 |
make: *** [out/target/common/docs/doc-comment-check-timestamp] Error 45 |
这是由于clearsilver在编译时如果检测到使用Java JDK 6,就使用64位编译。要避开此错误,需要修改下面四个文件:
1 |
external/clearsilver/cgi/Android.mk |
2 |
external/clearsilver/java-jni/Android.mk |
3 |
external/clearsilver/util/Android.mk |
4 |
external/clearsilver/cs/Android.mk |
把这四个Makefile中的下列语句注掉即可:
1 |
# This forces a 64-bit build for Java6 |
2 |
# Comment by Easwy |
3 |
# LOCAL_CFLAGS += -m64 |
4 |
# LOCAL_LDFLAGS += -m64 |
当然也可以把64改为32!
若有此错误:
/media/master/external/webkit/WebCore/css/CSSParser.cpp:4533:undefined reference to `WebCore::CSSParser::lex()'
collect2:ld returned 1 exit status
则执行touchexternal/webkit/WebCore/css/tokenizer.flex
b)然后执行make-j2(因为我的电脑是双核,使用j2来加快编译速度,如果实在不知道电脑是几核的,那么执行:
1 |
make -j`grep '^processor' /proc/cpuinfo | wc -l`) |
要说明的是make -jn也不是万能的,如果你使用它出现了编译错误(例如由于什么不能生成什么,而不是缺少什么不能生成什么)的时候,最好只使用make
c)make编译完之后,当编译完成时,生成的image文件放在out/target/product/generic目录中,直接执行:
1 |
emulator -system system.img -data userdata.img -ramdisk ramdisk.img |
来启动一个编译成功的模拟器
d)生成sdk?执行make-j2 sdk
生成的sdk文件在源码顶层目录的out/host/linux-x86/sdk下:android-sdk_eng.archermind_linux-x86.zip.解压后跟从http://developer.android.com/sdk/index.html下载到的sdk并无二致,唯一的区别是我们编译好的sdk至少是含有一个版本的android,比如这个里面含有一个android2.3.3可以直接进行开发.
e)收集源码?collectsource?在源码的顶层目录的sdk/eclipse/scripts下有个collect_sources_for_sdk.py就是我们要找的,这个Python脚本要两个参数:一个是源码所在的顶层目录,一个是目标目录。
执行
1 |
./collect_sources_for_sdk.py <source_dir> <dest_dir> |
搞定!
f)生成ADT?这个比较变态的是:它在编译前先下载eclipse,并且还是3.4的,我勒个去,如果愿意编译的,自己去做吧!方法很简单:执行源码的顶层目录的sdk/eclipse/scripts下的build_plugins.sh
或者build_server.sh
源文档 <http://my.oschina.net/lcx2007/blog/29389>