1.
LOCAL_PATH:= $(callmy-dir)
每个Android.mk文件必须以定义LOCAL_PATH为开始,它用于在开发tree中查找源文件。宏my-dir则由编译系统(Build System)提供,用于返回当前路径(即包含Android.mk文件的目录路径)。
2.
LOCAL_SRC_FILES:=\
$(callall-logtags-files-under, src)
LOCAL_SRC_FILES:=\
$(callall-java-files-under, src)\
src/com/android/settings/EventLogTags.logtags
LOCAL_SRC_FILES+=src/org/codeaurora/wfcservice/IWFCService.aidl\
src/org/codeaurora/wfcservice/IWFCServiceCB.aidl
注意:‘:=’是赋值的意思;’+=’是追加的意思;‘\’表示连接符。
- 如果要包含的是java源码的话,可以调用all-java-files-under得到。(这种形式来包含local_path目录下的所有java文件)
- 当涉及到C/C++时,LOCAL_SRC_FILES变量就必须包含将要编译打包进模块中的C或C++源代码文件。注意,在这里你可以不用列出头文件和包含
文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
all-java-files-under宏的定义是在build/core/definitions.mk中。
3.
LOCAL_MODULE := settings-logtags
以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。通常用于编译各种库,可执行文件。编译系统(Build System)会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。
4.
include$(BUILD_STATIC_JAVA_LIBRARY)
将当前模块编译成一个静态的 Java 库
5.
include$(CLEAR_VARS)注意:‘$’表示引用某变量的值。
CLEAR_VARS由编译系统提供(Build System),并指向一个指定的GNU Makefile,由它负责清理许多LOCAL_XXX,例如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRABIRES等等。但不清理LOCAL_PATH。这个清理动作是必须的,因为所有的编译控制文件哟䘝GNU Make解析和执行,其变量是全局的,所以清理后才能避免相互影响。
6.
LOCAL_JAVA_LIBRARIES:=bouncycastle core-ojtelephony-commonims-commontelephony-ext
当前模块依赖的java共享库,这项不是必须的。
7.
LOCAL_STATIC_JAVA_LIBRARIES:=\
android-support-v4\
android-support-v13\
android-support-v7-recyclerview\
android-support-v7-preference\
android-support-v7-appcompat\
android-support-v14-preference\
jsr305\settings-logtags
当前模块依赖的java静态库,这项不是必须的。
8.
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_TAGS :=user eng tests optional
- user: 指该模块只在user版本下才编译
- eng: 指该模块只在eng版本下才编译
- tests: 指该模块只在tests版本下才编译
- optional:指该模块在所有版本下都编译
取值范围debug eng tests optional samples shell_ash shell_mksh。
具体参见https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/index.html
http://www.cnblogs.com/chenbin7/archive/2013/01/05/2846863.html
9.
LOCAL_RESOURCE_DIR :=$(LOCAL_PATH)/res\frameworks/support/v7/preference/res\frameworks/support/v14/preference/res\frameworks/support/v7/appcompat/res\frameworks/support/v7/recyclerview/res
可选定义,推荐不定义。默认product package和device package相应的res路
10.
LOCAL_PACKAGE_NAME := Settings
当前 APK 应用的名称,这个名字在脚本中将标识这个app或package。
11.
LOCAL_CERTIFICATE := platform
签署当前应用的证书名称,LOCAL_CERTIFICATE 后面是签名文件的文件名,说明Settings.apk是一个需要platform key签名的APK
12.
LOCAL_PRIVILEGED_MODULE :=true
LOCAL_PRIVILEGED_MODULE := true 表示app应用在目录/system/priv-app/下
LOCAL_PRIVILEGED_MODULE := false 表示app应用在目录/system/app/下
13.
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
指定不需要混淆的native方法和变量的文件为proguard.flags, 在proguard.flags文件中加入不需要proguard优化的类和方法则不会对其进行混淆。
14.
LOCAL_AAPT_FLAGS := --auto-add-overlay \ --extra-packages android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview
aapt即Android Asset Packaging Tool,在SDK的build-tools目录下。该工具可以查看,创建, 更新ZIP格式的文档附件(zip, jar, apk)。也可将资源文件编译成二进制文件,尽管你可能没有直接使用过aapt工具,但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序。也就是上面说的配置。
15.
LOCAL_PROGUARD_ENABLED := disabled
这个就是表示是否要混淆,混淆就是防止别人破解你的代码,disabld是不需要使用代码混淆的工具进行代码混淆。默认为full,如果是user或userdebug则取值full,为full表示即将该工程代码全部混淆。
16.
LOCAL_PROGUARD_ENABLED := disabled
JACK编译器有三种模式:
LOCAL_JACK_ENABLED:=$(DEFAULT_JACK_ENABLED) # ” (ie disabled), disabled, full, incremental
即分别是disabled,full和incremental
disabled是指关闭JACK编译,使用android old toolchain。
full是指全部编译,即每次编译,都会将所有的code全部编译。
incremental是指增量编译,即只会编译修改的代码。incremental模式默认是关闭的,需要设置。
参见:http://blog.csdn.net/zhudaozhuan/article/details/51842072
17.
LOCAL_JACK_FLAGS := --multi-dex native
Jack 的目的是让 Android 支持更多的 Java 8 特性。
其他补充:
1.
LOCAL_MULTILIB := 64
可以使用 LOCAL_MULTILIB 变量中配置要构建的是32 位或者 64 位以及重写全局的变量 。
“both”:同时构建 32 位和 64 位
“32”:只构建 32 位
“64”:只构建 64 位
“first”:只给第一个架构构建( 在 32 位中优先 32 位,在 64 位中优先 64 位)
“”:默认参数;构建系统构建哪个架构取决于模块类以及其他LOCAL_ 参数,比如 LOCAL_MODULE_TARGET_ARCH,LOCAL_32_BIT_ONLY
等。
2.
LOCAL_JNI_SHARED_LIBRARIES:=libams-1.1.9-mfrlibams-1.1.9-m-mfrlibbuffalo-1.0.0-mfr
定义了要包含的so库文件的名字,如果程序没有采用jni,不需要
LOCAL_JNI_SHARED_LIBRARIES := libxxx 这样在编译的时候,NDK自动会把这个libxxx打包进apk; 放在yourapk/lib/目录下
3.
LOCAL_STATIC_JAVA_LIBRARIES:= TMSLOCAL_STATIC_JAVA_LIBRARIES+= fpapiLOCAL_PREBUILT_STATIC_JAVA_LIBRARIES:= TMS:libs/tms.jarLOCAL_PREBUILT_STATIC_JAVA_LIBRARIES+= fpapi:libs/fpapi.jar
在应用程序中需要引用第三方jar包时使用
参见http://blog.csdn.net/lizzywu/article/details/18255711
https://my.oschina.net/blackylin/blog/109527
4.
LOCAL_MODULE_CLASS:= SHARED_LIBRARIESLOCAL_MODULE_SUFFIX:= .so
LOCAL_MODULE_CLASS: 指定生成的目标文件类型,如LOCAL_MODULE_CLASS := SHARED_LIBRARIES, 生成的就是动态链接库,如果同时指
定了LOCAL_MODULE_SUFFIX,则可以生成后缀为so的动态链接库。
LOCAL_MODULE_SUFFIX:编译生成的文件的后缀名,在某些不能确定生成目标文件类型的时候使用,如 include $(BUILD_PREBUILD), 通过
LOCAL_MODULE_SUFFIX := so, 可生产以so为后缀的文件(不一定就是so文件,只是文件名而已)。
参见http://www.programgo.com/article/1467581733/
5.
include$(BUILD_MULTI_PREBUILT)
在 Android Build 系统中,编译是以模块(而不是文件)作为单位的,每个模块都有一个唯一的名称,一个模块的依赖对象只能是另外一个模块,而不能是其他类型的对象。对于已经编译好的二进制库,如果要用来被当作是依赖对象,那么应当将这些已经编译好的库作为单独的模块。对于这些已经编译好的库使用 BUILD_PREBUILT 或 BUILD_MULTI_PREBUILT。例如:当编译某个 Java 库需要依赖一些 Jar 包时,并不能直接指定 Jar 包的路径作为依赖,而必须首先将这些 Jar 包定义为一个模块,然后在编译 Java 库的时候通过模块的名称来依赖这些 Jar 包。
6.
include$(BUILD_PACKAGE)
生成apk文件。
stack overdlow
答案1:
LOCAL_DX_FLAGS := --multi-dex --main-dex-list=$(mainDexList) --minimal-main-dex
LOCAL_JACK_FLAGS += --multi-dex native
答案二:
Android.mk file use : LOCAL_DX_FLAGS := --multi-dex
或者,阅读SystemUI的Android.mk文件:
ifneq ($(INCREMENTAL_BUILDS),)
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_JACK_ENABLED := incremental
LOCAL_DX_FLAGS := --multi-dex
LOCAL_JACK_FLAGS := --multi-dex native
endif
网友评论