一直热衷于Android底层的实现原理,所有想编译一把源码并刷机,或者DIY Android系统,经过几天的折腾,今天终于看到自己编译的源码在模拟器中运行,特写下此文以纪念。


本文分为以下三部分:

一、源码下载

二、源码编译

三、模拟器运行


第一部分:源码下载

大家都知道从google下载源码是多么的困难,以至于等到天荒地老发现还没有下完,具体如何从google下载源码,http://source.android.com/中有详细的说明,别忘了挂代理或者自己买个VPN。


我编译的源码不是自己从google爬取的,而是拿了别人的劳动成果,直接在百度网盘下载的,感谢这位兄弟的奉献(),百度网怕地址:http://pan.baidu.com/s/1ngsZs


我下载的Android4.4版本,源码是完整的。


二、源码编译

Ubuntu版本:14.04,64bit。


环境准备:http://source.android.com/source/initializing.html,这里有详细的说明,不过我还是想把自己的运行环境说明一下。

1. JDK1.6,编译需要JDK1.6的环境,并且配置好环境变量,包括当前用户以及系统环境变量。

当前用户环境变量配置如下:

# JDK-6
 export JAVA_HOME=/usr/lib/jvm/jdk-6-sun/jdk1.6.0_45
 export JRE_HOME=${JAVA_HOME}/jre # CLASSPATH
 export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:${JAVA_HOME_7}/lib:${JRE_HOME_7}/lib
  # PATH
 export PATH=${JAVA_HOME}/bin:${ADB_HOME}:$PATH
系统环境变量配置如下:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/jvm/jdk-7-sun/bin:/home/xxx/android-sdks/platform-tools:/usr/lib/jvm/jdk-6-sun/jdk1.6.0_45/bin"


JDK安装多个版本的配置:

通过命令行安装JDK:


sudo update-alternatives --install /usr/bin/java java /usr/lib/java/jdk1.6.0_41/bin/java 300 
 
  sudo update-alternatives --install /usr/bin/javac javac /usr/lib/java/jdk1.6.0_41/bin/javac 300



安装后执行:


update-alternatives --config java


选择需要运行的JDK。

2. 编译环境配置


主要是参考source.build中的配置,


Installing required packages (Ubuntu 14.04)

You will need a 64-bit version of Ubuntu. Ubuntu 14.04 is recommended.

$ sudo apt-get install bison g++-multilib git gperf libxml2-utils

Installing required packages (Ubuntu 12.04)

You may use Ubuntu 12.04 to build older versions of Android. Version 12.04 is not supported on master or recent releases.

$ sudo apt-get install git 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 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


其它ubuntu的安装具体见:http://source.android.com/source/initializing.html


编译:


1. 初始化:


source build/envsetup.sh


lunch

然后选择

aosp_arm



3. 

make -j4


等待大概2个小时,就可以顺利编译完成。



三、模拟器运行


按照教程上的做法直接运行emulator,会出现如下错误:

emulator: ERROR: You did not specify a virtual device name, and the system

directory could not be found.

原因是文件路径没有设置,解决办法添加绝对路径:

out/host/linux-x86/bin/emulator -kernel prebuilts/qemu-kernel/arm/kernel-qemu -sysdir out/target/product/generic/ -system out/target/product/generic/system.img -ramdisk out/target/product/generic/ramdisk.img -data out/target/product/generic/userdata.img  -sdcard sdcard.img -scale 0.7 -memory 512 -partition-size 1024 


后来又遇到模拟器一直黑屏问题:

解决版本是kernel有问题:

-kernel prebuilts/qemu-kernel/arm/kernel-qemu-armv7 


黑屏没有出现,却卡在启动页面,不知什么原因,重启了模拟器也不起作用,通过重新配置解决了此问题:source build/envsetup.sh, lunch。


然后在运行模拟器,顺利启动,欣喜若狂啊!

以上是这几天的劳动成果,后续会继续阅读源码,并修改源码进行源码级别的改动,以探究Android各模块实现原理。