1.背景
源于自己想重新探索下android系统整个源码结构以及研究核心服务组件的实现原理,另外想将整个过程记录下来以备后续查看。(本次编译实例为android8.1.0,系统环境为ubuntu)
2.源码下载
不用说首先肯定得先参考官网将对应的源码拉下来,这里我就直接给官网地址不瞎补充了。下载地址
3.编译环境搭建
编译前需要根据源码对应的版本安装相应版本的jdk,不然将无法执行编译操作。
android系统版本 | jdk版本 |
---|---|
7.0以上 | OpenJdk8 |
5.x-6.0 | OpenJdk7 |
2.3-4.4.x | Java Jdk6 |
本人是安装openjdk8,直接通过命令行如下:
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk
复制代码
然后修改环境变量,我以前是用javajdk8因此需要修改才能正常使用。
注意如果缓存不够会报警,需要在源码树的根路径执行以下命令(不同源码路径可能会不一样):
prebuilts/misc/linux-x86/ccache/ccache -M 50G
复制代码
执行编译过程中如果报错很大可能是某些依赖工具没有安装,可以通过google查询对应软件名进行安装即可。当然为了防止编译中出错可以将以下依赖工具全部装下:
复制代码
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
复制代码
4.编译
初始化编译环境
执行如下命令:
$ source build/envsetup.sh
复制代码
不难发现该命令只是引入了其他执行脚本,至于这些脚本做什么,目前不在本文中细说.
该命令执行成功后,我们会得到了一些有用的命令,比如最下面要用到的lunch命令.
选择编译目标
通过lunch指令设置编译目标,所谓的编译目标就是生成的镜像要运行在什么样的设备上.这里我们设置的编译目标是aosp_arm64-eng,因此执行指令:
$ lunch aosp_arm64-eng
复制代码
编译目标格式说明
编译目标的格式:BUILD-BUILDTYPE,比如上面的aosp_arm-eng的BUILD是aosp_arm,BUILDTYPE是eng.
编译目标列表
如果想查看所有的编译目标可以通过在命令行下输入(会列出所有编译目标):
复制代码
$ lunch
复制代码
注意点:google亲儿子有专用编译目标如下
设备型号 | 设备代码 | 编译目标 |
---|---|---|
Nexus 6P | angler | aosp_angler-userdebug |
Nexus 5X | bullhead | aosp_bullhead-userdebug |
Nexus 6 | shamu | aosp_shamu-userdebug |
Nexus 5 | hammerhead | aosp_hammerhead-userdebug |
5.开始编译
$ make -j8
复制代码
该指令通过-j参数来设置参与编译的线程数量,以提高编译速度.比如这里我们设置8个线程同时编译:
6.源码导入
编译完成之后我们还需要生成androidstudio所需要的格式,在源码根目录执行以下命令即可:
$ mmm development/tools/idegen/
$ sh ./development/tools/idegen/idegen.sh
复制代码
修改android.iml文件去掉不想阅读的代码。
打开Intellij和Android Studio,File->open->android.ipr,或者Andoird Stuido, Open an existing Android Studio project -> android.ipr所在目录,然后等待索引的建立即可。
之后再删除当前项目setting中SDKs中classpath和sourcepath的指向,指向到源码目录下的frameworks和external目录下,apply即可。
结尾
本文属于个人实践总结,其中参考了许多其他人写的文章如有不妥敬请见谅。