多模块Android项目Release构建R8缺失类错误求助
解决多模块Android项目Release构建R8缺失类问题
核心问题分析
你使用AGP 8.5.1、Hilt 2.51.1、Kotlin 2.0.0、KSP 1.8.10-1.0.9搭建的多模块Android项目,Debug构建正常,但开启minify的Release构建时出现SingletonModule、VenuesViewModel等类的R8缺失错误,且不想手动添加大量Keep规则。
针对性解决步骤
1. 对齐KSP与Kotlin版本
当前KSP版本1.8.10-1.0.9与Kotlin2.0.0不兼容,KSP版本必须和Kotlin版本严格对应。Kotlin 2.0.0对应的KSP版本为2.0.0-1.0.24,在项目根目录的build.gradle.kts中更新:
plugins { id("com.google.devtools.ksp") version "2.0.0-1.0.24" apply false }
同步后重新构建,这是Hilt相关R8错误的常见诱因——KSP生成的代码不兼容会导致R8无法识别。
2. 确保Hilt的R8规则自动导入
Hilt会自动提供R8规则,需检查各模块配置:
- 在app模块的
build.gradle.kts中开启多模块聚合任务:
hilt { enableAggregatingTask = true // 多模块项目必须开启,确保Hilt生成的代码被正确聚合 }
- 所有使用Hilt的模块(presentation、data)需正确应用插件:
plugins { id("com.android.library") // 或com.android.application id("kotlin-android") id("dagger.hilt.android.plugin") id("com.google.devtools.ksp") }
3. 检查模块间依赖的传递性
domain是纯Kotlin模块,需确保:
- domain模块未配置导致类被移除的编译参数,示例配置:
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { kotlinOptions { freeCompilerArgs += "-Xno-param-assertions" // 避免添加会触发类移除的编译参数 } }
- presentation和data模块对domain的依赖声明正确:
implementation(project(":domain"))
4. 验证ViewModel的Hilt注解
针对VenuesViewModel的缺失问题,检查是否正确使用Hilt注解:
@HiltViewModel class VenuesViewModel @Inject constructor( private val getVenuesUseCase: GetVenuesUseCase ) : ViewModel() { // ... }
同时确保在Activity/Fragment中通过Hilt扩展方法获取ViewModel:by viewModels<VenuesViewModel>(),而非手动实例化。
5. 检查SingletonModule的Hilt配置
如果SingletonModule是Hilt模块,确认注解配置正确:
@Module @InstallIn(SingletonComponent::class) object SingletonModule { @Provides fun provideSomeRepository(): SomeRepository = SomeRepositoryImpl() }
最后验证
执行./gradlew clean清理构建缓存,重新构建Release版本。若仍有问题,查看missing_rules.txt中具体缺失类,若为Hilt_*开头的生成类,说明KSP版本不匹配的问题未解决。
内容的提问来源于stack exchange,提问作者No_Name
相关产品推荐
相关产品推荐

