Вопрос или проблема
После миграции 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
только усугубили ситуацию, так как приложение продолжает сбоить при запуске.
Варианты решения
-
Проверка правил ProGuard/R8:
- Убедитесь, что правила
-keep
указаны корректно. Например, приведённое вами правило-keep class com.my.package.** { *; }
должно охватывать все классы внутри пакета. Однако имейте в виду, что еслиMyClass
имеет специфические аннотации, которые не указываются в этих правилах, вам может потребоваться добавить дополнительные правила для их сохранения.
- Убедитесь, что правила
-
Добавление более точных правил:
- Попробуйте добавить более специфические правила для классов, на которые ссылаются создаваемые вами компоненты, например:
-keep class com.my.package.MyClass { *; } -keep class com.my.package.MyClass$Companion { *; }
- Попробуйте добавить более специфические правила для классов, на которые ссылаются создаваемые вами компоненты, например:
-
Использование инструмента R8:
- Попробуйте отключить оптимизацию R8 для разработки, если она используется в вашем проекте, и посмотреть, устранит ли это проблему. Вы можете сделать это, добавив:
android.enableR8=false
- Попробуйте отключить оптимизацию R8 для разработки, если она используется в вашем проекте, и посмотреть, устранит ли это проблему. Вы можете сделать это, добавив:
-
Обновление зависимостей:
- Проверьте, соответствуют ли все ваши зависимости, особенно те, которые могут взаимодействовать с отсутствующими классами, их версиям. Иногда более новая версия библиотеки может содержать исправления, которые устранят конфликт.
-
Изоляция проблемы:
- Попробуйте создать минимальный проект с той же конфигурацией и постепенно добавлять зависимости и функциональность, чтобы определить, что именно вызывает удаление классов.
-
Отладка с использованием R8:
- Включите дополнительный лог для R8, чтобы понять, почему классы удаляются. Это может дать ясное представление о том, где проходит неявная оптимизация:
-printmapping mapping.txt -printusage usage.txt
- Включите дополнительный лог для R8, чтобы понять, почему классы удаляются. Это может дать ясное представление о том, где проходит неявная оптимизация:
-
Обращение к сообществу и документации:
- Если вы не можете найти решение, рекомендуем обратиться к документации R8, а также на платформы поддержки, такие как Stack Overflow или официальный репозиторий Android на GitHub.
Заключение
Проблема с удалением классов в R8 может быть решена с помощью подробного анализа правил и настроек проекта. Выполнив вышеперечисленные шаги, вы сможете устранить возникающие ошибки и обеспечить нормальное функционирование вашего приложения. Убедитесь, что вы сохраняете резервные копии изменений, чтобы в любой момент можно было откатиться назад, если новые настройки не работают.