Как отлаживать с запутанными (с ProGuard) приложениями на Android?

Когда я получил что-то вроде этого

ERROR/AndroidRuntime(18677): Caused by: java.lang.NullPointerException
ERROR/AndroidRuntime(18677):     at com.companyname.a.a.a(Unknown Source)

Как я могу узнать, где проблема и отладить эту проблему? Я получил только отображение результатов из ProGuard и не знаю номера строки. Спасибо.

Ответ 1

Добавьте следующие строки в конфигурацию proguard.

-renamesourcefileattribute SourceFile    
-keepattributes SourceFile,LineNumberTable

Теперь ваши трассировки стека будут содержать номера строк, а с помощью инструмента retrace, который поставляется с proguard (включенным в Android SDK), вы можете отлаживать, как обычно.

Обратите внимание, что даже если вы не использовали эти два параметра конфигурации, retrace все еще может выводить полезную информацию, если у вас есть файл сопоставлений, хотя и не совсем однозначно.

Примечание. Файл с сопоставлениями создается с помощью опции конфигурации proguard:

 -printmapping outputfile.txt

В файле ant, поставляемом с Android SDK, он установлен на map.txt.

Удачи.

Ответ 2

Чтобы использовать любые трассировки стека из вашей учетной записи Android Market, вы можете использовать файл карты, созданный с помощью опции -printmapping в конфигурации ProGuard, с помощью инструмента ReTrace (ProGuard companion) для декодирования трассировки стека. Вы также можете декодировать вручную, используя содержимое файла карты, но это утомительно.

В Руководстве ProGuard в примерах имеется раздел о создании полезных обфускационных стековых следов, в том числе о том, как сохранить номера строк.

К сожалению, если вы не установили ProGuard, чтобы сохранить номера строк, вы сможете идентифицировать только тот метод, который генерирует исключение.

Ответ 3

Вставьте трассировку стека в файл stack_trace.txt

Выполните следующую команду: java -jar retrace.jar classes-processed.map stack_trace.txt

retrace.jar находится в sdk\tools\proguard\lib\retrace.jar classes-processed.map - это выходной файл, созданный proguard, когда вы обфускации