Przemek Lach
Przemek Lach

Reputation: 1538

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.

Upvotes: 10

Views: 9590

Answers (3)

angel_30
angel_30

Reputation: 1

For me, the fix was to change

compileOnly files('libs/mylibrary.aar') 

in gradle to

implementation files('libs/mylibrary.aar')

and the error was gone.

Upvotes: 0

RexSplode
RexSplode

Reputation: 1505

Just fyi, you can use a simpler syntax, which is valid too

 compile 'com.myapp.awesomelib:awesomelib:0.0.1'

Don't forget to omit the @aar thing at the end of the library name

Upvotes: -1

Thuy Trinh
Thuy Trinh

Reputation: 2914

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.

Upvotes: 8

Related Questions