转载: http://blog.youkuaiyun.com/sfezst/article/details/6220368
前期准备:
$ cd ~
$ mkdir mydroid
安装Java 6 (在之前的日志里写到过在Ubuntu上安装Java6,这里就不再记录)
安装好Git和curl, Ubuntu 下用apt-get安装:
sudo apt-get install git-core curl
用curl 下载repo
$ cd ~ && mkdir bin
# export PATH=$PATH:~/bin/
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ./bin/repo
下载android源代码
(这里以下载android 2.3的brunch分支上的代码为例)
$cd ~/mydroid
$repo init -u git://android.git.kernel.org/platform/manifest.git -b gingerbread
$repo sync
(可以使用repo 的-j参数来增加下载线程,比如repo sync -j 10)
下载完后,编译 HOW TO BUILD ON 32-BIT SYSTEM
(因为android 2.2以上Google是用64位的机子编译的,所以对一些mk文件做了修改,如果想在32位机子上编译,需要作如下修改:
1.
$ find . -name '*.mk' | xargs sed -i 's/-m64//g'
//这一步用来删除当前目录下(包括子文件)中包行的-m64字段 或者也可以手工修改 {
external/clearsilver/cgi/Android.mk,
external/clearsilver/java-jni/Android.mk,
external/clearsilver/util/Android.mk,
external/clearsilver/cs/Android.mk
change
LOCAL_CFLAGS += -m64
LOCAL_LDFLAGS += -m64
to
LOCAL_CFLAGS += -m32
LOCAL_LDFLAGS += -m32
$ export TARGET_BUILD_VARIANT=user
修改 build/core/main.mk 注释一下内容
ifneq (64,$(findstring 64,$(build_arch)))
$(warning ************************************************************)
$(warning You are attempting to build on a 32-bit system.)
$(warning Only 64-bit build environments are supported beyond froyo/2.2.)
$(warning ************************************************************)
$(error stop)
endif
)
$ . build/env_setup.sh
$ lunch
(选择需要的编译目标)
$ make
(我试着用make -j2去编译,但是因为运行移动硬盘上的虚拟机,最后卡死,无奈之下只能用make).
编译完后,会生成
Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
Install system fs image: out/target/product/generic/system.img
Installed file list: out/target/product/generic/installed-files.txt
可以将system.img和ramdisk.img拷贝到SDK的images/目录中,然后启动模拟器测试。
或者用sdk中的 emulator运行,还需要做如下修改:
- export PATH=$PATH:~/Android/mydroid/out/host/linux-x86/bin
- export ANDROID_PRODUCT_OUT=~/Android/mydroid/out/target/product/generic/
- ln -sf /home/smrdn/Android/mydroid/prebuilt/android-arm/kernel/kernel-qemu /home/smrdn/Android/mydroid/out/target/product/generic/
FAQ:
issue "host C: libclearsilver-jni <= external/clearsilver/java-jni/j_neo_util.c
In file included from /usr/include/features.h:378,
from /usr/include/string.h:26,
from external/clearsilver/java-jni/j_neo_util.c:1:
/usr/include/gnu/stubs.h:9:27: error: gnu/stubs-64.h: 没有那个文件或目录
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libclearsilver- jni_intermediates/j_neo_util.o]错误"
How to fix:
sudo apt-get install lib64z1-dev libc6-dev-amd64 g++-multilib lib64stdc++6
Issue: make: *** No rule to make target `out/debug/host/linux-x86/pr/sim/obj/lib/libdl.so', needed by `out/debug/host/linux-
x86/pr/sim/obj/SHARED_LIBRARIES/libnfc_intermediates/LINKED/libnfc.so'. Stop.
frameworks/base/media/libmedia/MediaScanner.cpp: In function ‘bool android::fileMatchesExtension(const char*, const char*)’:
frameworks/base/media/libmedia/MediaScanner.cpp:84: error: invalid conversion from ‘const char*’ to ‘char*’
frameworks/base/media/libmedia/MediaScanner.cpp:90: error: invalid conversion from ‘const char*’ to ‘char*’
make: *** [out/debug/host/linux-x86/pr/sim/obj/SHARED_LIBRARIES/libmedia_intermediates/MediaScanner.o] Error 1
make: *** Waiting for unfinished job.
>> add (char*) strrchr
$ find . -name '*.cpp' | xargs sed -i 's/strrchr/(char*)strrchr/g'
不过之后还需要将*Q_strrchr被错误修改为*Q_(char*)strrchr做修改,不太了解sed的具体用法
or 需要将gcc编译环境设置为4.3版本,否则会出现const char* 到 char*无法转换的问题。
参考:
1. http://www.android123.com.cn/kaifafaq/801.html
2. http://blog.youkuaiyun.com/tuhuolong/archive/2010/12/16/6079661.aspx
3. http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/