R8 удаляет целые классы, которые не должен.

Вопрос или проблема

После миграции Gradle с 8.4 на 8.9 и плагина Gradle с 8.3.2 на 8.7.0, R8 выдает ошибку при сборке подписанного APK для релиза.

Отсутствует класс com.my.package.MyClass$Companion (ссылается на: void common.my.package.workers.SyncWorker.<init>(android.content.Context, androidx.work.WorkerParameters, com.my.package.Dao))

Появляются ошибки с множеством отсутствующих классов. Я добавил -keep class com.my.package.** { *; } в модуль приложения (в proguard-rules.txt) и в мои другие модули (в consumer-rules.txt), но это не помогло. Я также добавил android.enableR8.fullMode=false в мой gradle.properties, но это ничего не изменило. Android Studio действительно генерирует missing-rules.txt с множеством -dontwarn, что позволяет сборке пройти, но приложение тут же выдает ошибку с теми же отсутствующими классами.

Есть идеи, как это исправить? Я вижу в документации написано

Ответ или решение

Проблема с удалением R8 целых классов при сборке вашего приложения после обновления Gradle и плагина может возникать по нескольким причинам, и решение может потребовать системного подхода. Давайте рассмотрим ключевые аспекты этой проблемы и возможные пути ее решения.

Описание проблемы

Вы столкнулись с ошибкой, при которой R8 удаляет классы, необходимые для работы вашего приложения, что приводит к возникновению ошибок времени выполнения. Ошибка, указанная в вашем описании, конкретно говорит о том, что отсутствует класс com.my.package.MyClass$Companion, что, в свою очередь, может указывать на неправильную конфигурацию правил ProGuard/R8.

Кроме того, несмотря на то что вы добавили правила -keep, найденные во proguard-rules.txt для вашего модуля приложения и consumer-rules.txt для других модулей, это не решило проблему. Применение параметра android.enableR8.fullMode=false также не привело к значительным изменениям. Генерация файла missing-rules.txt с анализом отсутствующих классов и добавление правил -dontwarn только усугубили ситуацию, так как приложение продолжает сбоить при запуске.

Варианты решения

  1. Проверка правил ProGuard/R8:

    • Убедитесь, что правила -keep указаны корректно. Например, приведённое вами правило -keep class com.my.package.** { *; } должно охватывать все классы внутри пакета. Однако имейте в виду, что если MyClass имеет специфические аннотации, которые не указываются в этих правилах, вам может потребоваться добавить дополнительные правила для их сохранения.
  2. Добавление более точных правил:

    • Попробуйте добавить более специфические правила для классов, на которые ссылаются создаваемые вами компоненты, например:
      -keep class com.my.package.MyClass { *; }
      -keep class com.my.package.MyClass$Companion { *; }
  3. Использование инструмента R8:

    • Попробуйте отключить оптимизацию R8 для разработки, если она используется в вашем проекте, и посмотреть, устранит ли это проблему. Вы можете сделать это, добавив:
      android.enableR8=false
  4. Обновление зависимостей:

    • Проверьте, соответствуют ли все ваши зависимости, особенно те, которые могут взаимодействовать с отсутствующими классами, их версиям. Иногда более новая версия библиотеки может содержать исправления, которые устранят конфликт.
  5. Изоляция проблемы:

    • Попробуйте создать минимальный проект с той же конфигурацией и постепенно добавлять зависимости и функциональность, чтобы определить, что именно вызывает удаление классов.
  6. Отладка с использованием R8:

    • Включите дополнительный лог для R8, чтобы понять, почему классы удаляются. Это может дать ясное представление о том, где проходит неявная оптимизация:
      -printmapping mapping.txt
      -printusage usage.txt
  7. Обращение к сообществу и документации:

    • Если вы не можете найти решение, рекомендуем обратиться к документации R8, а также на платформы поддержки, такие как Stack Overflow или официальный репозиторий Android на GitHub.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...