多模块Android项目Fastlane构建APK时Hilt Worker抛NoSuchMethodException
这个问题的核心是Fastlane构建的APK中Hilt WorkerFactory未被正确初始化,导致带额外注入参数的CoroutineWorker无法通过Hilt创建实例,WorkManager只能尝试调用默认的双参构造方法(而带参数的Worker没有这个构造方法),最终抛出NoSuchMethodException。对比Android Studio构建正常的情况,差异点集中在构建配置、混淆规则、依赖版本一致性这几个方向。
1. 修复Hilt依赖版本不一致问题
你的依赖配置中存在版本不匹配:Hilt核心版本是2.44.2,但hiltKapt用了2.35,这会导致注解处理器生成的代码与运行时库不兼容,直接影响Hilt WorkerFactory的生成和初始化。
修改libs.versions.toml中的版本:
hiltKapt = "2.44.2"
同时确保所有模块的kapt依赖都使用统一的Hilt版本,避免跨模块版本冲突。
2. 完善ProGuard/R8规则
现有规则只保留了Worker的基础构造方法,但Hilt生成的Worker工厂类、EntryPoint等代码也需要被保留,否则会被混淆移除。添加以下规则到ProGuard配置文件:
# 保留Hilt Worker相关核心类 -keep class androidx.hilt.work.HiltWorkerFactory { *; } -keep class * extends androidx.hilt.work.HiltWorker { *; } # 保留AssistedInject构造方法和Hilt生成的工厂实现 -keepclasseswithmembers class * { @dagger.assisted.AssistedInject <init>(...); } # 保留Hilt EntryPoint接口 -keep class * implements dagger.hilt.EntryPoint { *; } # 保留Worker类的全限定名,避免WorkManager找不到类 -keepnames class com.example.android.ActivitySyncWorker -keepnames class com.example.android.RemoteConfigSyncWorker
3. 确保WorkManager初始化时机正确
WorkManager必须在Hilt完全初始化后再启动,否则无法获取到HiltWorkerFactory。检查你的Application类:
@HiltAndroidApp class MyApplication : Application() { override fun onCreate() { super.onCreate() // 确保Hilt初始化完成后再初始化WorkManager AppInitializer.getInstance(this).initializeComponent(WorkManagerModule::class.java) } }
同时确认Manifest中WorkManagerInitializer确实被移除,避免默认初始化覆盖自定义配置:
<meta-data android:name="androidx.work.WorkManagerInitializer" android:value="androidx.startup" tools:node="remove" />
4. 验证Fastlane构建的变体配置
检查Fastlane的Fastfile,确保构建命令使用的变体(比如release)和Android Studio的配置一致,且开启了kapt任务:
lane :release do gradle( task: 'assembleRelease', properties: { # 如果开启了R8 full mode,需要额外适配规则,可先关闭测试 'android.enableR8.fullMode' => 'false' } ) end
另外,确保Fastlane构建时没有跳过kapt编译步骤,比如是否添加了--no-build-cache之类的参数导致注解处理器未执行。
5. 检查多模块Hilt配置
确保:core-ble模块的build.gradle正确应用了Hilt插件和kapt:
plugins { id 'com.android.library' id 'kotlin-android' id 'dagger.hilt.android.plugin' id 'kotlin-kapt' }
同时App模块要正确依赖:core-ble,确保Hilt能扫描到该模块的Worker和依赖提供类。
6. 验证Hilt生成代码
Fastlane构建完成后,查看build/generated/source/kapt/release目录下,是否生成了ActivitySyncWorker_HiltWorker类和HiltWorkerFactory相关的实现。如果没有生成,说明kapt在构建时未正确执行,需要检查构建命令是否触发了kapt任务。
内容的提问来源于stack exchange,提问作者Pezcraft

