Как отладить приложение для Android в режиме релиза? - PullRequest
4 голосов
/ 13 июня 2019

Когда я создаю apk в режиме релиза, он вылетает при запуске

Проблема возникает, когда я включаю minifyEnabled для proguard, и я решил ее, добавив приведенный ниже код в 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 ]

6 голосов
/ 13 июня 2019

Поскольку это приложение, работающее в производственном режиме, сделайте НЕ компрометирующее запутывание (используя 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 голосов
/ 15 июня 2019

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>;
}
2 голосов
/ 13 июня 2019

Вы можете настроить proguard для получения дополнительной информации.

-keepattributes SourceFile, LineNumberTable

Это также сохранит имя файла и номера строк, поэтому вы будетеиметь больше данных в вашем logcat.

Кроме того, используйте minifyEnabled в вашей отладочной сборке, чтобы proguard применялся к вашей отладочной сборке, и вы могли бы отладить лучше.

Как только вы найдете и исправите проблему, вы можете удалить ее из Proguard.

0 голосов
/ 13 июня 2019

Если вы хотите обфусцировать стековую трассировку, взгляните на это руководство .

Если вы хотите пошагово пройти через сборку релиза (то же самое)как в случае отладки), попробуйте добавить debuggable true в конфигурацию Gradle (app\build.gradle):

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