精华内容
下载资源
问答
  • Androidmk将Android.mk转换成Android.bp

    Android源码里边提供了快捷直接Android.mk转换成Android.bp的工具:androidmk。

    AOSP源码以及项目编译出来后androidmk可执行文件位置:

    lenovo@HZCS13:~/coding/aosp/build/soong$ 
    lenovo@HZCS13:~/coding/aosp/build/soong$ 
    lenovo@HZCS13:~/coding/aosp/build/soong$ find . -name androidmk
    ./androidmk
    ./androidmk/cmd/androidmk
    lenovo@HZCS13:~/coding/aosp/build/soong$ 
    lenovo@HZCS13:~/coding/aosp/build/soong$ 
    lenovo@HZCS13:~/coding/aosp/build/soong$ cd ..
    lenovo@HZCS13:~/coding/aosp/build$ cd ..
    lenovo@HZCS13:~/coding/aosp$ cd out/soong/
    lenovo@HZCS13:~/coding/aosp/out/soong$ find . -name androidmk
    ./host/linux-x86/bin/androidmk
    ./.bootstrap/androidmk
    ./.bootstrap/androidmk-parser/test/android/soong/androidmk
    ./.bootstrap/androidmk-parser/pkg/android/soong/androidmk
    lenovo@HZCS13:~/coding/aosp/out/soong$ 
    lenovo@HZCS13:~/coding/aosp/out/soong$ 

    转换方法:

    aosp/out/soong/host/linux-x86/bin/androidmk [Android.mk PATH] > [Android.bp PATH]

    举个栗子:

    转换前,

    lenove@HZCS13:~/coding/aosp/packages/apps/SecureElement$ cat Android.mk 
    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_SRC_FILES := $(call all-java-files-under, src)
    
    LOCAL_PACKAGE_NAME := SecureElement
    LOCAL_PRIVATE_PLATFORM_APIS := true
    LOCAL_CERTIFICATE := platform
    LOCAL_MODULE_TAGS := optional
    
    LOCAL_STATIC_JAVA_LIBRARIES := android.hardware.secure_element-V1.0-java
    
    LOCAL_PROGUARD_ENABLED := disabled
    
    include $(BUILD_PACKAGE)
    
    include $(call all-makefiles-under,$(LOCAL_PATH))
    lenove@HZCS13:~/coding/aosp/packages/apps/SecureElement$ 

    转换后,

    lenovo@HZCS13:~/coding/aosp/packages/apps/SecureElement$ ../../../out/soong/host/linux-x86/bin/androidmk Android.mk > Android.bp
    lenovo@HZCS13:~/coding/aosp/packages/apps/SecureElement$ 
    lenovo@HZCS13:~/coding/aosp/packages/apps/SecureElement$ 
    lenovo@HZCS13:~/coding/aosp/packages/apps/SecureElement$ 
    lenovo@HZCS13:~/coding/aosp/packages/apps/SecureElement$ cat Android.bp 
    android_app {
        name: "SecureElement",
    
        srcs: ["src/**/*.java"],
    
        platform_apis: true,
        certificate: "platform",
    
        static_libs: ["android.hardware.secure_element-V1.0-java"],
    
        optimize: {
            enabled: false,
        },
    
    }
    lenovo@HZCS13:~/coding/aosp/packages/apps/SecureElement$ 

    来个稍微复杂一点的:

    前:

    lenovo@HZCS13:~/coding/aosp/packages/apps/Car/Launcher$ cat Android.mk 
    # Copyright (C) 2018 The Android Open Source Project
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    #
    
    ifneq ($(TARGET_BUILD_PDK), true)
    
    LOCAL_PATH:= $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_SRC_FILES := $(call all-java-files-under, src)
    
    LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
    
    LOCAL_PACKAGE_NAME := CarLauncher
    
    LOCAL_PRIVATE_PLATFORM_APIS := true
    
    LOCAL_REQUIRED_MODULES := privapp_whitelist_com.android.car.carlauncher
    
    LOCAL_CERTIFICATE := platform
    
    LOCAL_MODULE_TAGS := optional
    
    LOCAL_PRIVILEGED_MODULE := true
    
    LOCAL_OVERRIDES_PACKAGES += Launcher2 Launcher3 Launcher3QuickStep
    
    LOCAL_USE_AAPT2 := true
    
    LOCAL_PROGUARD_ENABLED := disabled
    
    LOCAL_DEX_PREOPT := false
    
    LOCAL_STATIC_JAVA_LIBRARIES := \
        androidx-constraintlayout_constraintlayout-solver
    
    LOCAL_JAVA_LIBRARIES += android.car
    
    LOCAL_STATIC_ANDROID_LIBRARIES += \
        androidx-constraintlayout_constraintlayout \
        androidx.lifecycle_lifecycle-extensions \
        car-media-common
    
    # Including the resources for the static android libraries allows to pick up their static overlays.
    LOCAL_RESOURCE_DIR += \
        $(LOCAL_PATH)/../libs/car-apps-common/res \
        $(LOCAL_PATH)/../libs/car-media-common/res
    
    include $(BUILD_PACKAGE)
    
    endif
    lenovo@HZCS13:~/coding/aosp/packages/apps/Car/Launcher$ 

    后:

    lenovo@HZCS13:~/coding/aosp/packages/apps/Car/Launcher$ ../../../../out/soong/host/linux-x86/bin/androidmk Android.mk 
    // Copyright (C) 2018 The Android Open Source Project
    //
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //      http://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.
    //
    
    android_app {
        name: "CarLauncher",
    
        srcs: ["src/**/*.java"],
    
        resource_dirs: ["res"] + [ // Including the resources for the static android libraries allows to pick up their static overlays.
            "../libs/car-apps-common/res",
            "../libs/car-media-common/res",
        ],
    
        platform_apis: true,
    
        required: ["privapp_whitelist_com.android.car.carlauncher"],
    
        certificate: "platform",
    
        privileged: true,
    
        overrides: [
            "Launcher2",
            "Launcher3",
            "Launcher3QuickStep",
        ],
    
        optimize: {
            enabled: false,
        },
    
        dex_preopt: {
            enabled: false,
        },
    
        static_libs: [
            "androidx-constraintlayout_constraintlayout-solver",
            "androidx-constraintlayout_constraintlayout",
            "androidx.lifecycle_lifecycle-extensions",
            "car-media-common",
        ],
    
        libs: ["android.car"],
    
        product_variables: {
            pdk: {
                enabled: false,
            },
        },
    }
    lenovo@HZCS13:~/coding/aosp/packages/apps/Car/Launcher$ 

    从以长例子可以找到一些Android.mk和Android.bp宏声明的对应关系。

    例如:

    //Andorid.bp
        optimize: {
            enabled: false,
        },
    
        dex_preopt: {
            enabled: false,
        },
    
    
    #Android.mk
    
    LOCAL_PROGUARD_ENABLED := disabled
    
    LOCAL_DEX_PREOPT := false

     

    展开全文
  • Android mk编译APK范例

    2018-11-15 08:20:38
    Android mk编译APK范例

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   
    以下仅是使用Android.mk编译APK程序的一些范例。
    如果你想了解Android.mk的更多内容请参考《Android.mk简介
    一、编译一个简单的APK 
      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      # Build all java files in the java subdirectory
      LOCAL_SRC_FILES := $(call all-subdir-java-files)
      # Name of the APK to build
      LOCAL_PACKAGE_NAME := LocalPackage
      # Tell it to build an APK
      include $(BUILD_PACKAGE)
    二、编译一个依赖静态.jar文件的APK 
      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      # List of static libraries to include in the package
      LOCAL_STATIC_JAVA_LIBRARIES := static-library
      # Build all java files in the java subdirectory
      LOCAL_SRC_FILES := $(call all-subdir-java-files)
      # Name of the APK to build
      LOCAL_PACKAGE_NAME := LocalPackage
      # Tell it to build an APK
      include $(BUILD_PACKAGE)
     LOCAL_STATIC_JAVA_LIBRARIES 后面应是你的APK程序所需要的JAVA库的JAR文件名。
    三、编译一个需要platform key签名的APK 
      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      # Build all java files in the java subdirectory
      LOCAL_SRC_FILES := $(call all-subdir-java-files)
      # Name of the APK to build
      LOCAL_PACKAGE_NAME := LocalPackage
      LOCAL_CERTIFICATE := platform
      # Tell it to build an APK
      include $(BUILD_PACKAGE)
     注:LOCAL_CERTIFICATE 后面应该是签名文件的文件名
    四、编译一个需要特殊vendor key签名的APK 
      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      # Build all java files in the java subdirectory
      LOCAL_SRC_FILES := $(call all-subdir-java-files)
      # Name of the APK to build
      LOCAL_PACKAGE_NAME := LocalPackage
      LOCAL_CERTIFICATE := vendor/example/certs/app
      # Tell it to build an APK
      include $(BUILD_PACKAGE)
    五、装载一个普通的第三方APK
      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      # Module name should match apk name to be installed.
      LOCAL_MODULE := LocalModuleName
      LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
      LOCAL_MODULE_CLASS := APPS
      LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
      LOCAL_CERTIFICATE := platform
      include $(BUILD_PREBUILT
    六、装载需要.so(动态库)的第三方apk
    LOCAL_PATH := $(my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := baiduinput_android_v1.1_1000e
    LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
    LOCAL_MODULE_CLASS := APPS
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
    LOCAL_CERTIFICATE := platform
    include $(BUILD_PREBUILT)
     
    #################################################################
    ####### copy the library to /system/lib #########################
    #################################################################
    include $(CLEAR_VARS)
    LOCAL_MODULE := libinputcore.so
    LOCAL_MODULE_CLASS := SHARED_LIBRARIES
    LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
    LOCAL_SRC_FILES := lib/$(LOCAL_MODULE)
    OVERRIDE_BUILD_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)
    include $(BUILD_PREBUILT)
    七、编译一个静态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表示生成的java库的jar文件名。
               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block var foo = 'bar'; 

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目 Value
    电脑 $1600
    手机 $12
    导管 $1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列 第二列 第三列
    第一列文本居中 第二列文本居右 第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPE ASCII HTML
    Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
    Quotes "Isn't this fun?" “Isn’t this fun?”
    Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to-HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

    Γ(z)=0tz1etdt . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    gantt
            dateFormat  YYYY-MM-DD
            title Adding GANTT diagram functionality to mermaid
            section 现有任务
            已完成               :done,    des1, 2014-01-06,2014-01-08
            进行中               :active,  des2, 2014-01-09, 3d
            计划一               :         des3, after des2, 5d
            计划二               :         des4, after des3, 5d
    
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • Android mk详解

    万次阅读 2019-07-20 13:28:21
    Android.mk文件用于定义Application.mk、编译系统和环境变量所未定义的项目范围设置。它还可替换特定模块的项目范围设置。 Android.mk的语法支持将源文件分组为模块。模块是静态库、共享库或...

    概览

    Android.mk 文件位于项目 jni/ 目录的子目录中,用于向编译系统描述源文件和共享库。它实际上是编译系统解析一次或多次的微小 GNU makefile 片段。Android.mk 文件用于定义 Application.mk、编译系统和环境变量所未定义的项目范围设置。它还可替换特定模块的项目范围设置。

    Android.mk 的语法支持将源文件分组为模块。模块是静态库、共享库或独立的可执行文件。您可在每个 Android.mk 文件中定义一个或多个模块,也可在多个模块中使用同一个源文件。编译系统只将共享库放入您的应用软件包。此外,静态库可生成共享库。

    除了封装库之外,编译系统还可为您处理各种其他事项。例如,您无需在 Android.mk 文件中列出头文件或生成的文件之间的显式依赖关系。NDK 编译系统会自动计算这些关系。因此,您应该能够享受到未来 NDK 版本中新工具链/平台支持带来的益处,而无需处理 Android.mk 文件。

    此文件的语法与随整个 Android 开源项目分发的 Android.mk 文件中使用的语法非常接近。虽然使用这些语法的编译系统实现并不相同,但通过有意将语法设计得相似,可使应用开发者更轻松地将源代码重复用于外部库。

    基础知识

    在详细了解语法之前,最好先了解 Android.mk 文件所含内容的基本信息。为此,本部分使用 Hello-JNI 示例中的 Android.mk 文件解释文件中每一行的作用。

    Android.mk 文件必须先定义 LOCAL_PATH 变量:

    LOCAL_PATH := $(call my-dir)
        

     

    此变量表示源文件在开发树中的位置。在这行代码中,编译系统提供的宏函数 my-dir 将返回当前目录(Android.mk 文件本身所在的目录)的路径。

    下一行声明 CLEAR_VARS 变量,其值由编译系统提供。

    include $(CLEAR_VARS)
        

     

    CLEAR_VARS 变量指向一个特殊的 GNU Makefile,后者会清除许多 LOCAL_XXX 变量,例如 LOCAL_MODULELOCAL_SRC_FILES 和 LOCAL_STATIC_LIBRARIES。请注意,GNU Makefile 不会清除 LOCAL_PATH。此变量必须保留其值,因为系统在单一 GNU Make 执行环境(其中的所有变量都是全局变量)中解析所有编译控制文件。在描述每个模块之前,必须声明(重新声明)此变量。

    接下来,LOCAL_MODULE 变量存储您要编译的模块的名称。请在应用的每个模块中使用一次此变量。

    LOCAL_MODULE := hello-jni
        

     

    每个模块名称必须唯一,且不含任何空格。编译系统在生成最终共享库文件时,会对您分配给 LOCAL_MODULE 的名称自动添加正确的前缀和后缀。例如,上述示例会生成名为 libhello-jni.so的库。

    注意:如果模块名称的开头已经是 lib,则编译系统不会附加额外的 lib 前缀;而是按原样采用模块名称,并添加 .so 扩展名。因此,比如原来名为 libfoo.c 的源文件仍会生成名为 libfoo.so 的共享对象文件。此行为是为了支持 Android 平台源文件根据 Android.mk 文件生成的库;所有这些库的名称都以 lib 开头。

    下一行会列举源文件,以空格分隔多个文件:

    LOCAL_SRC_FILES := hello-jni.c
        

     

    LOCAL_SRC_FILES 变量必须包含要编译到模块中的 C 和/或 C++ 源文件列表。

    最后一行帮助系统将所有内容连接到一起:

    include $(BUILD_SHARED_LIBRARY)
        

     

    BUILD_SHARED_LIBRARY 变量指向一个 GNU Makefile 脚本,该脚本会收集您自最近 include 以来在 LOCAL_XXX 变量中定义的所有信息。此脚本确定要编译的内容以及编译方式。

    示例目录中有更为复杂的示例,包括带有注释的 Android.mk 文件供您参考。此外,示例:native-activity 详细介绍了该示例的 Android.mk 文件。最后,变量和宏提供了关于本部分中变量的更多信息。

    变量和宏

    编译系统提供了许多可在 Android.mk 文件中使用的变量。其中许多变量已预先赋值。另一些变量由您赋值。

    除了这些变量之外,您还可以自己定义任意变量。在定义变量时请注意,NDK 编译系统保留了下列变量名称:

    • 以 LOCAL_ 开头的名称,例如 LOCAL_MODULE
    • 以 PRIVATE_NDK_ 或 APP 开头的名称。编译系统在内部使用这些变量名。
    • 小写名称,例如 my-dir。编译系统也是在内部使用这些变量名。

    如果您为了方便而需要在 Android.mk 文件中定义自己的变量,建议在名称前附加 MY_

    NDK 定义的 include 变量

    本部分探讨了编译系统在解析 Android.mk 文件前定义的 GNU Make 变量。在某些情况下,NDK 可能会多次解析 Android.mk 文件,每次使用其中某些变量的不同定义。

    CLEAR_VARS

    此变量指向的编译脚本用于取消定义下文“开发者定义的变量”部分中列出的几乎所有 LOCAL_XXX 变量。在描述新模块之前,请使用此变量来包含此脚本。使用它的语法为:

    include $(CLEAR_VARS)
        

     

    BUILD_SHARED_LIBRARY

    此变量指向的编译脚本用于收集您在 LOCAL_XXX 变量中提供的模块的所有相关信息,以及确定如何根据您列出的源文件编译目标共享库。请注意,使用此脚本要求您至少已经为 LOCAL_MODULE 和 LOCAL_SRC_FILES 赋值(要详细了解这些变量,请参阅模块描述变量)。

    使用此变量的语法为:

    include $(BUILD_SHARED_LIBRARY)
        

     

    共享库变量会导致编译系统生成扩展名为 .so 的库文件。

    BUILD_STATIC_LIBRARY

    用于编译静态库的 BUILD_SHARED_LIBRARY 的变体。编译系统不会将静态库复制到您的项目/软件包中,但可以使用静态库编译共享库(请参阅下文的 LOCAL_STATIC_LIBRARIES 和 LOCAL_WHOLE_STATIC_LIBRARIES)。使用此变量的语法为:

    include $(BUILD_STATIC_LIBRARY)
        

     

    静态库变量会导致编译系统生成扩展名为 .a 的库。

    PREBUILT_SHARED_LIBRARY

    指向用于指定预编译共享库的编译脚本。与 BUILD_SHARED_LIBRARY 和 BUILD_STATIC_LIBRARY的情况不同,这里的 LOCAL_SRC_FILES 值不能是源文件,而必须是指向预编译共享库的一个路径,例如 foo/libfoo.so。使用此变量的语法为:

    include $(PREBUILT_SHARED_LIBRARY)
        

     

    您也可以使用 LOCAL_PREBUILTS 变量引用另一个模块中的预编译库。要详细了解如何使用预编译库,请参阅使用预编译库

    PREBUILT_STATIC_LIBRARY

    与 PREBUILT_SHARED_LIBRARY 相同,但用于预编译静态库。要详细了解如何使用预编译库,请参阅使用预编译库

    目标信息变量

    编译系统会根据 APP_ABI 变量所指定的每个 ABI 解析 Android.mk 一次,该变量通常在 Application.mk 文件中定义。如果 APP_ABI 为 all,则编译系统会根据 NDK 支持的每个 ABI 解析 Android.mk 一次。本部分介绍了编译系统每次解析 Android.mk 时定义的变量。

    TARGET_ARCH

    编译系统解析此 Android.mk 文件时面向的 CPU 系列。此变量是 armarm64x86 或 x86_64之一。

    TARGET_PLATFORM

    编译系统解析此 Android.mk 文件时面向的 Android API 级别编号。例如,Android 5.1 系统映像对应于 Android API 级别 22:android-22。如需平台名称和对应 Android 系统映像的完整列表,请参阅 Android NDK 原生 API。以下示例演示了使用此变量的语法:

    ifeq ($(TARGET_PLATFORM),android-22)
            # ... do something ...
        endif
        

     

    TARGET_ARCH_ABI

    编译系统解析此 Android.mk 文件时面向的 ABI。表 1 显示用于每个受支持 CPU 和架构的 ABI 设置。

    表 1. 不同 CPU 和架构的 ABI 设置。

    CPU 和架构 设置
    ARMv7 armeabi-v7a
    ARMv8 AArch64 arm64-v8a
    i686 x86
    x86-64 x86_64

    以下示例演示了如何检查 ARMv8 AArch64 是否为目标 CPU 与 ABI 的组合:

    ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
          # ... do something ...
        endif
        

     

    要详细了解架构 ABI 和相关兼容性问题,请参阅 ABI 管理

    未来的新目标 ABI 将使用不同的值。

    TARGET_ABI

    目标 Android API 级别与 ABI 的连接,特别适用于要针对实际设备测试特定目标系统映像的情况。例如,要检查搭载 Android API 级别 22 的 64 位 ARM 设备:

    ifeq ($(TARGET_ABI),android-22-arm64-v8a)
          # ... do something ...
        endif
        

     

    模块描述变量

    本部分中的变量会向编译系统描述您的模块。每个模块描述都应遵守以下基本流程:

    1. 使用 CLEAR_VARS 变量初始化或取消定义与模块相关的变量。
    2. 为用于描述模块的变量赋值。
    3. 使用 BUILD_XXX 变量设置 NDK 编译系统,使其将适当的编译脚本用于该模块。

    LOCAL_PATH

    此变量用于指定当前文件的路径。必须在 Android.mk 文件开头定义此变量。以下示例演示了如何定义此变量:

    LOCAL_PATH := $(call my-dir)
        

     

    CLEAR_VARS 所指向的脚本不会清除此变量。因此,即使 Android.mk 文件描述了多个模块,您也只需定义它一次。

    LOCAL_MODULE

    此变量用于存储模块名称。指定的名称必须唯一,并且不得包含任何空格。必须在包含任何脚本(CLEAR_VARS 的脚本除外)之前定义此变量。无需添加 lib 前缀或者 .so 或 .a 文件扩展名;编译系统会自动进行这些修改。在整个 Android.mk 和 Application.mk 文件中,请通过未经修改的名称引用模块。例如,以下行会导致生成名为 libfoo.so 的共享库模块:

    LOCAL_MODULE := "foo"
        

     

    如果希望生成的模块使用除“lib + LOCAL_MODULE 的值”以外的名称,您可使用 LOCAL_MODULE_FILENAME 变量为生成的模块指定自己选择的名称。

    LOCAL_MODULE_FILENAME

    此可选变量使您能够替换编译系统为其生成的文件默认使用的名称。例如,如果 LOCAL_MODULE 的名称为 foo,您可以强制系统将它生成的文件命名为 libnewfoo。以下示例演示了如何完成此操作:

    LOCAL_MODULE := foo
        LOCAL_MODULE_FILENAME := libnewfoo
        

     

    对于共享库模块,此示例将生成一个名为 libnewfoo.so 的文件。

    注意:您无法替换文件路径或文件扩展名。

    LOCAL_SRC_FILES

    此变量包含编译系统生成模块时所用的源文件列表。只列出编译系统实际传递到编译器的文件,因为编译系统会自动计算所有相关的依赖关系。请注意,您可以使用相对(相对于 LOCAL_PATH)和绝对文件路径。

    建议避免使用绝对文件路径;相对路径可以提高 Android.mk 文件的移植性。

    注意:务必在编译文件中使用 Unix 样式的正斜杠 (/)。编译系统无法正确处理 Windows 样式的反斜杠 (\)。

    LOCAL_CPP_EXTENSION

    可以使用此可选变量为 C++ 源文件指明 .cpp 以外的文件扩展名。例如,以下行将扩展名更改为 .cxx。(设置必须包含点。)

    LOCAL_CPP_EXTENSION := .cxx
        

     

    您可以使用此变量指定多个扩展名。例如:

    LOCAL_CPP_EXTENSION := .cxx .cpp .cc
        

     

    LOCAL_CPP_FEATURES

    您可使用此可选变量指明您的代码依赖于特定 C++ 功能。它会在编译过程中启用正确的编译器标记和链接器标记。对于预编译二进制文件,此变量还会声明二进制文件依赖于哪些功能,从而确保最终链接正常运行。建议您使用此变量,而不要直接在 LOCAL_CPPFLAGS 定义中启用 -frtti 和 -fexceptions

    使用此变量可让编译系统对每个模块使用适当的标记。使用 LOCAL_CPPFLAGS 会导致编译器将所有指定的标记用于所有模块,而不管实际需求如何。

    例如,要指明您的代码使用 RTTI(运行时类型信息),请输入:

    LOCAL_CPP_FEATURES := rtti
        

     

    要指明您的代码使用 C++ 异常,请输入:

    LOCAL_CPP_FEATURES := exceptions
        

     

    您还可以为此变量指定多个值。例如:

    LOCAL_CPP_FEATURES := rtti features
        

     

    描述值的顺序无关紧要。

    LOCAL_C_INCLUDES

    可以使用此可选变量指定相对于 NDK root 目录的路径列表,以便在编译所有源文件(C、C++ 和 Assembly)时添加到 include 搜索路径。例如:

    LOCAL_C_INCLUDES := sources/foo
        

     

    或者甚至:

    LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
        

     

    请在通过 LOCAL_CFLAGS 或 LOCAL_CPPFLAGS 设置任何对应的包含标记前定义此变量。

    在使用 ndk-gdb 启动原生调试时,编译系统也会自动使用 LOCAL_C_INCLUDES 路径。

    LOCAL_CFLAGS

    此可选变量用于设置在编译 C 和 C++ 源文件时编译系统要传递的编译器标记。这样,您就可以指定额外的宏定义或编译选项。可以使用 LOCAL_CPPFLAGS 仅为 C++ 指定标记。

    请勿尝试在 Android.mk 文件中更改优化/调试级别。编译系统可以使用 [pplication.mk] 文件中的相关信息自动处理此设置。这样,编译系统就可以生成供调试期间使用的有用数据文件。

    您可通过输入以下代码指定额外的 include 路径:

    LOCAL_CFLAGS += -I<path>,
        

     

    但是,最好使用 LOCAL_C_INCLUDES,因为这样也可以使用可用于 ndk-gdb 原生调试的路径。

    LOCAL_CPPFLAGS

    只编译 C++ 源文件时将传递的一组可选编译器标记。它们将出现在编译器命令行中的 LOCAL_CFLAGS后面。使用 LOCAL_CFLAGS 为 C 和 C++ 指定标记。

    LOCAL_STATIC_LIBRARIES

    此变量用于存储当前模块依赖的静态库模块列表。

    如果当前模块是共享库或可执行文件,此变量将强制这些库链接到生成的二进制文件。

    如果当前模块是静态库,此变量只是指出依赖于当前模块的其他模块也会依赖于列出的库。

    LOCAL_SHARED_LIBRARIES

    此变量会列出此模块在运行时依赖的共享库模块。此信息是链接时必需的信息,用于将相应的信息嵌入到生成的文件中。

    LOCAL_WHOLE_STATIC_LIBRARIES

    此变量是 LOCAL_STATIC_LIBRARIES 的变体,表示链接器应将相关的库模块视为完整归档。要详细了解完整归档,请参阅 GNU ld 文档的 --whole-archive 标记部分。

    多个静态库之间存在循环依赖关系时,此变量很有用。使用此变量编译共享库时,它将强制编译系统将静态库中的所有对象文件添加到最终二进制文件。但是,生成可执行文件时不会发生这种情况。

    LOCAL_LDLIBS

    此变量列出了在编译共享库或可执行文件时使用的额外链接器标记。利用此变量,您可使用 -l 前缀传递特定系统库的名称。例如,以下示例指示链接器生成在加载时链接到 /system/lib/libz.so 的模块:

    LOCAL_LDLIBS := -lz
        

     

    如需了解此 NDK 版本中可以链接的公开系统库列表,请参阅 Android NDK 原生 API

    注意:如果为静态库定义此变量,编译系统会忽略此变量,并且 ndk-build 会显示一则警告。

    LOCAL_LDFLAGS

    此变量列出了编译系统在编译共享库或可执行文件时使用的其他链接器标记。例如,要在 ARM/X86 上使用 ld.bfd 链接器:

    LOCAL_LDFLAGS += -fuse-ld=bfd
        

     

    注意:如果为静态库定义此变量,编译系统会忽略此变量,并且 ndk-build 会显示一则警告。

    LOCAL_ALLOW_UNDEFINED_SYMBOLS

    默认情况下,如果编译系统在尝试编译共享库时遇到未定义的引用,将会抛出“未定义的符号”错误。此错误可帮助您捕获源代码中的错误。

    要停用此检查,请将此变量设置为 true。请注意,此设置可能会导致共享库在运行时加载。

    注意:如果为静态库定义此变量,编译系统会忽略此变量,并且 ndk-build 会显示一则警告。

    LOCAL_ARM_MODE

    默认情况下,编译系统会在 thumb 模式下生成 ARM 目标二进制文件,其中每条指令都是 16 位宽,并与 thumb/ 目录中的 STL 库关联。将此变量定义为 arm 会强制编译系统在 32 位 arm 模式下生成模块的对象文件。以下示例演示了如何执行此操作:

    LOCAL_ARM_MODE := arm
        

     

    您也可以对源文件名附加 .arm 后缀,指示编译系统在 arm 模式下仅编译特定的源文件。例如,以下示例指示编译系统在 ARM 模式下始终编译 bar.c,但根据 LOCAL_ARM_MODE 的值编译 foo.c

    LOCAL_SRC_FILES := foo.c bar.c.arm
        

     

    注意:您也可以在 Application.mk 文件中将 APP_OPTIM 设置为 debug,以强制编译系统生成 ARM 二进制文件。指定 debug 会强制执行 ARM 编译,因为工具链调试程序无法正确处理 Thumb 代码。

    LOCAL_ARM_NEON

    此变量仅在以 armeabi-v7a ABI 为目标时才有意义。它允许在 C 和 C++ 源代码中使用 ARM Advanced SIMD (NEON) 编译器内建函数,以及在 Assembly 文件中使用 NEON 指令。

    请注意,并非所有基于 ARMv7 的 CPU 都支持 NEON 扩展指令集。因此,必须执行运行时检测,以便在运行时安全地使用此代码。详情请参阅 NEON 支持和 cpufeatures 库。

    此外,您也可以使用 .neon 后缀,指定编译系统仅以 NEON 支持编译特定源文件。在以下示例中,编译系统以 Thumb 和 NEON 支持编译 foo.c,以 Thumb 支持编译 bar.c,并以 ARM 和 NEON 支持编译 zoo.c

    LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
        

     

    如果同时使用这两个后缀,则 .arm 必须在 .neon 前面。

    LOCAL_DISABLE_FORMAT_STRING_CHECKS

    默认情况下,编译系统会在编译代码时保护格式字符串。这样的话,如果 printf 样式的函数中使用了非常量格式的字符串,就会强制引发编译器错误。此保护默认启用,但您也可通过将此变量的值设置为 true 将其停用。如果没有必要的原因,我们不建议停用。

    LOCAL_EXPORT_CFLAGS

    此变量用于记录一组 C/C++ 编译器标记,这些标记将添加到通过 LOCAL_STATIC_LIBRARIES 或 LOCAL_SHARED_LIBRARIES 变量使用此模块的任何其他模块的 LOCAL_CFLAGS 定义中。

    例如,假设有下面这一对模块:foo 和 bar,bar 依赖于 foo

    include $(CLEAR_VARS)
        LOCAL_MODULE := foo
        LOCAL_SRC_FILES := foo/foo.c
        LOCAL_EXPORT_CFLAGS := -DFOO=1
        include $(BUILD_STATIC_LIBRARY)
    
        include $(CLEAR_VARS)
        LOCAL_MODULE := bar
        LOCAL_SRC_FILES := bar.c
        LOCAL_CFLAGS := -DBAR=2
        LOCAL_STATIC_LIBRARIES := foo
        include $(BUILD_SHARED_LIBRARY)
        

     

    在此例中,编译系统在编译 bar.c 时会向编译器传递 -DFOO=1 和 -DBAR=2 标记。它还会在模块的 LOCAL_CFLAGS 前面加上导出的标记,以便您轻松进行替换。

    此外,模块之间的关系也具有传递性:如果 zoo 依赖于 bar,而后者依赖于 foo,那么 zoo 也会继承从 foo 导出的所有标记。

    最后,编译系统在执行局部编译时(即,编译要导出标记的模块时),不使用导出的标记。因此,在上面的示例中,编译 foo/foo.c 时不会将 -DFOO=1 传递到编译器。要执行局部编译,请改用 LOCAL_CFLAGS

    LOCAL_EXPORT_CPPFLAGS

    此变量与 LOCAL_EXPORT_CFLAGS 相同,但仅适用于 C++ 标记。

    LOCAL_EXPORT_C_INCLUDES

    此变量与 LOCAL_EXPORT_CFLAGS 相同,但适用于 C include 路径。例如,当 bar.c 需要包含模块 foo 的头文件时,此变量很有用。

    LOCAL_EXPORT_LDFLAGS

    此变量与 LOCAL_EXPORT_CFLAGS 相同,但适用于链接器标记。

    LOCAL_EXPORT_LDLIBS

    此变量与 LOCAL_EXPORT_CFLAGS 相同,告诉编译系统将特定系统库的名称传递给编译器。请在您指定的每个库名称前附加 -l

    请注意,编译系统会将导入的链接器标记附加到模块的 LOCAL_LDLIBS 变量值上。其原因在于 Unix 链接器的工作方式。

    当模块 foo 是静态库并且具有依赖于系统库的代码时,此变量通常很有用。然后,您可以使用 LOCAL_EXPORT_LDLIBS 导出依赖关系。例如:

    include $(CLEAR_VARS)
        LOCAL_MODULE := foo
        LOCAL_SRC_FILES := foo/foo.c
        LOCAL_EXPORT_LDLIBS := -llog
        include $(BUILD_STATIC_LIBRARY)
    
        include $(CLEAR_VARS)
        LOCAL_MODULE := bar
        LOCAL_SRC_FILES := bar.c
        LOCAL_STATIC_LIBRARIES := foo
        include $(BUILD_SHARED_LIBRARY)
        

     

    在此示例中,编译系统在编译 libbar.so 时,在链接器命令的末尾指定了 -llog。这样就会告知链接器,由于 libbar.so 依赖于 foo,因此它也依赖于系统日志记录库。

    LOCAL_SHORT_COMMANDS

    当模块有很多源文件和/或依赖的静态或共享库时,请将此变量设置为 true。这样会强制编译系统将 @ 语法用于包含中间对象文件或链接库的归档。

    此功能在 Windows 上可能很有用,在 Windows 上,命令行最多只接受 8191 个字符,这对于复杂的项目来说可能太少。它还会影响个别源文件的编译,而且将几乎所有编译器标记都放在列表文件内。

    请注意,true 以外的任何值都将恢复为默认行为。您也可以在 Application.mk 文件中定义 APP_SHORT_COMMANDS,以对项目中的所有模块强制实施此行为。

    不建议默认启用此功能,因为它会减慢编译速度。

    LOCAL_THIN_ARCHIVE

    编译静态库时,请将此变量设置为 true。这样会生成一个瘦归档,即一个库文件,其中不含对象文件,而只包含它通常包含的实际对象的文件路径。

    这对于减小编译输出的大小非常有用。但缺点是,这样的库无法移至其他位置(其中的所有路径都是相对路径)。

    有效值为 truefalse 或空白。您可在 Application.mk 文件中通过 APP_THIN_ARCHIVE 变量设置默认值。

    注意:在非静态库模块或预编译的静态库模块中,将会忽略此变量。

    LOCAL_FILTER_ASM

    请将此变量定义为一个 shell 命令,供编译系统用于过滤根据您为 LOCAL_SRC_FILES 指定的文件提取或生成的汇编文件。定义此变量会导致发生以下情况:

    1. 编译系统从任何 C 或 C++ 源文件生成临时汇编文件,而不是将它们编译到对象文件中。
    2. 编译系统在任何临时汇编文件以及 LOCAL_SRC_FILES 中所列任何汇编文件的 LOCAL_FILTER_ASM 中执行 shell 命令,因此会生成另一个临时汇编文件。
    3. 编译系统将这些过滤的汇编文件编译到对象文件中。

    例如:

    LOCAL_SRC_FILES  := foo.c bar.S
        LOCAL_FILTER_ASM :=
    
        foo.c --1--> $OBJS_DIR/foo.S.original --2--> $OBJS_DIR/foo.S --3--> $OBJS_DIR/foo.o
        bar.S                                 --2--> $OBJS_DIR/bar.S --3--> $OBJS_DIR/bar.o
        

     

    “1”对应于编译器,“2”对应于过滤器,“3”对应于汇编程序。过滤器必须是一个独立的 shell 命令,它接受输入文件名作为第一个参数,接受输出文件名作为第二个参数。例如:

    myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S
        myasmfilter bar.S $OBJS_DIR/bar.S
        

     

    NDK 提供的函数宏

    本部分介绍了 NDK 提供的 GNU Make 函数宏。使用 $(call <function>) 可以对这些宏进行求值;它们将返回文本信息。

    my-dir

    这个宏返回最后包含的 makefile 的路径,通常是当前 Android.mk 的目录。my-dir 可用于在 Android.mk 文件的开头定义 LOCAL_PATH。例如:

    LOCAL_PATH := $(call my-dir)
        

     

    由于 GNU Make 的工作方式,这个宏实际返回的是编译系统解析编译脚本时包含的最后一个 makefile 的路径。因此,包含其他文件后就不应调用 my-dir

    例如:

    LOCAL_PATH := $(call my-dir)
    
        # ... declare one module
    
        include $(LOCAL_PATH)/foo/`Android.mk`
    
        LOCAL_PATH := $(call my-dir)
    
        # ... declare another module
        

     

    该示例的问题在于,对 my-dir 的第二次调用将 LOCAL_PATH 定义为 $PATH/foo,而不是 $PATH,因为这是其最近的 include 所指向的位置。

    在 Android.mk 文件中的所有其他内容后添加额外的 include 可避免此问题。例如:

    LOCAL_PATH := $(call my-dir)
    
        # ... declare one module
    
        LOCAL_PATH := $(call my-dir)
    
        # ... declare another module
    
        # extra includes at the end of the Android.mk file
        include $(LOCAL_PATH)/foo/Android.mk
        

     

    如果以这种方式构造文件不可行,请将第一个 my-dir 调用的值保存到另一个变量中。例如:

    MY_LOCAL_PATH := $(call my-dir)
    
        LOCAL_PATH := $(MY_LOCAL_PATH)
    
        # ... declare one module
    
        include $(LOCAL_PATH)/foo/`Android.mk`
    
        LOCAL_PATH := $(MY_LOCAL_PATH)
    
        # ... declare another module
        

     

    all-subdir-makefiles

    返回位于当前 my-dir 路径所有子目录中的 Android.mk 文件列表。

    利用此函数,您可以为编译系统提供深度嵌套的源目录层次结构。默认情况下,NDK 只在 Android.mk 文件所在的目录中查找文件。

    this-makefile

    返回当前 makefile(编译系统从中调用函数)的路径。

    parent-makefile

    返回包含树中父 makefile 的路径(包含当前 makefile 的 makefile 的路径)。

    grand-parent-makefile

    返回包含树中祖父 makefile 的路径(包含当前父 makefile 的 makefile 的路径)。

    import-module

    此函数用于按模块名称查找和包含模块的 Android.mk 文件。典型的示例如下所示:

    $(call import-module,<name>)
        

     

    在此示例中,编译系统在 NDK_MODULE_PATH 环境变量所引用的目录列表中查找具有 <name> 标记的模块,并且自动包含其 Android.mk 文件。

     

     

    https://developer.android.google.cn/ndk/guides/android_mk

    展开全文
  • 这篇博客主要介绍在 Android mk 引用 jar 包、so 库、aar 包,系统签名

    转载请注明原博客地址

    写在最前面

    刚开始在 Ubuntu 编译系统源码的时候, 需要在 mk 文件里面配置各种东西,对比在 AndroidStudio 敲代码,那可真的是 TMD 麻烦(那时候内心仿佛有千万只马奔腾),不过后面心态渐渐变好了,每个人都是一样,刚开始对于新的并且暂时不理解又看不到优点的东西,内心总是抗拒的,总会第一时间抗拒它,否定他。其实,这往往会影响我们的成长,对于各种新的东西,我们应该是去面对他们,而不是去逃避他们,这才能够真正让我们成长起来。

    哈哈, 不扯蛋了,下面开始进入正题。

    Android mk 简介

    什么是 mk 文件

    Android.mk 文件用来告知 NDK Build 系统关于 Source 的信息。 它是GNU Makefile的一部分,且将被 Build System 解析一次或多次。


    简单示例

    首先我们先来看一下最简单的例子,编译一个普通的 apk。

    
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    # 是否开启混淆
    LOCAL_PROGUARD_ENABLED := disabled
    
    LOCAL_MODULE_TAGS := optional
    
    # 使用 platform 签名
    LOCAL_CERTIFICATE := platform
    
    
    # 指定 src 目录               
    LOCAL_SRC_FILES := $(call all-java-files-under, src)
    # 指定 res 目录
    LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res
    # 指定 apk 编译 
    LOCAL_PACKAGE_NAME := AppDemo
    
    include $(BUILD_PACKAGE)
    

    解释说明

    • LOCAL_PATH := $(call my-dir)

    每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。

    • include $(CLEAR_VARS)

    CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.

    例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.

    • LOCAL_MODULE_TAGS :

    表示在什么版本情况下会编译该版本

    LOCAL_MODULE_TAGS :=user eng tests optional
    user: 指该模块只在user版本下才编译
    eng: 指该模块只在eng版本下才编译
    tests: 指该模块只在tests版本下才编译
    optional:指该模块在所有版本下都编译
    
    • include $(BUILD_PACKAGE) 表示生成一个 apk,它可以多多种类型
    BUILD_SHARED_LIBRARY #生成一个动态库
    BUILD_STATIC_LIBRARY #生成一个静态的库
    BUILD_PACKAGE #生成一个APK
    

    指定生成的 apk 存放的目录

    默认情况

    不指定 apk 生成目录时,默认的目录为 system/app/{LOCAL_PACKAGE_NAME}/{LOCAL_PACKAGE_NAME}.apk.

    比如,我们上面的例子 LOCAL_PACKAGE_NAME 为 AppDemo,这样生成的 apk 目录为

    system/app/AppDemo/AppDemo.apk
    

    指定目录

    如果想指定生成的 apk 目录,我们可以通过 LOCAL_MODULE_PATH 来配置,比如,我们想指定生成的 aok 目录为 system/vendor/operator/app,我们可以这样配置

    LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app
    

    $(TARGET_OUT) 代表 /system ,这样在 、system/vendor/operator/app 可以看到我们生成的 apk。

    假如我们想让我们生成的 apk 放到 system/priv-app 目录下,有什么方法呢?

    第一种方法,指定 LOCAL_MODULE_PATH ,在上面的讲解中,我们已经知道 $(TARGET_OUT) 代表 /system,那么生成的 apk 想放到 system/priv-app,我们可以这样配置。

    LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app
    

    第二种方法,我们也可以直接这样配置,这样生成的 apk 也会放到 system/priv-app

    LOCAL_PRIVILEGED_MODULE := true
    

    假如我们想让我们生成的 apk 放到 data/app 目录下,有什么方法呢?

    我们可以直接这样指定,这样生成的 apk 就会放到 data/app 目录下

    LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)/
    

    引用第三方 jar 包

    引用一个 jar 包

    比如,我们当前目录下的 libs 有 CommonUtil.jar jar 包,我们想引用它,需要两个步骤

    第一步, 声明我们 jar 包所在的目录

    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := CommonUtil:/libs/CommonUtil.jar 这行代码的意思大概可以理解成这样,声明一个变量 CommonUtil,它的 value 是 /libs/CommonUtil.jar

    include $(CLEAR_VARS)
    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := CommonUtil:/libs/CommonUtil.jar 
    include $(BUILD_MULTI_PREBUILT)
    
    

    第二步. 引用我们声明 jar 包的变量

    引用我们上面声明的 CommonUtil

    LOCAL_STATIC_JAVA_LIBRARIES := CommonUtil
    

    引用多个 jar 包

    引用多个 jar 包的方式其实跟引用 一个 jar 包的方式是一样的,只不过我们需要注意一下语法而已。

    第一步:先声明多个 jar 包的位置

    include $(CLEAR_VARS)
    
    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := CloudHelper:/libs/CommonUtil.jar \
                                            BaiduLBS:/libs/BaiduLBS_Android.jar \
                                            logger:/libs/logger.jar
    										
    
    include $(BUILD_MULTI_PREBUILT)
    

    第二步:引用我们声明的多个 jar 包的变量

    LOCAL_STATIC_JAVA_LIBRARIES := CommonUtil \
                                   BaiduLBS \
                                   logger
    

    为了方便大家理解,这里先贴出部分 mk 文件

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    # 是否开启混淆
    LOCAL_PROGUARD_ENABLED := disabled
    
    LOCAL_MODULE_TAGS := optional
    
    # 使用 platform 签名
    LOCAL_CERTIFICATE := platform
    
    
    # 指定 src 目录               
    LOCAL_SRC_FILES := $(call all-java-files-under, src)
    # 指定 res 目录
    LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/res
    # 本地编译目录
    LOCAL_PACKAGE_NAME := AppDemo
    
    LOCAL_STATIC_JAVA_LIBRARIES := CommonUtil \
                                   BaiduLBS \
                                   logger
    
    include $(BUILD_PACKAGE)
    
    
    include $(CLEAR_VARS)
    
    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := CommonUtil:/libs/CommonUtil.jar \
                                            BaiduLBS:/libs/BaiduLBS_Android.jar \
                                            logger:/libs/logger.jar
    										
    
    include $(BUILD_MULTI_PREBUILT)
    

    引用 so 库

    假如我们当前目录下的 lib 目录下 有 armeabi-v7a,arm64-v8a 目录,里面分别有 libBaiduMapSDK_base_v4_2_1.so, libBaiduMapSDK_base_v4_2_1.so 。如果我们在编译 apk 的时候,想把这些 so 库 打包进去,在 mk 文件中要怎样配置呢?

    一般来说,会有以下两种写法

    第一种写法

    第一步,直接在 mk 文件中配置以下内容,配置我们 so 库文件的所在位置,可以在文件的开头或者结尾。

    #====================================================
    
    include $(CLEAR_VARS)
    LOCAL_MODULE_TAGS := optional
    LOCAL_MODULE_SUFFIX := .so
    LOCAL_MODULE := libBaiduMapSDK_base_v4_2_1
    LOCAL_MODULE_CLASS := SHARED_LIBRARIES
    LOCAL_SRC_FILES_arm :=libs/armeabi-v7a/libBaiduMapSDK_base_v4_2_1.so
    LOCAL_SRC_FILES_arm64 :=libs/arm64-v8a/libBaiduMapSDK_base_v4_2_1.so
    LOCAL_MODULE_TARGET_ARCHS:= arm arm64
    LOCAL_MULTILIB := both
    include $(BUILD_PREBUILT)
    #====================================================
    
    #====================================================
    include $(CLEAR_VARS)
    LOCAL_MODULE_TAGS := optional
    LOCAL_MODULE_SUFFIX := .so
    LOCAL_MODULE := libBaiduMapSDK_map_v4_2_1
    LOCAL_MODULE_CLASS := SHARED_LIBRARIES
    LOCAL_SRC_FILES_arm :=libs/armeabi-v7a/libBaiduMapSDK_map_v4_2_1.so
    LOCAL_SRC_FILES_arm64 :=libs/arm64-v8a/libBaiduMapSDK_map_v4_2_1.so
    LOCAL_MODULE_TARGET_ARCHS:= arm arm64
    LOCAL_MULTILIB := both
    include $(BUILD_PREBUILT)
    

    第二步: 引用我们的 so 库

    在include $(CLEAR_VARS) 和 include $(BUILD_PACKAGE) 之间添加以下内容

    LOCAL_REQUIRED_MODULES := libBaiduMapSDK_base_v4_2_1 \
                              libBaiduMapSDK_map_v4_2_1 \
                             
    
    LOCAL_JNI_SHARED_LIBRARIES := libBaiduMapSDK_base_v4_2_1\
                                  libBaiduMapSDK_map_v4_2_1\
    

    配置完以后 mk 文件的形式大概是这样的

    include $(CLEAR_VARS)
    
    ----   
    
    # 省略若干内容
    
    LOCAL_REQUIRED_MODULES := libBaiduMapSDK_base_v4_2_1 \
                              libBaiduMapSDK_map_v4_2_1 \
                             
    
    LOCAL_JNI_SHARED_LIBRARIES := libBaiduMapSDK_base_v4_2_1\
                                  libBaiduMapSDK_map_v4_2_1\
    
    include $(BUILD_PACKAGE)
    

    第二种写法

    第二种写法其实跟第一种写法差不多,只不过是将 so 库的 声明提取出来而已

    第一步:比如我们将下面的代码提取到 lib/baidumap.mk mk 文件

    #====================================================
    
    include $(CLEAR_VARS)
    LOCAL_MODULE_TAGS := optional
    LOCAL_MODULE_SUFFIX := .so
    LOCAL_MODULE := libBaiduMapSDK_base_v4_2_1
    LOCAL_MODULE_CLASS := SHARED_LIBRARIES
    LOCAL_SRC_FILES_arm :=libs/armeabi-v7a/libBaiduMapSDK_base_v4_2_1.so
    LOCAL_SRC_FILES_arm64 :=libs/arm64-v8a/libBaiduMapSDK_base_v4_2_1.so
    LOCAL_MODULE_TARGET_ARCHS:= arm arm64
    LOCAL_MULTILIB := both
    include $(BUILD_PREBUILT)
    #====================================================
    
    #====================================================
    include $(CLEAR_VARS)
    LOCAL_MODULE_TAGS := optional
    LOCAL_MODULE_SUFFIX := .so
    LOCAL_MODULE := libBaiduMapSDK_map_v4_2_1
    LOCAL_MODULE_CLASS := SHARED_LIBRARIES
    LOCAL_SRC_FILES_arm :=libs/armeabi-v7a/libBaiduMapSDK_map_v4_2_1.so
    LOCAL_SRC_FILES_arm64 :=libs/arm64-v8a/libBaiduMapSDK_map_v4_2_1.so
    LOCAL_MODULE_TARGET_ARCHS:= arm arm64
    LOCAL_MULTILIB := both
    include $(BUILD_PREBUILT)
    

    第二步,在原来的 Android.mk 文件中增加以下语句,表示将 /lib/baidumap.mk 文件 include 进来

    include $(LOCAL_PATH)/lib/baidumap.mk
    

    第三步: 引用我们 的 so 库

    include $(CLEAR_VARS)
    
    ----   
    
    # 省略若干内容
    
    LOCAL_REQUIRED_MODULES := libBaiduMapSDK_base_v4_2_1 \
                              libBaiduMapSDK_map_v4_2_1 \
                             
    
    LOCAL_JNI_SHARED_LIBRARIES := libBaiduMapSDK_base_v4_2_1\
                                  libBaiduMapSDK_map_v4_2_1\
    
    include $(BUILD_PACKAGE)
    

    其实第一种写法和第二种写法并没有多大区别,第二种方法相对于第一种方法而言,只是将 so 库文件的配置独立到 mk 文件中。不过,我更推荐使用第二种方法,毕竟更符合面向对象的思维,以后复用以比较方便。


    引用 aar 包

    第一步:先声明 aar 包的位置

    include $(CLEAR_VARS)
    
    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += inveno_ui_sdk:libs/sdk-release_201709291605.aar
    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += inveno_detail_info_sdk:libs/detail_info_sdk-release.aar
    
    include $(BUILD_MULTI_PREBUILT)
    

    第二步:引用我们声明的 aar 变量

    LOCAL_STATIC_JAVA_AAR_LIBRARIES += inveno_ui_sdk
    LOCAL_STATIC_JAVA_AAR_LIBRARIES += inveno_detail_info_sdk
    

    第三步:添加引用的 aar 包里面的资源

    LOCAL_AAPT_FLAGS += \
             --auto-add-overlay \
             --extra-packages com.inveno.basics \
             --extra-packages com.inveno.detailinfosdk \
    

    Android mk 文件配置签名

    我们知道在 build/target/product/security 目录中有四组默认签名供,Android.mk在编译APK使用:

    • 1、testkey:普通APK,默认情况下使用。
    • 2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,
      这种方式编译出来的APK所在进程的UID为system。
    • 3、shared:该APK需要和home/contacts进程共享数据。
    • 4、media:该APK是media/download系统中的一环。

    举例说明一下。

    系统中所有使用android.uid.system作为共享UID的APK,
    都会首先在manifest节点中增加android:sharedUserId="android.uid.system",
    然后在Android.mk中增加LOCAL_CERTIFICATE := platform。可以参见Settings等
    
    系统中所有使用android.uid.shared作为共享UID的APK,
    都会在manifest节点中增加android:sharedUserId="android.uid.shared",
    然后在Android.mk中增加LOCAL_CERTIFICATE := shared。可以参见Launcher等
    
    系统中所有使用android.media作为共享UID的APK,
    都会在manifest节点中增加android:sharedUserId="android.media",
    然后在Android.mk中增加LOCAL_CERTIFICATE := media。可以参见Gallery等。
    
    展开全文
  • android mk编译参数

    2018-03-04 01:11:47
    Application.mk file syntax specificationIntroduction:------------------本文档描述Application.mk文件的语法,这个编译文件描述Android应用需要的本地modules。为了便于理解下面的内容,假设你已经阅读了...
  • 修改cocos2d-x 3.3 android mk文件 为 自动遍历*.cpp文件,亲测~~ 我们在自己新建的项目中,比如项目Mycpp,在项目Mycpp\proj.android\jni的路径下找到android mk 文件,先来看看这个android.mk文件的内容,打开...
  • linux/android mk文件

    2013-10-10 12:57:21
    Android.mk文件说明文章参照:http://blog.csdn.net/hudashi/article/details/7059006  ...因为所有的编译文件都在同一个GUN MakeFile执行环境中进行执行,而Android.mk文件中所有的变量都是全局变量,因此,应尽量少声
  • android mk文件编写

    千次阅读 2016-08-25 20:25:54
    LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) ...LOCAL_STATIC_JAVA_LIBRARIES := pinyin4j aios android_v4 LOCAL_MODULE_TAGS s:= optional LOCAL_SRC_FILES := $(call all-java-files-under, src) \ src/c
  • 在开发安卓app时,我们通常可以用 AndroidStudio 开发应用,然后 build apk ,以预装的方式放到源码下编译。如果需要用源码来编译 AndroidStudio 工程,该怎么做呢 ? 下面来实操学习 android Makefile 的使用。 将 ...
  • javalib.jar中是经过dex优化的classes.dex, 系统应用如果采用Android Studio或Eclipse IDE开发时无法引用系统库, 需要在模块的Android.mk中加入如下参数使编译采用传统编译方式: ANDROID_COMPI...
  • android 5.0预制APK方法,android5.0预制apk http://www.android100.org/html/201506/17/154721.htmlAndroid.mk中添加宏定义 http://blog.csdn.net/huangyabin001/article/details/38302021
  • android mk脚本的编写

    2015-08-18 09:05:33
    目前网上通过JNI方式ndk编译,mk文件写法乱七八糟,没有固定的写法,让人看...An Android.mk file is written to describe your sources to the build system. More specifically: The file is really a tiny GNU M
  • android mk编译错误

    千次阅读 2016-12-14 11:26:41
    但是如果你在定义的过程中,自己加上了lib前缀,则NDK在处理时就不会在加上lib前缀了(这样做是为了兼容Android系统的一些源码)。 那么问题来了,查看你的模块名字是不是没有加lib前缀,如果没有加的话,在...
  • cocos2d-x 3.0 android mk文件 之 自动遍历*.cpp文件
  • Android mk文件(Makefile)笔记

    千次阅读 2015-04-21 14:06:46
    Android mk文件(Makefile)笔记 关于mk文件,菜鸟须知 :=是赋值的意思,$是引用某变量的值(或执行语句) ,# 注释 ifeq ($(strip $(YOUR_STRING)),yes) endif //判断 Android.mk编译文件是...
  • centos ndk下载和编译动态库 静态库 Mac使用iTerm2 rz sz和...将libget.a 和 libget.so 添加到ndkdir目录中,并创建Android.mk文件 配置build.gradle externalNativeBuild { ndkBuild { abiFilters 'armeabi-...
  • Android mk编译OkHttp3

    千次阅读 2017-01-19 15:12:08
    使用OkHttp,放到framework层编译,编译错误: Warning: okio.DeflaterSink: can ...├── Android.mk ├── assets ├── libs │?? ├── okhttp-3.5.0.jar │?? └── okio-1.11.0.jar
  • cocos2d-x 3.0 引用第三方库 及编译成apk时android mk文件写法
  • Android编译框架中,把许多固定的、反复用到的目录路径定义为 宏变量,常用 宏 如下: out/target/product/xxx的宏即为:PRODUCT_OUT out/target/product/xxx/system的宏即为:TARGET_OUT out/target/...
  • 游戏中引入了第三方工程,Androd平台编译总是出现头文件相关路径错误,需要在makefile中输出log,以便确定某些路径是否正确。makefile中输出信息的方法有:$(warning xxx) 或 $(error xxx)例如:$(warning this is ...
  • 今天编了个2.0.2的游戏到android平台上,...首先看Android.mk文件,之前1.x的版本的时候这个文件在class里面,到了2.0.2的时候他到了proj.android\jni这个下面,大家注意。但是2.0.3的时候就已经不需要处理Android.mk
  • 例如希望引用的jar包是protocolbuffer.jar,首先把这个jar包放在libs文件夹下,然后在mk文件中加入下列内容: LOCAL_STATIC_JAVA_LIBRARIES := \  protocolbuffer\ LOCAL_PREBUILT_...
  • 开发某个应用过程中需要引用...编辑应用的Android.mk文件,新增红色部分代码 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files
  • Android mk文件 构建编译第三方jar和so

    千次阅读 2016-08-04 11:34:56
    LOCAL_STATIC_JAVA_LIBRARIES := hyphenatechat gson android-support-v4 LOCAL_JNI_SHARED_LIBRARIES := libaplex libhyphenate libhyphenate_av #LOCAL_SRC_FILES := $(call all-subdir-java-files) \ LOCAL...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,125
精华内容 4,850
热门标签
关键字:

androidmk