java.lang.NoSuchFieldError: No static field xxxx of type I in class Lcom/app/live/R$id; or its supe

这个问题一般是在组件化项目(我这里有一个组件化项目,文末有链接)中出现的,其实就是组件化资源名冲突问题:就是Android 两个模块layout文件同名时出现 NoSuchFieldError报错的问题

当主模块app依赖模块module_square时,module_square中有layout文件activity_jsbridge.xml,而与此同时app模块也含有layout文件activity_jsbridge.xml,app的layout文件activity_jsbridge.xml就会覆盖module_square的layout文件activity_jsbridge.xml。所以当app的layout文件activity_jsbridge.xml修改了的时候(比如添加/删除某个控件id),就会报以下错误:

java.lang.NoSuchFieldError: No static field xxxx of type I in class Lcom/app/live/R$id; 
or its superclasses (declaration of 'com.xxx.xxx.R$id' appears in /data/app/com.xxx-1cXZApJbPz0XPmKXLG3oew==/base.apk!classes33.dex)

这时你在module_square的类中跳转该id是会找到module_square的layout文件activity_jsbridge.xml,看似是有这个资源ID的;而实际运行则是app的layout文件activity_jsbridge.xml,所以定位起来会很懵逼。

组件化资源名冲突问题解决方案:

在多module开发中,无法保证多个module中全部资源的命名不同,出现相同资源名选取的规则是后编译的模块会覆盖之前编译的模块的资源字段中的内容,出现相同会造成资源引用错误的问题。

解决方案:
方案一:资源出现冲突时进行重命名。


方案二:gradle的命名提示机制,使用resourcePrefix字段。

android {
	resourcePrefix "square_"
}

所有的资源命必须以指定的字符串作为前缀,否则会报错(能运行,但是会报错,如下图一),所以最好把文件改成但是resourcePrefix不能限定图片资源,图片资源的还需要手动去修改资源名。

如对此有疑问,请联系qq1164688204。

推荐Android开源项目

项目功能介绍:RxJava2和Retrofit2项目,添加自动管理token功能,添加RxJava2生命周期管理,使用App架构设计是MVP模式和MVVM模式,同时使用组件化,部分代码使用Kotlin,此项目持续维护中。

项目地址:https://gitee.com/urasaki/RxJava2AndRetrofit2

猜你喜欢

转载自blog.csdn.net/NakajimaFN/article/details/130952446