一直热衷于Android底层的实现原理,所有想编译一把源码并刷机,或者DIY Android系统,经过几天的折腾,今天终于看到自己编译的源码在模拟器中运行,特写下此文以纪念。
本文分为以下三部分:
一、源码下载
二、源码编译
三、模拟器运行
第一部分:源码下载
大家都知道从google下载源码是多么的困难,以至于等到天荒地老发现还没有下完,具体如何从google下载源码,http://source.android.com/中有详细的说明,别忘了挂代理或者自己买个VPN。
我编译的源码不是自己从google爬取的,而是拿了别人的劳动成果,直接在百度网盘下载的,感谢这位兄弟的奉献(http://www.cnblogs.com/-njx/p/3845164.html),百度网怕地址: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/javac javac /usr/lib/java/jdk1.6.0_41/bin/javac 300
安装后执行:
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
编译中的大部分问题都是编译环境安装有问题导致的,只要一上两步没问题,编译同样不会碰到问题。
source build/envsetup.sh
2. 选择target
lunch
然后选择
aosp_arm
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各模块实现原理。