Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using .aar NoClassDefFoundError But Class Exists and is Dexed

I have several projects which I build to create an .aar. I then import this .aar into into Android Studio under /libs. The build.gradle file for this dependency looks as follows:

repositories{
    flatDir{
        dirs 'libs'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.0.0'
    compile 'com.google.android.gms:play-services:7.0.0'
    compile 'com.android.support:multidex:+'
    compile(name: 'customApi-debug', ext:'aar')
}

Since the library is quite large I have set multiDexEnabled = true. Android Studio finds the library and autocomplete works. Building works fine too but running the app gives the following error:

java.lang.NoClassDefFoundError: com.companyx.android.api.ui.vision.metaio.MetaIoView
            at com.companyx.android.api.ui.vision.metaio.MetaIoView$$InjectAdapter.<init>(MetaIoView$$InjectAdapter.java:29)

I uncompressed and disassembled the .aar and dex files, respectively, and verified that the classes its complaining about actually exist. I've tried existing approaches for dealing with this problem but none of them worked.

Anyone else experienced this? Thanks in advance.

like image 485
Przemek Lach Avatar asked Apr 24 '15 20:04

Przemek Lach


1 Answers

I run into the same issue. The fix is firstly to deploy the AAR file to a local maven (I utilized the plugin at https://github.com/dcendents/android-maven-gradle-plugin). Then I referenced to the local maven as described at https://stackoverflow.com/a/23045791/2563009. And eventually I declared the dependencies with a transitive option, like this:

dependencies {
  compile('com.myapp.awesomelib:awesomelib:0.0.1@aar') {
    transitive = true
  }
}

The error would be gone then.

like image 118
Thuy Trinh Avatar answered Nov 15 '22 17:11

Thuy Trinh