问题
当项目越做越大的时候我们往往会使用组件化开发,项目整体架构与下图类似:
red的颜色虽然我们是在base模块中添加的,但是在App模块中依旧可以通过com.android.app.R来引用
但是最近创建的一个新项目居然引用不到下层模块的资源文件了…
解决
方案一
引用red属性的地方统一使用com.android.base.R.color.red来引用。如果是新项目还好,如果是老项目,要改动的地方可能会很多,可以采用方案二。
方案二
解决方式非常简单,只需要在gradle.properties进行如下设置:
android.nonTransitiveRClass=false
分析
nonTransitiveRClass这个属性以前是没有的,新版本才有(我使用的版本是Android Studio Bumblebee,gradle 7.2.0),之前我们使用都是很好的,为什么要添加这个属性给我们带来引用上的不方便?
先分析下上面架构中R文件的生成:
首先base模块中的R文件(com.android.base.R) 会存在一个R.color.red的属性。
其次video模块中的R文件(com.android.video.R)也会存在一个R.color.red的属性。
最后app模块中的R文件(com.android.app.R)也会存在一个R.color.red的属性。
此外product、mine模块对应的R文件中都会存在这个R.color.red的属性。
仅一个颜色值代码中就存放了5份,而我们在实际开发中资源文件要更多,module也会更复杂,这些冗余的代码会增加程序包体积。
为了解决R文件的冗余代码,nonTransitiveRClass这个属性就诞生了。当它为false的时候,冗余代码依旧会生成,相当于是对旧项目的兼容。当为true的时候,只会在资源所属module的包名下生成对应R文件,其他module引用只能通过原module的包名引用。