parent
be56fd8d9f
commit
c07ff27a2a
|
@ -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/<product_name>/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/<product_name>/ 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/<product_name>/ installed-files.txt 文件,该文件中内容是当前系统镜像中已经安装的文件列表。 |
|
||||
|
||||
其他目标
|
||||
|
||||
|
@ -237,7 +237,7 @@ Build 系统中包含的其他一些 Make 目标说明如表 5 所示:
|
|||
| make clean-<local_target> | 清理一个指定模块的编译结果。 |
|
||||
| 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)
|
||||
|
|
Loading…
Reference in New Issue