【问题标题】:DexGuard - Encryptclasses NullPointerException with RobolectricDexGuard - 使用 Robolectric 加密类 NullPointerException
【发布时间】:2015-08-27 18:54:52
【问题描述】:

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

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

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

我会将此作为 Robolectric 问题发布,但如果没有 DexGuard 工具的许可,他们可能无法重现。

设置是:

  • Android Studio 1.3.2
  • Android Gradle 插件 1.3.1
  • Android 构建工具版本 23.0.0
  • Android compileSdkVersion 22
  • Oracle JDK 8
  • Ubuntu 15.04 64 位
  • DexGuard 版本:5.5.00

【问题讨论】:

    标签: java android nullpointerexception robolectric dexguard


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我同意你的观点,这实际上是我在大多数情况下所做的。这里的问题是我所依赖的库是 dexguarded。我没有源代码,也无法控制它的构建方式。所以我不能在这里走这条路。
    • 你用什么类的表单库?你能把它包装在你的课堂上并模拟它吗?
    • 我需要 PowerMock 或其他来模拟静态最终方法。我已经通过 DI 规避了它的使用,但我真的希望能够将整个集成作为 Robolectric 测试进行测试。我仍然很好奇为什么它在 Dalvik/ART 中工作而不是在 JVM 中工作。
    猜你喜欢
    • 2012-10-26
    • 2014-02-07
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多