Android.mk文件常用标签说明

  • LOCAL_PATH := $(call my-dir)

必须定义。当前路径,即本Android.mk文件所处目录。每个Android.mk文件必须先定义 LOCAL_PATH 变量,此变量表示源文件在开发树中的位置。$(call my-dir)为编译系统Build System提供的宏函数,返回的就是当前目录路径。避免频繁定义,LOCAL_PATH不会被$(CLEAR_VARS)清理,所以一个文件中,只需要定义一次即可。

  • include $(CLEAR_VARS)

必须定义。清空所有LOCAL_xxx变量,但不清理LOCAL_PATH变量。CLEAR_VARS为编译系统Build System提供的宏函数,$(CLEAR_VARS)指向的是一个特殊的GNU Makefile(clear_vars.mk),负责清理LOCAL_xxx变量,如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。 这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量(LOCAL_xxx)是全局的。所以清理后才能避免相互影响。

  • LOCAL_PACKAGE_NAME := HelloWorld 或 LOCAL_MODULE:= HelloWorld

必须定义,模块名称,名称必须是唯一的且不包含空格,除应用(apk)可以另外使用LOCAL_PACKAGE_NAME外,其余的模块都以LOCAL_MODULE指定名称(如module包HelloWorldLib)

  • LOCAL_SRC_FILES := $(call all-java-files-under, src/java)
LOCAL_SRC_FILES := \
            $(call all-java-files-under, src/java) \
            src/java/com/android/helloworld/aidl/hello-0.aidl \
            hello-1.c \
            hello-2.so 

必须定义,变量 LOCAL_SRC_FILES 为Build Modules提供的app所有源码Source文件列表,不需要列出依赖文件。$(call all-java-files-under, src/java)宏函数,可以得到指定目录src/java下的所有java源码,宏all-java-files-under定义在build/core/definitions.mk中。其他如aidl、c/c++、so等文件需手动添加。

  • LOCAL_PROGUARD_ENABLED := disabled

不使用代码混淆的工具进行代码混淆。

可选定义,默认LOCAL_PROGUARD_ENABLED := full,即代码全部混淆。如果是user或userdebug。取值full, disabled, custom

  • LOCAL_MANIFEST_FILE := AndroidManifest.xml

指定AndroidManifest.xml路径为当前目录下。表示 Manifest 的路径,可以区分配置。

# Choose the appropriate AndroidManifest.xml
ifeq ($(strip $(MTK_EXCHANGE_SUPPORT)),yes)
    LOCAL_MANIFEST_FILE := AndroidManifest.xml
else
    LOCAL_MANIFEST_FILE := src/AndroidManifest.xml
endif
  • LOCAL_STATIC_ANDROID_LIBRARIES := android-support-v4
LOCAL_STATIC_ANDROID_LIBRARIES := \    
    android-support-transition \
    android-support-v13 \
    android-support-v7-appcompat \
    android-support-v4

指定依赖的android类库。

  • LOCAL_STATIC_JAVA_LIBRARIES := static-library
LOCAL_STATIC_JAVA_LIBRARIES := \
                   gson_appname \                        
                   hellolib_appname \                        
                   hellolibaar_appname \
                   android-support-v4

指定依赖的静态java类库,最终会打包到apk里面(添加的静态库编译会以拷贝的方式加到需要他的应用中)。

LOCAL_STATIC_JAVA_LIBRARIES 后面为依赖的静态库别名,可以随便取名,对应后面LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES。此处也可以指定android类库。

  • LOCAL_STATIC_JAVA_AAR_LIBRARIES := aar-library
LOCAL_STATIC_JAVA_AAR_LIBRARIES := \
                        111aar_appname \
                        222aar_appname 

指定依赖的aar包。冒号后为aar别名,可以配置在此变量,也可以配置在LOCAL_STATIC_JAVA_LIBRARIES中,方式相同。

  • LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := xxx:xxx.jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
                        gson_appname:/libs/gson-2.2.4.jar \
                        hellolib_appname:/libs/hellolib.jar \
                        hellolibaar_appname:/libs/hellolibaar.aar \
                        111aar_appname:/libs/111aar.aar \
                        222aar_appname:/libs/222aar.aar 

表示依赖的静态库具体路径,也可以是aar包。其中冒号前面为包别名,与LOCAL_STATIC_JAVA_LIBRARIES的值对应。冒号后面为包的实际路径。如果如上编写的,那么你可以使用AAR包中的java代码和so库了(如果有so库的话),

  • LOCAL_AAPT_FLAGS := --auto-add-overlay
LOCAL_AAPT_FLAGS := \
    --auto-add-overlay \
    --extra-packages com.xxxx.111aar

设置aapt(Android Asset Packaging Tool)的参数:

–auto-add-overlay : 配置应用程序打包标志,设置为自动添加并覆盖

–extra-packages : com.xxxx.111aar

如果需要使用的aar包中的R文件资源,那么需要在LOCAL_AAPT_FLAGS 变量后面添加AAR包中的包名,这AAR打包过程中,会有一个清单文件打包进去,只需要拷贝清单文件中package的包名并赋值给LOCAL_AAPT_FLAGS 即可。

  • LOCAL_USE_AAPT2 := true

使用appt2,aapt2是在aapt上做了优化。因为appt2在编译打包的时候,会有一些错误bug?,所以可以关闭appt2,这样就是默认使用appt了。

  • LOCAL_JAVA_LIBRARIES

###例如:当前APK的Android.mk文件中出现该属性:
LOCAL_JAVA_LIBRARIES += mediatek-framework telephony-common mediatek-telephony-base
###表示在编译当前APK的时候,导入framework-base中的一下部分jar,具体看源码该使用类所在的位置。

