继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Android源码编译过程及原理(二)

慕哥9229398
关注TA
已关注
手记 1241
粉丝 199
获赞 913

在未来等风也等你


本节主要记录的内容

  1. anroid 编译系统的结构

  2. 编译中枢中main.mk的基本解析

除非特别说明本节中的目录都是基于android的源码目录

1. android 编译系统的结构

android的编译系统可以分为三部分:

  1. build/core: 在这个目录中包含了大量的.mk文件

  2. 子项目:每个子项目都包含自己的Android.mk,在编译时会被包含进去,而如何编译子项目是由Andorid.mk文件所决定的3

  3. out/:编译结果输出到该目录下,编译的结果可以是jar包,apk,也可以是二进制的文件等

在Android系统主要就是根据.mk文件进行编译的。
他们之间的关系如下:


webp

编译关系


基本的流程是:

  1. 在我们编译系统时输入make后会默认搜索当前目录下的Makefile文件,它的内容如下:

### DO NOT EDIT THIS FILE ###include build/core/main.mk### DO NOT EDIT THIS FILE ###

可见它仅仅是包含了一个main.mk文件,说明了main.mk将会是系统编译的重要所在。

  1. 在系统编译的时候将会包含很多的子项目,对于如何编译子项目是由子项目的Android.mk文件决定的

  2. 在编译执行完成之后,编译结果大部分将会存储在out/target/..下

2. 编译中枢中main.mk的基本解析

  1. 决定使用shell的种类(编译脚本运用的是shell语法,不同的shell,语法会有差异)

SHELL := $(ANDROID_BUILD_SHELL)elseSHELL := /bin/bashend
  1. 定义默认的target名,也就是下面所定义的

droid.
.PHONY: droid
DEFAULT_GOAL := droid
$(DEFAULT_GOAL): droid_targets
  1. 包含了config.mk,这个文件主要进行了一系列的系统配置,在后面会详细讲解该文件

  2. 设置编译时所使用的java的版本,在Linux必须使用OpenJDK在Mac OS上使用Oracle JDK

  3. 包含了definitions.mk,该文件定义了许多在编译时用到的函数

# Bring in standard build system definitions.include $(BUILD_SYSTEM)/definitions.mk
  1. 包含了dex_preopt.mk,在Dalvik中执行的是dex文件,不同的cpu会略有不同,为了提高Dalvik的执行效率,可以将dex文件进行优化。而这个文件可以配置一些和dex优化相关的选项

# Bring in dex_preopt.mkinclude $(BUILD_SYSTEM)/dex_preopt.mk
  1. 检查产品的类型,如果不是user,userdebug,eng系统将会报错

ifneq ($(filter user userdebug eng,$(MAKECMDGOALS)),)
$(info ***************************************************************)
$(info ***************************************************************)
$(info Do not pass '$(filter user userdebug eng,$(MAKECMDGOALS))' on \
       the make command line.)
$(info Set TARGET_BUILD_VARIANT in buildspec.mk, or use lunch or)
$(info choosecombo.)
$(info ***************************************************************)
$(info ***************************************************************)
$(error stopping)
endif
  1. 检查PDK中java支持的级别,PDK是google提前提供给设备开发厂商OEM和芯片厂商的将要发布的最新版的Android,使得这些厂商能够快速更新自己的设备和芯片。

存在三个值,"not defined": 不支持, "sdk":仅支持SDK的API,"platform":支持 platform API
TARGET_BUILD_JAVA_SUPPORT_LEVEL := platform
  1. 包含用户所选择的product下的所有子项目的Android.mk文件

subdir_makefiles := \
$(shell build/tools/findleaves.py $(FIND_LEAVES_EXCLUDES) $(subdirs) Android.mk)

在这里使用到了脚本文件findleaves.py,有兴趣的大神可以研究研究。

  1. 根据系统的设置进行全编译和SDK编译。主要由FULL_BUILD和is_sdk_build编译

  2. 包含了Makefile(build/core/),该文件定义了编译过程中所需要的各种临时目标对象

  3. 定义了一些通用的target也就是无论是哪一个product都会有的
    例如:

ramdisk:生成ramdisk.imgsystemtarball:生成systemtarball.imgboottarball:生成boot.imguserdatatarball:生成userdata.img



作者:狗钱偷生
链接:https://www.jianshu.com/p/5ad125c62af3


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP