1

对于某些类,我在使用 -encryptclasses 运行 DexGuard 时遇到问题。该问题仅在运行 Robolectric 单元测试时发生。我从任何被 DexGuard 混淆和加密的类中得到一个 NullPointerException。如果我关闭 encryptclasses 标志,它可以在 Robolectric 中使用。

该配置也适用于设备和模拟器:在 Android 环境中运行应用程序(在 Dalvik 和 ART 设备和模拟器中测试)运行良好。Android Instrumentation 测试也有效。只有在通过 Robolectric 运行时,我才会收到 NullPointerException。如果我禁用 DexGuard encryptclasses,一切都可以在 Robolectric 中使用。

DexGuard 正在我所依赖的库中使用。这个库被添加到我的 gradle 模块的 libs 文件夹中。

我会将其发布为 Robolectric 问题,但如果没有 DexGuard 工具的许可,它们可能无法复制。

设置是:

  • 安卓工作室 1.3.2
  • 安卓 Gradle 插件 1.3.1
  • Android 构建工具版本 23.0.0
  • Android compileSdkVersion 22
  • 甲骨文 JDK 8
  • Ubuntu 15.04 64 位
  • DexGuard 版本:5.5.00
4

1 回答 1

1

Robolectric 非常密集地使用反射,任何类型的混淆都很容易破坏这个功能。

我会为测试目的创建构建配置,我会关闭 dexguarding。与默认调试相同,默认情况下不会混淆您的代码。

您的单元测试的问题是测试一小部分功能,而不是测试构建过程与混淆和您的代码功能的组合。

我还会写信给 DexGuard 人员,检查 dexguard 是否在正确的位置进行混淆处理。我的理解是在 VM 上运行 Robolectric 测试不应该被混淆

于 2015-08-28T05:22:08.387 回答