非传递性 R 类 (Non-transitive R Classes)
在传统 Android 构建中,每个模块的 R 类都包含它所依赖的所有模块的资源。如果你的项目有 100 个模块,顶层模块的 R 文件会极其庞大,这不仅浪费内存,还会导致不必要的全量重新编译。
1. 为什么要开启它?
- 编译提速: 当底层模块增减资源时,只有直接依赖它的模块需要重新编译,而不会引发链式反应。
- 减小体积: 减少了最终 APK 中重复的 R 类符号表。
2. 开启方式
在 gradle.properties 中:
properties
android.nonTransitiveRClass=true3. 开启后的代码变化
变化点
开启后,你不能再通过 com.example.app.R 访问来自 :library 模块的资源。
旧代码:
kotlin
// 错误:library_layout 属于 :library 模块,不能在 App 的 R 类中找到
import com.example.app.R
val view = inflater.inflate(R.layout.library_layout, ...)新代码:
kotlin
// 正确:必须引用资源所属模块的 R 类
import com.example.library.R as LibraryR
val view = inflater.inflate(LibraryR.layout.library_layout, ...)4. 自动迁移工具
如果你的项目很大,手动修改 import 会疯掉。使用 Android Studio 内置工具: Refactor > Migrate to Non-Transitive R Classes。 它会自动扫描全项目并修正所有的引用路径。