1、编译android系统
1.1 准备工作
需要Sun JDK 1.6(Android 2.2版本需要Sun JDK 1.5)
$sudo apt-get install sun-java6-jdk
还需要安装一些其他的包:
$ sudo apt-get install gcc g++ flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev valgrind libreadline5-dev
$sudo apt-get install lib64z1-dev libc6-dev-amd64 g++-multilib lib64stdc++
1.2 修改源代码
这一步骤是针对32位系统的,如果你的机器是64位的,此步可以跳过,不用修改
修改原因:android高于froyo/2.2版本,需要在64位机器上编译。
修改内容:
1、~/android-2.3.4_r1/build/core/main.mk:
将76行的 “ifneq (64,$(findstring64,$(build_arch)))” 替换成 “ifneq (i686,$(findstring i686,$(build_arch)))”
2、
~/android-2.3.4_r1/external/clearsilver/cgi/Android.mk
~/android-2.3.4_r1/external/clearsilver/java-jni/Android.mk
~/android-2.3.4_r1/external/clearsilver/util/Android.mk
~/android-2.3.4_r1/external/clearsilver/cs/Android.mk
将以上四个文件中的
LOCAL_CFLAGS += -m64
LOCAL_LDFLAGS += -m64
修改为:
LOCAL_CFLAGS += -m32
LOCAL_LDFLAGS += -m32
1.3 编译过程
1. 切入源码目录(以~/android-2.3.4_r1为例)
$ cd ~/android-2.3.4_r1
2. $ . build/envsetup.sh
3. $ lunch
选择generic_eng(或generic_x86,应该只有其中一个)
4. $ make -j2 <注>:-j2 是选择2个线程同时编译(网上这么说的)
5. 坐等。
6. 编译完的系统在~/android-2.3.4_r1/out/target/product/...下
1.4 验证
在~/android-2.3.4_r1/out/target/product/generic目录下生成 userdata.img system.img ramdisk.img
2 编译 Android SDK
2.1 编译过程
1.切入源码目录
$ cd ~/android-2.3.4_r1
2.$ make PRODUCT-sdk-sdk
<注>:也可以使用 $make sdk 命令,“make PRODUCT-sdk-sdk” 命令是对“make sdk”的扩展,原因是使用“make sdk”时,不能自动生成R文件,必须手动生成。但有时使用“make sdk”也没有问题。
2.2 验证
编译完会在~/android-2.3.4_r1/out/host/linux-x86/sdk下,有一个zip文件和一个文件夹(相当于那个zip文件解压后的产物),例如:
android-sdk_eng.fanm_linux-x86
android-sdk_eng.fanm_linux-x86.zip
你需要拿走一个备份,不然你在做其他动作的时候很可能就会把sdk清空了,特别是编译ADT时,sdk这个目录就被清理没了。
2.3 可能出现的问题及解决方法
1、couldn't locate source file: usr/share/pc-bios/bios.bin
couldn't locate source file: usr/share/pc-bios/vgabios-cirrus.bin
注意,这里的usr/share目录指的是Android2.3.4/out/host/linux-x86目录下的usr/share目录
修改办法:复制Android2.3.4/prebuilt/common下的pc-bios文件夹到Android2.3.4/out/host/linux-x86/usr/share即可
2、找不到ddmlib-tests.jar、 ninepath-tests.jar 、common-tests.jar 和sdkuilib-tests.jar文件,可能还有其他类似的文件,不定,但修改方法一致
修改办法: 在Android2.3.4/out/host/linux-x86/framework这个目录下,可以找到以下几个文件common.jar、ddmlib.jar、ninepatch.jar、sdkuilib.jar这四个文件,然后将它们分别复制一份,并重命名,命名的原则很简单,就是在原有的名字后面跟上-tests即可
3 编译Android内核(此步可以不做)
3.1 准备过程
准备交叉编译工具:
到http://sourcery.mentor.com/gnu_toolchains
下载arm的交叉编译工具。不同的工具效果可能不同,甚至可能引起编译失败,但我并未对此做许多测试。我下载的是arm-2011.03-42-arm-none-eabi-i686-pc-linux-gnu.tar.bz2。
解压之后将之sudo cp到/usr/local目录下,(以/usr/local/arm-2011.03为例)
然后:
$ export PATH=$PATH:/usr/local/arm-2011.03/bin
另外还要看一下arm-2011.03/bin下的编译工具都是以什么开头的,如arm-none-eabi-,或者可能是arm-none-linux-gnueabi-等,将它记下来(下文用{CCPREFIX}表示)
3.2 编译过程
1. 切入Android内核源码目录(以~/android-kernel-src/common为例)
$ cd ~/android-kernel-src/common
2. 查看分支
$ git branch -a
3. 选择Goldfish中的最新版本,如android-gldfish-2.6.29
$ git checkout remotes/origin/archive/android-gldfish-2.6.29
4. 坐等。
5. $ make ARCH=arm CROSS_COMPILE={CCPREFIX} goldfish_defconfig
6. $ make ARCH=arm CROSS_COMPILE={CCPREFIX}
7. 坐等。
8. 编译完之后在内核源码目录下arch/arm/boot下生成了个zImage文件,就是内核文件,把它拿走备份即可。
4 编译ADT Eclipse Plugin
可以编译android源码自带的ADT,也可以编译其他版本的。以自带的为例:
4.1 编译过程
1. $ cd ~/android-2.3.4_r1/sdk/eclipse/scripts
2. 如果不事先设置好ECLIPSE_HOME环境变量的话,下一步的脚本就会自己尝试下载Eclipse Ganymede(一个好老的版本),反正我是没下载成功,估计又是涉及到代理的问题。所以最好是事先准备好一个,推荐Eclipse RCP & RAP Developers (Indigo),下载地址:http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/indigo/R/eclipse-rcp-indigo-linux-gtk.tar.gz
下载完后解压
3. $ export ECLIPSE_HOME=你的eclipse解压后的地址
4. $ ./build_server.sh ~/adt <注>: ~/adt 是你指定生成adt的目录,要事先创建好
4.2 验证
在~/adt目录里生存一个zip文件,就是插件文件,拿出来备份。例如:android-eclipse-v201110311437.zip
5 组装
1. 把你之前备份的SDK目录(zip文件的话解压出来一个目录)、内核文件和ADT插件准备好。
2. 打开Eclipse,选择help里的Install New Software,Add->archive->选择刚刚生成的ADT插件(android-eclipse-v201110311437.zip)->OK->Selct All->Next->...,把ADT装好。(如果安装过程发现很慢,可以把网线拔掉,这样会很快)
3. 打开Eclipse的Windows->Preferences,左边树状结构中找“Android”,然后指定SDK所在地址,这时应该会出现问题,点击Apply后目标平台列表里依然没有东西。
4. 遇到上述情况后,找到SDK根目录,把tools/和platform-tools/目录全都复制到platforms/android_2.3.5/下,把/platform-tools目录下的adb复制到/tools目录下,再次执行上述操作,问题应该已经解决。
5. 那么就可以点击Eclipse中的机器人图标,新建一个模拟器(很有可能右边一排按钮看不到,试着调整窗口大小,拉动中间的splitter,总会看到的),运行一下试试。
6. 没有问题之后尝试用我们自己编译的内核替换掉原配内核。打开SDK根目录下的platforms/android_2.3.5/images,把kernel-qemu文件备份,再把准备好的内核文件改名为kernel-qemu后放进去。(如果没有编译内核,这步可以跳过)
7. 重新运行这个机器,如果能正常启动,那么恭喜了。
8. 最后试着用Eclipse新建一个Android默认工程,运行在模拟器上,如果能正常运行,那么恭喜了。
也可以在命令行中运行模拟器:
$cd ~/android-2.3.4_r1/out/host/linux-x86/sdk/tools
$./emulator -system ~/android-2.3.4_r1/out/target/product/generic/system.img -data ~/android-2.3.4_r1/out/target/product/generic/userdata.img -ramdisk ~/android-2.3.4_r1/out/target/product/generic/ramdisk.img
还可以设置环境变量
export PATH=$PATH:/home/android-2.3.4_r1/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=/home/android-2.3.4_r1/out/target/product/generic/
设置完之后,可以在终端中运行模拟器:
$emulator