升级到 agp 7+ 后有什么解决方案可以解决 NoClassDefFoundError 吗?

Any solutions to solve NoClassDefFoundError after upgrade to agp 7+?

提问人:lx94569456 提问时间:4/20/2023 最后编辑:lx94569456 更新时间:4/24/2023 访问量:105

问:

当我将 agp 版本从 4.1.0 升级到 7.4.2(gradle 版本 7.5.1)时,出现 NoClassDefFoundError 异常并且应用程序崩溃。

由于我将 agp 从 4.1.0 升级到 7.0,因此 dx 默认已弃用,并且块 dexOptions 不起作用,我的配置之前:

dexOptions {
    javaMaxHeapSize "4000M"
    jumboMode true
    threadCount 6
    preDexLibraries false
    additionalParameters += "--set-max-idx-number=65000"
    additionalParameters += "--minimal-main-dex"
}

AGP 表示,默认情况下,AGP 会优化 DEX 操作。所以我删除了块,然后构建收到同样的错误。google...,我发现一个解决方案是指定适合agp的正确r8版本,我仍然随机收到相同的错误。我将 agp 升级到 7.4.2 并将 gradle 升级到 7.5.1 并删除了 r8 版本定义,仍然出现相同的错误。 建筑。。。错误是随机发生的。 DEX Proguard 似乎什么也没做。api 21 默认使用 Agp native-dex,并且未提供 proguard。

我认为错误的原因是 d8 dex 内存,因为当我在 CI 上构建时,错误发生的频率降低了。有没有办法配置dex或任何其他方法可以解决它?或者有什么方法可以使用 DX?

顺便说一句,我将 kotlin 版本作为 android 开发者网站升级到 1.8.10。

错误如下:

Process: com.***.***, PID: 20480
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/***/***/Logger;
at ......
at ......
......
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

有时它变成:

Process: com.***.***, PID: 20480
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/core/app/CoreComponentFactory;

例如:

java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;
java.lang.NoClassDefFoundError: Failed resolution of: LandroidX/collection/ArrayMap;
java.lang.NoClassDefFoundError: Failed resolution of: com/{$privatePackage}/AppUpgradeService;
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/startup/AppInitializer;

以上所有内容都遵循以下内容:

Caused by: java.lang.ClassNotFoundException: Didn't find class "***" on path: DexPathList[[zip file "system/framework/org.apache.http.legacy.boot.jar", zip file ...... /base.apk"], nativeLibraryDirectories=[//***==/lib/x86_64]...]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... business code
安卓 android-gradle-plugin android-build dex android-d8

评论

0赞 Robert 4/23/2023
请将完整的错误文本复制到剪贴板,并将其包含在您的问题中。您可以随时编辑您的问题以改进它。 总是提到一个类名,这个类名对于理解问题很重要。堆栈跟踪通常也是一个有价值的信息。NoClassDefFoundError
0赞 Robert 4/28/2023
您是否使用 Proguard 进行 APK 缩小?可能提到的类已被 Proguard 删除,所以我的建议是检查 proguard 配置。
0赞 lx94569456 4/29/2023
关闭 minifyEnabled 的调试模式时发生错误,我还没有尝试过的发布模式作为调试模式错误,proguard 被 agp7 禁用,agp 会通知删除 android.enableR8=true,所以 minify 的工具现在是 R8。

答: 暂无答案