Соберите подписанный app bundle
Соберите веб-приложение
Запустите продакшен-сборку веба (в большинстве проектов Ionic на Angular, React и Vue это
npm run build), чтобы папка, указанная какwebDirв конфигурации Capacitor, была свежей.Синхронизируйте с Android
npx cap sync androidкопирует веб-сборку в нативный проект и обновляет нативные плагины. Пропустите этот шаг — и выпустите вчерашний JavaScript.Откройте Android Studio
Выполните
npx cap open android.Сгенерируйте бандл
Выберите Build → Generate Signed Bundle/APK, затем Android App Bundle, выберите или создайте хранилище ключей, вариант release и нажмите Create.
npm run build
npx cap sync android
npx cap open androidПредпочитаете командную строку или CI? npx cap build android собирает подписанный бандл с --androidreleasetype AAB и параметрами хранилища ключей. Передавайте пароли через переменные окружения, а не через файл в репозитории:
npx cap build android --androidreleasetype AAB \
--keystorepath ../upload-keystore.jks --keystorealias upload \
--keystorepass "$KEYSTORE_PASS" --keystorealiaspass "$KEY_PASS"Ключ загрузки и подписание приложений в Google Play
Для новых приложений Google Play требует подписание в Google Play. Хранилище, которое вы создаёте в мастере Android Studio (Create new) или передаёте в npx cap build, — это ваш ключ загрузки; отдельный ключ подписи приложения после первой загрузки хранит Google.
Android Studio рекомендует срок действия нового ключа не меньше 25 лет. Храните файл .jks вне папки android/ на случай, если придётся пересоздать нативный проект, и сделайте его резервную копию вместе с обоими паролями. Если ключ загрузки потерян, сброс можно запросить в Play Console.
Если вы храните параметры сборки в конфигурации Capacitor, не записывайте пароли в файл, который попадает в репозиторий. Конфигурация — часть репозитория.
Код версии и целевой уровень API
Capacitor не берёт версию из package.json. Значения, которые видит Google Play, находятся в android/app/build.gradle; увеличивайте versionCode перед каждой загрузкой:
android {
defaultConfig {
versionCode 2
versionName "1.0.1"
}
}С 31 августа 2026 года новые приложения и обновления должны быть нацелены на Android 16 (уровень API 36). Capacitor задаёт targetSdkVersion в android/variables.gradle, и каждая мажорная версия поддерживает ровно одно значение: Capacitor 8 — 36, Capacitor 7 — 35. Собственные значения не поддерживаются, поэтому путь к API 36 — переход на Capacitor 8 вместе с плагинами, а не правка числа.
ext {
// ...
targetSdkVersion = 36
}Ловушки Ionic и Capacitor
- Забытый live reload.
server.urlв конфигурации Capacitor заставляет приложение загружать адрес вашего компьютера разработки. Тестировщики видят пустой экран. Удалите его перед релизной сборкой. - Устаревшие веб-ресурсы. Если сгенерировать бандл в Android Studio без предварительного
npx cap sync android, выйдет предыдущая веб-сборка. - Плагины другой мажорной версии. Все пакеты
@capacitor/*и плагины сообщества должны совпадать по мажорной версии с@capacitor/android. Иначе будут ошибки нативной сборки или сбои во время работы. - Незашифрованные запросы. Android по умолчанию блокирует обычный трафик
http://. Продакшен-сборки должны обращаться только к HTTPS API. - Нативные плагины и страницы 16 КБ. Плагины с библиотеками
.soдолжны поддерживать страницы памяти 16 КБ. Play Console предупреждает об этом, а с 1 февраля 2027 года обновления без такой поддержки нельзя будет выпустить. - Проверка только в браузере. Кнопка «Назад», разрешения и глубокие ссылки в Android WebView ведут себя иначе. Перед загрузкой установите релизную сборку на реальное устройство.
Отлаживайте то, что тестировщики видят в WebView
Большинство проблем релизной сборки Capacitor живут в веб-слое, поэтому лучший вход — уже знакомые вам инструменты браузера. В релизной сборке они отключены: webContentsDebuggingEnabled по умолчанию равен false, а собственное логирование Capacitor подчиняется loggingBehavior со значением по умолчанию debug, поэтому релизные сборки молчат.
Воспроизведите в отладочной сборке
Запустите приложение на телефоне из Android Studio, откройте
chrome://inspectв Chrome на компьютере и выберите WebView. У вас будут консоль, панель сети и точки останова для веб-кода. В Edge так же работаетedge://inspect.Исследуйте релизную сборку только локально
Если ошибка появляется только в релизе, временно установите
webContentsDebuggingEnabledвtrueв сборке, которую ставите себе сами. Никогда не загружайте такую сборку: она делает веб-содержимое приложения отлаживаемым на любом устройстве.Собирайте нативные сбои в Play Console
Сбои в Java-коде Capacitor или в нативных плагинах появляются в разделе Мониторинг и улучшение → Android Vitals → Сбои и ANR. При включённом R8 файл сопоставления внутри
.aabделает их читаемыми.
const config: CapacitorConfig = {
// ...
android: {
// Never ship this to Google Play
webContentsDebuggingEnabled: true,
},
};Спрашивайте у тестировщиков модель устройства, версию Android и версию Android System WebView. Многие ошибки, которые бывают только в WebView, зависят от этого последнего числа, а всё ниже android.minWebViewVersion выходит за пределы того, что поддерживает ваше приложение.
Коротко о Play Console: от закрытого теста до продакшена
Когда бандл Ionic / Capacitor собран и подписан, всё остальное происходит в Play Console и одинаково для любого фреймворка. Здесь краткий чек-лист; каждое меню и экран описаны в полном руководстве по Play Console.
- Завершите настройку приложения на панели управления: политика конфиденциальности, доступ к приложению, реклама, возрастной рейтинг, целевая аудитория, безопасность данных и страница в Play Маркете.
- Создайте выпуск для закрытого теста в разделе Тестирование и выпуск → Тестирование → Закрытое тестирование: выберите страны тестировщиков, загрузите
.aabи отправьте на проверку. - Добавьте тестировщиков через Google Группу на вкладке Тестировщики и поделитесь ссылкой opt-in. Она заработает, когда у трека появится статус Опубликовано.
- Держите не менее 12 тестировщиков с opt-in 14 дней подряд. Внутреннее тестирование не засчитывается, а у того, кто вышел и вернулся, отсчёт 14 дней начинается заново.
- Выпустите хотя бы одно обновление во время теста и запишите, что нашли тестировщики и что вы изменили.
- Подайте заявку на доступ к продакшену с панели управления и ответьте на три раздела о тесте, приложении и готовности. Решение принимает Google; никто не может гарантировать одобрение.
Учитывайте выбывших: наберите больше 12 тестировщиков, чтобы уход одного человека не сдвинул ваши сроки. Все шаги в Play Console.
Полное руководство по Play Console
Закрытый трек, Google Группа и ссылка opt-in, правило 12 тестировщиков / 14 дней и заявка на продакшен, шаг за шагом на одной странице.
Исправления и место живых обновлений
Пересоберите веб-приложение, синхронизируйте, увеличьте versionCode и сгенерируйте новый подписанный бандл для того же закрытого трека:
npm run build
npx cap sync android
npx cap open androidПолитика Google Play о злоупотреблении устройствами и сетями запрещает приложению обновляться в обход Google Play, но делает исключение для кода, который выполняется в интерпретаторе или виртуальной машине, например JavaScript в WebView. Поэтому и существуют сервисы живых обновлений для веб-слоя. Нативный код, плагины и разрешения всегда требуют нового бандла через Google Play.
Во время закрытого теста самый прямой путь — новый versionCode в закрытом треке: он проходит проверку, тестировщики получают его через Google Play, и он виден в истории выпусков. Если вы дополнительно используете сервис живых обновлений, оставьте его для настоящих исправлений и держите веб-сборку в закрытом треке синхронной с ним.
- Помните о минимальной версии WebView.
android.minWebViewVersionпо умолчанию равен60и не может быть ниже55. Тестировщикам с проблемами стоит сначала обновить Android System WebView из Google Play. - Никакого смешанного контента.
android.allowMixedContentпо умолчанию выключен и не предназначен для продакшена. Отдавайте все API и ресурсы по HTTPS и оставьтеserver.cleartextв значении по умолчаниюfalse. - Синхронизируйте перед каждой сборкой. Каждое исправление требует
npx cap sync androidпосле веб-сборки, иначе в новом бандле останется старый JavaScript.
Частые вопросы
Можно ли использовать Chrome DevTools на телефоне тестировщика?
Не со сборкой, установленной из Google Play: релизные сборки не включают отладку WebView. Попросите шаги воспроизведения, установите ту же версию себе с включённой отладкой и исследуйте её через chrome://inspect.
Почему тестировщики видят пустой экран?
Обычно потому, что в бандле остался server.url от live reload, или запрос не проходит по обычному http://. Сначала проверьте конфигурацию Capacitor и панель сети в отладочной сборке.
Можно ли остаться на Capacitor 7?
Не для новых загрузок после срока целевого API: каждая основная версия Capacitor поддерживает ровно одно значение targetSdkVersion, Capacitor 7 использует 35, а Google Play требует 36. Запланируйте переход на Capacitor 8 вместе с плагинами до начала теста.
Нужен ли Android Studio для сборки бандла?
Нет. npx cap build android собирает подписанный .aab из командной строки с параметрами хранилища ключей, и это проще повторять в CI. В обоих случаях сначала выполните веб-сборку и npx cap sync android.
Источники
Технические детали сверены с официальной документацией ниже. Меню и значения по умолчанию меняются от версии к версии; если сомневаетесь, ориентируйтесь на официальную страницу.
- Capacitor: CLI build command
- Capacitor: Setting the target SDK
- Capacitor: Deploying to Google Play
- Android Developers: Sign your app
- Android Developers: Target API level requirements
- Capacitor: Configuration (android options, server options)
- Capacitor: Debugging (chrome://inspect)
- Play Policy: Device and Network Abuse
- Play Console Help: App testing requirements for new personal developer accounts
- Play Console Help: Set up an open, closed, or internal test
- Play Console Help: Deobfuscate or symbolicate crash stack traces
Впервые слышите о правиле 12 тестировщиков?
Общее руководство объясняет требование Google, как день за днём проходит кампания TestBunny и что мы можем и не можем гарантировать.
Читать общее руководство