Android.mk file用来向编译系统描述你的源代码。具体来说:-该文件是GNU Makefile的一小部分,会被编译系统解析一次或更多次的build系统。这个文件的语法允许把你的源代码组织成模块,如:静态库、共享库(将被安装/复制到您的应用软件包);我们可以在每一个Android.mk file中定义一个或多个模块,也可以在几个模块中使用同一个源代码文件。
LOCAL_PATH := $(call my-dir)
#指定当前目录
include $(CLEAR_VARS)
#引入编译变量
LOCAL_MODULE := hello
#编译出来的模块名
LOCAL_MODULE_TAGS := optional
#编译选项便是在何种情况下编译
LOCAL_SRC_FILES := hello.c
#源文件(可以指定多个)
LOCAL_MODULE_CLASS := EXECUTABLES
#指定编译之后放置的位置
include $(BUILD_EXECUTABLE)
#引入编译成可执行文件的规则
LOCAL_PACKAGE_NAME
#指定APP应用名称
LOCAL_PRIVATE_PLATFORM_APIS := true
#设置后,会使用sdk的hide的api來编译
LOCAL_USE_AAPT2 := true
#aapt 是编译和打包资源的工具。而aapt2是在aapt上做了优化
LOCAL_JNI_SHARED_LIBRARIES := libbluetooth_jni
#声明要使用到的共享 JNI 库的名称
LOCAL_JAVA_LIBRARIES := javax.obex telephony-common services.net
#指定依赖的共享java类库,这个是编译时依赖,最终不会打包
LOCAL_STATIC_JAVA_LIBRARIES := \
com.android.vcard \
bluetooth.cc\
services.net \
libprotobuf-java-lite \ #指定依赖的静态java类库,最终会打包到apk里面。引用多个的时候,可以像上面那样写。
LOCAL_STATIC_ANDROID_LIBRARIES := android-support-v4
#声明要调用 android 的包,这里是v4包
LOCAL_REQUIRED_MODULES := libbluetooth
#指定依赖的模块。一旦本模块被安装,通过此变量指定的模块也将被安装
LOCAL_PROGUARD_ENABLED := disabled
#混淆配置,默认为full obfuscation,全代码混淆,disabled不开启
include $(BUILD_PACKAGE)
#编译成APK 文件
include $(BUILD_STATIC_JAVA_LIBRARY)
#生成静态JAVA库
下面这是一个生成共享库的mk文件实例。
LOCAL_PATH:= $(call my-dir)
include$(CLEAR_VARS)
LOCAL_MODULE:=helloworld
LOCAL_SRC_FILES:= helloworld.c
include$(BUILD_SHARED_LIBRARY)
我们来解释一下这几行代码:
Android.mk file必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES, 等等…),
除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
LOCAL_MODULE变量是必须定义的,它是你在Android.mk文件中描述的每个模块的标识。它必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,例如一个被命名为’foo’的共享库模块,将会生成’libfoo.so’文件。
LOCAL_SRC_FILES变量包含将要编译打包进模块中的源文件列表。
需要编译成什么模块类型,BUILD_SHARED_LIBRARY是编译系统提供的变量,它表示的是生成一个动态库;它指向一个GNU Makefile脚本(应该就是在build/core目录下的shared_library.mk)。
LOCAL_PATH := $(call my-dir)
ifeq ($(strip $(SYSTEMUI_SUPPORT)),yes)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_MODULE := SystemUI
ifeq ($(TARGET_BUILD_VARIANT),user)
LOCAL_SRC_FILES := $(LOCAL_MODULE)-release.apk
else
LOCAL_SRC_FILES := $(LOCAL_MODULE)-debug.apk
endif
LOCAL_MULTILIB := both
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
endif
接着分析下新增的部分变量:
ifneq : 判断语句,用于比较两个参数,如果两个参数不等,则该语句通过。
# 如果a和b不相等,则do something
ifneq ($(a), $(b))
# do something
endif
这里是判断是否需要继续执行;
LOCAL_MODULE_TAGS,表示模块在什么版本中编译,optional 是模块在所有版本下都编译。
LOCAL_MODULE_CLASS 定义模块的分类。根据分类,生成的模块文件会安装到目标系统相应的目录下。例如:APPS:安装到/system/app下;SHARED_LIBRARIES:安装到/system/lib下;EXECUTABLES:安装到/system/bin下;ETC:安装到/system/etc下;
LOCAL_MODULE_SUFFIX 指定当前模块的后缀。一旦指定,系统在产生目标文件时,会以模块名加后缀来创建目标文件。这里是指定为apk。
LOCAL_CERTIFICATE 签名认证,platform表示使用平台签名文件签名。
指定编译目标为 32位 或 *64位,*它的值可以是32,64,both,表示可以编译的apk可以运行在32位、64位,或者32&64位硬件平台。
LOCAL_PRIVILEGED_MODULE 与编译、安装、权限管理等几个方面都有关系,不设置或者设置为false,安装位置为system/app;为true,安装位置为system/priv-app。
LOCAL_PATH := $(my-dir)
###############################################################################
$(warning [xin.wang] : Build ApeFtm_Mtk_USER)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := ApeFtm_Mtk_USER
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
LOCAL_REQUIRED_MODULES := ApeFtm_Mtk_USER_permission.xml
include $(BUILD_PREBUILT)
# Permissions pre-grant
include $(CLEAR_VARS)
LOCAL_MODULE := ApeFtm_Mtk_USER_permission.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)