2016-07-16 5 views
1

Мой мозг жарится. Я искал S.O. для справки, но кажется, что проблемы Proguard с этим исключением специфичны для рассматриваемого приложения. Я пытался использовать Proguard для obfucate/Минимизировать мое приложение и когда я запускаю его в сгенерированного APK образуют мое приложение либо аварии или поражает меня:Proguard for Wire + Retrofit NoSuchMethodException

com.company.project E/a: java.lang.NoSuchMethodException: fromValue [int] 

StackTrace:

java.lang.AssertionError: java.lang.NoSuchMethodException: fromValue [int] 
    at com.squareup.wire.RuntimeEnumAdapter.decode(Unknown Source) 
    at com.squareup.wire.RuntimeEnumAdapter.getFromValueMethod(Unknown Source) 
    at com.squareup.wire.RuntimeEnumAdapter.decode(Unknown Source) 
    at com.company.project.utils.wiremodels.d.a(Unknown Source) 
    at com.company.project.utils.wiremodels.d.decode(Unknown Source) 
    at com.company.project.utils.wiremodels.g.a(Unknown Source) 
    at com.company.project.utils.wiremodels.g.decode(Unknown Source) 
    at com.squareup.wire.ProtoAdapter.decode(Unknown Source) 
    at retrofit2.converter.wire.WireResponseBodyConverter.convert(Unknown Source) 
    at retrofit2.converter.wire.WireResponseBodyConverter.convert(Unknown Source) 
    at retrofit2.ServiceMethod.toResponse(Unknown Source) 
    at retrofit2.OkHttpCall.parseResponse(Unknown Source) 
    at retrofit2.OkHttpCall$1.onResponse(Unknown Source) 
    at a.az.b(Unknown Source) 
    at a.a.l.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.NoSuchMethodException: fromValue [int] 
    at java.lang.Class.getMethod(Class.java:624) 
    at java.lang.Class.getMethod(Class.java:603) 
    ... 18 more 

Мои приложение использует Retrofit (2.1.0) и Wire, как с Square. Затем, когда мое приложение падает я проверяю файл mapping.txt, чтобы увидеть, какой класс является причиной проблемы (я считаю, что это com.company.project.a, верно?)

Во всяком случае, вот мой файл ProGuard (с именами неясного класса FYI):

-dontwarn okio.** 
-dontwarn retrofit2.Platform$Java8 
-dontwarn retrofit2.** 
-keep class retrofit2.** { *; } 
-keep class com.squareup.wire.** { *; } 
-keep class com.company.project.utils.wiremodels.ProtoFile1 { *; } 
-keep class com.company.project.utils.wiremodels.ProtoFile2 { *; } 
-keep class com.company.project.utils.wiremodels.ProtoFile3 { *; } 
-keep class com.company.project.utils.wiremodels.ProtoFile4 { *; } 
-keep class com.company.project.utils.wiremodels.ProtoFile5 { *; } 
-dontwarn com.google.** 
-keepattributes Signature 
-keepattributes *Annotation* 
-keepattributes Exceptions 
-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry 
-dontwarn org.simpleframework.xml.stream.** 

Было бы замечательно, если я смогу помочь с этим, пожалуйста, дайте мне знать, если есть дополнительная информация, которую я должен предоставить.

EDIT: Вопрос ответ в комментариях заметного ответа (для будущих ссылок)

ответ

1

Вы можете сохранить методы в некоторых классах с:

-keepclassmembers,allowobfuscation class com.company.project.yourClass.** { 
    <methods>; 
} 

Как вы используете wire, форма рекомендуется these indications ProGuard является :

-keep class com.squareup.wire.** { *; } 
-keep class com.yourcompany.yourgeneratedcode.** { *; } 

Если проблема исходит из retrofithere is a proguard example:

-keep class com.squareup.okhttp.** { *; } 
-keep class retrofit.** { *; } 
-keep interface com.squareup.okhttp.** { *; } 

-dontwarn com.squareup.okhttp.** 
-dontwarn okio.** 
-dontwarn retrofit.** 
-dontwarn rx.** 

-keepclasseswithmembers class * { 
    @retrofit.http.* <methods>; 
} 

# If in your rest service interface you use methods with Callback argument. 
-keepattributes Exceptions 

# If your rest service methods throw custom exceptions, because you've defined an ErrorHandler. 
-keepattributes Signature 
+0

В любом случае я мог бы использовать это, чтобы предотвратить «NoSuchMethodException»? Журналы не достаточно специфичны, чтобы знать, какой метод ищет – mastrgamr

+0

, добавьте его в свой файл proguard с именем класса, содержащим раздражающий метод, чтобы узнать, помогает ли он –

+0

sigh, no luck ... Следующая ошибка Я получил: 'java .lang.IllegalArgumentException: невозможно создать конвертер для класса com.company.project.dah' (подумайте, что он ссылается на конвертер Retrofit для ответа Wire) – mastrgamr