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

Hon*_*ong 4 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)
Run Code Online (Sandbox Code Playgroud)

通常,我确切知道net.foo.anroid.Foo.wb与哪个文件相对应,并且行号(例如453、213 ...)是ProGuard源文件中的实际行号。

但是,对于R8,找出哪一行的唯一方法是在mapping.txt中查找它们。

这确实是一个很大的麻烦。如果没有很好的方法从堆栈跟踪中快速找到源代码,仅出于这个原因,我将返回ProGuard。

有没有办法防止R8更改行号?

sgj*_*sse 6

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

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

现在,当在配置中同时设置了-dontoptimize(不表示内联)和-dontobfuscate时,对于调试版本和发行版本始终将其关闭。

使用回溯(记住使用Proguard 6或更高版本中的回溯)时,您无需剪切堆栈跟踪,因为回溯将通过未修改的非堆栈跟踪行。

应用程序中目前没有库可以执行此操作,因为这要求将映射文件包含在应用程序中,这不利于缩小apk的目的。

  • 问题是很遗憾,Android Sdk中ProGuard的版本是4.7旧版本,所以你需要去https://sourceforge.net/projects/proguard/files/proguard/6.0/下载最新版本,其中retrace应该与行号一起正常工作。 (2认同)