android make 编译器,Android make 基础

1- adroid 演进过程

Android编译演进过程:

Android7.0之前 使用GNU Make

Android7.0 引入ninja、kati、Android.bp和soong构建系统

Android8.0 默认打开Android.bp

Android9.0 强制使用Android.bp

Make 构建系统得到了广泛的支持和使用,但在 Android 层面变得缓慢、容易出错、无法扩展且难以测试。Soong 构建系统正好提供了 Android build 所需的灵活性。

2f0c0c25a270

2- android build 流程

build/ 目录下

2f0c0c25a270

blueprint:用于处理Android.bp,编译生成*.ninja文件,用于做ninja的处理

kati:用于处理Android.mk,编译生成*.ninja文件,用于做ninja的处理

make:文件夹还是原始的make那一套流程,比如envsetup.sh

soong:构建系统,核心编译为soong_ui.bash

2f0c0c25a270

2f0c0c25a270

build 流程

3 编译环境初始化

source build/envsetup.sh

输入指令hmm 就可以查看信息

Run "m help" for help with the build system itself.

Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:

- lunch: lunch -

Selects as the product to build, and as the variant to

build, and stores those selections in the environment to be read by subsequent

invocations of 'm' etc.

- tapas: tapas [ ...] [arm|x86|mips|arm64|x86_64|mips64] [eng|userdebug|user]

- croot: Changes directory to the top of the tree, or a subdirectory thereof.

- m: Makes from the top of the tree.

- mm: Builds all of the modules in the current directory, but not their dependencies.

- mmm: Builds all of the modules in the supplied directories, but not their dependencies.

To limit the modules being built use the syntax: mmm dir/:target1,target2.

- mma: Builds all of the modules in the current directory, and their dependencies.

- mmma: Builds all of the modules in the supplied directories, and their dependencies.

- provision: Flash device with all required partitions. Options will be passed on to fastboot.

- cgrep: Greps on all local C/C++ files.

- ggrep: Greps on all local Gradle files.

- jgrep: Greps on all local Java files.

