2015-01-16 10 views
1

숫자를 사용하는 텍스트 필드가있는 양식을 가진 앱을 작성하고 있습니다. 입력이 유효한지 확인하기 위해 Hamcrest Matchers를 사용하기로 결정했습니다. 처럼 물건을 사용할 수 있습니다안드로이드 프로덕션 코드에서 Hamcrest Matchers를 사용하는 런타임 오류가 발생했습니다

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

있도록 : 나는 정의 지금이 디버그 모드에서 완벽하게 잘 작동

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

을, 그러나 나는 다음과 같은 메시지가 응용 프로그램이 충돌 즉시 생산 릴리스에 대한 난독을 사용할 때 (리 트레이스로 획득) :

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) 

어떻게 해결할 수 있습니까? 이 컴파일 얻을

  • 내 난독 규칙에 -dontwarn java.beans.** 추가 : https://github.com/burgerga/HamcrestMatchersWithProguard


    주 :

    나는이 문제를 보여주는 최소한의 예를했다.
  • 나는 단지 if(doubleFromText > 0)을 사용해야한다고 말하기 전에 내가 준 예제를 단순화했습니다. 내 코드에서 나는 parsesToDouble가 내가 쓴 간단한 정규이다

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

    같은 것을 사용합니다. 나는 이것이 내 의도를 진술하기위한 매우 유연하고 분명한 방법이라고 생각한다. 나는 프로 가드와 함께 일하는 방법에 관심이있다.

답변

1

Hamcrest는 리플렉션을 사용하기 때문에 삭제해서는 안되는 축소 단계에서 일부 메소드가 삭제됩니다. 나는 프로 가드 규칙에

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

을 추가하여 다시 작동시킬 수있었습니다. 약간 큰 apk에 관심이 없다면 hamcrest에서 삭제 된 항목이 없는지 확인하기 위해

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

을 추가 할 수 있습니다.