ClassNotFoundException:“androidx.work.impl.WorkManagerInitializer”

sag*_*gis 11 android admob facebook-audience-network android-workmanager

Google AdMob Ads 库版本 19.4.0 升级到 19.5.0 后,部分设备上出现了新的异常:

Caused by java.lang.ClassNotFoundException 
Didn't find class "androidx.work.impl.WorkManagerInitializer" on path: ...
dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:196)
androidx.core.app.CoreComponentFactory.instantiateProvider (CoreComponentFactory.java)
android.app.ActivityThread.installProvider (ActivityThread.java:7213)
android.app.ActivityThread.installContentProviders (ActivityThread.java:6769)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:941)
Run Code Online (Sandbox Code Playgroud)

该异常出现在 Android 8 和 10 的设备上。

AdMob 库 19.5.0 添加了对 WorkManager 2.1.0 的依赖项(通过 Play Services Ads Lite 库): https://mvnrepository.com/artifact/com.google.android.gms/play-services-ads-lite/19.5.0

在这个问题上有一个类似的问题,但它似乎是无关的(较旧的Android操作系统版本具有多个dex,而这里是单个dex和较新的操作系统版本)。

目前我降级到 AdMob 19.4.0,其中不包含 WorkManager 依赖项。

更新(2020.12.18)

  • 异常频率为每 1000 台运行 Android 10 的设备 1 次。
  • 强制使用 WorkManager 2.4.0(而不是 2.1.0)也会生成异常。
  • 该问题与 AdMob 无关。使用 AdMob 19.4.0 将 WorkManager 添加到项目中重现了该问题。
  • 我目前的假设是,该问题是由 AudienceNetwork 和 WorkManager 的内容提供商之间的冲突引起的。使用 WorkManager 将 AudienceNetwork 添加到项目会生成相同的异常,但类别不同:Didn't find class "com.facebook.ads.AudienceNetworkContentProvider"在某些 Android 10 设备上。

Chi*_*orn 22

Google文档版本开始2.6.0-alpha01WorkManager用来androidx.startup初始化WorkManager。以前,这是由androidx.work.impl.WorkManagerInitializer 如果您过去使用过用于初始化流程生命周期来完成的,那么您需要执行以下操作tools:node="remove"ContentProvider

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <!-- If you are using androidx.startup to initialize other components -->
    <meta-data
        android:name="androidx.work.impl.WorkManagerInitializer"
        android:value="androidx.startup"
        tools:node="remove" />
</provider>
Run Code Online (Sandbox Code Playgroud)

或者

<!-- If you want to disable android.startup completely. -->
<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    tools:node="remove" />
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的链接。Android 12 的 `2.7.0` 的小变化 - `android:name="androidx.work.WorkManagerInitializer"`,即删除了 `.impl` (2认同)

sag*_*gis 7

解决方法: 手动初始化 WorkManager不会导致此异常。

AdMob 20.5.0 及更高版本(或 WorkManager 2.6.0+ 的显式依赖项)

WorkManager 现在使用应用程序启动提供程序。为了使用手动初始化:

  1. 从应用程序启动提供程序中删除 WorkManager。
  2. 将 WorkManager 配置添加到 Application 对象。

步骤 1: 有 2 种方法可以从应用程序启动提供程序中删除 WorkManager:

  • 删除整个提供者。或者
  • 仅删除 WorkManager。

来自WorkManager 的文档

 <!-- If you want to disable android.startup completely. -->
 <provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    tools:node="remove">
 </provider>
Run Code Online (Sandbox Code Playgroud)

或者

 <provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <!-- If you are using androidx.startup to initialize other components -->
    <meta-data
        android:name="androidx.work.WorkManagerInitializer"
        android:value="androidx.startup"
        tools:node="remove" />
 </provider>
Run Code Online (Sandbox Code Playgroud)

步骤2: 在Application对象中添加手动WorkManager配置:

class MyApplication extends Application implements Configuration.Provider {
    @NonNull
    @Override
    public Configuration getWorkManagerConfiguration() {
        return new Configuration.Builder()
                .build();
    }
}
Run Code Online (Sandbox Code Playgroud)

AdMob 20.4.0 及更低版本

通过将以下内容添加到以下内容来删除 WorkManager 默认内容提供程序初始化Manifest.xml

<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="${applicationId}.workmanager-init"
    tools:node="remove"
    android:exported="false"
    />
Run Code Online (Sandbox Code Playgroud)

将 WorkManager 的手动初始化添加到Application.onCreate()方法中:

Configuration myConfig = new Configuration.Builder()
        .build();
WorkManager.initialize(this, myConfig);
Run Code Online (Sandbox Code Playgroud)