关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android Makefile 编译过程分析

    Android Makefile 编译过程分析

    2015-03-21 00:00:00 出处:投稿
    分享

    本文比较详细地介绍了Android Make系统,通过手动Makefile编译Android来提高对Android系统的了解,以下是原文:

    android make 系统

    arch board device product

    Android.mk中的定义变量

    include $(CLEAR_VARS)

    它对应的是在./build/core/config.mk中的CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk

    include $(BUILD_PACKAGE)

    它对应的是在./build/core/config.mk中的BUILD_PACKAGE:=$(BUILD_SYSTEM)/package.mk

    其它以此类推

    main.mk中的模块

    .PHONY:checkbuilt
    .PHONY:prebuilt
    .PHONY: files
    .PHONY: ramdisk
    .PHONY: systemimage
    .PHONY: userdataimage
    .PHONY: bootimage
    .PHONY: recoveryimage
    .PHONY: droidcore
    .PHONY: apps_only
    .PHONY: sdk
    .PHONY: clean
    .PHONY: clobber
    .PHONY: modules
    .PHONY: showcommands

    makefile的文件结构

    LOCAL_PATH:=$(call my-dir) //获取当前目录
    	#include $(CLEAR_VARS) //make系统为子模块定义了很多的私有变量,这个调用是为了初始化所有的私有变量
    	...
    	//里面的内容根据不同的需要会出现不同的LOCAL变量
    	...
    	#include $(BUILD_XXX) //执行编译任务

    编译apk

    LOCAL_SRC_FILES:=$(call all-subdir-java-files)
    LOCAL_PACKAGE_NAME:=packageName
    include $(BUILD_PACKAGE)

    编译依赖静态java库的应用程序

    LOCAL_STATIC_JAVA_LIBRARIES:=static-library
    LOCAL_SRC_FILES:=$(call all-subdir-java-files)
    LOCAL_PACKAGE_NAME:=packageName
    include $(BUILD_PACKAGE)

    编译一个需要用平台key签名的应用程序

    LOCAL_SRC_FILES:=$(call all-subdir-java-files)
    LOCAL_PACKAGE_NAME:=packageName
    LOCAL_CERTIFICATE:=platform
    include $(BUILD_PACKAGE)

    编译一个需要特定key的应用程序

    LOCAL_SRC_FILES := $(call all-subdir-java-files)
    LOCAL_PACKAGE_NAME := LocalPackage
    LOCAL_CERTIFICATE := vendor/example/certs/app
    include $(BUILD_PACKAGE)

    添加一个预编译应用程序

    LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
    LOCAL_MODULE := LocalModuleName
    LOCAL_MODULE_CLASS := APPS
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
    include $(BUILD_PREBUILT)
    LOCAL_SRC_FILES := $(call all-subdir-java-files)
    LOCAL_JAVA_LIBRARIES := android.test.runner
    LOCAL_MODULE := sample
    include $(BUILD_STATIC_JAVA_LIBRARY)

    常用的mk分类

    Android.mk 用来编译模块或者apk的,module对应native code,package对应于java AndroidProducts.mk 设置product,设置系统包含了那些应用target_-.mk,host_-.mk,-.mk 针对不同的系统和CPU架框进行设置 +BoardConfig.mk 设置主板用的,比如driver的选择 ./build/core/Makefile 定义了image是如何生成的 frameworks/base/core/java 扩展SDK时,可以向里面添加自己的类

    make参数

    . build/envsetup.sh 可以设置环境,运行之后会支持mm命令,使make支持只编译一个模块
    用户也可以通过mm来编译指定模块,或者通过make clean-module_name来删除指定模块。 make ONE_SHOT_MAKEFILE=

    通过CREATE_MODULE_INFO_FILE,build system会将所有的模块信息列在$(PRODUCT_OUT)/module-info.txt中

    make CREATE_MODULE_INFO_FILE=true 产生单个的image文件,用以早期的硬件测试

    HOST_BUILD_TYPE 和 TARGET_BUILD_TYPE 用来设置是debug还是release,debug的带有调试信息,这两个参数也可以在 buildspec.mk中进行设置以防止在别处被重复指定

    其它的一些变量
    LOCAL_AAPT_FLAGS
    LOCAL_ACP_UNAVAILABL
    LOCAL_ADDITIONAL_JAVA_DIR
    LOCAL_AIDL_INCLUDES
    LOCAL_ALLOW_UNDEFINED_SYMBOLS
    LOCAL_ARM_MODE
    LOCAL_ASFLAGS
    LOCAL_ASSET_DIR
    LOCAL_ASSET_FILES 在与BUILD_PACKAGE一起时有效,表示资源文件
    LOCAL_BUILT_MODULE_STEM
    LOCAL_C_INCLUDES 用来指定外面的头文件路径
    LOCAL_CC 可以指定C编译器
    LOCAL_JAR_MANIFEST
    LOCAL_JARJAR_RULES
    LOCAL_JAR_PATH
    LOCAL_SHARED_LIBRARIES 可链接动态库
    LOCAL_SRC_FILES 编译源文件
    LOCAL_STATIC_JAVA_LIBRARIES
    LOCAL_STATIC_LIBRARIES 可链接静态库
    LOCAL_UNINSTALLABLE_MODULE
    LOCAL_WHOLE_STATIC_LIBRARIES 禁止在连接时删除库中的无用代码
    LOCAL_FORCE_STATIC_EXECUTABLE 假如编译的可执行程序要进行静态链接(执行时不依赖于任何动态库)
    LOCAL_JAVA_LIBRARIES 编译java应用程序和库的时候指定包含的java类库,目前有core和framework两种
                         多数情况下定义成:LOCAL_JAVA_LIBRARIES := core framework
                         注意LOCAL_JAVA_LIBRARIES不是必须的,而且编译APK时不允许定义(系统会自动添加)
    envsetup.mk会读取由envsetup.sh写入环境变量中的一些变量来配置 编译过程中的输出目录 config.mk里面定义了各种module所需要的工具,以及如何来编译各个模块
    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
    以上的*.mk中都包含了base_rules.mk
    products设置

    ./build/target/product/AndroidProducts.mk

    module设置

    native code和java的一些通用方法都在./build/core/definitions.mk中

    BUILD_SHARE_xxx等变量在./build/core/config.mk中

    Board设置

    ./build/target/board/$(TARGET_DEVICE)/BoardConfig.mk ./vendor/*/$(TARGET_DEVICE)/BoardConfig.mk

    rules相关

    与 LOCAL_MODULE_TAGS相关的定义

    include $(BUILD_STATIC_LIBRARY) 编译成静态库
    include $(BUILD_SHARED_LIBRARY) 编译成动态库。
    include $(BUILD_EXECUTABLE) 编译成可执行程序

    常用函数

    call my-dir
    call all-subdir-java-files
    call all-java-files-under
    call all-makefiles-under,$(LOCAL_PATH)
    call all-clean-step
    call import-module,android/native_app_glue
    call inherit-product,xxx.mk
    call inherit-product-if-exists
    call device-test
    call include-path-for,libpagemap
    call dist-for-goals,dist_files,$(LOCAL_BUILT_MODULE)
    call _add-charger-image,$(_img)
    call libfilterfw-all-java-files-under,$(1)
    call libfilterfw_to_document,$(LOCAL_PATH)
    call intermediates-dir-for,EXECUTABLES,$(LOCAL_MODULE,true)
    call all-named-subdir-makefiles,$(legacy_modules)
    call RM;call MKDIR
    call emugl-begin-host-shared-library,libEGL_translator
    call emugl-import,libOpenglOsUtils
    call emugl-end-module
    call emugl-export,LDLIBS,-lGL
    cal emugl-export,LDFLAGS,$(GL_COMMON_LINKER_FLAGS)
    call emugl-set-shared-library-subpath,hw
    call emugl-export,C_INCLUDES,$(intermediates)
    call all-makefiles-under,$(LOCAL_PATH) 这个和下面的区别还不清楚
    call all-subdis-makefiles
    这个是通常出现在整个makefile的尾部,以实现递归调用子目录中的makefile,使整个make系统成为一个树状结构
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    电脑屏幕不小心竖起来了?别慌,快捷键搞定

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    IT头条

    Synology 更新 ActiveProtect Manager 1.1 以增强企业网络弹性和合规性

    00:43

    新的 Rubrik Agent Cloud 加速了可信的企业 AI 代理部署

    00:34

    宇树科技 G1人形机器人,拉动一辆重达1.4吨的汽车

    00:21

    Cloudera 调查发现,96% 的企业已将 AI 集成到核心业务流程中,这表明 AI 已从竞争优势转变为强制性实践

    02:05

    投资者反对马斯克 1 万亿美元薪酬方案,要求重组特斯拉董事会

    01:18

    技术热点

    大型网站的 HTTPS 实践(三):基于协议和配置的优化

    ubuntu下右键菜单添加新建word、excel文档等快捷方式

    Sublime Text 简明教程

    用户定义SQL Server函数的描述

    怎么在windows 7开始菜单中添加下载选项?

    SQL Server 2016将有哪些功能改进?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。