Android.mk解析

  • 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_LIBRARIESLOCAL_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 是用来进行包名映射的。

持续更新中~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值