android makefile学习笔记

本文详细解析了Android.mk文件中的关键变量及宏定义,如LOCAL_PATH、LOCAL_MODULE等,并介绍了它们的作用和使用方法。同时,文章还提供了实用的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、变量说明:
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-library
LOCAL_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.jar

10.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 .dat

13.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)指定编译生成APK

3.include $(BUILD_STATIC_LIBRARY)
用于编译一个静态库,将会生成一个名为lib$(LOCAL_MODULE).a的文件
静态库不会复制到的APK包中,但是能够用于编译共享库。

4.include $(BUILD_SHARED_LIBRARY)
指向编译脚本,根据所有的在 LOCAL_XXX 变量把列出的源代码文件编译成一个共享库,
将生成一个名为lib$(LOCAL_MODULE).so的文件
注意:你必须至少在包含这个文件之前定义LOCAL_MODULE和LOCAL_SRC_FILES

5.$(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/res
LOCAL_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=santos103g

12. 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_OPERATOR
ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_TEMP_OPERATOR,CMCC))
ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_TEMP_OPERATOR,CTC))

3.双卡宏:BUILD_MULTISIM_PROJECT

SEC_PRODUCT_FEATURE_COMMON_DSDS_SUPPORT
ifeq ($(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.wilcoxdszn
OpenGrok/android/vendor/samsung/wilcoxds/SecProductFeature.wilcoxdszn
# Region, Operator feature
SEC_PRODUCT_FEATURE_TEMP_REGION="CHN"
SEC_PRODUCT_FEATURE_TEMP_OPERATOR="CU"
#Common DSDS Feature
SEC_PRODUCT_FEATURE_COMMON_DSDS_SUPPORT=TRUE
# another micro for multisim module
SEC_PRODUCT_FEATURE_COMMON_USE_MULTISIM=TRUE

4.平台控制宏: BUILD_RIL_MARVELL_RIL
ifeq ($(BUILD_RIL_MARVELL_RIL), true)

5.项目名控制:TARGET_PRODUCT
ifneq ($(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.mk
src/foo/lib1/Android.mk
src/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-v7

LOCAL_MODULE_TAGS := optional
LOCAL_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 := APPPACKAGENAME

LOCAL_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 := current
include $(BUILD_PACKAGE)
##########################################
#添加jar
include $(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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值