如何在发布模式下调试Android应用程序?

7

当我在发布模式下创建apk时,它会在启动时崩溃。

当我启用proguard的minifyEnabled时,问题就会出现。我通过添加以下代码到proguard-rules.pro文件来解决这个问题。

-keep class my.package.name.** {*;}

我认为原因是Proguard删除了我的一些代码,但我不知道是哪一部分,因为它混淆了我的代码,读取logcat也无用。有没有什么方法可以让我理解logcat的信息?

java.lang.NullPointerException: throw with null exception
    at e.a.z.a(:176)
    at i.n.run(:71)

设置shrinkResource = true会混淆您的代码并更改类和方法名称。而仅启用minify enable true将显示带有类名的错误日志。然后,您可以根据需要保留类。 - Tarun Kumar
你不应该尝试调整发布版本来理解混淆的堆栈跟踪。对于发布版本,你需要使用生成的符号映射文件(Proguard)进行反混淆。Proguard有一个还原功能,但如果你的应用程序已经上线,Google Play会自动支持此功能。请查看下面我的回答。 - ehanoc
4个回答

8

由于这是一个正在运行的生产应用程序,如果您只需要了解崩溃报告,请不要妥协混淆(使用keepattributes)。

这在安卓 / Google指南中有详细说明。 您可以上传由Proguard创建的符号映射文件,从而允许对崩溃报告进行反混淆。

映射文件通常在此处生成:

build/outputs/mapping/release/mapping.txt

这里有解释:https://developer.android.com/studio/build/shrink-code#decode-stack-trace Proguard具有一个名为Retrace API的功能,可在此处找到描述:https://www.guardsquare.com/en/products/proguard/manual/retrace 并且在此处,可以上传到 Google Play 以获取反混淆报告:https://support.google.com/googleplay/android-developer/answer/6295281

6

你可以配置Proguard以获得更多信息。

-keepattributes SourceFile,LineNumberTable

这将保留文件名和行号,因此您在Logcat中会有更多数据。

还要在您的调试构建上使用minifyEnabled,以便Proguard应用于您的调试构建,您将能够更好地进行调试

找到并修复问题后,您可以从Proguard中删除它。


1
哇,你刚刚让我的调试变得更加容易了。以前每次想要测试一下我的应用程序在 minifyEnabled=true 时为什么会崩溃,我都需要生成一个签名的发布版本。 - lasec0203

2

为了使Android应用程序正常工作,需要以下Proguard规则:

Original Answer翻译成"最初的回答"

-keep public class * extends android.app.Activity
-keep public class * extends androidx.appcompat.app.AppCompatActivity
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider


-keep public class * extends android.view.View {
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
    public void set*(...);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.content.Context {
   public void *(android.view.View);
   public void *(android.view.MenuItem);
}

-keepclassmembers class * implements android.os.Parcelable {
    static ** CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

0

如果您想要解密堆栈跟踪,请查看本指南

如果您想要像在调试中一样逐步进行发布版本构建,请尝试将debuggable true添加到Gradle配置(app\build.gradle)中:

android
{
  buildTypes
  {
    release {
      proguardFiles 'your-proguard-config.pro'
      debuggable true   //<-- add this
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接