Android编译系统分析之make分析

本文分析了Android编译系统,重点探讨了makefile的语法、include顺序及main.mk、config.mk等关键文件的职责。文章详细阐述了从lunch到make的编译流程,包括环境设置、目标构建、变量配置和编译目标的定义,揭示了Android编译系统背后的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

已开通新的博客,后续文字都会发到新博客

https://www.0xforee.top


Android 编译系统解析系列文档

编译系统入口envsetup.sh解析

解析lunch的执行过程以及make执行过程中include文件的顺序

关注一些make执行过程中的几个关键点

对一些独特的语法结构进行解析


概览

Android编译系统概览

  • makefile语法的简要说明Makefile文件的include顺序main.mk文件中include的各文件职责
  • config.mk文件中include的各文件职责

Android编译系统流程的简要总结

正文

编译android的源代码时我们要经历三个阶段

source build/envsetup.sh
lunch project_name
make (SHOW_COMMANDS)

关于前两阶段的具体内容请参见另一篇文章 android 编译系统之lunch分析
这一章节我们主要来看看整个android编译系统的整体框架

Android编译系统概览

makefile语法的简要说明
    target ... : prerequisites ...
    [tab] command

这是makefile基本语法

  • target 就是目标文件,可以是一个object,也可以是一个可执行文件,还可以是一个label(伪目标)
  • prerequisites 就是要生成target所依赖的文件或者目标
  • command 也就是make要执行的命令(任意的shell命令)

注意,command命令必须要使用[tab]键开头,否则make无法识别

明白了语法规则,来看看执行规则:
target 这一个或者多个目标的文件依赖于prerequistites中的文件,其生成规则在command中,这其中的依赖规则判断是:如果prerequisites中有一个或以上文件比target新(判断modification times),那么就执行command所定义的命令

默认情况下执行make命令会在当前目录下依次寻找GNUMakefile(GNU独有)、makefile、Makefile这三个文件,然后执行文件中声明的第一个目标
所以我们在源码根目录执行make文件时,会默认执行Makefile,而这个文件内容只有一行

    include build/core/main.mk

我们直接来看main.mk文件干了什么

Makefile文件的include顺序

通过解析main.mk文件,我们可以大致看到include的文件的顺序

    # 以下为执行make与lunch时,include文件顺序以及行号

    #执行make时,会include build/core/main.mk
    main.mk (
        89:include help.mk
        93:include config.mk
        99:include cleanbuild.mk
        260:include definitions.mk
        263:include dex_preopt.mk
        297:include pdk_config.mk
        487:include $(ONE_SHOT_MAKEFILE)(如果变量不为空,则include)
        525:include post_clean.mk
        531:include legacy_prebuilts.mk
        797:include Makefile
    )

    #执行lunch时候,会直接make -f build/core/config.mk #
    config.mk (
        60:include pathmap.mk
        151:include envsetup.mk (
            10:include version_defaults.mk (
                34:include build_id.mk
            )
            138:include product_config.mk (
                178:include nod
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、付费专栏及课程。

余额充值