【问题标题】:How to debug android app on release mode?如何在发布模式下调试 android 应用程序?
【发布时间】:2019-06-13 09:13:45
【问题描述】:

当我在发布模式下创建 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 才会显示带有类名的错误日志。然后,您可以根据需要保留课程。
  • 您不应该尝试调整发布版本以了解混淆的堆栈跟踪。对于发布版本,您可以使用生成的符号映射文件 (proguard) 进行去混淆处理。 Proguard 有一个回溯功能,但如果您的应用程序处于活动状态,则 google play 会自动支持此功能。在下面查看我的答案

标签: android android-studio proguard


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    -keepattributes SourceFile,LineNumberTable

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

    此外,在您的调试版本中使用minifyEnabled,以便将 proguard 应用于您的调试版本,您将能够更好地调试它。

    找到并解决问题后,您可以将其从 proguard 中删除。

    【讨论】:

    • 哇,您现在为我的调试增添了便利。以前,每次我想测试关于为什么我的应用程序在minifyEnabled=true 时崩溃的更改时,我都会生成一个签名的发布版本。
    【解决方案3】:

    Android 需要以下 proguard 规则来保持 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>;
    }
    

    【讨论】:

      【解决方案4】:

      如果您想对堆栈跟踪进行去混淆处理,请查看this guide

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-07
        • 1970-01-01
        • 1970-01-01
        • 2018-03-22
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多