在RH系列linux上编译android2.3(gingerbread)的过程如下:
官方源码及ubuntu编译过程在(http://source.android.com/source/index.html)。
前提:最好用主机编译,虚拟机的话内存越大越好,最好不低于2G,硬盘40G以上,cpu设定2个以上。即使这样也经常出现虚拟机失去反应导致崩溃。
android2.2以前默认用32位主机和jdk5, 2.3以后默认用64为主机和jdk6。 网上有说通过修订源码可解决此类问题,但是对源码的修改要尽量少。
本次使用的主机是Red Hat Enterprise Linux Server release 5.7 (64 bit)
可以预先安装一些工具如:jdk6,git-core,zip,curl gnupg flex bison gperf 等。剩下的库可以先不安装,编译的时候碰到再一次安装,具体的库参见附录的问题解决情况。
#####################################################
然后下载源码,时间较长,如果有源码可跳过此步,另外如果想要加快下载速度可以把url中的https替换成http (命令行和manifest中),另外注意源码路径跟2.2之前有变,以官网最新为准。
需要使用curl,repo和git。
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo #用curl下载repo工具
chmod a+x ~/bin/repo
repo init -u https://android.googlesource.com/platform/manifest -b gingerbread #初始化repo 下载gingerbread代码,没有b则下载主分支最新代码,应该是android4.x的
repo sync #正是下载源代码。
#######################################################
然后开始编译。
设置环境变量:
export USE_CCACHE=1 #启用编译缓存,多次编译可加速
进入源码根目录。执行
source build/envsetup.sh #增加lunch,m等新的命令
lunch full-eng #设定机型,默认是模拟器,全编译,开发版。无参启动查看并选择界面。
make -j4 #四个线程编译平台镜像,一般为cpu个数的1~2倍个线程,目标在out/target/product/generic目录下,此过程会删除sdk。
make -j4 sdk #编译sdk,目标在out/host/linux-86/sdk目录下,此过程会编译镜像。
在此过程会遇到许多问题,主要是库依赖问题,主要问题见下面.
##########################################################
GLIBC_2.11 not found
该问题是因为android用了eglibc2.11代替了glibc,eglibc兼容libc,但更加优化,我们可以编译eglibc(没有成功),或者尝试编译glibc2.11(没有成功)。
不过临时有更加简单的方法,安卓的gcc降级,如下:
prebuilt/linux-x86/toolchain/下arm-eabi-4.4.0 改为 arm-eabi-4.4.3
undefined reference to `typeinfo for android::SortedVectorImpl'
该问题是android根据后缀名去确定文件类型选用编译工具导致出错。解决办法如下:
修订system/media/opensles/libopensles/IAndroidEffect.c为cpp,并修订其mk文件
剩下的为依赖库安装 (直接用yum联网安装,安装的时候要注意,有的yum配置默认只安装x86_64的,可以通过后缀强制安装i386或者i686的):
stubs-32.h装glic-devel.i686
libz.so装libstdc++-devel.i686
lz装zlib-devel.i686
realine装readline-devel.i686
ncurse装ncurse-devel.i686
X11装libX11-devel.i686
GL装 mesa-libGL-devel.i686
#############################################################
编译完成后需要把$SDK下的tools和platform-tools都加入PATH路径,否则不能创建avd。模拟器也是一片漆黑。
然后执行android list查看api等级和创建的avd,目前avd为空。
android create avd -t 1 -n myavd #创建名字为myavd,1表示列出的第一个platfrom,也就是android-2.3.3
emulator -avd myavd 启动模拟器。
至此模拟器成功运行起来。
跑模拟器要在图形界面下~~~