`

Android build system ---转

 
阅读更多

Android Building System 总结
Android以模块的形式来组织各个系统中的部件,Eng专业点的词汇就是Module,就是各位在几乎每个目录下都 能看到的Android.mk。可以简单地把Android所有的Make文件分为4种:
1、For config
这类文件主要来配置product,board,以及根据你的Host和Target选择相应的工具以及设定相应的通用编译选项:
build/core/config.mk summary of config
build/core/envsetup.mk generate dir config and so on
build/target/product product config
build/target/board board config
build/core/combo build flags config
这里解释下这里的board和product。borad主要是设计到硬件芯片的配置,比如是否提供硬件的某些功能,比如说GPU等等,或者芯片支持浮点 运算等等。product是指针对当前的芯片配置定义你将要生产产品的个性配置,主要是指APK方面的配置,哪些APK会包含在哪个product中,哪 些APK在当前product中是不提供的。
config.mk是一个总括性的东西,它里面定义了各种module编译所需要使用的HOST工具以及如何来编译各种模块,比如说 BUILT_PREBUILT就定义了如何来编译预编译模块。envsetup.mk主要会读取由envsetup.sh写入环境变量中的一些变量来配置 编译过程中的输出目录,combo里面主要定义了各种Host和Target结合的编译器和编译选项。
2、 Module Compile
这类文件主要定义了如何来处理Module的Android.mk,以及采用何种方式来生成目标模块,这些模块生成规则都定义在config.mk里面, 我们可以看看:
CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.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_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_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk
BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk
除了CLEAR_VARS是清楚本地变量之外,其他所有的都对应了一种模块的生成规则,每一个本地模块最后都会include其中的一种来生成目标模块。 大部分上面的.mk都会包含base_rules.mk,这是对模块进行处理的基础文件,建议要写本地模块的都去看看,看明白了为什么 Android.mk要这么写就会大致明白了。
3、Local Module
本地模块的Makefile文件就是我们在Android里面几乎上随处可见的Android.mk。Android进行编译的时候会通过下面的函数来遍 历所有子目录中的Android.mk,一旦找到就不会再往层子目录继续寻找(所有你的模块定义的顶层Android.mk必须包含自己定义的子目录中的 Android.mk)。
subdir_makefiles += /
$(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
不同类型的本地模块具有不同的语法,但基本上是相通的,只有个别变量的不同,如何添加模块在前面的帖子已经说过了,大家可以参考。
Android通过LOCAL_MODULE_TAGS来决定哪些本地模块会不会编译进系统,通过PRODUCT和LOCAL_MODULE_TAGS来 决定哪些应用包会编译进系统,如果用户不指定LOCAL_MODULE_TAGS,默认它的值是user。此外用户可以通过buildspec.mk来指 定你需要编译进系统的模块。
用户也可以通过mm来编译指定模块,或者通过make clean-module_name来删除指定模块。
4、Package
这主要指的是build/core/Makefile这个文件,它定义了生成各种img的方式,包括ramdisk.img userdata.img system.img update.zip recover.img等。我们可以看看这些img都是如何生成的,对应着我们常用的几个make goals.
在实际的过程中,我们也可以自己编辑out目录下的生成文件,然后手工打包相应生成 相应的img,最常用的是加入一些需要集成进的prebuilt file。

所有的Makefile都通过build/core/main.mk这个文件组织在一起,它定义了一个默认goals:droid,当我们在TOP目录下 敲Make实际上就等同于我们执行make droid。当Make include所有的文件,完成对所有make我文件的解析以后就会寻找生成droid的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用 相应的工具打包成相应的img。
基本上Android building system就是以这样一种方式组织在一起的了,下面说一点闲散的东西。首先是如何来加快Android的编译过程,因为每次Android都要遍历所有 的Android.mk,不管是编译整个工程还是只编译某个模块。所以可以将遍历的结果保存下来,下次直接从文件读就好了,但是这里容易出错,所以一定要 确认是否正确包含了所有的.mk,当新加入文件的时候确认将原来保存的文件删除。下面是我写的加快编译的一个makefile,将下面的语句替换掉 main.mk中的相应部分就可以了:
FROM:
subdir_makefiles += /
$(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
TO:
ifneq ($(ONE_SHOT_MAKEFILE),)
else
ifneq ($(CASH_MK),true)
subdir_makefiles += /
$(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
else
subdir-makefiles-cash := $(shell cat build/subdir_mk_cash)
ifeq ($(subdir-makefiles-cash),)
$(warning No .mk cash ,create now !)
subdir_makefiles += /
$(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
mk-to-file := $(shell echo $(subdir_makefiles) > build/subdir_mk_cash)
else
$(warning Using cash mk !)
subdir_makefiles := $(shell cat build/subdir_mk_cash)
endif
endif
endif
通过CASH_MK=true来打开快速编译的功能,因为没有对错误进行检测的操作,所以使用的时候一定要特别小心。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yangzhu1982/archive/2010/09/05/5865025.aspx

分享到:
评论

相关推荐

    android studio build-tools 23.0.2

    1. **检查SDK Manager设置**:打开Android Studio,转到`Preferences`(macOS)或`File` > `Settings`(Windows/Linux),然后找到`Appearance & Behavior` > `System Settings` > `Android SDK`。在`SDK Tools`选项...

    android studio build-tools 25.0.2

    3. 在左侧导航栏中选择`Appearance & Behavior` -> `System Settings` -> `Android SDK`。 4. 在右侧的`SDK Tools`选项卡中,找到`Android SDK Build-Tools`条目。 5. 在这里,你可以勾选`25.0.2`版本,如果未安装,...

    Android/SDK/Platforms/android-34-ext8

    Android SDK是开发Android应用的核心工具集,它包含了各种版本的Android平台、构建工具、调试工具以及其他必要的组件。在本案例中,我们关注的是"android-34-ext8"这一特定的平台版本,它对应于Android操作系统的一...

    Android build-tools

    选择`Appearance & Behavior` -> `System Settings` -> `Android SDK`,然后在`SDK Tools`选项卡中更新`build-tools`。 7. **检查Gradle配置**:确保你的`build.gradle`文件中的配置正确无误,特别是`apply plugin:...

    android studio build-tools 27.0.1

    在开发过程中,`build-tools`是Android Studio中的一个重要组件,主要用于构建、编译和打包Android应用程序。`build-tools 27.0.1`是该组件的一个特定版本,发布于2017年,包含了构建Android应用所需的工具集合。 `...

    Android-SYSTEM-INFO.rar_android

    本资源“Android-SYSTEM-INFO.rar”提供了一套用于Android系统信息获取的源代码,开发者可以轻松地将其集成到自己的应用中,以获取各种系统层面的数据。 首先,我们需要了解Android系统的层次结构。Android系统基于...

    Android/SDK/Platforms/android-33-ext4

    2. **Android SDK Build-Tools**:用于构建应用的工具集,如aapt(Android Asset Packaging Tool)和dx(Dalvik执行文件转换器)。 3. **Android System Images**:模拟器或硬件设备上运行的不同Android版本的系统...

    android build-tools_r19.0.3-windows

    Android SDK由多个组件组成,包括Build-Tools、Platform-Tools、Android Platforms、System Images等。这些组件共同协作,提供完整的Android开发环境。开发者通常通过Android SDK Manager来下载和更新这些组件,以...

    android-sdk-windows.zip

    5. **Android System Images**: 提供了各种Android版本的虚拟机镜像,用于在Android Emulator中运行。 6. **Sources for Android SDK**: Android源代码,对开发者理解系统底层运作和自定义系统有很大帮助。 7. **...

    Android代码-android-location-tracker

    android-location-tracker Android Simple Location Tracker is an Android library that helps you get user location with a object ...Be aware of Android Marshmallow's new permission system Use As its name

    android-nrf-toolbox

    然后,通过Android Studio的Build System编译并运行项目,测试Scanner、GATT Server和GATT Client等功能模块。 在实际开发中,开发者可以根据自身需求,结合工具包提供的API和示例,创建自定义的BLE服务和客户端...

    android sdk platform-31_r01.zip (android 12 preview)

    1. **system-images** - 这个目录包含模拟器用的系统镜像,开发者可以使用这些镜像在虚拟设备上运行和测试 Android 12 应用。 2. **docs** - 文档和参考材料,帮助开发者理解 Android 12 的新特性和API。 3. **...

    Android SDK (SDK Platforms)-android-34-ext8.zip

    6. **System Images**:用于在模拟器或物理设备上运行的Android系统镜像。 7. **Documentation**:详尽的API参考、开发者指南和教程。 **Android 34 (API Level 34) 特性** Android 34,也称为Android 13,引入了...

    Android Studio Linux(android-studio-ide-141.1890965-linux.zip )

    - Version Control System集成,支持Git和其他VCS,便于团队协作。 - 插件市场提供大量扩展功能,如代码美化、自动化工具等。 总的来说,"android-studio-ide-141.1890965-linux.zip"为Linux用户带来了完整的...

    android build system

    在Android Studio中,每个项目都有一个`build.gradle`文件,用于定义项目的构建规则和依赖关系。 1. **构建过程**:Android构建系统主要包括以下几个步骤: - **配置阶段**:读取`build.gradle`文件,解析其中的...

    模块化简易构建系统:Easy Build System - Modular Building System 6.8

    Easy Build System 是一个简单且模块化的构建解决方案,它使开发者能够轻松地进行项目开发。这个系统允许快速且容易地为项目添加高级构建特性。 ​ 用于 Unity 的高级模块化构建系统。轻松、快速、可缩放、强大、...

    build-tools_r28.0.3 + 使用方法.zip

    选择"Appearance & Behavior" -> "System Settings" -> "Android SDK",然后在"SDK Tools"标签页中找到"Android SDK Build-Tools",勾选相应的版本并点击"Apply"进行安装。在这个例子中,我们关注的是28.0.3版本。 ...

    build-tools.zip

    3. 在设置窗口中,选择“Appearance & Behavior” > “System Settings” > “Android SDK”。 4. 在“SDK Tools”标签页中,找到“Android SDK Build-Tools”,选择28.0.3版本,点击“Apply”或“OK”进行安装。 5....

    编译ffmpeg(ffmpeg6.0+android-ndk-r25c)生成的动态链接库.so文件

    在FFmpeg源码目录下创建一个名为`build-android.sh`的脚本,配置编译选项,例如: ```bash #!/bin/bash export NDK_PATH=/path/to/your/android-ndk-r25c export TOOLCHAIN=$NDK_PATH/toolchains/llvm/prebuilt...

    android-logging-log4j-1.0.3

    在Android应用中使用log4j,首先需要在项目的build.gradle文件中添加对应的依赖,通常是通过Maven或Gradle仓库获取。例如,如果使用Gradle,可以在dependencies块中添加如下代码: ```groovy dependencies { ...

Global site tag (gtag.js) - Google Analytics