关于Android源码的获取、编译等,网上有很多的帖子解答,但其实都是基于官方网站说明来写的,算是汉化过程吧,因此如果帖子看的不明,可以上源码官网寻找答案。
http: //source.android.com/ |
下面是自己在Ubuntu 8.04系统下编译过程:
1.源码获取
可参照前面写的博客:http://www.cnblogs.com/playing/
1).获得官方Android源码 repo init -u git://android.git.kernel.org/platform/manifest.git -b gingerbread
2).获得CyanogenMod Android源码 repo init -u git://github.com/CyanogenMod/android.git -b gingerbread
(源码位置github里面的CyanogenMod项目 https://github.com/CyanogenMod)
3).获得三星Galaxy Android源码 repo init -u git://github.com/drakaz/android.git -b gaosp-gingerbread
(源码位于github里面drakaz项目 https://github.com/drakaz)
(因为自己要搞的手机是三星i7500 所以特别加了Galaxy Android,其实也是CyanogenMod 里面的一个分支吧)
2.安装下载编译时需要的工具环境
sudo apt-get install build-essential
sudo apt-get install make
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install libc6-dev
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install patch
sudo apt-get install texinfo
sudo apt-get install libncurses-dev
sudo apt-get install git-core gnupg //(gnupg系统可能已自带)
sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
sudo apt-get install ncurses-dev
sudo apt-get install zlib1g-dev
sudo apt-get install valgrind(可选,有21M大,我觉得一般人是用不到的)
sudo apt-get install python2.5 (实际上不用装,Ubuntu 8.04 已经自带)
sudo apt-get install sun-java6-jdk (或者 sudo apt-get install sun-java5-jdk)
(很多其实系统已经安装了,除了红色标注要安装外,其他编译时没有在安装吧....)
特别注意:
JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older (官方说明)
即在编译2.3之前的版本需要用JDK 5 ,2.3及2.3之后的版本用JDK6
3.编译源码
在命令行里面执行make命令:
$make
然后是漫长的等待......
编译成功后会在代码目录下多了一个out目录
可以看到命令行里面输出如下信息:
Install: out /target/product/generic/system/xbin/scp |
Notice file: system/extras/showmap/NOTICE -- out /target/product/generic/obj/NOTICE_FILES/src //system/xbin/showmap.txt |
Install: out /target/product/generic/system/xbin/showmap |
Notice file: system/extras/showslab/NOTICE -- out /target/product/generic/obj/NOTICE_FILES/src //system/xbin/showslab.txt |
Install: out /target/product/generic/system/xbin/showslab |
Notice file: external/sqlite/dist/NOTICE -- out /target/product/generic/obj/NOTICE_FILES/src //system/xbin/sqlite3.txt |
Install: out /target/product/generic/system/xbin/sqlite3 |
Notice file: external/dropbear/NOTICE -- out /target/product/generic/obj/NOTICE_FILES/src //system/xbin/ssh.txt |
Install: out /target/product/generic/system/xbin/ssh |
Install: out /target/product/generic/system/xbin/strace |
Notice file: system/extras/su/NOTICE -- out /target/product/generic/obj/NOTICE_FILES/src //system/xbin/su.txt |
Install: out /target/product/generic/system/xbin/su |
Install: out /target/product/generic/system/xbin/timeinfo |
Copy: out /target/product/generic/system/etc/apns-conf.xml |
Copying: out /target/product/generic/obj/NOTICE_FILES/src/kernel.txt |
Finding NOTICE files: out /target/product/generic/obj/NOTICE_FILES/hash-timestamp |
Combining NOTICE files: out /target/product/generic/obj/NOTICE.html |
gzip -c out /target/product/generic/obj/NOTICE.html > out /target/product/generic/obj/NOTICE.html.gz |
zip -qj out /target/product/generic/system/etc/security/otacerts.zip build/target/product/security/testkey.x509.pem |
Generated: ( out /target/product/generic/android-info.txt) |
Target system fs image: out /target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img |
Install system fs image: out /target/product/generic/system.img |
Target ram disk: out /target/product/generic/ramdisk.img |
Target userdata fs image: out /target/product/generic/userdata.img<span class = "Apple-style-span" style= "font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px; white-space: normal; background-color: #ffffff;" > </span> |
===================================================================================
后续编译:
往往我们会已经编译过了源码,但是会再次修改里面的某个文件,某个项目,这时候我们就可以单独编译了...
先在android目录下执行 |
$ . build/envsetup.sh |
然后你就会多出几个可用的命令。 |
例如,我们在改了Contacts联系人项目后,可以简单的执行一下命令来单独编译这个部分:
$mmm packages/apps/Contacts/
为了可以直接测试改动,需要生成新的system.img,在android目录下执行:
$ make snod
当然,如果你改动的是emulator或者其它外围相关的,而非系统内部的东西,就不只是要重新生成system.img了
=====================================================================================
4.测试运行
1)先设置环境变量:
打开~/.bashrc文件, 并在最后添加下面两行:
PATH=”$PATH:$HOME/android/out/host/linux-x86/bin”
ANDROID_PRODUCT_OUT=$HOME/android/out/target/product/generic
export ANDROID_PRODUCT_OUT
(就是配置你生成的out目录)
2)运行模拟器:
cd $HOME/android/out/target/product/generic
emulator -image system.img -data userdata.img -ramdisk ramdisk.img
如果最后能进入到系统并看到一个大时钟, 说明就大功告成了!!!!
5.编译过程出现的问题
如果你以为按照上面一步步做就能成功编译,那就想得太简单了,很多时候编译过程中会出现一些意想不到的错误,导致编译中断!不过还好,遇到的问题一般网上都是有解决方案的,只要搜索一下就ok了,下面是自己编译过程中遇到错误:
1.缺少工具,如g++
可通过 sudo apt-get install ... 来安装
2.Android编译时找不到stub-64.h的问题
把几个Android.mk中的 -m64 的地方给注释掉了,它们在这里: external/clearsilver/cgi external/clearsilver/java-jni external/clearsilver/util external/clearsilver/cs
这是用java6会出现这问题,如果用java5 应该就不会出现!
参考文章:http://www.webgou.info/content/programming/262/