我按照Realm.io Java文档部分Sharing schemas中所述的建议将我的Android应用程序的模型类包含在realm.io函数中,并将其转移到库中。 当我的应用程序(间接)调用库中的realm.io方法时,我正面临NoSuchMethodError。在库中使用realm.io时的NoSuchMethodError
java.lang.NoSuchMethodError: No static method copyOrUpdate(Lio/realm/Realm;Lmy/package/structure/MyModelClass;ZLjava/util/Map;)Lmy/package/structure/MyModelClass; in class Lio/realm/MyModelClassRealmProxy; or its super classes (declaration of 'io.realm.MyModelClassRealmProxy' appears in /data/user/0/my.name.space/files/.jrebel/load-dexes/bundle3/classes.zip)
at io.realm.MyModuleMediator.copyOrUpdate(MyModuleMediator.java:98)
at io.realm.Realm.copyOrUpdate(Realm.java:1164)
at io.realm.Realm.copyToRealmOrUpdate(Realm.java:757)
这里是我的图书馆的样子:
的build.gradle(项目)
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'io.realm:realm-gradle-plugin:1.0.1'
}
}
的build.gradle(库模块)
apply plugin: 'com.android.library'
apply plugin: 'realm-android'
...
buildTypes {
release {
minifyEnabled false
signingConfig signingConfigs.release
proguardFile getDefaultProguardFile('proguard-rules.pro')
}
}
...
proguard-rules.pro
我以前this snippet为模板
-keep class io.realm.annotations.RealmModule
-keep @io.realm.annotations.RealmModule class *
-keep class io.realm.internal.Keep
-keep @io.realm.internal.Keep class * { *; }
-keep my.package.MyModelClass
-dontwarn javax.**
-dontwarn io.realm.**
MyModule.java
package my.package;
import io.realm.annotations.RealmModule;
@RealmModule(library = true, allClasses = true)
public class MyModule { }
MyRealm.java
package my.package;
import ...
public class MyRealm {
private final RealmConfiguration realmConfig;
public MyRealm(Context context) {
realmConfig = new RealmConfiguration.Builder(context)
.name("name.of.my.config")
.modules(new MyModule())
.build();
}
public Realm getRealm() {
return Realm.getInstance(realmConfig);
}
}
个MyModelClass.class
package my.package;
import ...
public class MyModelClass extends RealmObject {
public void save(Context context) {
Realm realm = new MyRealm(context).getRealm();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm bgRealm) {
bgRealm.copyToRealmOrUpdate(MyModelClass.this);
}
});
realm.close();
}
}
在我的实际应用我呼吁这样的事情,这是造成异常:
MyActivity.java
// ...
MyModelClass c = new MyModelClass();
c.save(context);
上面的代码运行良好当一切都在应用程序项目中。
我是否错过了一般的东西? 有什么更多我需要考虑关于lib的proguard设置? May JRebel会导致这种问题吗?
JRebel很容易导致这个问题,但我也会考虑更新到v1.1.1。它不应该有任何重大改变,如果你足够幸运的话,它甚至可以解决这个问题。 – EpicPandaForce
如果禁用JRebel,它会工作吗? –
我也有类似的问题,当我不小心留下Realm的旧编译依赖与新的Realm插件一起。 – EpicPandaForce