- resgrep: Greps on all local res/*.xml files.

- mangrep: Greps on all local AndroidManifest.xml files.

- mgrep: Greps on all local Makefiles files.

- sepgrep: Greps on all local sepolicy files.

- sgrep: Greps on all local source files.

- godir: Go to the directory containing a file.

- allmod: List all modules.

- gomod: Go to the directory containing a module.

- pathmod: Get the directory containing a module.

- refreshmod: Refresh list of modules for allmod/gomod.

Environment options:

- SANITIZE_HOST: Set to 'true' to use ASAN for all host modules. Note that

ASAN_OPTIONS=detect_leaks=0 will be set by default until the

build is leak-check clean.

- ANDROID_QUIET_BUILD: set to 'true' to display only the essential messages.

lunch 2

PLATFORM_VERSION_CODENAME=REL

PLATFORM_VERSION=10

TARGET_PRODUCT=aosp_arm64

TARGET_BUILD_VARIANT=eng

TARGET_BUILD_TYPE=release

TARGET_ARCH=arm64

TARGET_ARCH_VARIANT=armv8-a

TARGET_CPU_VARIANT=generic

TARGET_2ND_ARCH=arm

TARGET_2ND_ARCH_VARIANT=armv8-a

TARGET_2ND_CPU_VARIANT=generic

HOST_ARCH=x86_64

HOST_2ND_ARCH=x86

HOST_OS=linux

HOST_OS_EXTRA=Linux-4.15.0-137-generic-x86_64-Ubuntu-16.04.7-LTS

HOST_CROSS_OS=windows

HOST_CROSS_ARCH=x86

HOST_CROSS_2ND_ARCH=x86_64

HOST_BUILD_TYPE=release

BUILD_ID=QD4A.200805.003

OUT_DIR=out

4-make 说明

通过soong执行编译构建,这里执行make命令时,main.mk文件把一些环境变量和目标都配置好后,会执行envsetup.sh中的make()进行编译。

function make()

{

_wrap_build $(get_make_command "$@") "$@"

}

function get_make_command()

{

# If we're in the top of an Android tree, use soong_ui.bash instead of make

if [ -f build/soong/soong_ui.bash ]; then

# Always use the real make if -C is passed in

for arg in "$@"; do

if [[ $arg == -C* ]]; then

echo command make

return

fi

done

echo build/soong/soong_ui.bash --make-mode

else

echo command make

fi

}

build/soong/soong_ui.bash --make-mode

------->

[build/soong/soong_ui.bash] -------》 下面说明

# Save the current PWD for use in soong_ui

export ORIGINAL_PWD=${PWD}

export TOP=$(gettop)

source ${TOP}/build/soong/scripts/microfactory.bash

soong_build_go soong_ui android/soong/cmd/soong_ui -->生成soog_ui

cd ${TOP} --->return root

exec "$(getoutdir)/soong_ui" "$@"------>exec out/soong_ui --make-mode build

“echo build/soong/soong_ui.bash --make-mode ”

soong的编译过程:

2f0c0c25a270

soong_ui.bash 调用流程:

2f0c0c25a270

可以看到include 了main.mk文件,从main.mk开始,将通过include命令将其所有需要的.mk文件包含进来,最终在内存中形成一个包括所有编译脚本的集合,这个相当于一个巨大Makefile文件。Makefile文件看上去很庞大,其实主要由三种内容构成: 变量定义、函数定义和目标依赖规则,此外mk文件之间的包含也很重要。

2f0c0c25a270

文件

作用

build/make/core/main.mk

Build的主控文件,主要作用是包含其他mk,以及定义几个最重要的编译目标,同时检查编译工具的版本,例如如gcc、clang、java等

build/make/core/config.mk

Build的配置文件,主要是区分各个产品的配置,并将这些编译器参数引入产品配置 BoardConfig.mk,同时也配置了一些编译器的路径等

build/make/core/definitions.mk

最重要的 Make 文件之一,在其中定义了大量的函数。这些函数都是 Build 系统的其他文件将用到的。例如:my-dir,all-subdir-makefiles,find-subdir-files,sign-package 等,关于这些函数的说明请参见每个函数的代码注释。

build/make/core/dex_preopt.mk

定义了dex优化相关的路径和参数

5.工具链的关系

Android.bp --> Blueprint --> Soong --> Ninja

Makefile or Android.mk --> kati --> Ninja

(Android.mk --> Soong --> Blueprint --> Android.bp)

android make 介绍 Make 文件说明 整个 Build 系统的入口文件是源码树根目录下名称为“Makefile”的文件,当在源代码根目录上调用 make 命令 时,make 命令首先将读取该文件。 Makefile 文件的内容只有一行:“include build/core/main.mk”。该行代码的作用很明显:包含 build/core/main.mk 文 件。在 main.mk 文件中又会包含其他的文件,其他文件中又会包含更多的文件,这样就引入了整个 Build 系统。 这些 Make 文件间的包含关系是相当复杂的,图 3 描述了这种关系,该图中黄色标记的文件(且除了 $开头的文件) 都位于 build/core/ 目录下。 Android 源码中包含了许多的模块,模块的类型有很多种,例如:Java 库,C/C++ 库,APK 应用,以及可执行文件 等 。并且,Java 或者 C/C++ 库还可以分为静态的或者动态的,库或可执行文件既可能是针对设备(本文的“设备”指 的是 Android 系统将被安装的设备,例如某个型号的手机或平板)的也可能是针对主机(本文的“主机”指的是开发 Android 系统的机器,例如装有 Ubuntu 操作系统的 PC 机或装有 MacOS 的 iMac 或 Macbook)的。不同类型的模块 的编译步骤和方法是不一样,为了能够一致且方便的执行各种类型模块的编译,在 config.mk 中定义了许多的常量, 这其中的每个常量描述了一种类型模块的编译方式,这些常量有: BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk BUILD_HOST_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值