LOCAL_MODULE_TAGS 的疑问

本文详细探讨了在Android系统中,如何解决特定模块(如传感器驱动)无法正确加载到目标路径的问题。通过调整编译配置文件(Android.mk)中的LOCAL_MODULE_TAGS属性,实现了模块的有效加载。
sensor.xxxxx.so一致无法装入到system/lib/hw中。找了好久也不知到为什么,
发现只要有Android.mk的目录都会被编译,编译出来的so放到out目录下的obj中,但是并不是所有的都会被复制到system/lib或者system/lib/hw中.
但是只要在module所在目录用mm编译,就发现一切正常,编译出来的so会出现在LOCAL_MODULE_PATH所制定的最终安装位置。但是整体编译就有不会出现在指定位置。
昨晚和王永请教后发现是LOCAL_MODULE_TAGS := optional的问题,他建议将optional换成debug。我今天早上试了以下,果然就好了。
所以我又仔细研究了以下LOCAL_MODULE_TAGS这个东西,发现这个东西是决定最终是否装载模块的标志,这个和TARGET_BUILD_VARIANT相关,如果TARGET_BUILD_VARIANT=userdebug 那么就会装载LOCAL_MODULE_TAGS的值也为user或者debug的那些模块,所以因为我的模块对应的值是optional,故而没有别最终装载。所以我把optional改为debug就好了。
刚才我又想,改为user应该也可以的吧,但是却得到了如下错误,这个错误让我学习了!


yasin@ubuntu:~/mywork/xxxxroid403-td9921-plus$ make -j4
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.3
TARGET_PRODUCT=xxxx
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IML74K
============================================
build/core/base_rules.mk:78: *** Module name: sensors.td9921
build/core/base_rules.mk:79: *** Makefile location: device/xxxx/common/libs/libsensors_xxxx
build/core/base_rules.mk:80: * 
build/core/base_rules.mk:81: * Each module must use a LOCAL_MODULE_TAGS in its
build/core/base_rules.mk:82: * Android.mk. Possible tags declared by a module:
build/core/base_rules.mk:83: * 
build/core/base_rules.mk:84: *     optional, debug, eng, tests, samples
build/core/base_rules.mk:85: * 
build/core/base_rules.mk:86: * If the module is expected to be in all builds
build/core/base_rules.mk:87: * of a product, then it should use the
build/core/base_rules.mk:88: * "optional" tag: 
build/core/base_rules.mk:89: * 
build/core/base_rules.mk:90: *    Add "LOCAL_MODULE_TAGS := optional" in the
build/core/base_rules.mk:91: *    Android.mk for the affected module, and add
build/core/base_rules.mk:92: *    the LOCAL_MODULE value for that component
build/core/base_rules.mk:93: *    into the PRODUCT_PACKAGES section of product
build/core/base_rules.mk:94: *    makefile(s) where it's necessary, if
build/core/base_rules.mk:95: *    appropriate.
build/core/base_rules.mk:96: * 
build/core/base_rules.mk:97: * If the component should be in EVERY build of ALL
build/core/base_rules.mk:98: * products, then add its LOCAL_MODULE value to the
build/core/base_rules.mk:99: * PRODUCT_PACKAGES section of
build/core/base_rules.mk:100: * build/target/product/core.mk
build/core/base_rules.mk:101: * 
build/core/base_rules.mk:102: *** user tag detected on new module - user tags are only supported on legacy modules.  Stop.
yasin@ubuntu:~/mywork/xxxxroid403-td9921-plus$ 
yasin@ubuntu:~/mywork/xxxxroid403-td9921-plus$ 


所以我的正确的做法应该是module中的LOCAL_MODULE_TAGS依然应该是optional,而安装动作的要求应该放到类似core.mk当中,对于我的板子而言就是应该放到base.mk中。如下
PRODUCT_PACKAGES += \
sensors.$(TARGET_PLATFORM) \


这就可以了,现在唯一的问题就是我没有高明白为什么在对应module目录中的$(TARGET_PLATFORM)和base.mk中的这个$(TARGET_PLATFORM)的值不一样!



### 关于 `LOCAL_MODULE_TAGS` 的宏定义 在 Android.mk 文件中,`LOCAL_MODULE_TAGS` 是一个常用的变量,用于指定模块的标签。这些标签决定了该模块是否会被包含到特定类型的构建中(例如用户版本、调试版本等)。具体来说: - **`LOCAL_MODULE_TAGS` 的作用** 这个变量通常用来标记模块属于哪个类别,常见的取值包括 `eng`、`debug` 和 `user` 等[^1]。不同的标签会影响模块最终被安装到哪种类型的镜像中。 - **宏定义的位置** 在 Android 构建系统中,`LOCAL_MODULE_TAGS` 并不是一个严格意义上的 C/C++ 宏定义,而是 Makefile 中的一个变量。它的默认行为由构建系统的核心脚本决定,具体的实现可以在以下路径找到: - `$ANDROID_BUILD_TOP/build/core/base_rules.mk` 此文件是 Android 构建系统的一部分,其中包含了关于如何处理 `LOCAL_MODULE_TAGS` 的逻辑[^4]。 以下是部分代码片段展示其核心逻辑: ```makefile ifeq (,$(strip $(LOCAL_MODULE_TAGS))) # 如果未设置 LOCAL_MODULE_TAGS,则使用默认值 eng LOCAL_MODULE_TAGS := eng endif ``` 这段代码表明,如果没有显式设置 `LOCAL_MODULE_TAGS`,它会自动被赋予默认值 `eng`。 - **常见用法示例** 假设我们需要创建一个库并将其标记为仅适用于开发环境(即 `eng` 或 `debug`),可以这样写: ```makefile include $(CLEAR_VARS) LOCAL_MODULE := my_module LOCAL_SRC_FILES := my_source.cpp LOCAL_MODULE_TAGS := debug include $(BUILD_SHARED_LIBRARY) ``` 通过上述配置,只有当构建类型为 `eng` 或 `debug` 时,这个模块才会被编译和打包[^5]。 --- ### 总结 `LOCAL_MODULE_TAGS` 不是一个传统意义的宏定义,而是在 Android.mk 文件中使用的变量,默认行为由 `$ANDROID_BUILD_TOP/build/core/base_rules.mk` 控制。开发者可以通过设置此变量来控制模块的适用范围。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YasinLeeX

再来一杯西湖龙井。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值