Android编译系统介绍
Posted Jason_Wang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android编译系统介绍相关的知识,希望对你有一定的参考价值。
android编译系统基于GNU make, 也经常采用Python和bash脚本工具。不同于其他基于make的递归型编译系统,Android通过一个脚本搜索所有目录以及子目录,直到发现一个Android.mk
文件为止。下图为Android编译系统的结构图(来自Embedded Android).
Android编译系统主要包含了两个部分:
android/build/
该文件夹包含了整个编译系统的定义,以及一些预定义的设备配置anroid/device
定义了特定设备的配置
有时,厂商还会定义自己型号特定的编译选项,一般放在 android/vendor
文件夹下。
build/
build/ 目录主要包含以下几个部分:
buildspec.mk.default
:buildspeck.mk
的模板CleanSpec.mk
: 编译 cleanup 的定义core/
: 编译系统规则envsetup.sh
: 环境变量配置脚本libs
: 本地宿主机 helper相关target/
: 目标平台相关定义tools/
: 编译信息、打包、签名等工具脚本
envsetup.sh
脚本envsetup.sh
用于修改当前环境变量,添加一些SHELL宏:
- 配置编译系统
- 便于搜索代码
在命令行中,运行 . build/envsetup.sh
,即可将其提供的函数添加到系统中:
- lunch: lunch [product_name] [build_variant]
- tapas: tapas [App1 App2 …] [arm|x86|mips] [eng|userdebug|user]
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
build/target
build/target 包含了两个文件夹:
board/
: 硬件平台相关的配置
- 其中的
Android.mk
自动被编译包含 - 预定义常用硬件平台的编译模板:
generic_<arch>
- 每个预定义模板包含了
AndroidBoard.mk
(不再使用)、BoardConfig.mk
(硬件架构、ABI、分区布局、OpenGL等),device.mk
- 其中的
编译系统会在:(1)
build/target/board/$TARGET_DEVICE/
; (2)device/*/$TARGET_DEVICE/
; (3)vendor/*/TARGET_DEVICE
三个目录下搜索BoardConfig.mk
文件,如果没有找到,则编译失败;如果有一个以上,编译也会失败。
product/
: 产品相关配置
AndroidProducts.mk
添加产品配置到编译系统- 如需自己产品的
AndroidProducts.mk
,可以定义在device/.../
或者vendor/.../
security/
包含已编译好的证书
device/
目录下会包含target/
目录下得文件以及继承其中的规则
build/core
- 处理 product/ 和 board/ 中的定义
- 定义产品所使用的语言
- 定义编译配置、规则
Android.mk
Android.mk 文件编译特定模块的规则,一般包括以下几个部分:
- Name(名称): 编译模块的名称(
LOCAL_MODULE := <build_name>
) - Local variables(局部变量):使用
CLEAR_VARS(include $(CLEAR_VARS)
来清除局部变量 - Files(文件): 模块编译所依赖的文件(
LOCAL_SRC_FILES := main.c
) - Tags(标签): 如有需要,可以定义模块编译的标签(
LOCAL_MODULE_TAGS := eng development
) - Libraries(库文件): 模块所依赖的其他库文件(
LOCAL_SHARED_LIBRARIES := cutils
) - Template file(模板文件):特定平台所需的可执行文件(include $(BUILD_EXECUTABLE)
常用 Android.mk 文件模板
- executable
LOCAL_PATH:= $(call my-dir) # call function my-dir will return the path of Android.mk
include $(CLEAR_VARS) # clean all variables mainly started with LOCAL_
LOCAL_SRC_FILES:= foo.c # Source file list
LOCAL_MODULE:= foo# The name of executable binary
include $(BUILD_EXECUTABLE) # Start to build executable binary
- shared libraries
LOCAL_PATH:= $(call my-dir) # call function my-dir will return the path of Android.mk
include $(CLEAR_VARS) # clean all variables mainly started with LOCAL_
LOCAL_SRC_FILES:= foo.c bar.c # Source file list
LOCAL_MODULE:= libfoo # The name of shared library
LOCAL_PRELINK_MODULE := false # Prevent from prelink error
include $(BUILD_SHARED_LIBRARY) # Start to build shared library
- Static libraries
LOCAL_PATH:= $(call my-dir) # call function my-dir will return the path of Android.mk
include $(CLEAR_VARS) # clean all variables mainly started with LOCAL_
LOCAL_SRC_FILES:= $(call all-subdir-c-files) # Source file list
LOCAL_MODULE:= libbar # The name of static library
LOCAL_PRELINK_MODULE := false # Prevent from prelink error
include $(BUILD_STATIC_LIBRARY) # Start to build static library
参考文献
- Android 编译系统说明,参考 AOSP
android/build/core/build-system.html
Embeded Android
Ch4 - Android Build System- GNU Make参考手册:GNU Make reference
以上是关于Android编译系统介绍的主要内容,如果未能解决你的问题,请参考以下文章