Android编译分析

Android-6.0编译分析


 
#Start
source env.sh
    source build/envsetup.sh
        . device/.../vendorsetup.sh
        . vendor/.../vendorsetup.sh
        addcompletions

lunch ...
    set_stuff_for_environment
        setpaths
            local ARCH=$(get_build_var TARGET_ARCH)
                get_build_var()
                    CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
                        command make --no-print-directory -f build/core/config.mk dumpvar-$1
                    build/core/config.mk dumpvar-TARGET_ARCH
                        include $(BUILD_SYSTEM)/dumpvar.mk
                            $(dumpvar_target):@echo $(DUMPVAR_VALUE)
                            
make
Makefile
    build/core/main.mk
        include $(BUILD_SYSTEM)/config.mk
            include $(BUILD_SYSTEM)/envsetup.mk
            FIND_LEAVES_EXCLUDES := $(addprefix --prune=, $(OUT_DIR) $(SCAN_EXCLUDE_DIRS) .repo .git)
            include $(BUILD_SYSTEM)/product_config.mk
                include $(BUILD_SYSTEM)/product.mk
                #查找所有AndroidProducts.mk
                all_product_configs := $(get-all-product-makefiles)
                    $(call get-product-makefiles,$(_find-android-products-files)) #product.mk
                        $(eval include $(f))
                        #include device/.../AndroidProducts.mk
                        #include vendor/.../AndroidProducts.mk
                        #include $(SRC_TARGET_DIR)/product/AndroidProducts.mk
                            TARGET_BUILD_APPS=
                #查找所有product配置Makefile
                $(call import-products, $(current_product_makefile))
                    $(call import-nodes,PRODUCTS,$(1),$(_product_var_list))
                    ----
                    device/r/k/r_k.mk
                        $(call inherit-product, device/r/k/device.mk)
                        $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base.mk)
                            $(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk)
                                $(call inherit-product, $(SRC_TARGET_DIR)/product/generic_no_telephony.mk)
                                    $(call inherit-product, $(SRC_TARGET_DIR)/product/core.mk)
                        $(call inherit-product, device/r/k/r/r.mk)
                    ----
        #查找所有Android.mk
        subdir_makefiles := $(shell build/tools/findleaves.py $(FIND_LEAVES_EXCLUDES) $(subdirs) Android.mk) 
        $(foreach mk, $(subdir_makefiles), $(info including $(mk) ...)$(eval include $(mk)))

#End

Android 编译系统是构建 Android 操作系统及其应用程序的基础设施,负责将源代码、资源文件以及其他组件编译并打包成可在 Android 设备上运行的软件包,如 APK 或系统镜像 [^1]。 ### 发展历程 在 Android 7.0 之前,Android 编译系统使用 GNU Make 描述和 shell 来构建编译规则,模块定义使用 Android.mk,其本质是 Makefile。但随着 Android 工程规模增大、模块增多,Makefile 组织的项目编译时间变长 [^3][^4]。从 Android 7.0 开始,Google 引入了 ninja 和 kati 进行编译 [^3]。 ### 核心构建脚本 - **Android.mk**:在 Android 7.0 以前,是常用的构建脚本文件,用于组织各模块的编译。它需要定义 `LOCAL_PATH` 变量以在开发树中查找源文件,宏函数 `my-dir` 可返回当前路径(即包含 `Android.mk` 文件的目录) [^2][^3][^4][^5]。 - **Android.bp**:用来替换 Android.mk 的配置文件,使用 Blueprint 框架解析。Blueprint 是生成、解析 Android.bp 的工具,是 Soong 的一部分。Soong 专为 Android 编译设计,Blueprint 负责解析文件形式,Soong 解释内容含义,最终转换成 Ninja 文件。Android.bp 文件用类似 JSON 的简洁声明描述需要构建的模块 [^5]。 ### 编译过程 #### 环境准备 编译需在特定环境下进行,一般为 Linux 系统,要安装必要的依赖包,如 JDK,同时安装编译工具,如 GCC 编译器等。还需从官方渠道获取 Android 源码,使用 `repo` 工具同步源码,之后进行配置,设置环境变量,指定编译的目标设备、版本等信息。 #### 命令执行 不同版本和系统环境下命令有所不同。在 Windows 系统中使用 NDK 编译 Android 二进制文件,可使用 `ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk NDK_APPLICATION_MK=./Application.mk` 命令。在 Linux 系统中,常见命令如下: ```bash source build/envsetup.sh lunch aosp_arm-eng make -j$(nproc) ``` 其中,`source build/envsetup.sh` 用于设置编译环境,`lunch aosp_arm-eng` 用于选择编译的目标设备和版本,`make -j$(nproc)` 用于并行编译,`$(nproc)` 表示使用系统的所有核心进行编译。 #### 依赖处理 编译过程中,各模块存在依赖关系,编译系统会自动处理这些依赖,确保每个模块正确编译。例如,一个 Java 模块可能依赖于其他 Java 库,编译系统会找到这些库并进行相应处理。 #### 产物生成 经过编译步骤,最终生成 Android 系统的二进制文件,包括系统镜像文件、可执行文件、共享库文件等,这些文件可烧录到 Android 设备中运行。 ### 系统架构 - **GNU Make**:早期 Android 编译系统使用,用于描述和构建编译规则。 - **Ninja**:从 Android 7.0 引入,是一种快速的构建系统,与 kati 配合使用,提高编译效率。 - **Kati**:辅助 Ninja 进行编译,帮助处理原有的 Makefile 规则。 - **Soong**:专为 Android 编译设计的工具,与 Blueprint 配合,将 Android.bp 文件解析转换为 Ninja 文件。 - **Blueprint**:生成、解析 Android.bp 的工具,是 Soong 的一部分,负责解析文件形式。 ### 编译系统的特点 - **模块化**:Android 系统由众多模块组成,每个模块有独立的编译规则,便于开发和维护。 - **灵活性**:支持多种编译方式和配置选项,可根据不同需求进行定制。 - **自动化**:编译系统能自动处理模块间的依赖关系,减少手动干预。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值