Android Studio最近默认开始使用R8代替ProGuard。
尽管代码被混淆,但ProGuard的堆栈跟踪很容易理解,无需使用任何工具。让我们使用以下示例:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference
at net.foo.anroid.Foo.wb.d(SourceFile:453)
at net.foo.anroid.Foo.wb.a(SourceFile:213)
at net.foo.anroid.Foo.wb.n(SourceFile:103)
at net.foo.anroid.Foo.qa.run(Unknown Source:2)
at java.lang.Thread.run(Thread.java:764)
通常,我确切地知道net.foo.anroid.Foo.wb对应于哪个文件,并且行号(例如453、213 ...)是ProGuard源文件中的实际行号。
但是,对于R8,找出哪一行的唯一方法是在mapping.txt中查找它们。
这确实是一个很大的麻烦。如果没有很好的方法从堆栈跟踪中快速找到源代码,仅出于这个原因,我将回到ProGuard。
有没有办法防止R8更改行号?
答案 0 :(得分:2)
R8团队不时讨论此问题,出于多种原因,我们一直在优化行号:
现在,在配置中同时设置了-dontoptimize(表示无内联)和-dontobfuscate时,对于调试版本和发行版本始终将其关闭。
使用回溯(记住使用Proguard 6或更高版本中的回溯)时,您无需剪切堆栈跟踪,因为回溯将使非堆栈跟踪行通过未修改的行。
应用程序中目前没有库可以执行此操作,因为这要求将映射文件包含在应用程序中,这无法实现使apk变小的目的。
答案 1 :(得分:1)
在ProGuard配置中进行设置:
-keepattributes SourceFile,LineNumberTable
然后使用ReTrace jar:
ReTrace可以读取混淆的堆栈跟踪,并将其恢复为没有混淆的外观。恢复基于ProGuard在混淆过程中可以写出的映射文件。映射文件将原始类名和类成员名链接到它们的混淆名。
java -jar retrace.jar [options...] mapping_file [stacktrace_file]
例如:
java -jar retrace.jar mapping.txt stacktrace.log