Workers 不能在缩小变体中用 NoSuchMethodException 实例化

问题描述 投票:0回答:1

我正在使用 Android 的 WorkManager 执行后台任务,并且一切正常,直到我尝试在缩小版本中使用它。当服务应该被初始化时,我收到以下异常:

Could not instantiate *REDACTED*Worker
                                                                                                    java.lang.NoSuchMethodException: *REDACTED*Worker.<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)
  • 我已按照 Custom WorkManager 配置和初始化 所需的步骤进行操作,但在缩小构建时仍然遇到此问题。

  • 我正在使用 Dagger2(不是 Hilt)和 RxWorker

  • 我正在提供一个自定义的 WorkerFactory 实现。

  • 摇篮:

...
// workVersion is 2.7.1
implementation "androidx.work:work-rxjava2:$workVersion"
implementation "androidx.work:work-runtime-ktx:$workVersion"
  • 清单:
<application
>
 ...
 <provider
      android:name="androidx.startup.InitializationProvider"
      android:authorities="${applicationId}.androidx-startup"
      android:exported="false"
      tools:node="remove" />

我发现一个similar question它指的是旧版本并建议将以下内容添加到proguard文件中:

-keepclassmembers class * extends androidx.work.Worker {
    public <init>(android.content.Context,androidx.work.WorkerParameters);
}

但这并不能解决问题。

android proguard dagger-2 android-workmanager
1个回答
0
投票

在调试这个问题后,我发现我的自定义工厂被调用了,但它抛出了一个异常,我在 try-catch 块中捕获(因此我没有在日志中看到它)并返回

null
。当自定义工厂返回 null 时,它 回退到使用反射

© www.soinside.com 2019 - 2024. All rights reserved.