Соберите продакшен-бандл через EAS
Задайте имя пакета
В
app.json(илиapp.config.js) укажитеandroid.package, напримерcom.yourcompany.app. После первой загрузки его нельзя изменить.Установите и настройте EAS
Установите CLI, войдите и создайте
eas.jsonкомандами ниже. В созданном файле уже есть профильproduction.Соберите
Запустите продакшен-сборку. Профиль production по умолчанию создаёт Android App Bundle на серверах EAS; чтобы собрать на своём компьютере, добавьте
--local.Скачайте бандл
Когда сборка завершится, скачайте
.aabсо страницы сборки на expo.dev или по ссылке в терминале.
npm install -g eas-cli
eas login
eas build:configureeas build -p android --profile productionНе задавайте android.buildType значение apk в профиле production. APK нельзя отправить в Google Play.
Учётные данные: ключ загрузки хранит EAS
При первой сборке для Android EAS предлагает создать хранилище ключей и хранит его на серверах Expo; следующие сборки используют его же. Для Google Play это хранилище — ваш ключ загрузки. При загрузке первого бандла настраивается подписание приложений в Google Play, и ключ подписи приложения хранит Google.
Команда eas credentials показывает настроенное хранилище, позволяет скачать резервную копию или заменить его. Храните копию в надёжном месте: она понадобится, если вы когда-нибудь будете собирать локально или уйдёте с EAS.
eas credentials -p androidНе создавайте новое хранилище ключей после первой загрузки. Бандл, подписанный другим ключом загрузки, будет отклоняться, пока вы не запросите сброс ключа загрузки в Play Console.
Код версии и целевой уровень API
Play Console отклоняет любой бандл с уже использованным versionCode. Проще всего доверить его EAS: он хранит значение удалённо и увеличивает его при каждой продакшен-сборке:
{
"cli": { "appVersionSource": "remote" },
"build": {
"production": { "autoIncrement": true }
},
"submit": {
"production": {
"android": { "track": "alpha", "releaseStatus": "draft" }
}
}
}Когда appVersionSource равен remote, EAS хранит код версии сам и игнорирует android.versionCode в конфигурации приложения. Если вы уже загружали сборки вручную, один раз выполните eas build:version:set, чтобы EAS продолжил с вашего последнего номера.
С 31 августа 2026 года новые приложения и обновления должны быть нацелены на Android 16 (уровень API 36). Целевой SDK задаёт каждая версия Expo SDK, поэтому надёжное решение — версия SDK, нацеленная на 36. Плагин конфигурации expo-build-properties может переопределить targetSdkVersion, но делайте это, только если ваш SDK и библиотеки это поддерживают.
Ловушки Expo
- eas submit отправляет во внутренний тест. По умолчанию
eas submit -p androidотправляет сборку во внутренний трек, который не засчитывается в правило 12 тестировщиков. Укажите в профиле отправки"track": "alpha"(закрытый трек Google по умолчанию), как выше, или загрузите скачанный.aabв закрытый трек вручную. - Первые выпуски только черновиком. Пока приложение ни разу не публиковалось, Google принимает через API только выпуски-черновики. Оставьте
"releaseStatus": "draft"и завершите выпуск в Play Console. - Нужен сервисный аккаунт.
eas submitиспользует ключ сервисного аккаунта Google, который вы загружаете в EAS в учётные данные приложения. Без него загружайте вручную. - Сборки для разработки. Сборка с
developmentClient: trueждёт сервер разработки. Убедитесь, что тестировщики получают профиль production. - Пропавшие переменные окружения. Значения из игнорируемого git файла
.envне загружаются в EAS Build. Задайте продакшен-значения как переменные окружения EAS, иначе релизная сборка обратится не к тому бэкенду. - Нативные изменения требуют новой сборки. Разрешения, имя пакета и плагины конфигурации доходят до тестировщиков только с новой сборкой EAS, а не через обновление по воздуху.
eas submit -p android --profile productionВыясните, почему сборка падает у тестировщиков
Production-сборка ведёт себя не так, как Expo Go и development-сборки: нет dev-сервера, JavaScript минифицирован, и доступны только нативные модули, которые вы вкомпилировали. Воспроизведите то, что видят тестировщики, прежде чем строить догадки.
Запустите production-режим локально
npx expo start --no-dev --minifyвыполняет ваш JavaScript так же, как релизный бандл, и показывает ошибки, которых режим разработки никогда не выдаёт.Читайте нативные логи
Подключите телефон по USB и запустите
adb logcat. Нативные логи часто показывают причину, когда JavaScript error boundary не перехватывает проблему.Проверьте Play Console
Сбои у тестировщиков появляются в разделе Мониторинг и улучшение → Android Vitals → Сбои и ANR. Отчёт перед запуском, который Google автоматически создаёт после загрузки, тоже запускает приложение на тестовых устройствах и перечисляет найденные сбои.
Сделайте ошибки JavaScript читаемыми
С Sentry сборка EAS Build загружает source maps автоматически, как только
SENTRY_AUTH_TOKENзадан как секретная переменная окружения EAS. Послеeas updateзапуститеnpx sentry-expo-upload-sourcemaps dist, чтобы обновления тоже были читаемыми.
Нужна нативная отладка? npx expo prebuild -p android создаёт папку android, чтобы можно было подключить отладчик Android Studio. Потом удалите её, чтобы проектом и дальше управлял Expo.
Коротко о Play Console: от закрытого теста до продакшена
Когда бандл Expo собран и подписан, всё остальное происходит в 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 дней и заявка на продакшен, шаг за шагом на одной странице.
Быстрые исправления: новые сборки и EAS Update
С удалённым версионированием просто снова запустите продакшен-сборку и загрузите или отправьте её в закрытый трек; код версии увеличится сам.
eas build -p android --profile productionДля исправлений только в JavaScript EAS Update может доставить новый бандл без повторной отправки в магазин. Политика Google Play о злоупотреблении устройствами и сетями разрешает так обновлять код, который выполняется в интерпретаторе или виртуальной машине, например JavaScript; загружать нативный код она не разрешает. Используйте обновления для настоящих исправлений и не выходите за рамки того, что делает проверенная сборка.
eas update --channel production --message "Fix checkout crash" --environment production- Каналы.
eas update:configureзадаётchannelв профилях сборкиpreviewиproduction. Сборка получает только обновления, опубликованные в её канал. Начиная с SDK 55 флаг--environmentобязателен. - Версия среды выполнения. Обновление доходит только до сборок с той же версией среды выполнения. Политика
fingerprintменяет её при любом изменении, влияющем на нативную среду, поэтому несовместимые обновления маловероятны. - Перезапуски. Релизные сборки скачивают обновление в фоне и применяют его после перезапуска приложения. Попросите тестировщиков закрыть и снова открыть приложение, при необходимости дважды.
- Нативным изменениям нужна сборка. Новые разрешения, config plugins или нативные библиотеки попадают к тестировщикам только с новой production-сборкой в закрытом треке, которая к тому же остаётся видимым выпуском в Play Console.
Частые вопросы
Должны ли тестировщики пользоваться Expo Go?
Нет. Тестировщики устанавливают ваше приложение из Google Play по ссылке opt-in, то есть production-сборку EAS из закрытого трека. Expo Go и development-сборки нужны вам, а не вашим 12 тестировщикам.
Можно ли сначала поставить сборку на свой телефон?
Да. Добавьте "buildType": "apk" в раздел android профиля preview и запустите eas build -p android --profile preview. Файл .aab нельзя установить напрямую: он предназначен только для Google Play.
Какую политику версии среды выполнения выбрать?
appVersion проста, но если изменить нативный код, не повысив версию приложения, сборки и обновления перестанут совпадать. fingerprint автоматически отслеживает нативные изменения ценой более частых сборок, и для короткого закрытого теста это обычно подходит.
Что если обновление сломает приложение?
Если обновление вызывает нативный код, которого нет в сборке, expo-updates может заметить ошибку и откатиться к предыдущему рабочему обновлению. Также можно заново опубликовать последнее стабильное обновление поверх неудачного.
Источники
Технические детали сверены с официальной документацией ниже. Меню и значения по умолчанию меняются от версии к версии; если сомневаетесь, ориентируйтесь на официальную страницу.
- Expo: Submit to the Google Play Store
- Expo: App version management
- Expo: eas.json reference
- Expo: Managed credentials
- Android Developers: Target API level requirements
- Expo: EAS Update introduction
- Expo: Runtime versions and updates
- Expo: Debugging runtime issues
- Expo: Build APKs for Android emulators and devices
- Play Policy: Device and Network Abuse
- Play Console Help: Pre-launch reports
- 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 и что мы можем и не можем гарантировать.
Читать общее руководство