Как найти источник сбоя, используя отчет о сбое в консоли разработчика Android? - PullRequest
0 голосов
/ 16 мая 2018

Поскольку я опубликовал новую версию своего приложения в магазине Google Play, я получаю отчеты о сбоях в консоли разработчика Android.

Я загрузил ProGuard mappings.txt сразу после публикации новой версии. Таким образом, весь журнал НЕ запутан (все имена классов и методы отображаются в виде открытого текста). Однако я все еще не уверен, что могу читать их.

Существует три основных проблемы:

  1. В отчете показан только метод сбоя, но нет номеров строк. Поэтому я не знаю, какая часть метода вызвала сбой.
  2. В некоторых отчетах о сбоях показаны различные методы, использующие OR. Что это значит?
  3. Не все сообщения обфусцированы. Некоторые по-прежнему отображаются с анонимными именами классов и методов

Пример:

// Crash Log with is NOT obfuscated
Caused by: java.lang.NullPointerException: 
1:  at com.example.MyApp.Path.To.Package.MyClass.myMethod1 (MyClass.java)  // <-- No Line Numbers...
    or                     .myMethod2 (MyClass.java)    // <-- WHAT does this OR mean???
    or                     .myMethod3 (MyClass.java)
2:  at com.example.MyApp.Path.To.Package.MyClass.onCreateView (MyClass.java)
3:  at android.support.v4.app.Fragment.performCreateView (Fragment.java)
4:  at android.support.v4.app.FragmentManagerImpl.access$500 (FragmentManagerImpl.java)
    or                     .access$600 (FragmentManagerImpl.java)
    or                     .addFragment (FragmentManagerImpl.java)
    or                     .allocBackStackIndex (FragmentManagerImpl.java)
    or                     .animateRemoveFragment (FragmentManagerImpl.java)
    ...

5:  at android.support.v4.app.FragmentManagerImpl.access$500 (FragmentManagerImpl.java)
...


// Other crash seems to show the same problem but is still obfuscated
Caused by: java.lang.NullPointerException: 
1:  at com.example.MyApp.Path.To.Package.MyClass.a (MyClass.java:89)  // <-- Line numbers available here...
2:  at com.example.MyApp.Path.To.Package.MyClass.b (MyClass.java:40)
3:  at android.support.v4.app.Fragment.performCreateView (Fragment.java)
... // Same call stack as above  

Вопросы:

  • Почему некоторые журналы обфусцированы, а другие (которые, кажется, показывают ту же ошибку) - нет? Оба журнала были созданы после загрузки файла сопоставлений. Журналы более старых версий без файла сопоставлений показывают явное сообщение «Журналы запутаны»
  • Что означает оператор OR в стеке вызовов? Означает ли это, что исключение произошло в каждом из этих методов (как это должно быть возможно)?
  • Почему в де-запутанных журналах нет номеров строк? Данные методы довольно длинные, и без какой-либо дополнительной информации я понятия не имею, что именно могло вызвать проблему. Номера строк в запутанном виде, кажется, указывают на случайные строки, которые никак не связаны с реальным кодом.

Итак, главный вопрос:

Как использовать информацию из журналов, чтобы найти источник сбоя?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вам необходимо добавить следующие параметры в конфигурацию Proguard:

# This option forces Proguard to use different obfuscated names
# for different members. It avoids the 'or' stack traces.
-useuniqueclassmembernames

# These options produce useful stacktraces preserving line numbers
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

Без -useuniqueclassmembernames Proguard может назначать одинаковые запутанные имена для различных методов из одного и того же класса (вы можете увидеть это на отображении.txt файл).Вот почему трассировка стека знает, что ошибка произошла в методе A или в методе B, но не знает точно, какой именно.

При использовании опции -useuniqueclassmembernames все запутанные имена будут разнымии больше не будет или стековых трасс.Подробнее об этом здесь .

Кроме того, Proguard не хранит информацию о номерах строк, если мы не используем параметры -renamesourcefileattribute и -keepattributes, как указано.Подробнее об этом здесь .

Эти опции немного увеличат ваш размер apk, но это того стоит.Это избавило меня от многих головных болей при анализе моих стековых трасс.

0 голосов
/ 16 мая 2018

Лучше вместо этого использовать Ткани. Это даст отчет о сбое вместе с номерами строк.

...