android怎么编译源码包-Android源码编译流程及原理(二)

未来,风也会等你

本节记录的主要内容

android编译系统的结构

编译中心main.mk基本分析

除非特别说明,本节中的目录均为基于android的源码目录。

1.android编译系统结构

Android编译系统可以分为三个部分:

build/core:该目录包含大量.mk文件

子项目:每个子项目都包含自己的Android.mk,编译时会包含该文件。 子工程如何编译由Andorid.mk文件决定3

out/:编译结果输出到该目录。 编译结果可以是jar包、apk或者补码文件等。

在Android系统中,主要是根据.mk文件进行编译。

它们之间的关系如下:

编译关系

基本流程是:

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

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

可以看到,它只包含一个main.mk文件,说明main.mk将是系统编译的重要组成部分。

系统编译完成后,会包含很多子工程。 子工程如何编译由子工程的Android.mk文件决定。

编译完成后,大部分编译结果会存放在out/target/..

2.编译中心main.mk的基本分析

决定使用的shell类型(编译的脚本使用shell句型,不同的shell会有不同的句型)

SHELL := $(ANDROID_BUILD_SHELL)elseSHELL := /bin/bashend

定义默认目标名称,定义如下

droid.
.PHONY: droid
DEFAULT_GOAL := droid
$(DEFAULT_GOAL): droid_targets

包含config.mk。 该文件主要进行一系列的系统配置。 该文件将在前面详细解释。

设置编译时使用的java版本。 Linux 上必须使用 OpenJDKandroid怎么编译源码,MacOS 上必须使用 OracleJDK。

包含definitions.mk,定义了很多编译过程中用到的函数

android怎么编译源码包-Android源码编译流程及原理(二)

# Bring in standard build system definitions.include $(BUILD_SYSTEM)/definitions.mk

包含 dex_preopt.mk。 dex 文件在 Dalvik 中执行。 不同的CPU会略有不同。 为了提高Dalvik的执行效率,可以对dex文件进行优化。该文件可以配置一些与dex优化相关的选项。

# Bring in dex_preopt.mkinclude $(BUILD_SYSTEM)/dex_preopt.mk

检测产品类型。 如果不是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

检测PDK中java支持的级别。 PDK是Google将提前发布给设备开发制造商OEM和芯片制造商的Android最新版本,让这些制造商能够快速更新他们的设备和芯片。

存在三个值,"not defined": 不支持, "sdk":仅支持SDK的API,"platform":支持 platform API
TARGET_BUILD_JAVA_SUPPORT_LEVEL := platform

android怎么编译源码包-Android源码编译流程及原理(二)

Android.mk文件android怎么编译源码包,包含用户所选产品下的所有子项目

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

这里使用了脚本文件findleaves.py,有兴趣的高手可以研究一下。

根据系统设置进行完整编译和SDK编译。主要通过FULL_BUILD和is_sdk_build编译

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

定义一些通用目标,无论是哪种产品都可用。

例如:

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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 android怎么编译源码包-Android源码编译流程及原理(二) https://www.wkzy.net/game/196967.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务