Android Studio升级后Direction类报R包不存在错误
问题根因
这个报错根本不是普通的R类缺失问题,是Navigation组件配套的Safe Args代码生成插件版本过低导致的,和namespace迁移操作本身无关。
老版本Safe Args只会从AndroidManifest.xml的package属性读取应用包名,用来拼接生成类里R类的导入路径。当你按照Android Studio Chipmunk配套的AGP 7.0+规范,把包名配置迁移到build.gradle的namespace字段后,老插件读不到正确的包名,自动生成的Directions、Args类里就会缺失R类的正确导入语句,直接触发package R does not exist编译错误。你之前查到的普通R缺失解决方案都是针对源码导包、资源编译失败场景的,自然解决不了生成代码的问题。
解决方案
按优先级从高到低操作即可,不需要回滚namespace配置:
- 优先方案:对齐Safe Args插件版本
打开项目根目录下的build.gradle文件,把Safe Args插件的版本号改成和你当前使用的Android Gradle Plugin(AGP)版本完全一致即可。比如Chipmunk默认搭载的是AGP 7.3.x版本,就把Safe Args升级到7.3.x及以上的对应同大版本,不要跨大版本用老旧的Safe Args插件。
修改完成后依次点击File > Invalidate Caches...勾选清除缓存并重启IDE,重启后执行Clean Project > Rebuild Project,重新生成的Directions类会自动导入正确包路径下的R类,报错直接消失。 - 临时兼容方案(无法升级插件时使用)
如果因为项目依赖限制暂时没法升级Safe Args,不需要回滚namespace配置,只需要在模块级build.gradle的android闭包里补两行兼容配置,给老版本插件指定资源包名即可:
配置完成后同样执行Clean+Rebuild即可正常编译,这个配置完全符合AGP 7.0+的规则,不会引入额外冲突。android { namespace 'myPackageName' // 补以下兼容配置 buildFeatures { buildConfig true } androidResources { packageName = namespace } } - 避坑提示:不要随便给生成类手动加
import android.R导包,也不要乱改sourceSets、applicationId配置,这类操作只会引发更多资源引用错乱的问题。
内容的提问来源于stack exchange,提问作者Milad Faridnia
相关产品推荐
相关产品推荐

