自从我在Google Play商店中发布了我的应用程序的新版本后,我在Android开发者控制台中收到了崩溃报告。
我在发布新版本后立即上传了ProGuard mappings.txt
。因此,所有日志都未混淆(所有类名称和方法都以明文形式出现)。但是我仍然不太热衷于阅读它们。
有三个主要问题:
OR
的不同方法。这是什么意思?示例:
// Crash Log with is NOT obfuscated
Caused by: java.lang.NullPointerException:
1: at com.example.MyApp.Path.To.Package.MyClass.myMethod1 (MyClass.java) // <-- No Line Numbers...
or .myMethod2 (MyClass.java) // <-- WHAT does this OR mean???
or .myMethod3 (MyClass.java)
2: at com.example.MyApp.Path.To.Package.MyClass.onCreateView (MyClass.java)
3: at android.support.v4.app.Fragment.performCreateView (Fragment.java)
4: at android.support.v4.app.FragmentManagerImpl.access$500 (FragmentManagerImpl.java)
or .access$600 (FragmentManagerImpl.java)
or .addFragment (FragmentManagerImpl.java)
or .allocBackStackIndex (FragmentManagerImpl.java)
or .animateRemoveFragment (FragmentManagerImpl.java)
...
5: at android.support.v4.app.FragmentManagerImpl.access$500 (FragmentManagerImpl.java)
...
// Other crash seems to show the same problem but is still obfuscated
Caused by: java.lang.NullPointerException:
1: at com.example.MyApp.Path.To.Package.MyClass.a (MyClass.java:89) // <-- Line numbers available here...
2: at com.example.MyApp.Path.To.Package.MyClass.b (MyClass.java:40)
3: at android.support.v4.app.Fragment.performCreateView (Fragment.java)
... // Same call stack as above
问题:
OR
语句的含义是什么?这是否意味着,每种方法都会发生异常(应该如何实现)?所以主要问题是:
如何使用日志中的信息查找崩溃的来源?
答案 0 :(得分:1)
您需要在Proguard配置中添加以下选项:
# This option forces Proguard to use different obfuscated names
# for different members. It avoids the 'or' stack traces.
-useuniqueclassmembernames
# These options produce useful stacktraces preserving line numbers
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
如果没有-useuniqueclassmembernames
,Proguard可以为同一个类中的不同方法分配相同的混淆名称(您可以在mapping.txt文件中看到它)。这就是堆栈跟踪知道方法B中方法A 或中发生错误的原因,但并不确切知道哪一个错误。
使用-useuniqueclassmembernames
选项,所有混淆的名称都会有所不同,并且不再有或堆栈跟踪。有关此here的更多信息。
除此之外,Proguard不会保留有关行号的信息,除非我们使用所示的-renamesourcefileattribute
和-keepattributes
选项。有关此here的更多信息。
这些选项会增加你的apk尺寸,但它是完全值得的。这让我很难分析我的堆栈痕迹。
答案 1 :(得分:0)
最好使用Fabrics。它会给出崩溃报告以及行号。