Proguard:发布版本中的 AssertionError

Proguard: AssertionError on release build

我正在尝试将 Proguard 应用于我的发布应用程序,但到目前为止,我一直遇到错误。构建的调试工作完美:

04-06 20:25:17.689 544-544/com.myapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                         Process: com.myapp, PID: 544
                                                         java.lang.AssertionError
                                                             at com.google.b.b.a.r.<init>(Unknown Source)
                                                             at com.google.b.b.a.q.a(Unknown Source)
                                                             at com.google.b.f.a(Unknown Source)
                                                             at com.google.b.b.a.k.a(Unknown Source)
                                                             at com.google.b.b.a.k.a(Unknown Source)
                                                             at com.google.b.b.a.k.<init>(Unknown Source)
                                                             at com.google.b.b.a.k.a(Unknown Source)
                                                             at com.google.b.b.a.k.a(Unknown Source)
                                                             at com.google.b.b.a.k.a(Unknown Source)
                                                             at com.google.b.f.a(Unknown Source)
                                                             at com.google.b.b.a.b.a(Unknown Source)
                                                             at com.google.b.f.a(Unknown Source)
                                                             at com.google.b.b.a.k.a(Unknown Source)
                                                             at com.google.b.b.a.k.a(Unknown Source)
                                                             at com.google.b.b.a.k.<init>(Unknown Source)
                                                             at com.google.b.b.a.k.a(Unknown Source)
                                                             at com.google.b.b.a.k.a(Unknown Source)
                                                             at com.google.b.b.a.k.a(Unknown Source)
                                                             at com.google.b.f.a(Unknown Source)
                                                             at com.google.b.f.a(Unknown Source)
                                                             at com.google.b.f.a(Unknown Source)
                                                             at com.google.b.f.a(Unknown Source)
                                                             at com.google.b.f.a(Unknown Source)
                                                             at com.a.a.a.a(Unknown Source)
                                                             at com.myapp.activities.bj.onResume(Unknown Source)
                                                             at android.support.v4.app.Fragment.performResume(Unknown Source)
                                                             at android.support.v4.app.ae.a(Unknown Source)
                                                             at android.support.v4.app.ae.a(Unknown Source)
                                                             at android.support.v4.app.ae.f(Unknown Source)
                                                             at android.support.v4.app.ae.g(Unknown Source)
                                                             at android.support.v4.app.ae.b(Unknown Source)
                                                             at android.support.v4.app.ah.finishUpdate(Unknown Source)
                                                             at android.support.v4.view.ViewPager.populate(Unknown Source)
                                                             at android.support.v4.view.ViewPager.populate(Unknown Source)
                                                             at android.support.v4.view.ViewPager.onMeasure(Unknown Source)
                                                             at android.view.View.measure(View.java:17547)
                                                             at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                             at android.support.design.widget.CoordinatorLayout.onMeasureChild(Unknown Source)
                                                             at android.support.design.widget.CoordinatorLayout.onMeasure(Unknown Source)
                                                             at android.view.View.measure(View.java:17547)
                                                             at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                             at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
                                                             at android.view.View.measure(View.java:17547)
                                                             at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                             at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
                                                             at android.view.View.measure(View.java:17547)
                                                             at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                             at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
                                                             at android.support.v7.widget.ContentFrameLayout.onMeasure(Unknown Source)
                                                             at android.view.View.measure(View.java:17547)
                                                             at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                             at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
                                                             at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
                                                             at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
                                                             at android.view.View.measure(View.java:17547)
                                                             at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                             at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
                                                             at android.view.View.measure(View.java:17547)
                                                             at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                             at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
                                                             at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
                                                             at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
                                                             at android.view.View.measure(View.java:17547)
                                                             at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
                                                             at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
                                                             at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615)
                                                             at android.view.View.measure(View.java:17547)
                                                             at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015)
                                                             at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173)
                                                             at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379)
                                                             at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
                                                            at android.view.ViewRootImpl$TraversalRunnable.run(

我已经将以下规则添加到我的 proguard-rules.pro 文件中:

#for support library
# support design
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }

#Support v7
# Hide warnings about references to newer platforms in the library
-dontwarn android.support.v7.**
# don't process support library
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }

#Support v4
# Hide warnings about references to newer platforms in the library
-dontwarn android.support.v4.**
# don't process support library
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.** { *; }

我不知道该怎么做 - 错误描述并没有真正说明问题,所以我不知道 assertionError 从何而来。

有人知道如何解决这个问题吗?

在 proguard.txt 文件中添加这些行应该会有所帮助。

-dontwarn com.google.** { *; }
-keep class com.google.** { *; }
-keep interface com.google.** { *; }

所以我对 Proguard 很陌生,但在调查后找到了答案。我读过这个网站,您可以在堆栈跟踪被混淆时对堆栈跟踪进行去混淆 - 这就是为什么您看到 a.a.a 或 b.b.b 等:https://developer.android.com/tools/help/proguard.html

对于 mac,您需要导航到此文件夹:

sdk/tools/proguard/bin/

您将在其中看到 retrace.sh 脚本。您现在需要在此处的文件夹中找到 mapping.txt 文件:

app/build/outputs/mapping/release/

复制到sh所在的bin文件夹下。然后,您需要复制要反混淆的堆栈跟踪部分并将其粘贴到文本文件中,然后放入 bin 文件夹中。

在您的终端中使用以下命令去混淆:

sh retrace.sh -verbose mapping.txt obfuscated_trace.txt > deobfuscated_trace.txt

打开deobfuscated_trace.txt,你会发现错误居然指向GSON。我通过导入 GSON 的 proguard 规则来修复它。

要检查混淆器是否正确运行,您将看到日志现在如下所示:

04-06 21:20:15.453 6853-6853/com.myapp E/y: last vis 3
04-06 21:20:15.463 6853-6853/com.myapp E/y: last vis 3
04-06 21:20:15.480 6853-6853/com.myapp E/y: last vis 3

你可以看到 class 的名字现在已经被混淆了,以前应该是:

   04-06 21:20:15.453 6853-6853/com.myapp E/MyFragment: last vis 3