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应用名称
--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 是用来进行包名映射的。
持续更新中~
|