Android P编译说明

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编译系统演进

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介绍.

jack
java-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编译流程:

  1. Kati把Android.mk转换成out/xxx.ninja
  2. 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编译环境。


android aunch命令

编译命令

记录并理解些常用的编译命令,工作中使用会有很大的帮助

序号 编译命令 说明
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,主要包含用户以及应用程序相关的数据

你可能感兴趣的:(Android P编译说明)