diff --git a/Software/Development/OperatingSystem/Android/Build/理解_Android_Build_系统.md b/Software/Development/OperatingSystem/Android/Build/理解_Android_Build_系统.md index dc6c519..de9b799 100644 --- a/Software/Development/OperatingSystem/Android/Build/理解_Android_Build_系统.md +++ b/Software/Development/OperatingSystem/Android/Build/理解_Android_Build_系统.md @@ -63,7 +63,7 @@ make -j8 表 1. build/envsetup.sh 中定义的常用函数 -| 名称 | 说明 | +| Name | Descriptions | |-----------------|-------------------| | croot | 切换到源码树的根目录 | | m | 在源码树的根目录执行 make | @@ -117,24 +117,24 @@ Makefile 文件的内容只有一行:“include build/core/main.mk”。该行 表 2. 主要的 Make 文件的说明 -| 文件名 | 说明 | -|-------|------| -| main.mk | 最主要的 Make 文件,该文件中首先将对编译环境进行检查,同时引入其他的 Make 文件。另外,该文件中还定义了几个最主要的 Make 目标,例如 droid,sdk,等(参见后文“Make 目标说明”)。 | -| help.mk | 包含了名称为 help 的 Make 目标的定义,该目标将列出主要的 Make 目标及其说明。 | -| pathmap.mk | 将许多头文件的路径通过名值对的方式定义为映射表,并提供 include-path-for 函数来获取。例如,通过 $(call include-path-for, frameworks-native)便可以获取到 framework 本地代码需要的头文件路径。 | -| envsetup.mk | 配置 Build 系统需要的环境变量,例如:TARGET_PRODUCT,TARGET_BUILD_VARIANT,HOST_OS,HOST_ARCH 等。当前编译的主机平台信息(例如操作系统,CPU 类型等信息)就是在这个文件中确定的。另外,该文件中还指定了各种编译结果的输出路径。 | -| combo/select.mk | 根据当前编译器的平台选择平台相关的 Make 文件。 | -| dumpvar.mk | 在 Build 开始之前,显示此次 Build 的配置信息。 | -| config.mk | 整个 Build 系统的配置文件,最重要的 Make 文件之一。该文件中主要包含以下内容:1.定义了许多的常量来负责不同类型模块的编译;2.定义编译器参数以及常见文件后缀,例如 .zip,.jar.apk;3.根据 BoardConfig.mk 文件,配置产品相关的参数;4.设置一些常用工具的路径,例如 flex,e2fsck,dx。 | -| definitions.mk | 最重要的 Make 文件之一,在其中定义了大量的函数。这些函数都是 Build 系统的其他文件将用到的。例如:my-dir,all-subdir-makefiles,find-subdir-files,sign-package 等,关于这些函数的说明请参见每个函数的代码注释。 | -| distdir.mk | 针对 dist 目标的定义。dist 目标用来拷贝文件到指定路径。 | -| dex_preopt.mk | 针对启动 jar 包的预先优化。 | -| pdk_config.mk | 顾名思义,针对 pdk(Platform Developement Kit)的配置文件。 | +| Name | Descriptions | +|----------------------|--------------| +| main.mk | 最主要的 Make 文件,该文件中首先将对编译环境进行检查,同时引入其他的 Make 文件。另外,该文件中还定义了几个最主要的 Make 目标,例如 droid,sdk,等(参见后文“Make 目标说明”)。 | +| help.mk | 包含了名称为 help 的 Make 目标的定义,该目标将列出主要的 Make 目标及其说明。 | +| pathmap.mk | 将许多头文件的路径通过名值对的方式定义为映射表,并提供 include-path-for 函数来获取。例如,通过 $(call include-path-for, frameworks-native)便可以获取到 framework 本地代码需要的头文件路径。 | +| envsetup.mk | 配置 Build 系统需要的环境变量,例如:TARGET_PRODUCT,TARGET_BUILD_VARIANT,HOST_OS,HOST_ARCH 等。当前编译的主机平台信息(例如操作系统,CPU 类型等信息)就是在这个文件中确定的。另外,该文件中还指定了各种编译结果的输出路径。 | +| combo/select.mk | 根据当前编译器的平台选择平台相关的 Make 文件。 | +| dumpvar.mk | 在 Build 开始之前,显示此次 Build 的配置信息。 | +| config.mk | 整个 Build 系统的配置文件,最重要的 Make 文件之一。该文件中主要包含以下内容:1.定义了许多的常量来负责不同类型模块的编译;2.定义编译器参数以及常见文件后缀,例如 .zip,.jar.apk;3.根据 BoardConfig.mk 文件,配置产品相关的参数;4.设置一些常用工具的路径,例如 flex,e2fsck,dx。 | +| definitions.mk | 最重要的 Make 文件之一,在其中定义了大量的函数。这些函数都是 Build 系统的其他文件将用到的。例如:my-dir,all-subdir-makefiles,find-subdir-files,sign-package 等,关于这些函数的说明请参见每个函数的代码注释。 | +| distdir.mk | 针对 dist 目标的定义。dist 目标用来拷贝文件到指定路径。 | +| dex_preopt.mk | 针对启动 jar 包的预先优化。 | +| pdk_config.mk | 顾名思义,针对 pdk(Platform Developement Kit)的配置文件。 | | ${ONE_SHOT_MAKEFILE} | ONE_SHOT_MAKEFILE 是一个变量,当使用“mm”编译某个目录下的模块时,此变量的值即为当前指定路径下的 Make 文件的路径。 | -| ${subdir_makefiles} | 各个模块的 Android.mk 文件的集合,这个集合是通过 Python 脚本扫描得到的。 | -| post_clean.mk | 在前一次 Build 的基础上检查当前 Build 的配置,并执行必要清理工作。 | -| legacy_prebuilts.mk | 该文件中只定义了 GRANDFATHERED_ALL_PREBUILT 变量。 | -| Makefile | 被 main.mk 包含,该文件中的内容是辅助 main.mk 的一些额外内容。 | +| ${subdir_makefiles} | 各个模块的 Android.mk 文件的集合,这个集合是通过 Python 脚本扫描得到的。 | +| post_clean.mk | 在前一次 Build 的基础上检查当前 Build 的配置,并执行必要清理工作。 | +| legacy_prebuilts.mk | 该文件中只定义了 GRANDFATHERED_ALL_PREBUILT 变量。 | +| Makefile | 被 main.mk 包含,该文件中的内容是辅助 main.mk 的一些额外内容。 | Android 源码中包含了许多的模块,模块的类型有很多种,例如:Java 库,C/C++ 库,APK 应用,以及可执行文件等 。并且,Java 或者 C/C++ 库还可以分为静态的或者动态的,库或可执行文件既可能是针对设备(本文的“设备”指的是 Android 系统将被安装的设备,例如某个型号的手机或平板)的也可能是针对主机(本文的“主机”指的是开发 Android 系统的机器,例如装有 Ubuntu 操作系统的 PC 机或装有 MacOS 的 iMac 或 Macbook)的。不同类型的模块的编译步骤和方法是不一样,为了能够一致且方便的执行各种类型模块的编译,在 config.mk 中定义了许多的常量,这其中的每个常量描述了一种类型模块的编译方式,这些常量有: @@ -196,22 +196,22 @@ droid 目标将编译出整个系统的镜像。从源代码到编译出系统 表 4. droid 所依赖的其他 Make 目标的说明 -| 名称 | 说明 | -|-----------|-----------------------------------| -| apps_only | 该目标将编译出当前配置下不包含 user,userdebug,eng 标签(关于标签,请参见后文“添加新的模块”)的应用程序。 | -| droidcore | 该目标仅仅是所依赖的几个目标的组合,其本身不做更多的处理。 | -| dist_files | 该目标用来拷贝文件到 /out/dist 目录。 | -| files | 该目标仅仅是所依赖的几个目标的组合,其本身不做更多的处理。 | -| prebuilt | 该目标依赖于 $(ALL_PREBUILT),$(ALL_PREBUILT)的作用就是处理所有已编译好的文件。 | -| $(modules_to_install) | modules_to_install 变量包含了当前配置下所有会被安装的模块(一个模块是否会被安装依赖于该产品的配置文件,模块的标签等信息),因此该目标将导致所有会被安装的 |模| 块的编译。 | -| $(modules_to_check) | 该目标用来确保我们定义的构建模块是没有冗余的。 | +| Name | Descriptions | +|--------------------------------------|---------------------------------------------------------------------------------------------| +| apps_only | 该目标将编译出当前配置下不包含 user,userdebug,eng 标签(关于标签,请参见后文“添加新的模块”)的应用程序。 | +| droidcore | 该目标仅仅是所依赖的几个目标的组合,其本身不做更多的处理。 | +| dist_files | 该目标用来拷贝文件到 /out/dist 目录。 | +| files | 该目标仅仅是所依赖的几个目标的组合,其本身不做更多的处理。 | +| prebuilt | 该目标依赖于 $(ALL_PREBUILT),$(ALL_PREBUILT)的作用就是处理所有已编译好的文件。 | +| $(modules_to_install) | modules_to_install 变量包含了当前配置下所有会被安装的模块(一个模块是否会被安装依赖于该产品的配置文件,模块的标签等信息),因此该目标将导致所有会被安装的模块的编译。 | +| $(modules_to_check) | 该目标用来确保我们定义的构建模块是没有冗余的。 | | $(INSTALLED_ANDROID_INFO_TXT_TARGET) | 该目标会生成一个关于当前 Build 配置的设备信息的文件,该文件的生成路径是:out/target/product//android-info.txt | -| systemimage | 生成 system.img。 | -| $(INSTALLED_BOOTIMAGE_TARGET) | 生成 boot.img。 | -| $(INSTALLED_RECOVERYIMAGE_TARGET) | 生成 recovery.img。 | -| $(INSTALLED_USERDATAIMAGE_TARGET) | 生成 userdata.img。 | -| $(INSTALLED_CACHEIMAGE_TARGET) | 生成 cache.img。 | -| $(INSTALLED_FILES_FILE) | 该目标会生成 out/target/product// installed-files.txt 文件,该文件中内容是当前系统镜像中已经安装的文件列表。 | +| systemimage | 生成 system.img。 | +| $(INSTALLED_BOOTIMAGE_TARGET) | 生成 boot.img。 | +| $(INSTALLED_RECOVERYIMAGE_TARGET) | 生成 recovery.img。 | +| $(INSTALLED_USERDATAIMAGE_TARGET) | 生成 userdata.img。 | +| $(INSTALLED_CACHEIMAGE_TARGET) | 生成 cache.img。 | +| $(INSTALLED_FILES_FILE) | 该目标会生成 out/target/product// installed-files.txt 文件,该文件中内容是当前系统镜像中已经安装的文件列表。 | 其他目标 @@ -237,7 +237,7 @@ Build 系统中包含的其他一些 Make 目标说明如表 5 所示: | make clean- | 清理一个指定模块的编译结果。 | | make dump-products | 显示所有产品的编译配置信息,例如:产品名,产品支持的地区语言,产品中会包含的模块等信息。 | | make PRODUCT-xxx-yyy | 编译某个指定的产品。 | -| make bootimage | 快速生成 boot.img | +| make bootimage | 快速生成 boot.img | | make systemimage | 快速生成 system.img | | make vendor | 快速生成 vendor.img | | make recoveryimage | 快速生成 recovery.img | @@ -267,22 +267,22 @@ $(LOCAL_DIR)/generic_stingray.mk 表 6. 产品版本定义文件中的变量及其说明 -| 常量 | 说明 | -|--------------|----------------------------------------------| -| PRODUCT_NAME | 最终用户将看到的完整产品名,会出现在“关于手机”信息中。 | -| PRODUCT_MODEL | 产品的型号,这也是最终用户将看到的。 | -| PRODUCT_LOCALES | 该产品支持的地区,以空格分格,例如:en_GB de_DE es_ES fr_CA。 | -| PRODUCT_PACKAGES | 该产品版本中包含的 APK 应用程序,以空格分格,例如:Calendar Contacts。 | -| PRODUCT_DEVICE | 该产品的工业设计的名称。 | -| PRODUCT_MANUFACTURER | 制造商的名称。 | -| PRODUCT_BRAND | 该产品专门定义的商标(如果有的话)。 | +| Const | Descriptions | +|----------------------------|-----------------------------------------------| +| PRODUCT_NAME | 最终用户将看到的完整产品名,会出现在“关于手机”信息中。 | +| PRODUCT_MODEL | 产品的型号,这也是最终用户将看到的。 | +| PRODUCT_LOCALES | 该产品支持的地区,以空格分格,例如:en_GB de_DE es_ES fr_CA。 | +| PRODUCT_PACKAGES | 该产品版本中包含的 APK 应用程序,以空格分格,例如:Calendar Contacts。 | +| PRODUCT_DEVICE | 该产品的工业设计的名称。 | +| PRODUCT_MANUFACTURER | 制造商的名称。 | +| PRODUCT_BRAND | 该产品专门定义的商标(如果有的话)。 | | PRODUCT_PROPERTY_OVERRIDES | 对于商品属性的定义。 | -| PRODUCT_COPY_FILES | 编译该产品时需要拷贝的文件,以“源路径 : 目标路径”的形式。 | -| PRODUCT_OTA_PUBLIC_KEYS | 对于该产品的 OTA 公开 key 的列表。 | -| PRODUCT_POLICY | 产品使用的策略。 | -| PRODUCT_PACKAGE_OVERLAYS | 指出是否要使用默认的资源或添加产品特定定义来覆盖。 | -| PRODUCT_CONTRIBUTORS_FILE | HTML 文件,其中包含项目的贡献者。 | -| PRODUCT_TAGS | 该产品的标签,以空格分格。 | +| PRODUCT_COPY_FILES | 编译该产品时需要拷贝的文件,以“源路径 : 目标路径”的形式。 | +| PRODUCT_OTA_PUBLIC_KEYS | 对于该产品的 OTA 公开 key 的列表。 | +| PRODUCT_POLICY | 产品使用的策略。 | +| PRODUCT_PACKAGE_OVERLAYS | 指出是否要使用默认的资源或添加产品特定定义来覆盖。 | +| PRODUCT_CONTRIBUTORS_FILE | HTML 文件,其中包含项目的贡献者。 | +| PRODUCT_TAGS | 该产品的标签,以空格分格。 | 通常情况下,我们并不需要定义所有这些变量。Build 系统的已经预先定义好了一些组合,它们都位于 /build/target/product 下,每个文件定义了一个组合,我们只要继承这些预置的定义,然后再覆盖自己想要的变量定义即可。例如: @@ -345,10 +345,10 @@ include $(CLEAR_VARS) 表 7. 编译类型的说明 -|名称 | 说明 | -|-----|-----| -| eng | 默认类型,该编译类型适用于开发阶段。当选择这种类型时,编译结果将:1.安装包含 eng, debug, user,development 标签的模块;2.安装所有没有标签的非 APK 模块;3.安装所有产品定义文件中指定的 APK 模块。 | -| user | 该编译类型适合用于最终发布阶段。当选择这种类型时,编译结果将:1.安装所有带有 user 标签的模块;2.安装所有没有标签的非 APK 模块;3.安装所有产品定义文件中指定的 APK 模块,APK 模块的标签将被忽略。 | +| Name | Descriptions | +|-----------|--------------| +| eng | 默认类型,该编译类型适用于开发阶段。当选择这种类型时,编译结果将:1.安装包含 eng, debug, user,development 标签的模块;2.安装所有没有标签的非 APK 模块;3.安装所有产品定义文件中指定的 APK 模块。 | +| user | 该编译类型适合用于最终发布阶段。当选择这种类型时,编译结果将:1.安装所有带有 user 标签的模块;2.安装所有没有标签的非 APK 模块;3.安装所有产品定义文件中指定的 APK 模块,APK 模块的标签将被忽略。 | | userdebug | 该编译类型适合用于 debug 阶段。该类型和 user 一样,除了:1.会安装包含 debug 标签的模块;2.编译出的系统具有 root 访问权限。 | 表 3 中的文件已经定义好了各种类型模块的编译方式。所以要执行编译,只需要引入表 3 中对应的 Make 文件即可(通过常量的方式)。例如,要编译一个 APK 文件,只需要在 Android.mk 文件中,加入“include $(BUILD_PACKAGE)