Настройка Android App Bundle (AAB) для оптимизации размера
С августа 2021 Google Play требует AAB вместо APK для новых приложений. Но просто переключить формат сборки с APK на AAB — недостаточно для реального уменьшения размера. Нужно понять, как работает Google Play Asset Delivery, настроить конфигурационные splits и убрать из base module всё, что туда не должно попасть.
Как AAB уменьшает размер
APK — один файл для всех устройств. AAB — архив с модулями, из которого Google Play собирает оптимизированный APK под конкретное устройство. Samsung Galaxy S23 с arm64-v8a и xxhdpi экраном получает только arm64-v8a нативные библиотеки и xxhdpi ресурсы — без x86, armeabi-v7a и xhdpi/hdpi вариантов.
Размер скачиваемого APK уменьшается в среднем на 15–35% по сравнению с universal APK — это официальные данные Google для реальных приложений.
Настройка в build.gradle
android {
bundle {
language { enableSplit = true } // отдельный APK под язык
density { enableSplit = true } // отдельный APK под плотность экрана
abi { enableSplit = true } // отдельный APK под архитектуру CPU
texture {
enableSplit = true
defaultFormat = "ETC2" // основной формат, для Mali/Adreno baseline
// ASTC для флагманов с поддержкой (Adreno 530+, Mali-G51+)
}
}
}
texture splits — особенно важны для игр и приложений с 3D: ETC2 — universally supported (GLES 3.0+), ASTC — лучшее сжатие на современных устройствах, DXT/S3TC — для x86 (ChromeOS). Без texture splits все форматы упакованы вместе, и это может давать +50–100 MB к размеру.
Проверка размера через bundletool
bundletool build-apks --bundle=app.aab --output=app.apks \
--ks=keystore.jks --ks-pass=pass:password \
--ks-key-alias=key --key-pass=pass:password
bundletool get-size total --apks=app.apks \
--device-spec=pixel7_spec.json
device-spec.json для конкретного устройства получаем через bundletool get-device-spec --adb=<path>. Это даёт точный размер загружаемого APK для целевого устройства ещё до загрузки в Play Store.
R8 и ProGuard — обязательные спутники AAB
buildTypes {
release {
minifyEnabled = true
shrinkResources = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
shrinkResources = true работает только при minifyEnabled = true. Убирает неиспользуемые ресурсы — строки, изображения, layout — на основе статического анализа кода. В реальных проектах это 5–20 MB дополнительного уменьшения.
R8 в full mode (-dontobfuscate — не добавляем для release) агрессивнее удаляет код и инлайнит методы. proguard-android-optimize.txt вместо proguard-android.txt включает дополнительные оптимизации.
Анализ размера через Android Studio
Build → Analyze APK (работает и с AAB через распаковку). Показывает pie chart: classes.dex, res/, lib/, assets/. Сразу видно что занимает больше всего. Типичные находки:
-
assets/с несжатыми JSON-файлами данных — сжать или перевести в бинарный формат (Protobuf / FlatBuffers) -
lib/с нативными библиотеками для всех ABI включаяx86иx86_64— оставить толькоarm64-v8aиarmeabi-v7aдля production build -
res/drawable-*с PNG там где достаточно VectorDrawable
Сроки
Настройка AAB с bundletool-верификацией — 1–2 дня. Если нужна полная оптимизация размера включая R8 tuning и texture splits — 3–5 дней.







