解析Android.mk文件

来源:互联网 发布:java权限 编辑:程序博客网 时间:2024/05/24 06:30

以Browser为例。

一般情况下,   Android.mk和需要编译的源文件放在同一目录下。

LOCAL_PATH 变量用于查找源文件, 宏函数my-dir由编译系统提供,用于返回当前路径。
LOCAL_PATH := $(call my-dir)      //将LOCAL_PATH 变量定义成本文件所在的目录

Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始,include $(BUILD_XXX)结束。

CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除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)表示编译成可执行文件

include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := MBrowser2        //APK的名称
LOCAL_MODULE_TAGS := optional   

解析:LOCAL_MODULE_TAGS =user eng tests optional
user :指该模块只在user版本下才编译
eng:指该模块只在eng版本下才编译
tests :指该模块只在tests 版本下才编译
optional:指该模块在所有版本下都编译

LOCAL_CERTIFICATE := platform
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
LOCAL_OVERRIDES_PACKAGES := Browser

LOCAL_CERTIFICATE 后面是签名文件的文件名,说明Browser.apk是一个需要platform key签名的apk。
(1)系统中所有使用android.uid.system作为共享UID的APK,都会首先在mannifest节点中增加android:sharedUserId="android.uid.system",然后在Android.mk中增加LOCAL_CERTIFICATE := platform
(2)系统中所有使用android.uid.shared作为共享UID的APK,都会首先在mannifest节点中增加android:sharedUserId="android.uid.shared",然后在Android.mk中增加LOCAL_CERTIFICATE := shared
(3)系统中所有使用android.uid.media作为共享UID的APK,都会首先在mannifest节点中增加android:sharedUserId="android.uid.media",然后在Android.mk中增加LOCAL_CERTIFICATE := media

LOCAL_PROGUARD_FLAG_FILES 在源码中进行混淆编译 也可以为null
LOCAL_OVERRIDES_PACKAGES  使其他的模块不参加编译,此处即使Browser不加入编译

LOCAL_SRC_FILES := \
    $(call all-java-files-under, src) \
    src/com/android/browser/EventLogTags.logtags

如果要包含的是java源码的话,可以调用all-java-files-under得到。(这种形式来包含LOCAL_PATH目录下的所有Java文件);
当涉及到C/C++时,LOCAL_SRC_FILES 变量就必须包含将要编译打包进模块中的C或 C++源代码文件。
在这里可以不用列出头文件和包含文件夹,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。all-java-files-under宏的定义在build/core/definitions.mk中。

LOCAL_STATIC_JAVA_LIBRARIES := \
    android-common \
    guava \
    android-support-v13 \
    android-support-v4

LOCAL_STATIC_JAVA_LIBRARIES  依赖的静态jar包(jar包是使用include$(BUIDE_STATIC_JAVA_LIBRARY)生成的)。

LOCAL_JAVA_LIBRARIES := \
    android.policy \
    com.mstar.android

LOCAL_JAVA_LIBRARIES 依赖的共享jar包

LOCAL_JNI_SHARED_LIBRARIES := libbrowser2util_jni

LOCAL_JNI_SHARED_LIBRARIES 定义了要包含的so库文件的名字,如果程序没有采用jni,不需要LOCAL_JNI_SHARED_LIBRARIES ,这样在编译的时候,NDK自动会把这个libbrowser2util_jni打包进apk中。

LOCAL_EMMA_COVERAGE_FILTER := *,-com.android.common.*

# We need the sound recorder for the Media Capture API.
LOCAL_REQUIRED_MODULES := SoundRecorder libbrowser2util_jni

LOCAL_REQUIRED_MODULES 指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块)
SoundRecorder 表示该模块需要SoundRecorder模块,在系统编译的时候就会将SoundRecorder放入到system.img中,如果单独编译mm的话就不会关心SoundRecorder

include $(BUILD_PACKAGE)       //用来编译生成package/app下的apk

#========================================================================

include $(call all-makefiles-under,$(LOCAL_PATH))       //告诉编译器继续向目录深处递归的一种规定写法


0 0