【问题标题】:How to keep original line numbers in stack traces with R8?如何使用 R8 将原始行号保留在堆栈跟踪中?
【发布时间】:2021-01-30 18:37:10
【问题描述】:

我正在尝试弄清楚如何使用 R8 保留原始行号。

用当前的AndroidStudio做一个应用程序并用R8混淆它,甚至将mapping.txt文件上传到Google Play Console,用户的堆栈跟踪在某些情况下是无用的,因为崩溃的行与在真正的非混淆文件中。

这是一个示例,我的类没有3000行,但是在第3052行报错(com.mypackage.activities.ManagerActivity.onCreate (ManagerActivity.java:3052)):

Caused by: java.lang.NullPointerException: 
  at com.mypackage.activities.ManagerActivity.onCreate (ManagerActivity.java:3052)
  at android.app.Activity.performCreate (Activity.java:7136)
  at android.app.Activity.performCreate (Activity.java:7127)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1271)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2990)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3148)
  at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:78)
  at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:108)
  at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:68)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1861)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:193)
  at android.app.ActivityThread.main (ActivityThread.java:6819)
  at java.lang.reflect.Method.invoke (Method.java)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:497)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:912)

有没有办法获得 R8 和 AndroidStudio 错误的真实行号? 请记住,此代码已经使用 mapping.txt 文件进行了反混淆

【问题讨论】:

  • 如果 mapping.txt 文件与 APK 一起上传,则 Google Play 管理中心应自动运行反混淆。显然这在这种情况下不起作用。如果可以在 Google Play 控制台中从用户那里获取原始堆栈跟踪,那么可以改为在本地运行反混淆,以尝试找出问题所在。作为参考,您使用的是哪个版本的 Android Studio/AGP/R8?
  • 嗨@sgjesse AS 4.0.1、AGP 4.0.1 和 R8 我不知道,默认的是 AS。顺便说一句,我报告了其他一些堆栈跟踪,但没有一个显示真实的行号。而且在我的其他应用程序中也是一样的,它们都没有显示真实的行号。我所有的应用程序都上传了映射文件。我该怎么做才能保留真实的行号?我需要混淆代码,但将行号保留在堆栈跟踪中或至少接近此的东西。这对我来说是一个非常大的问题,因为我有很多关于该错误的堆栈跟踪,并且由于行号问题而无法解决它
  • AGP 4.0.1 嵌入了 R8 版本 2.0.74。如果以上是在去混淆/回溯之后,那么映射文件可能有问题。您可以尝试使用R8 retracing tool 与您的映射文件和来自应用程序的堆栈跟踪一起在本地验证(您可以通过插入throw new NullPointerException() 在本地强制验证)。如果您可以与 sgjesse@google.com 和 mkroghj@google.com 共享映射文件和一些堆栈跟踪,我们可以尝试帮助找出问题所在。
  • 非常感谢@sgjesse 发送电子邮件
  • @sgjesse 请添加一个答案,告诉您“-keepattributes LineNumberTable,SourceFile”解决了这个问题吗?我会接受的

标签: android proguard obfuscation android-r8


【解决方案1】:

为了正确追溯混淆的堆栈跟踪,需要在配置文件中包含以下内容

 -keepattributes LineNumberTable,SourceFile

有关教育部信息,请参阅https://developer.android.com/studio/build/shrink-code#decode-stack-trace

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 2017-01-12
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多