Android.mk详解

来源:互联网 发布:礼仪卡片制作软件 编辑:程序博客网 时间:2024/06/04 22:22

简介

Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等。

这里使用google原生6.0的代码作为详解

/packages/apps/Settings/Android.mk

//编译一个依赖于静态Java库(static.jar)的应用程序1LOCAL_PATH:= $(call my-dir) //编译一个依赖于静态Java库(static.jar)的应用程序2include $(CLEAR_VARS) //开始34LOCAL_JAVA_LIBRARIES := bouncycastle conscrypt telephony-common ims-common5LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 android-support-v13 jsr30567LOCAL_MODULE_TAGS := optional //指该模块在所有版本下都编译8// :=是赋值的意思9LOCAL_SRC_FILES := \ //编译的源代码文件列表 添加所有的java源文件10        $(call all-java-files-under, src) \11        src/com/android/settings/EventLogTags.logtags1213LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res1415LOCAL_PACKAGE_NAME := Settings  //表示APK包的名称,模块名称16LOCAL_CERTIFICATE := platform   //签名认证17LOCAL_PRIVILEGED_MODULE := true1819LOCAL_PROGUARD_FLAG_FILES := proguard.flags2021ifneq ($(INCREMENTAL_BUILDS),)22    LOCAL_PROGUARD_ENABLED := disabled23    LOCAL_JACK_ENABLED := incremental24endif2526include frameworks/opt/setupwizard/navigationbar/common.mk27include frameworks/opt/setupwizard/library/common.mk28include frameworks/base/packages/SettingsLib/common.mk2930include $(BUILD_PACKAGE) //结束3132# Use the following include to make our test apk.33ifeq (,$(ONE_SHOT_MAKEFILE))34include $(call all-makefiles-under,$(LOCAL_PATH))35endif36

*详细解析

*

(1)LOCAL_PATH := $(call my-dir)
每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。宏my-dir 则由Build System提供。返回包含Android.mk的目录路径。

(2)include $(CLEAR_VARS)
CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.

例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.

这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

(3)LOCAL_JAVA_LIBRARIES :=xxx
表示需要依赖的共享jar。

(4)LOCAL_STATIC_JAVA_LIBRARIES :=yyy
依赖的静态jar包(jar包是使用 include $(BUILD_STATIC_JAVA_LIBRARY)生成的。)

(5)LOCAL_SRC_FILES :=
Build all java files in the java subdirectory

(6)LOCAL_PACKAGE_NAME := Settings
对这个模块必须定义,名字必须唯一且不包含空格。
Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。

0 0
原创粉丝点击