主module不能引用子module资源文件

问题

当项目越做越大的时候我们往往会使用组件化开发,项目整体架构与下图类似:
在这里插入图片描述
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的包名引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

得食猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值