使用 .aar NoClassDefFoundError 但类存在并且已 Dexed

问题描述 投票:0回答:3

我构建了几个项目来创建 .aar。然后我将此 .aar 导入到 Android Studio 的 /libs 下。此依赖项的 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 文件,并验证了它所抱怨的类确实存在。我已经尝试过现有的方法来处理这个问题,但没有一个有效。

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

android android-studio android-gradle-plugin dex aar
3个回答
8
投票

我遇到了同样的问题。解决方法是首先将 AAR 文件部署到本地 maven(我使用了https://github.com/dcendents/android-maven-gradle-plugin 上的插件)。然后我参考了本地 Maven,如 https://stackoverflow.com/a/23045791/2563009 中所述。最终我使用传递选项声明了依赖关系,如下所示:

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

错误就会消失。


0
投票

对我来说,解决办法就是改变

compileOnly files('libs/mylibrary.aar') 

在 gradle 中

implementation files('libs/mylibrary.aar')

错误消失了。


-1
投票

仅供参考,您可以使用更简单的语法,这也是有效的

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

不要忘记省略库名称末尾的@aar内容

© www.soinside.com 2019 - 2024. All rights reserved.