android - Proguard for Wire + 改造 NoSuchMethodException

标签 android proguard retrofit2 android-proguard square-wire

我的脑袋炸了。我搜索了 S.O.寻求帮助,但此异常的 Proguard 问题似乎特定于相关应用程序。我一直在尝试使用 Proguard 混淆/缩小我的应用程序,当我在生成的 APK 表单中运行它时,我的应用程序要么崩溃,要么出现以下问题:

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

堆栈跟踪:

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

我的应用程序使用来自 Square 的 Retrofit (2.1.0) 和 Wire。然后,当我的应用程序崩溃时,我正在检查 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.**

如果我能在这方面得到一些帮助,那就太好了,如果我应该提供更多信息,请告诉我。

编辑:在标记答案的评论中回答了问题(以供将来引用)

最佳答案

你可以在某些类中保留方法:

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

当您使用 wire 时,表格 these indications proguard 推荐的是:

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

如果问题来自retrofit here 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

关于android - Proguard for Wire + 改造 NoSuchMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38407384/

相关文章:

java - 如何在 Retrofit Response<List<Object>> 中访问对象的方法

java - 当 xml 的 src 不为 null 时,如何在 android 中将 setImage 设置为 null?

android - Android 应用内消费品购买支持退款吗? - 应用内计费 API V3

android - 如何从时间戳获取日期和时间到不同的 TextView

android - 如何为 Jackson JSON 处理器设置 PROGUARD?

java - 使用 Maven/Proguard 分别混淆两个 JAR

java - Android:将敏感字符串放入我的 Java 代码中是否安全?

java - 从 Eclipse 的模拟器控制返回不准确的值

android - Retrofit 2 使用动态键序列化 JSON 结果

android - 如何通过改造发送 List<String> ?