混淆构建下WorkManager无法实例化Worker,抛出NoSuchMethodException
问题:WorkManager混淆构建时无法实例化Worker
正常构建后台任务无异常,混淆构建时服务初始化抛出如下错误:
Could not instantiate REDACTEDWorker
java.lang.NoSuchMethodException: REDACTEDWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters]
at java.lang.Class.getConstructor0(Class.java:2328)
at java.lang.Class.getDeclaredConstructor(Class.java:2167)
at e1.y.b(SourceFile:65)
at f1.j.k(SourceFile:358)
at f1.j.run(SourceFile:17)
at n1.i$a.run(SourceFile:3)
环境与配置
- 基于WorkManager 2.7.1开发,使用Dagger2(非Hilt)+ RxWorker,实现了自定义WorkerFactory
- 已按照官方《Custom WorkManager Configuration and Initialization》文档完成自定义初始化配置
- Gradle依赖配置:
// workVersion is 2.7.1 implementation "androidx.work:work-rxjava2:$workVersion" implementation "androidx.work:work-runtime-ktx:$workVersion"
- Manifest配置(禁用默认初始化):
<application> ... <provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="remove" /> </application>
已尝试无效的方案
添加了针对旧版本WorkManager的ProGuard规则,但问题未解决:
-keepclassmembers class * extends androidx.work.Worker { public <init>(android.content.Context,androidx.work.WorkerParameters); }
解决建议
因为你使用的是RxWorker而非普通Worker,原规则仅覆盖了Worker子类,需补充RxWorker的混淆规则:
# 保留RxWorker的构造方法 -keepclassmembers class * extends androidx.work.RxWorker { public <init>(android.content.Context, androidx.work.WorkerParameters); } # 推荐保留自定义Worker类完整结构,避免类名/方法被混淆导致WorkManager无法匹配 -keep class com.yourpackage.**Worker { *; }
同时检查自定义WorkerFactory的混淆规则,确保注入逻辑不被破坏:
# 保留自定义WorkerFactory的类与方法 -keep class com.yourpackage.YourCustomWorkerFactory { *; }
最后确认WorkManager自定义初始化逻辑是否正常,确保WorkerFactory被正确传入WorkManagerConfiguration,避免混淆导致初始化代码失效。
内容的提问来源于stack exchange,提问作者Max Glukhov
相关产品推荐
相关产品推荐

