Сборка Android‑приложения: шаги от Gradle до подписанного APK/AAB

Короткий ответ: настройте buildTypes и (при необходимости) productFlavors в Gradle, пропишите signingConfig (через защищённые свойства), соберите релизный артефакт командой ./gradlew bundleRelease (AAB) или ./gradlew assembleRelease (APK) либо через Build → Generate Signed Bundle / APK в Android Studio и подпишите keystore; храните keystore и пароли вне репозитория.

Подготовка проекта и ключевые настройки Gradle

  1. Обновите Android Studio и Android Gradle Plugin; проверьте compileSdk/targetSdk.
  2. Разделяйте debug/release — включите R8/obfuscation только в релизе, отключите логирование и тестовые ключи.
  3. Пример важных полей в модуле 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")
    }
  }
}
  1. Если нужно несколько окружений — добавьте 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
  • Путь к артефактам:
    • APK: app/build/outputs/apk/<variant>/app-<variant>.apk
    • AAB: app/build/outputs/bundle/<variant>/app-<variant>.aab

Таблица: что собирать для разных сценариев

СценарийФорматКогда использовать
Публикация в Google PlayAABРекомендуется: оптимизация размеров, Play Feature/Asset Delivery
Прямая загрузка/альтернативные сторыAPKСовместимость с установкой по ссылке или MDM
Внутреннее тестированиеAPKБыстрее установить на устройство

Не публикуйте debug‑сборки в магазины — они содержат отладочные данные и могут быть уязвимы.

Подпись релиза: keystore, signingConfig и безопасное хранение

  1. Keystore: контейнер (.jks/.keystore) с ключом (alias). Для Google Play есть upload key и App Signing key; upload key нужен для загрузки.
  2. Создание 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
  1. Настройка в 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"] } }
}
  1. 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 для безопасной сборки и выпуска.