Android Studio默认情况下开始使用R8而不是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,弄清楚哪个行是在映射txt中查找哪一行的唯一方法。
这确实是一个重要的滋扰。如果没有很好的方法可以从堆栈跟踪快速找到源代码,我将仅出于这个原因就回到Proguard。
有没有办法防止R8更改线号?
这是不时在R8团队上讨论的,我们总是出于多种原因而始终优化行号:
- 它保存在DEX尺寸的5%的区域
- 对于释放构建,无论如何需要打开诸如INLINGING之类的优化,以扩展嵌入式帧
- 这是测试矩阵中的一个较少选择
现在,它始终被关闭以进行调试构建,并且在配置中设置了两者dontoptimize(no ins -dontoptimize(和-dontobfuscate时的释放构建。
当您使用反式(请记住使用Proguard版本6或更高版本(时,您不需要切出堆栈TACKTRACE,因为ReTRace将通过未修改的非堆栈跟踪线路。
当前没有库在应用程序中执行此操作,因此要求将映射文件包含在应用程序中,该应用程序破坏了使APKS小的目的。
在proguard配置中设置这些:
-keepattributes SourceFile,LineNumberTable
然后使用retrace jar:
回溯可以读取混淆的堆栈跟踪,并将其恢复为没有混淆的情况。恢复基于Proguard在混淆期间可以写出的映射文件。映射文件将原始类名称和类成员名称链接到其混淆的名称。
java -jar retrace.jar [options...] mapping_file [stacktrace_file]
例如:
java -jar retrace.jar mapping.txt stacktrace.log