1. 环境准备:
编译安卓源码只能在Linux上面,建议使用64位电脑进行编译,这里使用Ubuntu14.04系统来进行编译
Java环境,需要使用Oracle的JDK, Android5.0以后才可以使用OpenJDK来进行编译,推荐去Oracle官网下载压缩包自己配置环境变量来安装:(后面编译发现编译2.3.1版本Android系统源码需要jdk1.6)
编译依赖包准备: ( sudo apt-get install -y flex bison gperf libesd0-dev build-essential zip curl valgrind git-core gnupg)
2. 源码下载:
Google使用repo来封装git对android源码进行管理,方便开发,这里先获取repo执行脚本并放到/bin目录以便执行:
sudo apt-get install phablet-tools
repo放到/bin目录后,新建一个文件夹,然后可以下载代码了:
(repo init -u https://android.googlesource.com/platform/manifest -> 这是下载最新的代码,现在估计是android7.x了吧,正如研究linux的都喜欢先看linux0.11源码,这里也不求新,先看透2.3.1的源码,所以,这里需要指定下载的源码分支)
然后就是漫长的等待过程了……………………
中途如果网络断开,重新执行"repo sync"即可。Tips: 下载源码需要科学上网,哈哈~
大约花了3小时,下载完成后如下:
根目录就一个Makefile,看看那里面有啥:
它只是包含了build/core/main.mk主入库编译,再看看它的内容:
接近800行,现在先不看它,先编译再说,如果编译都通过不了,看懂了好像不懂,因为你后面都没法进行程序运行测试。
3. 源码编译,在源码根目录直接执行make,将编译Android系统的全部模块
报错,提示需要JDK1.6版本,那就安装呗,另外,对于权限禁止的,增加可执行权限即可:
上面的执行生成jdk6的包:
添加环境变量即可:
//
接着我们再make一次看看,出现如下错误:
安装依赖库:
再次make,出现如下错误:
安装依赖库:
再次make,报错:
修改文件frameworks/base/tools/aapt/Android.mk,在28行加多一个参数"-fpermissive":
再次make,提示类似错误,修改文件frameworks/base/libs/utils/Android.mk,在60行增加-fpermissive参数:
再次编译出现如下错误:
安装依赖包: sudo apt-get install zlib1g-dev && sudo apt-get install lib32z1-dev && sudo apt-get install libncurses5-dev:i386
另外,为了编译顺利,建议降级gcc和g++到4.4版本:
sudo apt-get install gcc-4.4 g++-4.4
sudo rm -rf /usr/bin/gcc
sudo rm -rf /usr/bin/g++
sudo ln -s /usr/bin/gcc-4.4 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.4 /usr/bin/g++
再次make,出现如下错误:
编辑提示的文件,增加如下的28行:
再次make, 出现如下错误:
zlib1g-dev有个头文件修改了路径,及zconf.h放到了/usr/include/x86_64-Linux-gnu/,所以将其拷贝到/usr/include/下即可:
sudo cp /usr/include/x86_64-linux-gnu/zconf.h /usr/include/
再次make:
sudo apt-get install libswitch-perl
再次make,等了半个多小时,终于编译成功:
4. 生成SDK,可用于开发Android应用程序
make sdk
5. 运行
启动Android模拟器需要四个文件:
1. Linux内核镜像文件--> zImage
2. Android系统镜像文件--> system.img, userdata.img, ramdisk.img,上面已经编译生成,在目录out/target/product/generic下面
export PATH=$PATH:~/Documents/source_code/android-2.3.1/out/host/linux-x86/bin (out/host/linux-x86/bin目录下是Android模拟器的位置,这里加入到环境变量中)
export ANDROID_PRODUCT_OUT=~/Documents/source_code/android-2.3.1/out/target/product/generic
启动模拟器:
1. 不加任何参数表示已经配置好上面两行的环境变量: emulator
2. 如果不配置环境变量,则要加参数指定镜像文件的位置
emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system out/target/product/generic/system.img -data out/target/product/generic/userdata.img -ramdisk out/target/product/generic/ramdisk.img
启动模拟器提示如下错误:
安装依赖包:(来自StackOver Flow: https://stackoverflow.com/questions/4841908/sdl-init-failure-reason-is-no-available-video-device/22625691)
sudo apt-get install libsdl1.2debian:i386
然后再次启动:
可以看看其系统信息:
6. 下载Linux内核源码
上面使用repo下载同步的Android源码并不包含Linux内核源码,因此,如果需要定制Linux内核源码,就要下载下来自己进行修改编译,从上面也可以看到Android2.3.1使用的Linux内核位2.6.29。
我们在Android系统源码根目录下进行如下操作:
mkdir kernel && cd kernel
git clone https://android.googlesource.com/kernel/goldfish.git
下载完成后,我们需要checkout内核版本为2.6.29版本的分支:
cd goldfish
git branch -a
git checkout remotes/origin/android-goldfish-2.6.29
7. 编译Linux内核源码
准备工作:
修改Makefile文件,修改目标CPU架构(ARCH)为arm和交叉编译工具(CROSS_COMPILE),如下195和196行:
Android源码提供的交叉编译工具位于prebuild/linux-x86/toolchain目录下。
编译步骤:
1. 配置交叉编译工具的环境变量: export PATH=$PATH:~/Documents/source_code/android-2.3.1/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin
2. 生成指定CPU架构的硬件配置文件
首先看看模拟器的CPU体系结构版本,为arm v5的,因此使用goldfish_defconfig文件,若为arm v7的,则使用goldfish_armv7_defconfig:
make goldfish_defconfig
3. 编译make生成Linux内核镜像文件zImage
8. 基于定制编译的Linux内核源码启动Android模拟器
emulator -kernel kernel/goldfish/arch/arm/boot/zImage -sysdir ./out/target/product/generic -system out/target/product/generic/system.img -data out/target/product/generic/userdata.img -ramdisk out/target/product/generic/ramdisk.img
和前面命令相比,就是修改了内核文件的路径而已,这里使它基于刚刚编译的内核来启动:
到这里,Android2.3.1源码的开发环境搭建和编译、模拟器启动都完成了,可以进入下一步学习了。
后记:
原本打算记录一下流程,结果因为是新配置的Ubuntu虚拟机,在编译源码那里遇到一堆问题,总算搞定了,不知不觉,时间到了00:11,赶紧睡觉,明天还要搬砖,啊哈~~