Ошибки APK

Краш ClassNotFound / NoSuchMethod

Текст ошибки

java.lang.ClassNotFoundException: Didn't find class "com.example.Foo" on path: DexPathList
java.lang.NoSuchMethodError: No virtual method bar()V in class Lcom/example/Foo;

Причина

Во время работы не находится класс или метод. Обычно R8 удалил код, библиотека присутствует в двух версиях или неверно настроен multidex.

Решение по шагам

  1. Получи полный stack trace: adb logcat -b crash.
  2. Если только в release, виноват R8: добавь правило -keep.
  3. Защити классы для reflection и JSON-модели через -keep.
  4. Через dependencies проверь, нет ли двух версий одной библиотеки.
  5. Если трассировка запутана, запусти retrace с mapping.txt.

Примеры команд

adb logcat -b crash
./gradlew :app:dependencies --configuration releaseRuntimeClasspath
# proguard-rules.pro
-keep class com.example.Foo { *; }
retrace mapping.txt trace.txt

Как не повторить

Если используешь reflection, проверяй release APK каждый раз.

Автор и лицензия: Nibras Code