android makefile学习笔记

来源:互联网 发布:端口不通怎么办 编辑:程序博客网 时间:2024/06/04 00:46

一、变量说明:
1.LOCAL_PATH:= $(call my-dir)
此行代码在Android.mk的开头,用于给出当前文件的路径 LOCAL_PATH
用于在开发树中查找源文件宏函数’my-dir’, 由编译系统提供,
用于返回当前路径(即包含Android.mk file文件的目录)

2.LOCAL_PACKAGE_NAME := SecSettings 或 LOCAL_MODULE:= SecSettings标识在Android.mk文件中描述的每个模块。名称必须是唯一的且不包含空格。注意编译系统会自动产生合适的前缀和后缀:静态库:又称为文档文件(Archive File),多个.o文件的集合,linux中静态库文件的后缀为“.a”LOCAL_STATIC_JAVA_LIBRARIES := static-libraryLOCAL_STATIC_JAVA_LIBRARIES += libSR共享库:多个.o文件的集合,一个被命名为'foo'的共享库模将会生成'libfoo.so'文件。LOCAL_SHARED_LIBRARIES := libBMapApiEngine_v1_3_5重要注意事项:如果你把库命名为‘libhelloworld’,编译系统将不会添加任何的lib前缀,也会生成libhelloworld.so,这是为了支持来源于Android平台的源代码的Android.mk文件。如果你确实需要这么做的话。3.LOCAL_MODULE_CLASS (标识所编译模块最后放置的位置。)ETC表示放置在/system/etc.目录下,APPS表示放置在/system/app目录下,SHARED_LIBRARIES表示放置在/system/lib目录下如果具体指定,则编译的模块不会放到编译系统中,最后会在out对应product的obj目录下的对应目录中。4.LOCAL_MODULE_TAGS := optional / user / eng / tests  可选定义该模块在所有版本下都编译/ 该模块只在user版本下才编译/  该模块只在eng版本下才编译/ 该模块只在tests版本下才编译5.LOCAL_OVERRIDES_PACKAGES := Settings覆盖其他所有同名的应用6.LOCAL_CERTIFICATE := platform 可选定义编译一个需要platform签名的APK,而不是share编译(签署当前应用的证书名称)7.LOCAL_PROGUARD_FLAG_FILES := proguard.flags指定不需要混淆的native方法与变量的proguard.flags文件ProGuard的主要作用就是混淆:Java的字节码一般是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。8.LOCAL_PROGUARD_ENABLED:= disabled制定编译的工程,不要使用代码混淆的工具进行代码混淆:9.LOCAL_CLASSPATH := $(LOCAL_PATH)/lib/maps.jar10.LOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_SRC_FILES += src/com/android/settings/nearby/IMediaServer.aidl变量 LOCAL_SRC_FILES (本次需要编译的源文件)必须包含将要编译打包进模块中的源代码文件不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好LOCAL_SRC_FILES := $(call all-subdir-java-files)==》用来包含local_path目录下的所有java文件。11.LOCAL_RESOURCE_OVERLAY_DIR := $(LOCAL_PATH)/TN_CHN_OPEN/res指定资源文件路径12.LOCAL_AAPT_FLAGS := $(SEC_DEV_APP_LOCAL_AAPT_FLAGS)指定打包资源文件因为Android的工具aapt在生成apk文件时默认地会编译并压缩res/下的文件,而一些系统文件则不需要被压缩(否则在读取该文件时需要解压缩),在Android.mk文件需要指定以下选项告诉aapt工具不压缩所的文件。例如Android.mk文件需要指定以下选项告诉aapt工具不压缩所有.dat文件:LOCAL_AAPT_FLAGS := -0 .dat13.LOCAL_SHARED_LIBRARIES:(本次编译需要链接的动态链接库文件,即.so文件)指定模块在运行时要依赖的共享库(动态库),在链接时就需要,以便在生成文件时嵌入其相应的信息。14.LOCAL_STATIC_LIBRARIES:(静态链接库)指定该模块需要使用哪些静态库,以便在编译时进行链接。15.LOCAL_C_INCLUDES  本次编译需要包含的头文件,一个相对于当前目录可选的路径名单,当编译所有的源文件(C,C++和汇编)时,它将被添加进include搜索路径。例如:LOCAL_C_INCLUDES := sources/foo 或者甚至:LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo  16.LOCAL_LDLIBS:(本次编译的链接选项,相当于gcc -l后的参数 )编译模块时要使用的附加的链接器选项。这对于使用‘-l’前缀传递指定库的名字是有用的。例如,LOCAL_LDLIBS := -lz表示告诉链接器生成的模块要在加载时刻链接到/system/lib/libz.so可查看 docs/STABLE-APIS.TXT 获取使用 NDK发行版能链接到的开放的系统库列表。  17.LOCAL_CFLAGS:(同样是编译选项,相当于gcc -O后面的参数 )提供给C/C++编译器的额外编译参数。18.LOCAL_JAVA_LIBRARIES:(当前模块依赖的Java共享库,也叫Java动态库。例如framework.jar包。)19.LOCAL_STATIC_JAVA_LIBRARIES:当前模块依赖的Java静态库,在Android里,导入的jar包和引用的第三方工程都属于Java静态库。20.LOCAL_DEX_PREOPT:(apk的odex优化开关,默认是false)21.LOCAL_MODULE_PATH 和 LOCAL_UNSTRIPPED_PATH在 Android.mk 文件中, 还可以用LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH指定最后的目标安装路径.不同的文件系统路径用以下的宏进行选择:TARGET_ROOT_OUT:表示根文件系统。TARGET_OUT:表示 system文件系统。TARGET_OUT_DATA:表示 data文件系统。如:LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT)至于LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH的区别,暂时还不清楚。  22.LOCAL_JNI_SHARED_LIBRARIES定义了要包含的so库文件的名字,如果程序没有采用jni,不需要LOCAL_JNI_SHARED_LIBRARIES := libxxx 这样在编译的时候,NDK自动会把这个libxxx打包进apk;放在youapk/lib/目录下。除此之外,Build系统中还定义了一些函数方便在Android.mk中使用,包括:$(call my-dir):获取当前文件夹的路径。$(call all-java-files-under, ):获取指定目录下的所有java文件。$(call all-c-files-under, ):获取指定目录下的所有c文件。$(call all-Iaidl-files-under, ):获取指定目录下的所有AIDL文件。$(call all-makefiles-under, ):获取指定目录下的所有Make文件。$(call intermediates-dir-for, , , ,  

二、语句解释

1.include $(CLEAR_VARS)CLEAR_VARS由编译系统提供(可以在 android 安装目录下的/build/core/config.mk  文件看到其定义,为 CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk),因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的,让GNU MAKEFILE清除许多LOCAL_XXX变量,例如 :LOCAL_MODULE, LOCAL_SRC_FILES,  LOCAL_STATIC_LIBRARIES,  等等...该语句的意思就是把CLEAR_VARS变量所指向的脚本文件包含进来。2. include $(BUILD_PACKAGE)指定编译生成APK3.include $(BUILD_STATIC_LIBRARY)用于编译一个静态库,将会生成一个名为lib$(LOCAL_MODULE).a的文件静态库不会复制到的APK包中,但是能够用于编译共享库。4.include $(BUILD_SHARED_LIBRARY)指向编译脚本,根据所有的在 LOCAL_XXX 变量把列出的源代码文件编译成一个共享库,将生成一个名为lib$(LOCAL_MODULE).so的文件注意:你必须至少在包含这个文件之前定义LOCAL_MODULE和LOCAL_SRC_FILES5.$(info RES_OVERLAY TN_CHN_OPEN/RES/) 相当于代码中的log信息6.ifneq($(filter santos10%,$(TARGET_PRODUCT)),)#############################################endif判断是否含有santos10***的string,有的话,进入ifneq条件,Filter有两个参数7..ifneq($(filter %wifi,$(PROJECT_NAME)),)endif 判断是否含有***wifi,如果有进入ifneq条件8.  += 原来有的话不覆盖(追加??)9.  := 之前的值清空,重新复制注意:‘:=’是赋值的意思;’+=’是追加的意思;‘$’表示引用某变量的值。10.LOCAL_RESOURCE_OVERLAY_DIR:=$(LOCAL_PAHT)/TN_CHN_OPEN/res $(LOCAL_RESOURCE_OVERLAY_DIR)相当于 LOCAL_RESOURCE_OVERLAY_DIR  :=  $(LOCAL_PAHT)/TN_CHN_OPEN/resLOCAL_RESOURCE_OVERLAY_DIR  +=  LOCAL_RESOURCE_OVERLAY_DIR(原来的)11.ifeq($(findstring santos3g,$(PROJECT_NAME)),cantos3g)###################################################endif如果PROJECT_NAME中含有santos3g,进入ifeq条件,如何查找PROJECT_NAME与TARGET_PRODUCT的值1.到编译log中搜索,即可得到 2.到脚本中查找,./buildscript/build中        export PROJECT_NAME=${_BUILD_PROJECT_NAME%%_*}而_BUILD_PROJECT_NAME就是$1,我们的输入如果是santos103g_chn_open那么PROJECT_NAME=santos103g12. ifeq (true,$(call spf_check, EC_PRODUCT_FEATURE_TEMP_REGION,CHN))Check 地区是不是CHN,如果是,进入ifeq条件

三、Settings的Android.mk 的相关介绍

1.地区宏:SEC_PRODUCT_FEATURE_TEMP_REGION  ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_TEMP_REGION,HKTW))ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_TEMP_REGION,CHN))2.运营商宏:SEC_PRODUCT_FEATURE_TEMP_OPERATORifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_TEMP_OPERATOR,CMCC))ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_TEMP_OPERATOR,CTC))3.双卡宏:BUILD_MULTISIM_PROJECTSEC_PRODUCT_FEATURE_COMMON_DSDS_SUPPORTifeq ($(BUILD_MULTISIM_PROJECT),true)控制双卡相关文件路径为:TN_MultiSIM/…ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_COMMON_DSDS_SUPPORT,TRUE))控制双卡相关文件路径为:TN_DSDS/…上面三个宏的定义路径://JBP_MAIN/Maple/JBP98x/model/vendor/wilcoxds/SecProductFeature.wilcoxdsznOpenGrok/android/vendor/samsung/wilcoxds/SecProductFeature.wilcoxdszn# Region, Operator featureSEC_PRODUCT_FEATURE_TEMP_REGION="CHN"SEC_PRODUCT_FEATURE_TEMP_OPERATOR="CU"#Common DSDS FeatureSEC_PRODUCT_FEATURE_COMMON_DSDS_SUPPORT=TRUE# another micro for multisim moduleSEC_PRODUCT_FEATURE_COMMON_USE_MULTISIM=TRUE4.平台控制宏: BUILD_RIL_MARVELL_RILifeq ($(BUILD_RIL_MARVELL_RIL), true)5.项目名控制:TARGET_PRODUCTifneq ($(filter wilcoxds%, $(TARGET_PRODUCT)),)

