R8 full modeНе так давно обновил проект до Gradle 8 и получил краш в релизной сборке
⚪️. Все из-за включенного по умолчанию
R8 full mode. Прежде чем разберемся, что поменялось, давайте для начала вспомним, кто такой этот ваш R8.
☢️ R8 — это утилита для удаления лишнего кода, его минификации и оптимизации
Как работает⚙️ Строит граф от рутов, помеченных -keep в правилах proguard, и удаляет все до чего не смог дотянуться
Причем тут proguard
⚙️ Ранее в Android использовался аналог R8 под названием ProGuard, правила остались для совместимости
Когда запускается⚙️ Во время сборки с включенным флагом isMinifyEnabled
Где может стрельнуть⚙️ При использовании рефлексии или JNI
Что за full mode⚙️ Включает более агрессивный режим и вырезает еще больше кода. Например, классы, создаваемые только через рефлексию, должны явно помечаться через -keep правило. Также R8 удаляет сигнатуру дженериков, что стрельнуло у меня в связке Retrofit + RxJava2
❗️Вообще хорошей практикой считается то, когда либа уже содержит необходимые правила для R8 и вам не нужно об этом задумываться, но так бывает не всегда. Например, GSON только с последней версии стал включать
правила по-умолчанию, но и это работает не для всех кейсов.
📌 Подробнее почитать про R8 full mode и известные проблемы можно
тут, но эти правила мне не помогли, поэтому в комментах напишу, что помогло.
Также если хотите глубже погрузиться в правила ProGuard, то рекомендую официальный
мануал и андроидовскую
доку.
Столкнулись ли вы с подобной проблемой на своем проекте
❓#Android #R8 #ProGuard