• Android.mk简单分析


    复制代码
    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_MODULE_TAGS := optional
    
    LOCAL_SRC_FILES := $(call all-java-files-under, src)
    
    LOCAL_PACKAGE_NAME := Settings
    LOCAL_CERTIFICATE := platform
    
    include $(BUILD_PACKAGE)
    
    # Use the folloing include to make our test apk.
    include $(call all-makefiles-under,$(LOCAL_PATH))
    复制代码

    该Android.mk文件路径是package/app/Settings/Android.mk,来分析该文件

    GNU Make‘功能’宏,必须通过使用'$(call  )'来调用,调用他们将返回文本化的信息。

    ------------------------------------------------------------------------------------------------------------------------------

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

    一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。

    宏函数’my-dir’,由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

    ------------------------------------------------------------------------------------------------------------------------------

    (2) Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束。

    (2.1) include $(CLEAR_VARS)

    CLEAR_VARS指的是clear_vars.mk,由编译系统提供,它会让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

    这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。

    (2.2) include $(BUILD_PACKAGE)      # Tell it to build an APK

    $(BUILD_PACKAGE)是用来编译生成package/app/下的apk。

    还有其他几种编译情况:

    include $(BUILD_STATIC_LIBRARY)   表示编译成静态库

    include $(BUILD_SHARED_LIBRARY)  表示编译成动态库

    include $(BUILD_EXECUTABLE)      表示编译成可执行程序         

    至于例子的话,跳转到下面的"扩展"

    ------------------------------------------------------------------------------------------------------------------------------

    (3) LOCAL_MODULE_TAGS := optional

    解析:

    LOCAL_MODULE_TAGS :=user eng tests optional

    user:  指该模块只在user版本下才编译

    eng:  指该模块只在eng版本下才编译

    tests: 指该模块只在tests版本下才编译

    optional:指该模块在所有版本下都编译

    取值范围debug eng tests optional samples shell_ash shell_mksh。注意不能取值user,如果要预装,则应定义core.mk。

    ------------------------------------------------------------------------------------------------------------------------------

    (4) LOCAL_SRC_FILES := $(call all-java-files-under, src)

    (4.1) 如果要包含的是java源码的话,可以调用all-java-files-under得到。(这种形式来包含local_path目录下的所有java文件)

    (4.2) 当涉及到C/C++时,LOCAL_SRC_FILES变量就必须包含将要编译打包进模块中的C或C++源代码文件。注意,在这里你可以不用列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。

    all-java-files-under宏的定义是在build/core/definitions.mk中。

    ------------------------------------------------------------------------------------------------------------------------------

    (5) LOCAL_PACKAGE_NAME := Settings

    package的名字,这个名字在脚本中将标识这个app或package。

    ------------------------------------------------------------------------------------------------------------------------------

    (6) LOCAL_CERTIFICATE := platform

    LOCAL_CERTIFICATE 后面是签名文件的文件名,说明Settings.apk是一个需要platform key签名的APK

    ------------------------------------------------------------------------------------------------------------------------------

    (7) include $(BUILD_PACKAGE)

    在(2.2)中已作解释

    ------------------------------------------------------------------------------------------------------------------------------

    (8) include $(call all-makefiles-under,$(LOCAL_PATH))

    加载当前目录下的所有makefile文件,all-makefiles-under会返回一个位于当前'my-dir'路径的子目录中的所有Android.mk的列表。

    all-makefiles-under宏的定义是在build/core/definitions.mk中。

    ------------------------------------------------------------------------------------------------------------------------------

    这个Android.mk文件最后就生成了Settings.apk。分析完上面的Android.mk文件后,来总结下各种LOCAL_XXX。

    三种情况说明:

        必须定义, 在app或package的Android.mk中必须给定值。

        可选定义,在app或package的Android.mk中可以也可以不给定值。

        不用定义,在app或package的Android.mk中不要给定值,脚本自动指定值。

    复制代码
    LOCAL_PATH,          当前路径,必须定义。
    LOCAL_PACKAGE_NAME,  必须定义,package的名字,这个名字在脚本中将标识app或package。
    LOCAL_MODULE_SUFFIX, 不用定义,module的后缀,=.apk。
    LOCAL_MODULE,        不用定义,=$(LOCAL_PACKAGE_NAME)。
    LOCAL_JAVA_RESOURCE_DIRS,     不用定义。
    LOCAL_JAVA_RESOURCE_FILES,    不用定义。
    LOCAL_MODULE_CLASS,  不用定义。
    LOCAL_MODULE_TAGS,   可选定义。默认optional。取值范围user debug eng tests optional samples shell_ash shell_mksh。
    LOCAL_ASSET_DIR,     可选定义,推荐不定义。默认$(LOCAL_PATH)/assets
    LOCAL_RESOURCE_DIR,  可选定义,推荐不定义。默认product package和device package相应的res路径和$(LOCAL_PATH)/res。
    LOCAL_PROGUARD_ENABLED,       可选定义,默认为full,如果是user或userdebug。取值full, disabled, custom。
    full_android_manifest,        不用定义,=$(LOCAL_PATH)/AndroidManifest.xml。
    LOCAL_EXPORT_PACKAGE_RESOURCES,    可选定义,默认null。如果允许app的资源被其它模块使用,则设置true。
    LOCAL_CERTIFICATE,   可选定义,默认为testkey。最终
            private_key := $(LOCAL_CERTIFICATE).pk8
            certificate := $(LOCAL_CERTIFICATE).x509.pem
    复制代码

    扩展:在一个Android.mk中可以生成多个可执行程序、动态库和静态库。

    (1)编译APK应用程序模板。
    关于编译APK应用程序的模板请参照《Android.mk编译APK范例
     
    (2)编译JAVA库模板
    复制代码
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    # Build all java files in the java subdirectory
    LOCAL_SRC_FILES := $(call all-subdir-java-files)
    # Any libraries that this library depends on
    LOCAL_JAVA_LIBRARIES := android.test.runner
    # The name of the jar file to create
    LOCAL_MODULE := sample
    # Build a static jar file.
    include $(BUILD_STATIC_JAVA_LIBRARY)
    复制代码
      :LOCAL_JAVA_LIBRARIES := android.test.runner表示生成的JAVA库的jar文件名
     
    (3)编译C/C++应用程序模板如下
    复制代码
    LOCAL_PATH := $(call my-dir)
    #include $(CLEAR_VARS)
    LOCAL_SRC_FILES := main.c
    LOCAL_MODULE := test_exe
    #LOCAL_C_INCLUDES :=
    #LOCAL_STATIC_LIBRARIES :=
    #LOCAL_SHARED_LIBRARIES :=
    include $(BUILD_EXECUTABLE)
    复制代码

     :‘:=’是赋值的意思,'+='是追加的意思,‘$’表示引用某变量的值

    LOCAL_SRC_FILES中加入源文件路径,LOCAL_C_INCLUDES中加入需要的头文件搜索路径
    LOCAL_STATIC_LIBRARIES 加入所需要链接的静态库(*.a)的名称,
    LOCAL_SHARED_LIBRARIES 中加入所需要链接的动态库(*.so)的名称,
    LOCAL_MODULE表示模块最终的名称,BUILD_EXECUTABLE 表示以一个可执行程序的方式进行编译。
    (4)编译CC++静态库
    复制代码
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := 
     helloworld.c
    LOCAL_MODULE:= libtest_static
     #LOCAL_C_INCLUDES :=
    #LOCAL_STATIC_LIBRARIES :=
    #LOCAL_SHARED_LIBRARIES :=
    include $(BUILD_STATIC_LIBRARY)
    复制代码

     和上面相似,BUILD_STATIC_LIBRARY 表示编译一个静态库。

    (5)编译C/C++动态库的模板
    复制代码
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := helloworld.c
    LOCAL_MODULE := libtest_shared
    TARGET_PRELINK_MODULES := false
    #LOCAL_C_INCLUDES :=
    #LOCAL_STATIC_LIBRARIES :=
    #LOCAL_SHARED_LIBRARIES :=
    include $(BUILD_SHARED_LIBRARY)
    复制代码

    和上面相似,BUILD_SHARED_LIBRARY 表示编译一个共享库。

    以上三者的生成结果分别在如下目录中,generic 依具体 target 会变(可能是dkb~~):
    out/target/product/generic/obj/APPS
    out/target/product/generic/obj/JAVA_LIBRARIES
    out/target/product/generic/obj/EXECUTABLE
    out/target/product/generic/obj/STATIC_LIBRARY
    out/target/product/generic/obj/SHARED_LIBRARY

    每个模块的目标文件夹分别为:

    1)APK程序:XXX_intermediates
    2)JAVA库程序:XXX_intermediates
    3)CC++可执行程序:XXX_intermediates
    4)CC++静态库: XXX_static_intermediates
    5)CC++动态库: XXX_shared_intermediates

    参考文章: 

    讲解的很详细~~

    Android.mk简介

    编译apk的例子~~

    Android.mk编译APK范例

    这个讲的有点广,涉及到很多mk文件~~

    Android makefile 组织结构

    continue my dream...
  • 相关阅读:
    C#4.0,支持动态语言?
    宁波.NET俱乐部第二次聚会WCF讲稿
    在线学习新编程
    mysql常用函数
    PHP 连接Mysql数据库
    Unix网络编程进阶计划
    RabbitMQ 安装
    Golang 变量
    Golang 结构体
    Golang 指针
  • 原文地址:https://www.cnblogs.com/luolizhi/p/5853031.html
Copyright © 2020-2023  润新知