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

时间:2019-06-13 09:13:45

标签: android android-studio proguard

在发布模式下创建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)

4 个答案:

答案 0 :(得分:6)

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

这在android / 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

答案 1 :(得分:2)

您可以配置proguard以获得更多信息。

  

-keepattributes SourceFile,LineNumberTable

这还将保留文件名和行号,因此您的logcat中将有更多数据。

此外,在您的调试版本上使用minifyEnabled,以便将proguard应用于您的调试版本,并且可以对其进行更好的 debug 调试。

一旦发现并解决了该问题,便可以将其从proguard中删除。

答案 2 :(得分:2)

Android需要遵循以下保护规则,才能使Android应用正常运行:

-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>;
}

答案 3 :(得分:0)

如果要对堆栈跟踪进行模糊处理,请查看this guide

如果您想逐步完成发布版本(与调试中相同的方式),请尝试添加 debuggable true 到您的Gradle配置(app\build.gradle):

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