Деобфускацирующий файл не работает с этим исключением

Я загрузил файл deobfuscate в консоль, но... кажется, что файлы deobfuscate некорректно работают с этим исключением. Я запутываю код с новой системой R8 вместо Proguard, потому что я использую последнюю андроид-студию, но это также случалось и раньше с ProGuard. Я вижу много исключений в моей консоли разработчика Google Play с этим текстом:

java.lang.NullPointerException: 
  at com.myapp.Util.capitalize (Util.java)
  or                     .clearRAM (Util.java)
  or                     .firstCharToUpperCase (Util.java)
  or                     .formatSize (Util.java)
  or                     .getBenchmarkResultsMap (Util.java)
  or                     .getColorFromStyle (Util.java)
  or                     .getLocaleStringResource (Util.java)
  or                     .getStringList (Util.java)
  or                     .goToAppSettingsDialog (Util.java)
  or                     .persistInt (Util.java)
  or                     .persistString (Util.java)
  or                     .persistStringArrayList (Util.java)
  or                     .sendEmail (Util.java)
  or                     .share (Util.java)
  at com.myapp.SystemInfoHelper.getExternalSdCardTotalSize (SystemInfoHelper.java)
  or                     .getFormattedExternalSdCardSize (SystemInfoHelper.java)
  at com.myapp.SystemInfoStringBuilder.getSystemSummaryList (SystemInfoStringBuilder.java)
  at com.myapp.activities.MainActivity$5$1.run (MainActivity.java)
  at android.os.Handler.handleCallback (Handler.java:739)
  at android.os.Handler.dispatchMessage (Handler.java:95)
  at android.os.Looper.loop (Looper.java:145)
  at android.app.ActivityThread.main (ActivityThread.java:6134)
  at java.lang.reflect.Method.invoke (Method.java)
  at java.lang.reflect.Method.invoke (Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1399)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1194)
  at de.robv.android.xposed.XposedBridge.main (XposedBridge.java:95)

Как вы можете видеть, он не говорит, в какой строке или функции есть проблема, вместо этого он говорит "at, or, at или" и не разъясняет, где происходит сбой.

Как я могу решить эту проблему?

1 ответ

Когда номера строк удаляются из метаданных, трассировки стека не будут включать их, что может затруднить определение места возникновения проблемы. Можете добавить --keepattributes LineNumberTable к вашей конфигурации R8, чтобы сохранить их.

К сожалению, это не поможет вашей текущей ситуации. В этом случае я бы рекомендовал начать с:

com.myapp.SystemInfoStringBuilder.getSystemSummaryList

и определить, вызывает ли это:

com.myapp.SystemInfoHelper.getExternalSdCardTotalSize

или же

com.myapp.SystemInfoHelper.getFormattedExternalSdCardSize

Если он вызывает оба (основываясь на именах, которые он, вероятно, делает), следующий шаг становится немного более обременительным.

Из этого метода определите, какой из com.myapp.UtilМетоды называются. Обратите внимание, что вы также можете удалить некоторые из длинного списка com.myapp.Utilметоды, исследующие код, чтобы определить, будут ли они фактически генерировать исключение NullPointerException.

Последний вариант заключается в кодировании на Kotlin, потому что это заставит вас явно разрешить нулевые значения для данной переменной или параметра.

Другие вопросы по тегам