Как предсказать сбой во время выполнения сборки выпуска Android из-за обфускации Proguard

Хотя я знаю как устранять проблемы, связанные с Proguard, проверка того, что при запуске приложения не произойдет сбой, занимает много времени:

  1. Изменить модуль proguard.cfg
  2. Построить > Clean Project
  3. Построить > Generate Signed App Bundle / APK...
  4. Подождите, пока вся сборка завершится
  5. Удалить предыдущий APK
  6. Подключите телефон через USB (на эмулируемом устройстве сбоев не происходит).
  7. Скопируйте APK-версию релиза на телефон.
  8. Установите этот новый APK
  9. Откройте приложение
  10. Бум...
  FATAL EXCEPTION: main
  java.lang.NoSuchFieldError: No field xxx of type yyy

При устранении такой проблемы я не всегда уверен, сработает ли мое исправление, поэтому мне приходится повторять описанные выше шаги несколько раз (как в этой LinkageError).

Это, конечно, отнимает очень много времени, и мне бы хотелось, чтобы во время самой сборки/генерации появлялись какие-то сообщения, которые сообщали бы мне об этих ошибках во время выполнения.

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

Существует ли способ предсказать сбой во время выполнения сборки выпуска Android из-за обфускации Proguard?

Если да, то как мне это сделать?

Могу я спросить, почему вы используете Proguard, когда Android Studio по умолчанию использует R8 для сжатия и запутывания кода, начиная с версии плагина Gradle 3.4.0?

Introspective 01.07.2024 20:41

@Introspective Хороший улов. Я использую «файлы правил ProGuard», но движок R8: Developer.android.com/build/shrink-code#configuration-files

ususer 01.07.2024 21:10
5
2
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следующий совет вам очень поможет, хотя он ни в коем случае не является исчерпывающим ответом:

Когда вы Build > Generate Signed App Bundle / APK... и вы получаете следующую ошибку в консоли сборки (во время задачи minifyReleaseWithR8):

При запуске R8 обнаружены отсутствующие классы. Пожалуйста, добавьте недостающее классы или применить дополнительные правила хранения, созданные в <корневой_путь_проекта>\build\outputs\mapping\release\missing_rules.txt.

Обратите внимание на детали «отсутствующих классов»:

  • Для каждого файла, перечисленного в missing_rules.txt, требующего оператора/строки -dontwarn, не добавляйте правило -dontwarn к существующим правилам сохранения, чтобы подавить предупреждения (как предложено в R8).
  • Вместо этого добавьте -keep public class com.yourorg.yourlib.MissingClassName { *; }

По сути, это предотвращает превращение этих «бомб времени выполнения» (в форме «предупреждений») в ФАТАЛЬНЫЕ ИСКЛЮЧЕНИЯ во время выполнения.

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

Похожие вопросы