【问题标题】:ClassNotFoundException on Worker class工人类上的 ClassNotFoundException
【发布时间】:2020-11-02 10:11:12
【问题描述】:

我在生产中遇到了很多奇怪的错误,这些错误只发生在少数用户身上,所以 99% 的用户都没事。

java.lang.Error: java.lang.ClassNotFoundException: com.packagename.core.Translations.TranslationWorker
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1119)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)

Caused by: java.lang.ClassNotFoundException: com.packagename.core.Translations.TranslationWorker
        at java.lang.Class.classForName(Class.java:-2)
        at java.lang.Class.forName(Class.java:324)
        at java.lang.Class.forName(Class.java:285)
        at com.packagename.core.translations.TranslationWorkerFactory.createWorker(TranslationWorkerFactory.kt:19)
        at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:83)
        at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:242)
        at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:136)
        at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.packagename.core.Translations.TranslationWorker" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.packagename.appname-2/base.apk", zip file "/data/app/com.packagename.appname-2/split_config.armeabi_v7a.apk", zip file "/data/app/com.packagename.appname-2/split_config.cs.apk", zip file "/data/app/com.packagename.appname-2/split_config.xhdpi.apk"],nativeLibraryDirectories=[/data/app/com.packagename.appname-2/lib/arm, /data/app/com.packagename.appname-2/base.apk!/lib/armeabi-v7a, /data/app/com.packagename.appname-2/split_config.armeabi_v7a.apk!/lib/armeabi-v7a, /data/app/com.packagename.appname-2/split_config.cs.apk!/lib/armeabi-v7a, /data/app/com.packagename.appname-2/split_config.xhdpi.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
        at java.lang.Class.classForName(Class.java:-2)
        at java.lang.Class.forName(Class.java:324)
        at java.lang.Class.forName(Class.java:285)
        at com.packagename.core.translations.TranslationWorkerFactory.createWorker(TranslationWorkerFactory.kt:19)
        at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:83)
        at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:242)
        at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:136)
        at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)

这是 TranslationWorkerFactory 的代码。我正在使用匕首辅助注入将依赖项注入工作类。

class TranslationWorkerFactory @Inject constructor(
    private val workerFactories: Map<Class<out ListenableWorker>, @JvmSuppressWildcards Provider<ITranslationWorkerFactory>>
) : WorkerFactory() {
    override fun createWorker(
        appContext: Context,
        workerClassName: String,
        workerParameters: WorkerParameters
    ): ListenableWorker? {
        val foundEntry =
                workerFactories.entries.find { Class.forName(workerClassName).isAssignableFrom(it.key) }
        val factoryProvider = foundEntry?.value
                ?: throw IllegalArgumentException("unknown worker class _name: $workerClassName")
        return factoryProvider.get().create(appContext, workerParameters)
    }
}

我不知道为什么会这样。工作人员所做的是下载并解析大型 json,因此这可能是引发异常的原因,但这只是我的猜测是否可能相关。

有人知道发生这种情况的原因吗?

谢谢

【问题讨论】:

    标签: android dagger-2 android-workmanager assisted-inject


    【解决方案1】:

    您很可能已经移动/重命名了您的工作类 (TranslationWorker),例如在重构期间。

    如果是继续阅读。

    重现步骤:

    • 启动应用(旧版本)并等待worker启动
    • 将工作类移动到另一个包,重新构建应用程序
    • 启动应用程序并等待系统运行工作器时

    到目前为止,我还没有找到好的解决方案。但是有一个可行的选择。 主要思想 - 是用 WorkerFactory 中的实际路径替换工作类的不正确路径。 更多详情this post

    【讨论】:

      猜你喜欢
      • 2016-08-20
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      相关资源
      最近更新 更多