Android中的各种模块,无论是APK应用、可执行程序还是jar包,都可以通过Build系统编译生成。在每一个模块的源码目录下,都有一个Android.mk文件,里面包含了模块代码的位置、模块的名称、需要链接的动态库等一系列的定义。
先看一个比较典型的文件:package/apps/Settings/Android.mk,如下:
#设置当前编译目录(包含此Android.mk的目录)
LOCAL_PATH:= $(call my-dir)
#清除LOCAL_XXX变量,LOCAL_PATH除外
include $(CLEAR_VARS)
#指定依赖的共享java类库
LOCAL_JAVA_LIBRARIES := bouncycastle conscrypt telephony-common ims-common
#指定依赖的静态java类库
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 android-support-v13 jsr305
#定义模块的标签为optional
LOCAL_MODULE_TAGS := optional
#定义源文件列表
LOCAL_SRC_FILES := \
$(call all-java-files-under, src) \
src/com/android/settings/EventLogTags.logtags
#可选定义,推荐不定义。默认product package和device package相应的res路径和$(LOCAL_PATH)/res。
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
#指定模块名称
LOCAL_PACKAGE_NAME := Settings
#指定模块签名使用platform签名
LOCAL_CERTIFICATE := platform
#为true表示此apk将安装到priv-app目录下
LOCAL_PRIVILEGED_MODULE := true
#指定混淆的标志
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
#将下面指定的文件包含进来
include frameworks/opt/setupwizard/navigationbar/common.mk
#指定编译模块的类型为APK
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
ifeq (,$(ONE_SHOT_MAKEFILE))
#将源码目录下其余的Android.mk都包含进来
include $(call all-makefiles-under,$(LOCAL_PATH))
endif
对于一个模块定义文件Android.mk而言,有几行是必须的,其中最开始的两行是固定的写法:
#设置当前编译目录(包含此Android.mk的目录)
LOCAL_PATH:= $(call my-dir)
#清除LOCAL_XXX变量,LOCAL_PATH除外
include $(CLEAR_VARS)
第二行的作用是包含进clear_vars.mk文件,在这个文件里会将除了LOCAL_PATH变量以外,所有“LOCAL_”开头的变量都清除掉。
在Android.mk文件的结尾一般都会有类似“include $