使用.aar NoClassDefFoundError但是Class Exists并且是Dexed

时间:2015-04-24 20:45:22

标签: android android-studio android-gradle dex aar

我有几个项目是为了创建一个.aar而构建的。然后我将这个.aar导入到/ libs下的Android Studio中。此依赖项的build.gradle文件如下所示:

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')
}

由于库非常大,我设置了multiDexEnabled = true。 Android Studio查找库和自动填充功能。构建工作正常,但运行应用程序会出现以下错误:

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)

我分别对.aar和dex文件进行了解压缩和反汇编,并验证了它抱怨的类实际存在。我已经尝试过处理这个问题的现有方法,但没有一个能够解决问题。

其他人有过这种经历吗?提前致谢。

2 个答案:

答案 0 :(得分:7)

我遇到了同样的问题。修复首先是将AAR文件部署到本地maven(我使用了https://github.com/dcendents/android-maven-gradle-plugin处的插件)。然后我引用了https://stackoverflow.com/a/23045791/2563009所描述的本地maven。最后我用一个传递选项声明了依赖关系,如下所示:

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

错误将会消失。

答案 1 :(得分:0)

只需fyi,您可以使用更简单的语法,这也是有效的

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

不要忘记在库名称的末尾省略@aar的东西