Android.mk
-------------Android.mk------------------------------
#宏函数“my-dir”右编译系统提供的,用于返回当前路径
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#CLEAR_VARS由编译系统提供,指定让GNUMAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,
LOCAL_MODULE_TAGS := optional
#LOCAL_MODULE_TAGS :=user eng tests optional
#user: 指该模块只在user版本下才编译
#eng: 指该模块只在eng版本下才编译
#tests: 指该模块只在tests版本下才编译
#optional:指该模块在所有版本下都编译
LOCAL_JAVA_LIBRARIES := semc_bootinfoif
#依赖的共享jar
LOCAL_SRC_FILES := $(call all-java-files-under, src)
#编译的源代码文件列表 添加所有的java 源文件
#这种形式来包含local_path目录下的所有java文件
LOCAL_PACKAGE_NAME := CMTest
#当前 APK 应用的名称
include $(BUILD_PACKAGE)
include $(call all-makefiles-under, $(LOCAL_PATH))
----------------------------------------------------------------
Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始
以include $(BUILD_XXX)结束。
include $(CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让GNUMAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,
如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
include $(BUILD_STATIC_LIBRARY)表示编译成静态库
include $(BUILD_SHARED_LIBRARY)表示编译成动态库。
include $(BUILD_EXECUTABLE)表示编译成可执行程序
Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译。
因为所有的编译文件都在同一个 GNU MAKE 执行环境中进行执行,而Android.mk中所有的变量都是全局的。因此,您应尽量少声明变量,不要认为某些变量在解析过程中不会被定义。
一个Android.mk文件可以编译多个模块
Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始
以include $(BUILD_XXX)结束。
include $(CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让GNUMAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,
如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
include $(BUILD_STATIC_LIBRARY)表示编译成静态库
include $(BUILD_SHARED_LIBRARY)表示编译成动态库。
include $(BUILD_EXECUTABLE)表示编译成可执行程序
因为所有的编译文件都在同一个 GNU MAKE 执行环境中进行执行,而Android.mk中所有的变量都是全局的。因此,您应尽量少声明变量,不要认为某些变量在解析过程中不会被定义。
一个Android.mk文件可以编译多个模块
--------------------------------------------------------------------------
LOCAL_XXX的列表相关简绍
说明:
必须定义, 在app或package的Android.mk中必须给定值。
可选定义,在app或package的Android.mk中可以也可以不给定值。
不用定义,在app或package的Android.mk中不要给定值,脚本自动指定值。
LOCAL_PATH, 当前路径,必须定义。
LOCAL_PACKAGE_NAME, 必须定义,package的名字,这个名字在脚本中将标识app或package。
LOCAL_MODULE_SUFFIX, 不用定义,module的后缀,=.apk。
LOCAL_MODULE, 不用定义,=$(LOCAL_PACKAGE_NAME)。
LOCAL_JAVA_RESOURCE_DIRS, 不用定义。
LOCAL_JAVA_RESOURCE_FILES, 不用定义。
LOCAL_MODULE_CLASS, 不用定义。
LOCAL_MODULE_TAGS, 可选定义。默认optional。取值范围user debug eng tests optional samples shell_ash shell_mksh。
LOCAL_ASSET_DIR, 可选定义,推荐不定义。默认$(LOCAL_PATH)/assets
LOCAL_RESOURCE_DIR, 可选定义,推荐不定义。默认product package和device package相应的res路径和$(LOCAL_PATH)/res。
LOCAL_PROGUARD_ENABLED, 可选定义,默认为full,如果是user或userdebug。取值full, disabled, custom。
full_android_manifest, 不用定义,=$(LOCAL_PATH)/AndroidManifest.xml。
LOCAL_EXPORT_PACKAGE_RESOURCES, 可选定义,默认null。如果允许app的资源被其它模块使用,则设置true。
LOCAL_CERTIFICATE, 可选定义,默认为testkey。最终
private_key := $(LOCAL_CERTIFICATE).pk8
certificate := $(LOCAL_CERTIFICATE).x509.pem
--------------------------
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_JAVA_LIBRARIES := com.broadcom.bt
LOCAL_PACKAGE_NAME := FmRadio
include $(BUILD_PACKAGE)
------------------------------------
include $(BUILD_PACKAGE) # Tell it to build an APK
$(BUILD_PACKAGE)是用来编译生成package/app/下的apk。还有其他几种编译情况:
include $(BUILD_STATIC_LIBRARY) 表示编译成静态库;
include $(BUILD_SHARED_LIBRARY) 表示编译成动态库;
include $(BUILD_EXECUTABLE) 表示编译成可执行程序;
--------------------------------------------------
环境变量TARGET_BUILD_APPS
它的值被函数lunch设置为空,用来表示此次编译是对整个系统进行编译。如果环境变量 TARGET_BUILD_APPS的值不等于空,
那么就表示此次编译是只对某些APP模块进行编译,而这些APP模块就是由环境变量 TARGET_BUILD_APPS来指定的。
----------------------------------------------------------
关于android.mk中的LOCAL_OVERRIDES_PACKAGES需要说明一下,此变量可以使其他的模块不加入编译,
如: 源码中DeskClock的android.mk有
LOCAL_OVERRIDES_PACKAGES := AlarmClock
使 AlarmClock不会加入到编译系统中,不会生成 AlarmClock.apk。