Android Kotlin多模块迁移:跨模块类Unresolved Reference构建报错
多模块项目Java转Kotlin跨模块引用构建失败解决方案
针对编辑阶段无Lint报错、自动补全正常但构建报跨模块类找不到的问题,按以下优先级排查修复:
- 首先校验模块依赖规则
检查持有AppSettings类的模块和引用模块的依赖配置:如果两个模块不是直接依赖、中间隔了其他模块层,中间层模块对持有AppSettings的模块依赖必须用api配置,不能用implementation。implementation配置不会把依赖传递到上层模块,IDE全局索引能扫到所有源码的类所以补全、Lint都正常,但编译时上层模块的类路径里没有这个类,直接报引用错误。这是多模块迁Kotlin时出现该问题最常见的诱因。同时要确认依赖没有被加在非当前构建变体的配置下,比如只配了releaseImplementation但当前跑debug构建。 - 检查全模块Kotlin编译配置一致性
所有子模块的Kotlin插件版本、kotlinOptions里的jvmTarget版本必须完全对齐,不能出现部分模块用1.8、部分模块用11/17的情况,JVM目标版本不一致会导致跨模块Kotlin类签名校验失败,报类找不到的错误。同时确认持有AppSettings的模块已经正确应用了kotlin-android插件,仅在根目录声明Kotlin插件classpath、子模块没应用的话,IDE能识别Kotlin源码做索引,但编译时不会生成对应class文件。 - 检查Kotlin类的可见性配置
确认AppSettings类没有被标记为internal修饰符。同工程下IDE索引会放宽跨模块internal类的识别提示,但正式编译时Kotlin编译器会严格执行可见性校验,直接拦截跨模块的internal类引用,这类问题基本不会在编辑阶段提前报红。如果类是对外暴露的公共组件,必须保持public可见性(Kotlin默认是public,除非手动加了internal修饰符)。 - 做深度缓存清理
普通的Build -> Clean操作清不掉Kotlin跨模块编译缓存,按以下步骤操作:- 完全关闭Android Studio
- 删除项目根目录下的
.gradle、.idea文件夹,删除所有子模块下的build文件夹 - 在项目根目录执行终端命令
./gradlew cleanBuildCache清除全局Gradle构建缓存 - 重新打开Android Studio等索引完成后再执行构建
- 特殊场景排查
如果AppSettings是注解处理器(KAPT/KSP)生成的类,检查对应注解处理器的依赖配置是否正确,有没有把生成源码目录排除在编译路径外——IDE默认会扫所有生成目录做代码补全,但编译器如果没拿到生成路径就会报找不到类。另外检查持有AppSettings模块的AndroidManifest.xml里的package属性有没有被误改,包名改动会导致编译输出的类全路径和源码路径不一致,也会触发这个问题。如果模块开了混淆,确认公共类已经加了对应的keep规则,避免R8提前把类裁掉。
内容的提问来源于stack exchange,提问作者Diego Perez
相关产品推荐
相关产品推荐

