有没有一种方法可以防止Android应用代码收缩器R8更改行号?

时间:2019-05-07 21:28:33

标签: android android-r8

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更改行号?

2 个答案:

答案 0 :(得分:2)

R8团队不时讨论此问题,出于多种原因,我们一直在优化行号:

  • 它节省了dex大小的5%
  • 对于要启用内联之类的优化的发行版,无论如何都需要扩展内联框架
  • 这是测试矩阵中少一个的选择

现在,在配置中同时设置了-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