如何修复Mqtt v5中的java.util.MissingResourceException异常
Paho MQTT v5 Android 混淆崩溃问题解决办法
问题背景
在Kotlin Android项目中使用Paho MQTT v5客户端库,依赖配置如下:
implementation 'org.eclipse.paho:org.eclipse.paho.mqttv5.client:1.2.5'
原本套用了针对MQTT v3的ProGuard规则:
-keep class org.eclipse.paho.client.mqttv3.** {*;} -keep class org.eclipse.paho.client.mqttv3.*$* { *; } -keep class org.eclipse.paho.client.mqttv3.logging.JSR47Logger { *; }
但该规则对v5库完全无效,应用运行时直接崩溃,抛出错误:
Process: com.sckooly.net, PID: 7438 java.util.MissingResourceException: Error locating the logging class at wb.b.a(SourceFile:27) at vb.b.<init>(Unknown Source:5) at com.sckooly.net.chat.MosquittoManager.startSubscriber(Unknown Source:27) at com.sckooly.net.activities.HomeActivity$onCreate$1$1.invokeSuspend(SourceFile:62) at oa.a.resumeWith(Unknown Source:8) at bb.g0.run(Unknown Source:104)
问题原因
原规则全部针对org.eclipse.paho.client.mqttv3包,但MQTT v5的包结构为org.eclipse.paho.mqttv5.client,两者完全不同,导致v5库的核心类和日志类被混淆,进而找不到日志相关资源,触发MissingResourceException。
解决办法
替换为适配MQTT v5的ProGuard规则:
# 保护MQTT v5所有核心类及内部类不被混淆 -keep class org.eclipse.paho.mqttv5.** { *; } -keep class org.eclipse.paho.mqttv5.*$* { *; } # 保护日志类及相关资源文件,避免资源找不到 -keep class org.eclipse.paho.mqttv5.logging.JSR47Logger { *; } -keepresourcefiles META-INF/services/org.eclipse.paho.mqttv5.logging.LoggerFactory -keepresourcefiles META-INF/mqttv5_logging.properties
规则说明
- 将包名从
mqttv3替换为mqttv5,覆盖v5库的所有类 - 保留内部类(
*$*),防止库内部嵌套类结构被破坏 - 额外保留日志相关的配置文件和服务注册文件,彻底解决日志资源找不到的问题
内容的提问来源于stack exchange,提问作者Sckoolboy Inc.
相关产品推荐
相关产品推荐

