Введение / Зачем это нужно
Подготовка к релизу — это ключевой этап перед публикацией Android-приложения в Google Play. Он гарантирует, что ваша сборка будет подписана, оптимизирована и соответствовать требованиям магазина. После выполнения этого руководства вы получите готовый к загрузке APK или AAB-файл, который корректно отображает версию и может быть установлен на устройства пользователей.
Требования / Подготовка
Перед началом убедитесь, что у вас установлено:
- Android Studio (версия Flamingo | 2022.2.1 или новее) с Android SDK (API level 33+).
- Gradle (версия 7.4+), интегрированный в проект.
- Java Development Kit (JDK) 11 или выше для использования
keytool. - Готовый проект Android, который вы хотите выпустить.
- Доступ к компьютеру с правами администратора (для некоторых операций с keystore).
Если у вас уже есть keystore для подписания, подготовьте его расположение, alias и пароли. Если keystore нет — вы создадите его на одном из шагов.
Шаг 1: Настройте versionCode и versionName
Каждая публичная версия приложения в Google Play должна иметь уникальные versionCode (целое число) и понятный versionName (строка). Эти параметры задаются в файле build.gradle модуля app.
- Откройте файл
app/build.gradle(илиbuild.gradle.ktsдля Kotlin DSL). - Найдите блок
defaultConfigвнутриandroid. - Обновите значения:
versionCode: увеличьте на 1 относительно предыдущей публикации (например, с 1 на 2).versionName: задайте читаемую версию, например"1.0.1"или"2.0 beta".
Пример для Groovy DSL:
android {
defaultConfig {
applicationId "com.example.myapp"
minSdkVersion 21
targetSdkVersion 33
versionCode 2
versionName "1.0.1"
}
}
Для Kotlin DSL:
android {
defaultConfig {
applicationId = "com.example.myapp"
minSdk = 21
targetSdk = 33
versionCode = 2
versionName = "1.0.1"
}
}
⚠️ Важно:
versionCodeдолжен быть целым числом и строго возрастать. Google Play не примет сборку с тем же или меньшимversionCode, чем у текущей версии.
Шаг 2: Создайте или используйте существующий keystore
Keystore — это файл, содержащий криптографический ключ для подписания APK/AAB. Без него вы не сможете обновлять приложение в Google Play. Если keystore уже есть, перейдите к шагу 3.
- Откройте терминал (в Android Studio или отдельный).
- Выполните команду
keytool(входит в JDK). Пример для создания keystore с валидностью 25 лет:keytool -genkeypair -v -keystore my-release-key.jks -alias my-key-alias -keyalg RSA -keysize 2048 -validity 9125-keystore my-release-key.jks— имя файла keystore (можно.keystoreили.jks).-alias my-key-alias— псевдоним ключа (запомните его).-validity 9125— срок действия в днях (25 лет ≈ 9125 дней).
- Следуйте инструкциям: введите пароль keystore, информацию о владельце (имя, организация, страна и т.д.). Подтвердите пароли.
💡 Совет: Храните keystore в надежном месте (не в проекте, не в облаке без шифрования). Создайте резервную копию. Потеря keystore означает невозможность обновлять приложение.
Шаг 3: Настройте подписание release-сборки
В build.gradle модуля app добавьте конфигурацию подписания для сборки release.
- В том же файле
build.gradleвнутри блокаandroidдобавьтеsigningConfigs:android { signingConfigs { release { storeFile file('path/to/my-release-key.jks') storePassword 'your_keystore_password' keyAlias 'my-key-alias' keyPassword 'your_key_password' } } buildTypes { release { signingConfig signingConfigs.release minifyEnabled true // опционально: включите ProGuard/R8 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
Замените'path/to/my-release-key.jks','your_keystore_password','my-key-alias','your_key_password'на реальные значения. - Для безопасности не храните пароли в открытом виде. Используйте переменные окружения или
gradle.properties:- В
gradle.properties(в корне проекта или~/.gradle/):MY_KEYSTORE_PASSWORD=your_keystore_password MY_KEY_PASSWORD=your_key_password - В
build.gradle:storePassword System.getenv("MY_KEYSTORE_PASSWORD") keyPassword System.getenv("MY_KEY_PASSWORD")
- В
⚠️ Важно: Убедитесь, что release-сборка использует
signingConfigs.release. Если вы пропустите это, сборка будет не подписана и не приметься в Google Play.
Шаг 4: Соберите release APK или AAB
Вы можете сгенерировать подписанную сборку через Android Studio или командную строку.
Способ A: Через Android Studio (рекомендуется для новичков)
- В меню выберите Build → Generate Signed Bundle / APK.
- В мастере:
- Выберите Android App Bundle (AAB) или APK. Для новых приложений Google требует AAB.
- Нажмите Next.
- Выберите модуль (обычно
app). - В разделе Key store path укажите путь к keystore или создайте новый.
- Введите пароли и alias.
- Выберите release в Build Variant.
- Нажмите Finish.
- Готовый файл будет в
app/build/outputs/bundle/release/(для AAB) илиapp/build/outputs/apk/release/(для APK).
Способ B: Через Gradle (для автоматизации)
- Для AAB:
./gradlew bundleRelease - Для APK:
./gradlew assembleRelease
Файлы появятся в тех же директориях, что и при сборке через Android Studio.
💡 Совет: Если сборка завершилась с ошибкой, проверьте логи в
Build→Build Outputв Android Studio или в терминале. Распространенные ошибки: неверный пароль keystore, отсутствие keystore-файла.
Шаг 5: Проверьте и оптимизируйте сборку
После сборки убедитесь, что APK (если выбран APK) оптимизирован с помощью zipalign. AABB автоматически оптимизируются Google Play, но для APK это обязательно.
- Для APK: Если вы использовали
assembleRelease, APK может быть не выровнен. Выполните:zipalign -v -p 4 app/build/outputs/apk/release/app-release-unsigned.apk app-release-aligned.apk
Затем подпишите, если еще не подписано (но в шаге 3 мы настроили подписание, поэтомуapp-release.apkуже подписан и выровнен, если вbuild.gradleвключенzipAlignEnabled— он включен по умолчанию для release). Проверьте:zipalign -c -v 4 app/build/outputs/apk/release/app-release.apk
Если выводVerification successful, APK готов. - Для AAB: Проверьте целостность:
jarsigner -verify -verbose -certs app/build/outputs/bundle/release/app-release.aab
Должно бытьjar verified.. - Тестирование: Установите сборку на устройство или эмулятор:
adb install -r app/build/outputs/apk/release/app-release.apk
Или для AAB используйте внутреннее тестирование в Google Play Console (см. связанный гайд).
Проверка результата
После выполнения всех шагов убедитесь, что:
- Файл существует: APK или AAB находится в указанной директории.
- Подпись верна: Выполните
jarsigner -verify -verbose -certs ваш_файл.apk(для APK) илиaab(для AAB). Должны быть указаны ваши данные сертификата. - Zipalign для APK:
zipalign -c -v 4 ваш_файл.apkвозвращаетVerification successful. - versionCode и versionName: Откройте
AndroidManifest.xmlв скомпилированном APK (можно черезaapt dump badging ваш_файл.apk) и проверьтеversionCodeиversionName. - Установка: Приложение устанавливается на устройство без ошибок и запускается.
Возможные проблемы
Ошибка: "Keystore was tampered with, or password was incorrect"
- Причина: Неверный пароль keystore или alias при сборке.
- Решение: Проверьте пароли в
build.gradleили в переменных окружения. Убедитесь, что используете правильный alias.
Ошибка: "Version code must be greater than previous"
- Причина:
versionCodeне увеличен или совпадает с предыдущей версией в Google Play. - Решение: Увеличьте
versionCodeвbuild.gradle(например, на 1) и пересоберите.
Ошибка: "Execution failed for task ':app:validateSigningRelease'. > Keystore file not found"
- Причина: Указан неверный путь к keystore в
build.gradle. - Решение: Используйте абсолютный путь или
file('relative/path'). Проверьте, что файл существует.
Проблема: AAB или APK не оптимизированы, большой размер
- Причина: Не включен
minifyEnabledилиshrinkResourcesдля release-сборки. - Решение: В
build.gradleдляreleaseдобавьте:
Пересоберите. Размер уменьшится, но протестируйте приложение после обфускации.buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }
Проблема: Установка release-сборки падает с ошибкой "App not installed"
- Причина: Несовместимость подписи (например, пытаетесь установить поверх debug-сборки), или поврежденный APK.
- Решение: Удалите debug-версию с устройства. Проверьте zipalign и подпись. Убедитесь, что
minSdkVersionсоответствует устройству.
Если проблема не решена, проверьте логи adb logcat при установке или обратитесь к другим гайдам по ошибкам установки.