更新Android Studio后R.drawable私有访问错误如何修复
错误根因
升级Android Studio时会同步匹配升级适配的Android Gradle Plugin(AGP)版本,新版本AGP对自动生成的R资源类做了更严格的访问控制:R类本身是纯粹的资源ID常量映射容器,其内部嵌套的drawable类的构造方法,从旧版本的宽松访问权限调整为私有访问,从编译规则层面禁止开发者手动实例化R的内部类。
你代码行R.drawable ourRID = new R.drawable();本身完全不符合R类的设计规范:所有drawable对应的资源ID都是类内的public static final int静态常量,R类不承载任何业务逻辑,本来就不允许被实例化。旧版本AGP没做严格的编译校验,才让这类不合规的写法可以正常编译运行。
修复操作步骤
- 直接删除多余的实例化代码
你编写这行实例化逻辑的初衷,通常是想获取指定drawable的资源ID,完全不需要创建R.drawable的实例。直接通过类名访问对应静态常量即可,比如要获取名为ic_app_icon的drawable资源ID,直接写int ourRID = R.drawable.ic_app_icon;即可满足需求。 - 全局排查项目内所有
new R.xxx()的实例化代码,全部替换为静态常量直连的写法,避免同类报错遗漏。 - 若报错来自项目引入的老旧第三方SDK(而非自有业务代码),可在对应模块的
build.gradle文件的android配置块中添加兼容配置,适配旧依赖对R类的非规范调用:android { rClass { nonTransitiveRClass = false } } - 清理项目残留的旧编译缓存,依次执行
Build > Clean Project、Build > Rebuild Project完成重新构建,避免过期的生成R类残留导致重复报错。
注意:不要为了兼容旧写法手动把R类构造器的访问权限改回公共,这会破坏AGP的资源编译规则,后续会触发更多资源引用冲突问题。
内容的提问来源于stack exchange,提问作者TheEagle
相关产品推荐
相关产品推荐

