多索引 apk 中的 NoClassDefFounderror

NoClassDefFound in a multidex'ed apk

我有一个非常奇怪的问题,我怀疑与多索引有关(但不确定)。

我有一个应用程序模块和一个库模块。库在应用程序启动时执行一些代码,通过主应用程序 class 上的接口,获取库中定义的 class 名称。

现在奇怪的部分开始了。 该应用程序根据以下说明进行多索引处理 - Configure Apps with Over 64K Methods - 我有 2 种构建类型 - 调试和发布。在发布版本中,我使用混淆器来混淆和缩小代码。在调试版本中我没有。

当 运行 应用程序在 android +21 的设备上时,在两种构建类型中一切正常。

当 运行 应用程序在具有棒棒糖之前版本的设备上时,在发布构建类型中一切正常,但在调试构建类型中我得到 NoClassDefFoundError 因为 class 应用程序正在尝试到 return 到图书馆。

按照 Declare classes required in the primary DEX file 中的建议,我在 android studio 中使用了 APK 分析器来检查 classes 在 dex 文件之间的分布,并看到了两件事:

  1. 在release build type中只有一个dex文件。
  2. 在调试构建类型中有 2 个 dex 文件,但有问题的 class(及其父文件)在主 dex 文件中定义。

此外,当我用实际的 class 名称替换从库到应用程序(图中的 getClassName())的调用时,在所有构建类型中一切正常!

作为最后一次了解这里发生了什么的尝试,我比较了 2 个 apk,原始的和没有调用应用程序的(替换为实际的 class 名称),以及唯一的我能看到的区别是进行调用的库代码。在 dex 文件之间的 classes 分布方面绝对没有区别!

有人知道这里的问题是什么吗?谢谢

最终 com/newrelic/agent/android/api/v2/TraceFieldInterface。class 我必须确保它在主 dex 文件中。

如果有人在使用 newrelic 你可能要注意这一点。