Android makefile 属性记录

基础知识

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_MODULE、LOCAL_SRC_FILES 和 LOCAL_STATIC_LIBRARIES。请注意,GNU Makefile 不会清除 LOCAL_PATH。此变量必须保留其值,因为系统在单一 GNU Make 执行环境(其中的所有变量都是全局变量)中解析所有编译控制文件。在描述每个模块之前,必须声明(重新声明)此变量


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

LOCAL_MODULE := hello-jni

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

注意:如果模块名称的开头已经是 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)

变量和宏

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

除了这些变量之外,您还可以自己定义任意变量。
在定义变量时请注意,NDK 编译系统保留了下列变量名称:
LOCAL_ 开头的名称,例如 LOCAL_MODULE。
PRIVATE_、NDK_ 或 APP 开头的名称编译系统在内部使用这些变量名
小写名称,例如 my-dir。编译系统也是在内部使用这些变量名
如果您为了方便而需要在 Android.mk 文件中定义自己的变量,建议在名称前附加 MY_

NDK 定义的 include 变量


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


此变量指向的编译脚本用于收集您在 LOCAL_XXX 变量中提供的模块的所有相关信息,
以及确定如何根据您列出的源文件编译目标可执行文件。
请注意,使用此脚本要求您至少已经为 LOCAL_MODULE 和 LOCAL_SRC_FILES 赋值
include $(BUILD_EXECUTABLE)


此变量指向的编译脚本用于收集您在 LOCAL_XXX 变量中提供的模块的所有相关信息,
以及确定如何根据您列出的源文件编译目标共享库。
共享库变量会导致编译系统生成扩展名为 .so 的库文件
include $(BUILD_SHARED_LIBRARY)


用于编译静态库的 BUILD_SHARED_LIBRARY 的变体。
编译系统不会将静态库复制到您的项目/软件包中,但可以使用静态库编译共享库
静态库变量会导致编译系统生成扩展名为 .a 的库
include $(BUILD_STATIC_LIBRARY)


指向用于指定预编译共享库的编译脚本。
BUILD_SHARED_LIBRARYBUILD_STATIC_LIBRARY 的情况不同,
这里的 LOCAL_SRC_FILES 值不能是源文件,而必须是指向预编译共享库的一个路径,例如 foo/libfoo.so
您也可以使用 LOCAL_PREBUILTS 变量引用另一个模块中的预编译库
include $(PREBUILT_SHARED_LIBRARY)


目标信息变量

TARGET_PLATFORM 编译系统解析此 Android.mk 文件时面向的 Android API 级别编号

TARGET_ARCH 编译系统解析此 Android.mk 文件时面向的 CPU 系列

TARGET_ARCH_ABI 编译系统解析此 Android.mk 文件时面向的 ABI
例如:armeabi-v7a,arm64-v8a,x86

TARGET_ABI 目标 Android API 级别与 ABI 的连接,特别适用于要针对实际设备测试特定目标系统映像的情况

模块描述变量

LOCAL_PATH
此变量用于指定当前文件的路径。必须在 Android.mk 文件开头定义此变量
LOCAL_PATH := $(call my-dir)


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 为我们定义了很好用的函数值:
$(call my-dir):获取当前文件夹的路径。
$(call all-java-files-under,src/com/tecent/dual ):获取指定目录下的所有java文件。
$(call all-c-files-under,xxx ):获取指定目录下的所有c文件。
$(call all-Iaidl-files-under,src/):获取指定目录下的所有AIDL文件。
$(call all-makefiles-under, ):获取指定目录下的所有Make文件。

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

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


BUILD_JAVA_LIBRARY
BUILD_STATIC_JAVA_LIBRARY
解释:
在Android.mk中可通过调用include $(BUILD_JAVA_LIBRARY)include $(BUILD_STATIC_JAVA_LIBRARY)
来分别生成目标设备上的共享JAVA库静态JAVA库

区别:
二者的区别在于静态JAVA库是由.class文件打包而成JAR包,它在任何一个JAVA虚拟机上都可以运行;
而共享JAVA库则是在静态库的基础上进一步打包成的.dex文件,众所周知,dex是在android系统上所使用的文件格式。

生成的路径:
BUILD_STATIC_JAVA_LIBRARY会生成out/target/common/obj/JAVA_LIBRARIES/appsaut_intermediates目录及其下的JAR文件
BUILD_JAVA_LIBRARY生成此目录的同时会将其中的JAR包复制到out/target/product//system/framework/中;除此之外,还存在BUILD_HOST_JAVA_LIBRARY命令则是在out/host/linux-x86/framework目录下生成相应的JAR包。


LOCAL_SDK_VERSION
标记SDK 的version 状态,值为current system_current或test_current core_current

LOCAL_PRIVATE_PLATFORM_APIS
如果我们使用了系统的hideAPI,值设置为true即可

这两个变量只能定义一个,不能同时定义。


LOCAL_PRIVILEGED_MODULE
如果不设置或者设置为false,安装位置为system/app
如果设置为true,安装位置为system/priv-app


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


LOCAL_PROGUARD_FLAG_FILES := proguard.flags
指定不需要混淆的native方法与变量的proguard.flags文件

LOCAL_PROGUARD_ENABLED := disabled
不使用代码混淆工具混淆文件

LOCAL_PROGUARD_ENABLED := full
即将该工程代码全部混淆


LOCAL_JAVA_LIBRARIES
指定依赖的共享java类库
LOCAL_JAVA_LIBRARIES表示引用的外部Java库,在编译时可以找到相关的东西,但并不打包到本模块,在runtime时需要从别的地方查找,这个别的地方就是在编译时将引用的外部Java库的模块名添加到PRODUCT_BOOT_JARS,例如Android原生的framework.jar就添了,PRODUCT_BOOT_JARS+=framework,否则在runtime时ClassLoader找不到需要的class。

LOCAL_STATIC_JAVA_LIBRARIES
指定依赖的静态java类库
表示把引用的外部Java库,直接编译打包到本模块中,在runtime时可以直接从本模块中找到相关的东西。


LOCAL_JACK_ENABLED := disabled
使用aapt进行编译的方法是,Android默认使用jack进行编译的


PRODUCT_BOOT_JARS += \android.car
PRODUCT_BOOT_JARS变量里的值在编译时,会先被加上’system/framework/‘前缀放到PRODUCT_BOOTCLASSPATH变量中去,然后再把PRODUCT_BOOTCLASSPATH的值放到BOOTCLASSPATH中去。BOOTCLASSPATH又在init.rc里被设置成系统环境变量。


Java反编译工具javap进行查看,javap xxx.class

有源码的时候mk编写的例子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

apk jar 放入系统中mk编写的方式

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值