Сборка Android‑приложения: шаги от Gradle до подписанного APK/AAB
Короткий ответ: настройте buildTypes и (при необходимости) productFlavors в Gradle, пропишите signingConfig (через защищённые свойства), соберите релизный артефакт командой ./gradlew bundleRelease (AAB) или ./gradlew assembleRelease (APK) либо через Build → Generate Signed Bundle / APK в Android Studio и подпишите keystore; храните keystore и пароли вне репозитория.
Подготовка проекта и ключевые настройки Gradle
- Обновите Android Studio и Android Gradle Plugin; проверьте compileSdk/targetSdk.
- Разделяйте debug/release — включите R8/obfuscation только в релизе, отключите логирование и тестовые ключи.
- Пример важных полей в модуле app (Kotlin DSL):
android {
compileSdk = 34
defaultConfig {
applicationId = "com.example.app"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0.0"
}
buildTypes {
debug { isMinifyEnabled = false applicationIdSuffix = ".debug" }
release {
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
}
- Если нужно несколько окружений — добавьте
productFlavors(dev/stage/prod) с разнымиapplicationId, ресурсами и BuildConfig-переменными.
Используйте BuildConfig/ресурсы для передачи URL, флагов аналитики и ключей (не храните секреты в коде).
Сборка: команды, артефакты и когда использовать AAB или APK
- Команды:
- Debug APK:
./gradlew assembleDebug - Релизный APK:
./gradlew assembleRelease - App Bundle (рекомендуется для Google Play):
./gradlew bundleRelease - Для конкретного flavor:
./gradlew assembleProdReleaseили./gradlew bundleProdRelease
- Debug APK:
- Путь к артефактам:
- APK:
app/build/outputs/apk/<variant>/app-<variant>.apk - AAB:
app/build/outputs/bundle/<variant>/app-<variant>.aab
- APK:
Таблица: что собирать для разных сценариев
| Сценарий | Формат | Когда использовать |
|---|---|---|
| Публикация в Google Play | AAB | Рекомендуется: оптимизация размеров, Play Feature/Asset Delivery |
| Прямая загрузка/альтернативные сторы | APK | Совместимость с установкой по ссылке или MDM |
| Внутреннее тестирование | APK | Быстрее установить на устройство |
Не публикуйте debug‑сборки в магазины — они содержат отладочные данные и могут быть уязвимы.
Подпись релиза: keystore, signingConfig и безопасное хранение
- Keystore: контейнер (.jks/.keystore) с ключом (alias). Для Google Play есть upload key и App Signing key; upload key нужен для загрузки.
- Создание keystore: через Android Studio (Build → Generate Signed Bundle / APK → Create new) или
keytool:
keytool -genkeypair -v -keystore keys/release.jks -alias release -keyalg RSA -keysize 2048 -validity 10000
- Настройка в Gradle (не храните пароли в VCS). Пример чтения из
local.properties:
val props = Properties().apply { load(rootProject.file("local.properties").inputStream()) }
android {
signingConfigs {
create("release") {
storeFile = file(props["storeFile"] as String)
storePassword = props["storePassword"] as String
keyAlias = props["keyAlias"] as String
keyPassword = props["keyPassword"] as String
}
}
buildTypes { getByName("release") { signingConfig = signingConfigs["release"] } }
}
- CI: передавайте секреты через переменные окружения/секреты и подставляйте в build pipeline, не встраивайте пароли в репозиторий.
Потеря keystore или пароля может сделать невозможным публикацию обновлений в некоторых сторах. Делайте несколько резервных копий в защищённых хранилищах.
Генерация подписанного APK/AAB в Android Studio
- Через UI: Build → Generate Signed Bundle / APK → выбрать AAB или APK → указать keystore и variant → Finish.
- Через CLI: запустите
./gradlew bundleReleaseили./gradlew assembleRelease. - Для массовых сборок и автоматизации используйте CI (GitHub Actions, GitLab CI, Jenkins) с задачами, которые вызывают Gradle и сохраняют артефакты.
Частые ошибки
- Пароли keystore в репозитории — риск компрометации.
- Публикация debug‑варианта — баги и утечки логов.
- Пропущенные proguard/r8 правила — краш из‑за обфускации.
- Неверный applicationId/версионирование — обновление в Play может не примениться.
- Неправильный alias/пароль при загрузке в Play — отклонение артефакта.
FAQ
- Как проверить, подписан ли APK? —
jarsigner -verify -certs app-release.apkилиapksigner verify. - Можно ли поменять keystore после публикации? — Нет: смена ключа делает невозможным обновление существующего приложения в большинстве случаев; в Google Play можно запросить смену через upload key, но App Signing key остаётся у Google.
- Что выбрать: AAB или APK? — Для Google Play — AAB; для прямой установки — APK.
- Где хранить пароли? — В менеджере паролей или секретах CI; local.properties только локально и не в VCS.
Если нужно, могу привести готовый пример build.gradle.kts с настройкой flavors, signingConfig (через env vars) и примером GitHub Actions для безопасной сборки и выпуска.