Skip to content

非传递性 R 类 (Non-transitive R Classes)

源:使用非传递性 R 类

在传统 Android 构建中,每个模块的 R 类都包含它所依赖的所有模块的资源。如果你的项目有 100 个模块,顶层模块的 R 文件会极其庞大,这不仅浪费内存,还会导致不必要的全量重新编译。

1. 为什么要开启它?

  • 编译提速: 当底层模块增减资源时,只有直接依赖它的模块需要重新编译,而不会引发链式反应。
  • 减小体积: 减少了最终 APK 中重复的 R 类符号表。

2. 开启方式

gradle.properties 中:

properties
android.nonTransitiveRClass=true

3. 开启后的代码变化

变化点

开启后,你不能再通过 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。 它会自动扫描全项目并修正所有的引用路径。