四、NDK提供的函数宏

1.my-dir:返回当前 Android.mk 所在的目录的路径,相对于 NDK 编译系统的顶层。在 Android.mk 文件的开头如此定义: LOCAL_PATH := $(call my-dir)2.all-subdir-makefiles: 返回一个位于当前’my-dir’路径的子目录中的所有Android.mk的列表。  例如,某一子项目的目录层次如下:src/foo/Android.mksrc/foo/lib1/Android.mksrc/foo/lib2/Android.mk如果 src/foo/Android.mk 文件中使用了: include $(call all-subdir-makefiles)那么它就会自动包含 src/foo/lib1/Android.mk 和 src/foo/lib2/Android.mk。这项功能用于向编译系统提供深层次嵌套的代码目录层次。注意,在默认情况下,NDK 将会只搜索在 src/*/Android.mk 中的文件。  3.this-makefile: 返回当前Makefile 的路径(即这个函数调用的地方)  4.parent-makefile: 返回调用树中父 Makefile 路径。即包含当前Makefile的Makefile 路径。  5.grand-parent-makefile:返回调用树中父Makefile的父Makefile的路径  

五、 Android.mk示例

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)#jar包命名,尽量保持命名独特性,避免与其它项目命名重复LOCAL_STATIC_JAVA_LIBRARIES := cl-al cl-ams cl-xutils2 cl-glide cl-v4 cl-v7LOCAL_MODULE_TAGS := optionalLOCAL_CERTIFICATE := platform#添加.java .aidl文件的#LOCAL_SRC_FILES := $(call all-java-files-under, src)#$符号之前有空格LOCAL_SRC_FILES := $(call all-java-files-under, src)  $(call all-Iaidl-files-under, aidl)LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl# LOCAL_SRC_FILES += src/aidl/com/example/showweather/model/db/entities/minimalist/WeatherLive.aidl# LOCAL_SRC_FILES += src/aidl/com/example/showweather/model/db/entities/minimalist/IGetWeatherService.aidl#LOCAL_AIDL_INCLUDES := src/aidl/com/example/showweather/model/db/entities/minimalist/WeatherLive.aidl \#                     src/aidl/com/example/showweather/model/db/entities/minimalist/IGetWeatherService.aidl \LOCAL_PACKAGE_NAME := APPPACKAGENAMELOCAL_PROGUARD_ENABLED := disabled#添加混淆规则#LOCAL_PROGUARD_ENABLED := full#LOCAL_PROGUARD_FLAG_FILES := proguard.flags#LOCAL_PROGUARD_ENABLED := nosystem#LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.cfg# Builds against the public SDK#LOCAL_SDK_VERSION := currentinclude $(BUILD_PACKAGE)###########################################添加jarinclude $(CLEAR_VARS)# \之前有空格,后面没有LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=  \        cl-al:libs/AMap_Location_V3.2.0_20161205.jar \        cl-ams:libs/Android_Map3D_SDK_V4.1.2_20161104.jar \        cl-xutils2:libs/xUtils-2.6.14.jar \        cl-glide:libs/glide-3.7.0.jar \        cl-v4:libs/android-support-v4.jar \        cl-v7:libs/android-support-v7-appcompat.jar \include $(BUILD_MULTI_PREBUILT)###########################################添加SO文件include $(CLEAR_VARS)LOCAL_PREBUILT_LIBS := \        libgdinamapv4sdk752:libs/armeabi/libgdinamapv4sdk752.so \        libgdinamapv4sdk752ex:libs/armeabi/libgdinamapv4sdk752ex.so \# This finds and builds the test apk as well, so a single make does both.include $(call all-makefiles-under,$(LOCAL_PATH))
原创粉丝点击