• AOSP——Android.mk解析


    Android.mk是什么?

    Android.mk是用于控制Android代码的编译流程,用shell编写

    Android.mk结构

    设置当前路径

    除带#的注释,Android.mk第一句话都是

    LOCAL_PATH := $(call my-dir)
    
    • 1

    即将my-dir方法的返回值赋值给LOCAL_PATH,让其等于当前目录,其中的my-dir 方法在build/core/defintions.mk中定义,源码如下

    ###########################################################
    ## Retrieve the directory of the current makefile
    ## Must be called before including any other makefile!!
    ###########################################################
    
    # Figure out where we are.
    define my-dir
    $(strip \
      $(eval LOCAL_MODULE_MAKEFILE := $$(lastword $$(MAKEFILE_LIST))) \
      $(if $(filter $(BUILD_SYSTEM)/% $(OUT_DIR)/%,$(LOCAL_MODULE_MAKEFILE)), \
        $(error my-dir must be called before including any other makefile.) \
       , \
        $(patsubst %/,%,$(dir $(LOCAL_MODULE_MAKEFILE))) \
       ) \
     )
    endef
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    清空所有LOCAL变量

    接下来是

    include $(CLEAR_VARS)
    
    • 1

    CLEAR_VARS的值在/build/core/config.mk,源码如下:

    CLEAR_VARS := $(BUILD_SYSTEM)/clear_vars.mk
    
    • 1

    BUILD_SYSTEM在/build/core/cleanbuild.mk及/build/core/config.mk中均有定义,源码如下:

    BUILD_SYSTEM := $(TOPDIR)build/core
    
    • 1

    TOPDIR为空,所以BUILD_SYSTEM:=build/core,故CLEAR_VARS=build/core/clear_vars.mk,其内容为清空所有LOCAL变量,部分源码如下:

    ###########################################################
    ## Clear out values of all variables used by rule templates.
    ###########################################################
    
    # '',true
    LOCAL_2ND_ARCH_VAR_PREFIX:=
    LOCAL_32_BIT_ONLY:=
    LOCAL_AAPT2_ONLY:=
    LOCAL_AAPT_FLAGS:=
    LOCAL_AAPT_INCLUDE_ALL_RESOURCES:=
    LOCAL_AAPT_NAMESPACES:=
    LOCAL_ADDITIONAL_CERTIFICATES:=
    LOCAL_ADDITIONAL_CHECKED_MODULE:=
    LOCAL_ADDITIONAL_DEPENDENCIES:=
    LOCAL_ADDITIONAL_HTML_DIR:=
    LOCAL_ADDITIONAL_JAVA_DIR:=
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    重新设置LOCAL变量

    接下来是为自己的代码设置编译流程,常用的变量及取值有

    变量取值及意义
    LOCAL_PACKAGE_NAME包名,自定义
    LOCAL_MODULE_TAGSoptional
    LOCAL_SRC_FILES$(call all-java-files-under, src)
    LOCAL_STATIC_JAVA_LIBRARIESandroid-support-v4
    LOCAL_JAVA_LIBRARIES
    LOCAL_CERTIFICATEplatform
    LOCAL_SDK_VERSIONcurrent
    LOCAL_PRODUCT_MODULEtrue
    LOCAL_OVERRIDES_PACKAGES
    LOCAL_STATIC_ANDROID_LIBRARIES\
    android-support-v7-appcompat \
    android-support-v7-recyclerview

    选择构建方式

    接下来是为自己的代码设置构建方法,常用的构建方式及意义有

    构建方式意义
    include $(BUILD_PACKAGE)构建为app
    BUILD_PACKAGE的值在/build/core/config.mk
    BUILD_PACKAGE := $(BUILD_SYSTEM)/package.mk
    意为引进build/core/package.mk为程序打包

    调用当前目录下的所有mk文件

    include $(call all-makefiles-under,$(LOCAL_PATH))
    
    • 1

    all-makefiles-under 方法在在build/core/defintions.mk中定义,源码如下

    • 相关阅读:
      lotus-local-net 8MiB v1.17.0 本地测试环境
      从零玩转人脸识别
      C++ vector 功能强大的数组
      中小型企网搭建
      segment方案解决VXLAN分布式网关DCI间互联
      使用 setoolkit 伪造站点窃取用户信息
      Dephi2007以任意字符串分隔字符
      基于吉萨金字塔建造优化的BP神经网络(分类应用) - 附代码
      Unity Shader入门精要学习——透明效果
      SAP S/4HANA Public Cloud Enhancement
    • 原文地址:https://blog.csdn.net/qq_35258036/article/details/120192179