您的位置:首页 > 移动开发 > Android开发

浅析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  

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)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: