Search code examples
androidsqliteandroid-sqliteandroid-libraryandroid-multidex

Cannot load class from .aar file when i added Room persistence library into my library


I am currently developing an alarm library, that needs to store multiple alarm details in sqlite database. So I used google's Room persistence library, with my alarm library.

I have added below code to build.gradle.

implementation 'android.arch.persistence.room:runtime:1.1.1'
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'

I have added database class

@Database(entities = AlarmDetails.class, version = 1)
public abstract class AlarmDatabase extends RoomDatabase {

  public abstract AlarmDao alarmDao();
}

I have also added Data Access Object

@Dao
public interface AlarmDao {

  @Insert(onConflict = OnConflictStrategy.REPLACE)
  void insert(AlarmDetails alarmDetails);

  @Update
  void update(AlarmDetails alarmDetails);

  @Delete
  void delete(AlarmDetails alarmDetails);

  @Query("SELECT * FROM alarms")
  List<AlarmDetails> getAll();
}

I am creating a database instance in the main class of my library as below

/*Constructor*/
public AlarmBase(Context mcontext,Context ncontext) {
    this.mContext = mcontext;

    alarmDatabase= Room.databaseBuilder(ncontext,
            AlarmDatabase.class, "alarm_db")
            .build();
}

i am calling the above constructor from my demo project and passing application context as below

Context applicationContext=MyApplicationClass.getContext();
    alarmBase = new AlarmBase(this,applicationContext);

And this is my application class

public class MyApplicationClass extends MultiDexApplication {
  private static MultiDexApplication instance;

  @Override
  public void onCreate() {
    super.onCreate();
    instance = this;
  }

  public static Context getContext() {
    return instance.getApplicationContext();
  }
}

But when I run the project I get the below error

    --------- beginning of crash
02-21 20:23:34.643 11930-11930/com.mid.alarmdemo E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mid.alarmdemo, PID: 11930
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/mid/alarmlib/roomsqlite/AlarmDatabase;
    at com.mid.alarmlib.AlarmBase.<init>(AlarmBase.java:39)
    at com.mid.alarmdemo.MainActivity.onCreate(MainActivity.java:54)
    at android.app.Activity.performCreate(Activity.java:6362)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2441)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2548)
    at android.app.ActivityThread.access$1100(ActivityThread.java:154)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:157)
    at android.app.ActivityThread.main(ActivityThread.java:5613)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.mid.alarmlib.roomsqlite.AlarmDatabase" on path: DexPathList[[zip file "/data/app/com.mid.alarmdemo-1/base.apk"],nativeLibraryDirectories=[/data/app/com.mid.alarmdemo-1/lib/arm64, /vendor/lib64, /system/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    at com.mid.alarmlib.AlarmBase.<init>(AlarmBase.java:39) 
    at com.mid.alarmdemo.MainActivity.onCreate(MainActivity.java:54) 
    at android.app.Activity.performCreate(Activity.java:6362) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2441) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2548) 
    at android.app.ActivityThread.access$1100(ActivityThread.java:154) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:157) 
    at android.app.ActivityThread.main(ActivityThread.java:5613) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:774) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652) 
    Suppressed: java.lang.NoClassDefFoundError: com.mid.alarmlib.roomsqlite.AlarmDatabase
    at dalvik.system.DexFile.defineClassNative(Native Method)
    at dalvik.system.DexFile.defineClass(DexFile.java:226)
    at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
    at dalvik.system.DexPathList.findClass(DexPathList.java:338)
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
            ... 16 more
    Suppressed: java.lang.ClassNotFoundException: com.mid.alarmlib.roomsqlite.AlarmDatabase
    at java.lang.Class.classForName(Native Method)
    at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
    at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
            ... 15 more
 Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

I was able to run the project along with my library until I added Room persistence to my library


Solution

  • I just added below lines to the build.gradle(Module app) of the project also,

    implementation 'android.arch.persistence.room:runtime:1.1.1'
    annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
    

    and it worked fine