http://blog.youkuaiyun.com/sergeycao/article/details/49680855
Android.mk文件用来告知NDK Build 系统关于Source的信息。 Android.mk将是GNU Makefile的一部分,且将被BuildSystem解析一次或多次。
Android.mk其实是把真正的Makefile包装起来,使用它来编译程序时,不管是动态库、可执行的二进制文件,还是Jar库、APK包,只要沿着一个简单的思路来做三大步就可以了:清除旧变量,设置新变量,调用编译函数。拿Calendar来做例子的话:
//清除旧变量
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
//设置新变量
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := Calendar
//调用编译函数
include $(BUILD_PACKAGE)
下面简单解释一下这三步:
1)、清除旧变量,是因为Android.mk中所有的变量都是全局的,编译函数在编译时会调用这些变量。为了防止编译函数使用了编译其它模块时设置的变量,每次开始编译一个新的模块时清除所有的变量是个好习惯。
2)、设置新变量就是把本次编译时用到的源码地址,包名等设置好。
3)、调用编译函数其实就是include一个固定的mk文件,这个mk文件会根据设置的变量提取出编译模块需要的target,Command等信息并执行固定的编译命令。
2. NDK Build System变量:
NDK Build System 保留以下变量名:
以LOCAL_ 为开头的
以PRIVATE_ ,NDK_ 或者APP_ 开头的名字。
小写字母名字:如my-dir
如果想要定义自己在Android.mk中使用的变量名,建议添加 MY_ 前缀。
# 1、LOCAL_PATH必须位于Android.mk文件的最开始。它是用来定位源文件的位置,$(call my-dir),宏my-dir 则由Build System提供。返回包含Android.mk的目录路径。的作用就是返回当前目录的路径。
LOCAL_PATH:= $(call my-dir)
# 2、include $(CLEAR_VARS)的作用是清除一些变量的值,例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但是LOCAL_PATH除外。这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。
include $(CLEAR_VARS)
# 3、LOCAL_MODULE是用来指定当前待编译模块的名称,在示例中的模块名称为optional,名字必须唯一且不包含空格。
Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。
LOCAL_MODULE_TAGS := optional
contacts_common_dir := ../ContactsCommon
incallui_dir := ../InCallUI
src_dirs := src $(contacts_common_dir)/src $(incallui_dir)/src
res_dirs := res $(contacts_common_dir)/res $(incallui_dir)/res
# 4、LOCAL_SRC_FILES是用来指定参与编译的源代码文件。
LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs))
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages com.android.contacts.common \
--extra-packages com.android.incallui
LOCAL_JAVA_LIBRARIES := telephony-common voip-common
LOCAL_STATIC_JAVA_LIBRARIES := \
com.android.phone.shared \
com.android.services.telephony.common \
com.android.vcard \
android-common \
guava \
android-support-v13 \
android-support-v4 \
android-ex-variablespeed \
com.mediatek.contacts.ext \
com.mediatek.incallui.ext
LOCAL_JAVA_LIBRARIES += mediatek-framework
LOCAL_JAVA_LIBRARIES += mediatek-common
LOCAL_REQUIRED_MODULES := libvariablespeed
LOCAL_PACKAGE_NAME := Dialer
LOCAL_CERTIFICATE := shared
LOCAL_PRIVILEGED_MODULE := true
LOCAL_PROGUARD_FLAG_FILES := proguard.flags $(incallui_dir)/proguard.flags
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))