LOCAL_PATH := $(call my-dir)
每个Android.mk文件必须以定义LOCAL_PATH为开始。主要作用为在开发的tree中查找源文件。
宏my-dir是由Build System提供,将返回当前目录(Android.mk文件本身所在的目录)的路径
include $(CLEAR_VARS)
CLEAR_VARS变量是由Build System提供,指向一个特殊的GNU Makefile,由GNU Makefile负责清理LOCAL_xxx。例如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRAIES等,但是不清理LOCAL_PATH。
需要注意的是:
(1)、因为所有的编译控制文件均由同一个GNU Make解析和执行,其变量是全局的,为了避免相互影响,所以必须执行清理动作。
(2)、Android.mk中可以编译多个模块,每个模块以include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束
LOCAL_MODULE := hello-jni
LOCAL_MODULE模块必须定义,用来表示Android.mk中的每一个模块。名字必须唯一且不包含空格。Build System会自动添加前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so。但是需要注意:如果模块名被定义为libfoo,则会生成libfoo.so,不会再添加前缀了。
除apk以LOCAL_PACKAGE_NAME指定模块名以外,其余的模块都以LOCAL_MODULE指定模块名
include $(BUILD_PACKAGE)
(BUILD_PACKAGE) :用来编译生成package/app/下的apk,也可以编译资源包文件,但需要指定LOCAL_EXPORT_PACKAGE_RESOURCES := true
(BUILD_STATIC_LIBRARY): 表示编译成静态库
(BUILD_SHARED_LIBRARY):表示编译成动态库
(BUILD_EXECUTABLE):表示编译成可执行文件
LOCAL_MODULE_TAGS :=user \ eng \ tests \ optional
user:该模块只在user版本下编译
eng:该模块只在eng版本下编译
tests:该模块只在tests版本下编译
optional:该模块在所有版本下都编译
LOCAL_SRC_FILES := $(call all-java-files-under, $(src))
如果需要包含的是java源码,可以通过all-java-files-under这种形式来包含local_path目录下的所有的java文件;
LOCAL_SRC_FILES
变量必须包含要构建到模块中的C或C++源文件列表
最后通过include $(BUILD_SHARED_LIBRARY)
将一切连接到一起
include $(BUILD_SHARED_LIBRARY)
指向一个GNU Makefile 脚本,该脚本会收集自最近include以来在LOCAL_XX变量中定义的所有信息,此脚本确定要构建的内容以及构建方式。
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
默认调用根目录下的res资源,也可以调用指定目录下的资源文件,如下:
res_dirs : = settings/res
res_dirs +=settings/res-luke
LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs))
LOCAL_PACKAGE_NAME := xxx
指定APP应用名称
LOCAL_AAPT_FLAGS :=
--version-code 向manifest中添加android:versionCode
--version-name 向manifest中添加android:versionCode
--extra-packages 为后面的库生成R.java文件,用:分隔库
--auto-add-overlay 自动添加overlays包里的资源
LOCAL_MANIFEST_FILE := AndroidManifest.xml
指定AndroidManifest.xml,默认不用配置,会调用根目录下的
LOCAL_STATIC_JAVA_LIBRARIES
和LOCAL_JAVA_LIBRARIES
LOCAL_STATIC_JAVA_LIBRARIES:表示把引用的外部Java库直接编译打包到本模块中,在runtime时可以直接从本模块中找到相关的内容;
LOCAL_JAVA_LIBRARIES:表示引用的外部Java库仅在编译时可以找到相关内容,不参与打包过程,在runtime时需要从另外的地方查找。
需要注意:LOCAL_JAVA_LIBRARIES这种方式,需要在编译的时候将引用的外部Java库的模块名添加到PRODUCT_BOOT_JARS,例如Android原生的framework.jar就添加了,PRODUCT_BOOT_JARS+=framework,否则在runtime时ClassLoader找不到需要的class。
静态引用时将外部库直接进行打包,动态引用时需要将外部库加到PRODUCT_BOOT_JARS
LOCAL_AIDL_INCLUDES
指定参与编译的AIDL路径
LOCAL_CERTIFICATE
Android.mk在编译apk时有4种签名方式,签名方式位于build/target/product/security/目录中
testKey:普通apk,默认签名方式
platform:该apk会完成一些系统的核心功能,这种方式编译出来的apk所在的进程的UID为system
shared:该apk需要和home/contacts进程共享数据
media:该apk是media/download系统的一环
由LOCAL_CERTIFICATE指定用哪种key来进行签名
LOCAL_PRIVILEGED_MODULE :=
对于Android系统应用,LOCAL_PRIVILEGED_MODULE 决定其编译后在ROM中的安装位置:
LOCAL_PRIVILEGED_MODULE :=false
若不设置或设置为false,安装的位置为system/app
LOCAL_PRIVILEGED_MODULE :=true
若设置为true,安装的位置为system/priv-app
LOCAL_DEX_PREOPT :=
Android预优化:即把Android在启动或APP在运行时所需要做的事情转移到编译APK时完成,从而提高Android系统启动速度和APP的运行速度。
本地测试时可以把预编译关闭,LOCAL_DEX_PREOPT := false
LOCAL_PROGUARD_ENABLED :=
Android代码混淆:将代码中的各种变量、方法、类和包等的名字改写成无意义的名字,增加项目反编译后被读懂的难度。通常使用ProGuard工具来进行代码混淆,该工具可以压缩、优化和混淆Java字节码文件,删除无用的类、字段和属性。
LOCAL_PROGUARD_ENABLED的取值如下:
full:使用编译系统默认的配置,压缩但不混淆和优化,默认的混淆配置文件是build/core/proguard.flags
custom:和full一样,但不包括aapt生成的resource相关的混淆配置
nosystem:不使用系统的默认配置,但使用aapt生成的resource相关的混淆配置,qita混淆由模块自己负责
disabled:关闭混淆
obfuscation:和full一样,并且开启混淆
optimization:和full一样,并且开启优化
不设置时,若为app,默认为full;若为library,默认为disabled
LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt
举例说明:若在Android.mk文件中指定LOCAL_JAVA_LIBRARIES := okhttp
,在编译时import语句导入的com.squareup.okhttp.OkHttpClient会找不到,原因在于Android.mk中引入一条规则LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt
,在jarjar-rules.txt文件中会对导入的包进行包名映射,需要参照文件中规则修改导入的包名。
因此,LOCAL_JARJAR_RULES
是用来进行包名映射的。
持续更新中~