纸上得来终觉浅,绝知此事要躬行。
从事Android开发两年多,在公司里用的都是平台提供上提供的源代码,终于有一天自己准备彻彻底底的滤一下这个流程,发现这个过程没有想象中那么复杂,网上的资料很多,遇到一些问题的时候就google或baidu一下,但当做完这个过程后,会感觉明了了不少。
一、下载源代码
GOOGLE网站已经介绍的非常详细了,参考 http://source.android.com/source/downloading.html
讲的非常详细,安装repo和repo客户端,想说一下自己的下载技巧。
自己是第三次才下载成功的,开始两次直接repo sync,但有时候发现在一个某过程中进度20%多的时候就停住了,一天都没有动静,然后就断掉重新repo sync,几天都没有效果。做后使用多线程 repo sync -j 64, 够狠吧,呵呵,一晚上就下载了6G多,断掉一次,又重新repo sync了一次,ok。
内核要单独下载:参考http://blog.csdn.net/luoshengyang/article/details/6564592
二、编译
1. 用的是ubuntu12.04,默认gcc和g++是4.6的,要切换成4.4的,方法:
sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib
sudo mv gcc gcc.bak
sudo ln -s gcc-4.4 gcc
sudo mv g++ g++.bak
sudo ln -s g++-4.4 g++
用gcc -v 查看gcc版本。
2. 判断java版本
编译要用1.6的,但我装得是1.6.0.7,所以修改 build/core/main.mk,注释掉判断脚本时退出的语句
3. host Prebuilt: monkeyrunner (out/host/linux-x86/obj/EXECUTABLES/monkeyrunner_intermediates/monkeyrunner)
host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp
<命令行>:0:0: 错误: “_FORTIFY_SOURCE”重定义 [-Werror]
<built-in>:0:0: 附注: 这是先前定义的位置
cc1plus:所有的警告都被当作是错误
改正:
修改build/core/combo/HOST_linux-x86.mk 61行,将
HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
修改成
HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
Android源码换服务器了,具体的看http://source.android.com/source/downloading.html
4. external/oprofile/libpp/format_output.h:94:22: 错误: reference ‘counts’ cannot be declared ‘mutable’ [-fpermissive]
解决办法:
external/oprofile/libpp/format_output.h
把:
mutable counts_t & counts;
改为:
counts_t & counts;
5. cts/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java:191: android.app.Activity 中的 onCreateDialog(int,android.os.Bundle) 无法实现 com.android.cts.verifier.PassFailButtons.PassFailActivity 中的 onCreateDialog(int,android.os.Bundle);正在尝试指定更低的访问权限;为 public
private static <T extends android.app.Activity & PassFailActivity>
解决方法:
cd cts;
将Android.mk中的
#include cts/CtsTestCoverage.mk
#include $(call all-subdir-makefiles)
注释掉。
也就是不在编译cts模块,后面要修改过来,因为有时候还是要cts测试的。
最后,mage_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
显示编译成功
添加PATH,
export PATH=$PATH:~/Android/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=~/Android/out/target/product/generic
然后,执行emulator,启动模拟器