是否有一种方法可以防止Android App Code收缩R8更改行号



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

最新更新