Ger*_*ger 5 java validation android proguard hamcrest
我正在编写一个应用程序,它有一个带有数字的文本字段的表单。为了检查输入是否有效,我决定使用 Hamcrest Matchers。我定义:
public static <T> boolean checkThat(T actual, Matcher<? super T> matcher) {
return matcher.matches(actual);
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以使用以下内容:
if(checkThat(doubleFromText,greaterThan(0.0)) doSomething();
Run Code Online (Sandbox Code Playgroud)
现在这在调试模式下工作得很好,但是当我为生产版本启用 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)
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
我做了一个最小的例子来演示这个问题:https : //github.com/burgerga/HamcrestMatchersWithProguard
笔记:
-dontwarn java.beans.**到我的 proguard 规则中以使其编译。在你开始告诉我我应该使用之前if(doubleFromText > 0),我给出的例子已经简化了。在我的代码中,我使用类似的东西
checkThat(textIn(myEditText),parsesToDouble(greaterThan(0.0)));
Run Code Online (Sandbox Code Playgroud)
parsesToDouble我写的一个简单的匹配器在哪里。我认为这是一种非常灵活和清晰的方式来表达我的意图,我只是对如何让它与 proguard 一起工作感兴趣。
因为 Hamcrest 使用反射,一些不应该被删除的方法在收缩阶段被删除。我能够通过添加让它再次工作
-keepclasseswithmembers class org.hamcrest.number.** { *** matchesSafely(...); }
Run Code Online (Sandbox Code Playgroud)
到 proguard 规则。如果您不关心稍大的 apk,您可以添加
-keep class org.hamcrest.** { *; }
Run Code Online (Sandbox Code Playgroud)
确保 hamcrest 中的任何内容都不会被删除。
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |