如何使用R8将原始行号保留在堆栈跟踪中?

问题描述

我正在尝试找出如何使用R8保留原始行号。

使用当前的AndroidStudio开发应用程序,并使用R8对其进行混淆,甚至将mapping.txt文件上传到Google Play控制台,在某些情况下,用户的堆栈跟踪都是无用的,因为崩溃的原因并不是与真实的非混淆文件相同。

这是一个示例,我的班级没有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文件混淆了

解决方法

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

 -keepattributes LineNumberTable,SourceFile

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