Android编译系统介绍

Posted Jason_Wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android编译系统介绍相关的知识,希望对你有一定的参考价值。

android编译系统基于GNU make, 也经常采用Pythonbash脚本工具。不同于其他基于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编译系统介绍的主要内容,如果未能解决你的问题,请参考以下文章

Android 10 根文件系统和编译系统:Android ROM镜像介绍

0-Android编译系统简要介绍和学习计划

如何构建和使用PJSIP用于不同于armeabi的架构?

Android深度探索

Android.mk介绍(一)

android深度探索读书笔记