В Android можно включить resource shrinking, чтобы убрать из финального APK/Bundlа неиспользуемые ресурсы (строки, drawables, layouts и т.д.)
android {
buildTypes {
release {
shrinkResources true
minifyEnabled true
}
}
}С недавних пор Google экспериментирует со strict режимом работы шринкера, который делает эту очистку более агрессивной, а именно:
👉 Удаляет все ресурсы, которые не удалось найти в коде или XML.
👉 Не делает допущений, что ресурс “вдруг используется где-то через reflection”. Нету явного использования или keep правила - удаление
👉 Режет всё под корень — даже если вы явно используете getIdentifier() или динамически загружаете ресурсы по имени, он может их не заметить и выкинуть.
📉 Эффект - меньший размер сборки, но есть риск крешей в рантайме, если ресурсы удалены, а были нужны
Как включается strict режим:
# В gradle.properties
android.experimental.enableStrictResourceShrinking=true
🛡 Как сохранить нужные ресурсы от удаления?
Если вы точно знаете, что ресурс используется, но shrinker может его не заметить:
1️⃣ProGuard правила (R8 учитывает их для ресурсов тоже):
# Правила для R8
-keepresources R.string.some_dynamic_string
-keepresources R.drawable.icon_loaded_by_name
2️⃣Файлы в папках
res/raw/ и assets/ shrinker не трогает вообще.3️⃣
tools:keep и tools:discard в XML (подробнее тут):<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/landing,@drawable/logo"
tools:discard="@drawable/unused_image" />
Рекомендации:
👉 Не включайте strict-режим без хорошего UI-тест-покрытия.
👉 Проверьте, что не используете динамическое получение ресурсов getIdentifier() без крайней необходимости.
👉 Добавляйте
-keepresources, если есть малейшие сомнения.Подробнее про оптимизацию ресурсов читайте в официальной документации
#android #r8 #оптимизация