Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NoSuchMethodError when using realm.io in a library

I transferred the model classes of my Android app inlcuding realm.io functions into a library following the advices described in the realm.io Java docs section Sharing schemas. I'm facing a NoSuchMethodError when my app (indirectly) calls realm.io methods which are in the the library.

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)

Here is how my library looks like:

build.gradle (project)

buildscript {
  repositories {
      jcenter()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:2.1.2'
    classpath 'io.realm:realm-gradle-plugin:1.0.1'        
  }
}

build.gradle (library module)

apply plugin: 'com.android.library'
apply plugin: 'realm-android'
...
buildTypes {
    release {
        minifyEnabled false
        signingConfig signingConfigs.release
        proguardFile getDefaultProguardFile('proguard-rules.pro')
    }
}
...

proguard-rules.pro

I used this snippet as a template

-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();
  }
}

In my actual app I call something like this which is causing the Exception:

MyActivity.java

// ...
MyModelClass c = new MyModelClass();
c.save(context);

The code above was working well when everything was in the app project.

Am I missing something general? Is there something more I need to consider regarding the proguard settings of the lib? May JRebel cause this kind of problem?

like image 461
stackoverflo Avatar asked Jun 03 '26 06:06

stackoverflo


2 Answers

I think you might not be using it correctly, I will suggest that you see a full working example like the one they reference are the end of that Sharing Schemas link. The link is to this repository full working example of realm lib and app. I would suggest that you take a look at the Zoo class from the library, the methods are the only thing exposed to the application as you can see in the app's activity here (line 148 and downwards).

I think this was just a confusion on your part, because from what I understood you are calling your library class and using it like it was a Realm instance for that activity context which is not the case. Hope this can steer you in the right path!

Basically you simply create an instance based on you configuration so you don't need to pass a context there.

like image 193
Gustavo Gomes Avatar answered Jun 05 '26 20:06

Gustavo Gomes


This happens with JRebel, I would suggest you try with the latest version of it if the issue still persists try not using it.

like image 21
krishan Avatar answered Jun 05 '26 21:06

krishan