浅析Android下的Android.mk文件(四)
2017-11-15 21:13
537 查看
1.Android对模块唯一性检测的规则
在base_rules.mk里面通过module_id里来检测这个模块是否已经存在,我们看看这个值是如何定义的: module_id := MODULE.$(if \ $(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE) 所以它是通过LOCAL_MODULE_CLASS和LOCAL_MODULE这两个变量来检测模块的唯一性,因此当你定义同一样的CLASS和MODULE的时候,Android就会报错,提示模块必须是唯一的。因此如果你将LOCAL_MODULE_CALSS进行修改,使用LOCAL_MODULE_PATH来指定安装目录的时候就会逃过Android对模块唯一性的检测,但是这样导致的问题就是同一个目标会有多个规则来实现它,而且每个规则都是相同的命令。这样导致的结果就是MAKE会将所有的依赖放在一起,然后使用命令来将其生成目标,这样是非常危险的,会造成库的覆盖,而且很多时候你不知道它就究竟使用的是哪个依赖来最终生成目标,只能用md5sum来检查。
因此当你使用prebuilt来覆盖系统原有的文件的时候应该特别小心,如果你确认你的文件在覆盖系统原有文件以后系统能正常运行的话,好的方法是还是打开Android对module_id的检测,同时把原来生成这个文件的Makefile进行修改,让其不编译出这个文件。
2.Android.mk中LOCAL_MODULE_CLASS对LOCAL_MODULE_PATH 的影响
LOCAL_MODULE_CLASS用于制定LOCAL_MODULE_PATH的路径所在。
如果在Android.mk没有直接明确LOCAL_MODULE_PATH 的话,需要通过以下规则来自动生成base_rules.mk:
[html]
view plain
copy
print?
154 LOCAL_MODULE_PATH := $(strip $(LOCAL_MODULE_PATH))
155 ifeq ($(LOCAL_MODULE_PATH),)
156 #LOCAL_MODULE_CLASS :=
157 LOCAL_MODULE_PATH := $($(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS))
158 $(info *******//////////$(LOCAL_MODULE_PATH))
159 ifeq ($(strip $(LOCAL_MODULE_PATH)),)
160 $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS "$(LOCAL_MODULE_CLASS)")
161 endif
162 endif
在不同的Android.mk文件中,对于模块include()不同的编译类型选项,比如对于Library或者app,execut等在调用对应的处理mk文件时,会默认就指定当前的LOCAL_MODULE_CLASS的值,比如EXECUTABLES、SHARED_LIBRARIES等。所以在自己编写的Android.mk可不显示的指定LOCAL_MODULE_CLASS的值。
但当遇到include $(BUILD_PREBUILT)的预编译选项时不会指定模块模块编译输出的类型CLASS,需要在自己编写的Android.mk中明确指定LOCAL_MODULE_CLASS的值如ETC/APP等,使其值为非空,从而帮助系统确定LOCAL_MODULE_PATH的路径,比如最终编译输出LOCAL_MODULE_PATH := $(TARGRT_OUT_ETC)。
在base_rules.mk里面通过module_id里来检测这个模块是否已经存在,我们看看这个值是如何定义的: module_id := MODULE.$(if \ $(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE) 所以它是通过LOCAL_MODULE_CLASS和LOCAL_MODULE这两个变量来检测模块的唯一性,因此当你定义同一样的CLASS和MODULE的时候,Android就会报错,提示模块必须是唯一的。因此如果你将LOCAL_MODULE_CALSS进行修改,使用LOCAL_MODULE_PATH来指定安装目录的时候就会逃过Android对模块唯一性的检测,但是这样导致的问题就是同一个目标会有多个规则来实现它,而且每个规则都是相同的命令。这样导致的结果就是MAKE会将所有的依赖放在一起,然后使用命令来将其生成目标,这样是非常危险的,会造成库的覆盖,而且很多时候你不知道它就究竟使用的是哪个依赖来最终生成目标,只能用md5sum来检查。
因此当你使用prebuilt来覆盖系统原有的文件的时候应该特别小心,如果你确认你的文件在覆盖系统原有文件以后系统能正常运行的话,好的方法是还是打开Android对module_id的检测,同时把原来生成这个文件的Makefile进行修改,让其不编译出这个文件。
2.Android.mk中LOCAL_MODULE_CLASS对LOCAL_MODULE_PATH 的影响
LOCAL_MODULE_CLASS用于制定LOCAL_MODULE_PATH的路径所在。
如果在Android.mk没有直接明确LOCAL_MODULE_PATH 的话,需要通过以下规则来自动生成base_rules.mk:
[html]
view plain
copy
print?
154 LOCAL_MODULE_PATH := $(strip $(LOCAL_MODULE_PATH))
155 ifeq ($(LOCAL_MODULE_PATH),)
156 #LOCAL_MODULE_CLASS :=
157 LOCAL_MODULE_PATH := $($(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS))
158 $(info *******//////////$(LOCAL_MODULE_PATH))
159 ifeq ($(strip $(LOCAL_MODULE_PATH)),)
160 $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS "$(LOCAL_MODULE_CLASS)")
161 endif
162 endif
154 LOCAL_MODULE_PATH := $(strip $(LOCAL_MODULE_PATH)) 155 ifeq ($(LOCAL_MODULE_PATH),) 156 #LOCAL_MODULE_CLASS := 157 LOCAL_MODULE_PATH := $($(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS)) 158 $(info *******//////////$(LOCAL_MODULE_PATH)) 159 ifeq ($(strip $(LOCAL_MODULE_PATH)),) 160 $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS "$(LOCAL_MODULE_CLASS)") 161 endif 162 endif
在不同的Android.mk文件中,对于模块include()不同的编译类型选项,比如对于Library或者app,execut等在调用对应的处理mk文件时,会默认就指定当前的LOCAL_MODULE_CLASS的值,比如EXECUTABLES、SHARED_LIBRARIES等。所以在自己编写的Android.mk可不显示的指定LOCAL_MODULE_CLASS的值。
但当遇到include $(BUILD_PREBUILT)的预编译选项时不会指定模块模块编译输出的类型CLASS,需要在自己编写的Android.mk中明确指定LOCAL_MODULE_CLASS的值如ETC/APP等,使其值为非空,从而帮助系统确定LOCAL_MODULE_PATH的路径,比如最终编译输出LOCAL_MODULE_PATH := $(TARGRT_OUT_ETC)。
相关文章推荐
- 浅析Android下的Android.mk文件
- 浅析Android下的Android.mk文件
- 浅析Android下的Android.mk文件
- 浅析Android下的Android.mk文件(二)
- 浅析Android下的Android.mk文件(三)
- 浅析Android下的Android.mk文件(一)
- 浅析Android下的Android.mk文件
- 浅析Android下的Android.mk文件
- android编译命令及.mk文件浅析
- 浅析Android下的Android.mk文件
- 浅析Android下的Android.mk文件
- 浅析Android下的Android.mk文件
- Android.mk和Application.mk文件语法规范说明及举例
- Android .mk文件语法规范
- android.mk自动添加cpp文件
- Android.mk 文件 添加 .so 和 .jar 文件
- Android.mk文件
- Android.mk文件详解
- [安卓]Android.mk 文件语法详解
- 停止手打所有cpp文件到android.mk