使用Hilt注入CoroutineWorker时出现Worker无法实例化的异常咨询
Hilt注入WorkManager Worker实例化异常问题
问题背景
- 最初使用WorkManager 2.7 alpha3版本,因该版本仅兼容Android 12预览SDK做版本降级后,Worker实例化报错仍未解决
- 构造函数无业务依赖的Worker可正常运行,一旦通过构造函数注入业务类(如
StorageHelper)就会触发实例化失败 - 经日志确认,Worker创建流程完全没有走到自定义的
HiltWorkerFactory,全部走了WorkManager默认的实例化逻辑
现有实现配置
Manifest配置
Manifest中未手动添加任何WorkManager相关配置节点
Application实现
@HiltAndroidApp class TimelineApp : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .build() }
Worker类实现
@HiltWorker class DriveSyncWorker @AssistedInject constructor( @Assisted val context: Context, @Assisted workerParams: WorkerParameters, val dependency: StorageHelper, ) : CoroutineWorker(context, workerParams)
Gradle依赖配置
implementation "com.google.dagger:hilt-android:$hilt_version" kapt "com.google.dagger:hilt-compiler:$hilt_version" def work_version = "2.6.0-alpha02" implementation "androidx.work:work-runtime-ktx:$work_version" implementation 'androidx.hilt:hilt-work:1.0.0-beta01' implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
报错日志
E/WM-WorkerFactory: Could not instantiate com.wakaztahir.timeline.utils.workers.DriveSyncWorker java.lang.NoSuchMethodException: com.wakaztahir.timeline.utils.workers.DriveSyncWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters] at java.lang.Class.getConstructor0(Class.java:2332) at java.lang.Class.getDeclaredConstructor(Class.java:2170) at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:95) at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:244) 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:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:923) E/WM-WorkerWrapper: Could not create Worker com.wakaztahir.timeline.utils.workers.DriveSyncWorker
问题解决方案
- 核心原因:未禁用WorkManager默认自动初始化流程,系统通过内置的ContentProvider在应用启动早期就完成了WorkManager初始化,加载了默认的WorkerFactory,后续应用层实现的
Configuration.Provider配置完全不会生效 - 第一步:在AndroidManifest.xml中移除WorkManager默认的自动初始化节点,配置如下:
<provider android:name="androidx.work.impl.WorkManagerInitializer" android:authorities="${applicationId}.workmanager-init" tools:node="remove" /> - 第二步:替换存在兼容问题的依赖版本组合
当前使用的work:2.6.0-alpha02+hilt-work:1.0.0-beta01存在接口不匹配问题,建议替换为稳定兼容组合:- WorkManager升级到2.7.1及以上稳定版(完全兼容Android 12正式SDK,不再依赖预览SDK)
androidx.hilt:hilt-work升级到1.0.0稳定版
- 第三步:校验Hilt注入链路
确认Application类已正确在Manifest中注册,@HiltAndroidApp注解生效,避免HiltWorkerFactory注入为空导致的配置失效 - 第四步:多进程场景校验
若应用存在多进程运行WorkManager的场景,需确保Configuration.Provider逻辑在所有进程下均可正常执行,避免非主进程触发默认初始化逻辑
相关参考方向
- Dagger组件中关于协程Worker注入的已知兼容问题
- 社区同类Hilt注入Worker失败的通用排查方案
内容的提问来源于stack exchange,提问作者Waqas Tahir
相关产品推荐
相关产品推荐

