gpt4 book ai didi

java - 在带有 proguard 的 Android 生产代码中使用 Hamcrest Matchers 时出现运行时错误

转载 作者:搜寻专家 更新时间:2023-11-01 02:43:34 25 4
gpt4 key购买 nike

我正在编写一个应用程序,该应用程序的表单中包含带有数字的文本字段。为了检查输入是否有效,我决定使用 Hamcrest Matchers。我定义:

public static <T> boolean checkThat(T actual, Matcher<? super T> matcher) {
return matcher.matches(actual);
}

这样我就可以使用像这样的东西:

if(checkThat(doubleFromText,greaterThan(0.0)) doSomething();

现在这在 Debug模式下工作得很好,但是当我为生产版本启用 proguard 时,应用程序立即崩溃并显示以下消息(通过回溯获得):

java.lang.Error: Cannot determine correct type for matchesSafely() method.
at org.hamcrest.internal.ReflectiveTypeFinder.findExpectedType(Unknown Source)
canObtainExpectedTypeFrom
at org.hamcrest.TypeSafeMatcher.<init>(Unknown Source)
at org.hamcrest.TypeSafeMatcher.<init>(Unknown Source)
at org.hamcrest.number.OrderingComparison.<init>(Unknown Source)
at org.hamcrest.number.OrderingComparison.greaterThan(Unknown Source)
matchesSafely
at org.hamcrest.Matchers.greaterThan(Unknown Source)

我该如何解决这个问题?

我做了一个最小的例子来说明这个问题:https://github.com/burgerga/HamcrestMatchersWithProguard


注意事项:

  • 我将 -dontwarn java.beans.** 添加到我的混淆器规则中以使其编译。
  • 在您开始告诉我应该只使用 if(doubleFromText > 0) 之前,我给出的示例已经过简化。在我的代码中,我使用类似

    checkThat(textIn(myEditText),parsesToDouble(greaterThan(0.0)));

    parsesToDouble 是我写的一个简单匹配器。我认为这是一种非常灵活和清晰的方式来表达我的 Intent ,我只是对如何让它与混淆器一起工作感兴趣。

最佳答案

因为 Hamcrest 使用了反射,一些不应该被删除的方法在收缩阶段被删除了。我能够通过添加让它再次工作

-keepclasseswithmembers class org.hamcrest.number.** { *** matchesSafely(...); }

proguard 规则。如果您不关心稍大的 apk,您可以添加

-keep class org.hamcrest.** { *; }

确保 hamcrest 中的任何内容都不会被删除。

关于java - 在带有 proguard 的 Android 生产代码中使用 Hamcrest Matchers 时出现运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27981614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com