指定依赖的共享java类库,只是编译的时候引用。

  • include $(BUILD_STATIC_JAVA_LIBRARY)

将当前模块编译成一个静态的 Java 库

  • include $(BUILD_PACKAGE)

编译生成apk,指向的是package.mk

  • include$(BUILD_MULTI_PREBUILT)

​编译构建,Android提供了Prebuilt编译方法,两个文件prebuilt.mk和multi_prebuilt.mk,对应的方法宏是BUILD_PREBUILT和 BUILD_MULTI_PREBUILT。

prebuilt.mk就是prebuilt的具体实现,它是针对独立一个文件的操作,multi_prebuilt.mk 可以针对多个文件的,它对多个文件进行判断,然后调用prebuilt对独立一个文件进行处理。

在 Android Build 系统中,编译是以模块(而不是文件)作为单位的,每个模块都有一个唯一的名称,一个模块的依赖对象只能是另外一个模块,而不能是其他类型的对象。对于已经编译好的二进制库,如果要用来被当作是依赖对象,那么应当将这些已经编译好的库作为单独的模块。对于这些已经编译好的库使用 BUILD_PREBUILT 或 BUILD_MULTI_PREBUILT。

例如:当编译某个 Java 库需要依赖一些 Jar 包时,并不能直接指定 Jar 包的路径作为依赖,而必须首先将这些 Jar 包定义为一个模块,然后在编译 Java 库的时候通过模块的名称来依赖这些 Jar 包。

  • include (callall−makefiles−under,(LOCAL_PATH))

如果子目录也有文件需要编译build,那么使用这句即可包含子目录所有的Android.mk文件

  • LOCAL_DX_FLAGS := --multi-dex

编译该模块,启用mulit dex,防止java方法Dex 64K限制问题

  • LOCAL_JACK_FLAGS += --multi-dex native

Jack 的目的是让 Android 支持更多的 Java 8 特性。

  • LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/src/main/res

表示 Res 的路径

  • LOCAL_MODULE_SUFFIX

不用定义,module的后缀,=.apk。

  • LOCAL_MODULE_TAGS := optional

该模块在所有版本下都编译。

可选定义,默认optional,可选项如下:

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

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

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

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

PS:LOCAL_MODULE_TAGS 变量跟TARGET_BUILD_VARIANT 变量息息相关。 android系统编译时如果不指定TARGET_BUILD_VARIANT 变量的值,默认 TARGET_BUILD_VARIANT=eng ,这一项指定 编译android时形成的版本风格,一般发布时使用这个值,当然还有user,debuguser等风格值

PS:如果两次make之间选了不同的编译模式,则需要运行一下make installclean,确保本次make不会用到上次install的文件,也可以运行make clean,不过耗时较长。

  • LOCAL_CERTIFICATE := PRESIGNED

PRESIGNED代表已经签过名了,无需系统再签名。

可选定义,用于指定签名时使用的KEY,默认为testkey。可选项还有:

//该APK完成一些系统的核心功能。系统签名,可访问系统中的文件/文件夹

​LOCAL_CERTIFICATE := platform

//该APK需要和home/contacts进程共享数据。

LOCAL_CERTIFICATE := shared

//该APK是media/download系统中的一环

LOCAL_CERTIFICATE := media

//普通APK,默认情况下使用

LOCAL_CERTIFICATE := **testkey

需要在AndroidManifest.xml文件中添加对应如下内容:

android:sharedUserId=“android.uid.system”

android:sharedUserId=“android.uid.shared”

android:sharedUserId=“android.media”

其各个KEY文件在Android源码的build/target/product/security/目录下:

1、media.pk8与media.x509.pem;

 2、platform.pk8与platform.x509.pem;

3、shared.pk8与shared.x509.pem;

4、testkey.pk8与testkey.x509.pem;

其中,“.pk8”文件为私钥,“.x509.pem”文件为公钥,这需要去了解非对称加密方式

  • LOCAL_PRIVILEGED_MODULE := true

模块装入system/priv-app目录下,系统核心app,不可卸载。

可选定义,默认为false,放入system/app里面。

  • LOCAL_PRIVATE_PLATFORM_APIS := true

对于使用了系统@hide api的,需设为true


Android.mk常用说明整理

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android.mk 文件Android NDK(Native Development Kit)中的一个重要文件,它用于构建 Android 应用的 C/C++ 代码。Android.mk 文件是一个 Makefile,它描述了如何编译和链接 C/C++ 源代码文件以生成共享库(.so 文件)或可执行文件Android.mk 文件通常位于 JNI(Java Native Interface)目录下,用于指定要编译的源代码文件、编译选项、链接选项等。以下是一个示例 Android.mk 文件的简单结构: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 编译选项 LOCAL_CFLAGS := -Werror # 源文件 LOCAL_SRC_FILES := \ file1.c \ file2.c # 生成的共享库名称 LOCAL_MODULE := mylib include $(BUILD_SHARED_LIBRARY) ``` 在这个示例中,`LOCAL_PATH` 定义了当前 Android.mk 文件所在的路径。`include $(CLEAR_VARS)` 清空了之前的变量设置,以便重新定义新的变量。`LOCAL_CFLAGS` 定义了编译选项,这里设置为 `-Werror` 表示将所有警告视为错误。`LOCAL_SRC_FILES` 定义了要编译的源文件列表。`LOCAL_MODULE` 定义了生成的共享库的名称。 通过编写 Android.mk 文件,您可以根据项目的需求自定义编译和链接规则,以及添加其他依赖库等。完成 Android.mk 文件的编写后,可以使用 ndk-build 命令来执行编译和链接操作,生成最终的共享库文件。 请注意,Android.mk 文件在最新的 Android Gradle 插件中已经不再被推荐使用,而是使用 CMake 或 ndk-build 的 Android.bp 文件进行构建。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值