Android编译流程网上有很多的文档,还是按照自己思路简单整理下,不然每次遇到问题都要去搜索。
参考博客
1.https://developer.ibm.com/zh/articles/os-cn-android-build/
2.http://gityuan.com/2016/03/19/android-build/
3.https://www.cnblogs.com/xerrard/p/5145725.html
4.https://www.jianshu.com/p/80013a768a45
5.https://www.jianshu.com/p/7fe1beb38817
Android编译系统演进
Android N编译系统
编译很多东西都是从Android N开始改变的,就把之前Android N 刚出来时候做的笔记直接拿出来。
概述
- Java编译器从javac切换到jack,支持java8语言规范
- C/C++编译器从GCC切换到CLANG
- Make系统从GNU Make切换到Ninja
- Kati负责做Android.mk到Ninja的转化,仍然以Android.mk组织项目编译
价值
- N版本整体编译速度变快
- CLANG对代码非法地址访问、未定义行为进行了更严格的检查,提升代码安全性
影响
- Native程序和so库默认使用CLANG编译,编译检查更严格。如果遇到编译问题过多,可以在Android.mk中通过设置LOCAL_CLANG := false转成使用GCC进行编译
jack和jack-server介绍.
ninja编译系统
[ninja)
http://qkxue.net/info/163402/Android-Ninja-7-0
Android art虚拟机
1.http://blog.csdn.net/luoshengyang/article/details/39256813
2.http://blog.csdn.net/luoshengyang/article/details/39307813
clang编译器
1.https://zh.wikipedia.org/wiki/Clang
2.https://linuxplumbersconf.org/2014/ocw/system/presentations/2031/original/LPC14-L%20Building%20Android%20with%20Clang.pdf
dex2oat
https://yq.aliyun.com/articles/8944?spm=5176.100239.blogcont9105.7.ykkdpm
boot.art, boot.oat
boot.art和boot.oat把${BOOTCLASSPATH}变量里面指定的所有包的dex文件合并打成boot.art和boot.oat
1.http://www.iloveandroid.net/2015/12/19/AndroidART-2/
Framework编译流程:
- Kati把Android.mk转换成out/xxx.ninja
- Ninja/Jack 编译.java -> .jack -> .dex -> dex2oat -> .oat
jack-server编译问题解决
1.http://blog.csdn.net/lizekun2010/article/details/52535591
Android.mk
关于Android.mk的编写,参考Android.mk
Android.bp
Android8.0开始引入Android.bp文件,这个参考下其他文章说明Android.bp
Android编译系统简介
整个Build系统的Make文件分为三大类:
- 系统核心的Make文件:定义了Build系统的框架,文件全部位于路径build/core,其他Make文件都是基于该框架编写的;
- 针对产品的Make文件:定义了具体某个型号手机的Make文件,文件路径位于device,该目录下往往又以公司名和产品名划分两个子级目录,比如device/mstar/X5;
- 针对模块的Make文件:整个系统分为各个独立的模块,每个模块都一个专门的Make文件,名称统一为”Android.mk/Android.bp”,该文件定义了当前模块的编译方式。Build系统会扫描整个源码树中名为”Android.mk/Android.bp”的问题,并执行相应模块的编译工作。
Android系统编译
1. source /opt/buildScript/OpenJDK1.8/initPath.sh
2. cd aosp 根目录
3. source build/envsetup.sh
4. lunch xxx //指定此次编译的目标设备以及编译类型
5. make –j8 //开始编译,默认为编译整个系统
1.source /opt/buildScript/OpenJDK1.8/initPath.sh
---初始化编译环境,使用OpenJDK1.8
3.source build/envsetup.sh
---初始化编译环境,envsetup中包含所有的编译命令,比如lunch,mm ,mmm等
Lunch命令
lunch命令帮我们设置好了很多环境变量。通过设置这些环境变量,就配置好了Android编译环境。
编译命令
记录并理解些常用的编译命令,工作中使用会有很大的帮助
序号 | 编译命令 | 说明 |
---|---|---|
1 | mm | 编译当前路径下所有模块,但不包含依赖 |
2 | mmm | 编译指定路径下所有模块,但不包含依赖 |
3 | mma | 编译当前路径下所有模块,且包含依赖 |
4 | mmma [module_path] | 编译指定路径下所有模块,且包含依赖 |
5 | make [module_name] | 无参数,则表示编译整个Android代码 |
查找命令
查找命令使用得当,也可以大大提高工作效率
序号 | 编译命令 | 说明 |
---|---|---|
1 | cgrep | 所有C/C++文件执行搜索操作 |
2 | jgrep | 所有Java文件执行搜索操作 |
3 | ggrep | 所有Gradle文件执行搜索操作 |
4 | mangrep | 所有AndroidManifest.xml文件执行搜索操作 |
5 | mgrep | 所有Android.mk文件执行搜索操作 |
6 | segrep | 所有sepolicy文件执行搜索操作 |
7 | resgrep | 所有本地res/*.xml文件执行搜索操作 |
8 | sgrep | 所有资源文件执行搜索操作 |
例如,搜索所有Java代码中包含zygote所在文件
jgrep zygote
再如,搜索所有AndroidManifest.xml文件中的launcher关键字所在文件的具体位置
mangrep zygote
目录快速跳转
序号 | 编译命令 | 说明 |
---|---|---|
1 | croot | 切换至Android根目录 |
2 | cproj | 切换至工程的根目录 |
3 | godir [filename] | 跳转到包含某个文件的目录 |
当每次修改完某个文件后需要编译时,执行cproj后会跳转到当前模块的根目录,也就是Android.mk文件所在目录,然后再执行mm指令,即可编译目标模块;当进入源码层级很深后,需要返回到根目录,使用croot一条指令完成;另外cd - 指令可用于快速切换至上次目录。
编译常量说明,
这个已经比较老了,后续有时间自己整理一份。
编译产物
经过make编译后的产物,都位于/out目录,该目录下主要关注下面几个目录:
/out/host:Android开发工具的产物,包含SDK各种工具,比如adb,dex2oat,aapt等。
/out/target/common:通用的一些编译产物,包含Java应用代码和Java库;
/out/target/product/[product_name]:针对特定设备的编译产物以及平台相关C/C++代码和二进制文件;
在/out/target/product/[product_name]目录下,有几个重量级的镜像文件:
system.img:挂载为根分区,主要包含Android OS的系统文件;
ramdisk.img:主要包含init.rc文件和配置文件等;
userdata.img:被挂载在/data,主要包含用户以及应用程序相关的数据