原文:http://www.adaiw.com/?p=167
1 准备开发环境
下载sun-java6-jdk (NOT openjdk6)
REF:http://source.android.com/source/initializing.html
注意安装包,并连接libGL:
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \ libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \ libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos \ python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
如果其它apt-get下载提示找不到包,就更新:source.list
如果apt-get 遇到407 Proxy Authentication Required ,那么修改 /etc/apt/apt.conf
1 2 3 4 | Acquire::http::proxy "http:///username:passwd@proxy:port/"; Acquire::https::proxy "https:///username:passwd@proxy:port/"; Acquire::ftp::proxy "ftp:///username:passwd@proxy:port/"; Acquire::socks::proxy "socks://username:passwd@proxy:port/"; |
2.下载最新源码
http://source.android.com/source/downloading.html
准备好13G以上的硬盘空间。
3 新建REPO/GIT branch
有了代码的第一需求,就是建一个GIT,REPO已经提供了这样的命令,帮助新建一个GIT分支:$repo start BRANCH PROJECT 这里PROJECT指的是源码根下面分的很多小项目,这些分例如:
1 2 3 | $repo start oozicLauncher packages/apps/Launcher2/ $cdpackages/apps/Launcher2/ $git status |
这下可以安心的修改源码了。呵呵呵呵
REF:http://source.android.com/source/version-control.html
4 编译源码
开4个线程MAKE:(官方推荐线程数是CPU数目加2)
$make -j4
遇到问题:
ERROR: prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/bin/x86_64-linux-gcc only run on 64-bit linux
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/emulator64-target-arm_intermediates/tcg/tcg.o] Error 1
make: *** Waiting for unfinished jobs….
产生的原因是我的UBUNTU是32位的,要求64位。
牛人给了一个解决方法: external/qemu/Makefile.common externalqemu/Makefile.target 中关于-m64改为-m32
继续编译,紧接又遇到一个问题:android “error: gnu/stubs-64.h: no such file or directory 产生原因仍然是要64位系统
继续编译, 这次/out/target/product又编不过去了。
好吧,按官方的来,重装一个64位系统。
选择12.04LTS,下载ISO后,用pendrive生成USB安装盘。
开机选USB启动。
安装好后,GOTO STEP 1
5 在Ubuntu12.04下编译的问题:
make: *** [out/host/linux-x86/obj/ <wbr><span style="border:0px; font-family:inherit; font-style:inherit; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(255,0,0)">EXECUTABLES/emulator64-</span><br><span style="border:0px; font-family:inherit; font-style:inherit; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(255,0,0)">arm_intermediates/emulator64-</span><wbr><span style="border:0px; font-family:inherit; font-style:inherit; margin:0px; outline:0px; padding:0px; vertical-align:baseline; color:rgb(255,0,0)">arm] error 1</span></wbr></wbr>
原因是Ubuntu12.04装的是GCC4.6,编译ICS要用GCC4.4. Ubuntu11.10也有同样的问题。这样解决:
1 2 3 | $sudo apt-get install gcc-4.4 g++-4.4 $lunch $make CC=gcc-4.4 CXX=g++-4.4 |
经过中间机子卡死,按Ctrl+C停止,并重编后,终于完成编译。
用$emulator 看到熟悉的界面
参考
6 编译SDK
$make PRODUCT-sdk-sdk
7. 使用编译好的SDK
unzip out/host/linux-86/sdk/android-sdk_eng.herbertdai_linux-x86.zip
在Eclipse用使用这个新SDK。
遇到一个问题:显示SDK版本为Preview,并提示错误:
需要在AndroidManifest.xml 添加 minSdkVersion=”AOSP”。
然后也不能跑在设备上,设备的版本是4.0.3,version 15, 提示与AOSP不兼容。
这位高人给出解答:
http://www.qkevin.com/archives/257
原来下载最新的源码都默认
PLATFORM_VERSION_CODENAME := AOSP 相当于一个当前正在开发的版本,即Preview版,不是正式版。
按他的方法, 我把 build/core/version_defaults.mk 中的PLATFORM_VERSION_CODENAME改为:
If this is a final release build, it is simply “REL”.
PLATFORM_VERSION_CODENAME := REL
PLATFORM_VERSION_CODENAME := REL
再运行:
$make CC=gcc-4.4 CXX=g++-4.4
$make PRODUCT-sdk-sdk
成功。
这次的SDK显示版本为15, 而非“AOSP”。现在程序就可以正常跑在设备上了。
PS 如果要修改源码中字段的@hide属性,需要运行:
$make update-api
GOOGLE这样做,一是为了封闭其内部的一些属性和方法,防止外部程序乱用,二是隐藏一些正在开发中的组件,等成熟后再去掉@hide属性。