Перейти к содержимому

Инструкции по настройке · Expo

Закрытое тестирование Google Play для приложений на Expo (EAS)

Для Expo-проектов, которые собираются в EAS Build: получите продакшен-.aab, доверьте хранилище ключей EAS, отправьте бандл в закрытый трек и удержите 12 тестировщиков 14 дней. Bare React Native без EAS? Смотрите инструкцию для React Native.

Сборка
eas build -p android --profile production
Код версии
eas.json → autoIncrement
Целевой API
targetSdkVersion ≥ 36

Соберите продакшен-бандл через EAS

  1. Задайте имя пакета

    В app.json (или app.config.js) укажите android.package, например com.yourcompany.app. После первой загрузки его нельзя изменить.

  2. Установите и настройте EAS

    Установите CLI, войдите и создайте eas.json командами ниже. В созданном файле уже есть профиль production.

  3. Соберите

    Запустите продакшен-сборку. Профиль production по умолчанию создаёт Android App Bundle на серверах EAS; чтобы собрать на своём компьютере, добавьте --local.

  4. Скачайте бандл

    Когда сборка завершится, скачайте .aab со страницы сборки на expo.dev или по ссылке в терминале.

Terminal
npm install -g eas-cli
eas login
eas build:configure
Terminal
eas build -p android --profile production

Не задавайте android.buildType значение apk в профиле production. APK нельзя отправить в Google Play.

Учётные данные: ключ загрузки хранит EAS

При первой сборке для Android EAS предлагает создать хранилище ключей и хранит его на серверах Expo; следующие сборки используют его же. Для Google Play это хранилище — ваш ключ загрузки. При загрузке первого бандла настраивается подписание приложений в Google Play, и ключ подписи приложения хранит Google.

Команда eas credentials показывает настроенное хранилище, позволяет скачать резервную копию или заменить его. Храните копию в надёжном месте: она понадобится, если вы когда-нибудь будете собирать локально или уйдёте с EAS.

Terminal
eas credentials -p android

Не создавайте новое хранилище ключей после первой загрузки. Бандл, подписанный другим ключом загрузки, будет отклоняться, пока вы не запросите сброс ключа загрузки в Play Console.

Код версии и целевой уровень API

Play Console отклоняет любой бандл с уже использованным versionCode. Проще всего доверить его EAS: он хранит значение удалённо и увеличивает его при каждой продакшен-сборке:

eas.json
{
  "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, а не через обновление по воздуху.
Terminal
eas submit -p android --profile production

Выясните, почему сборка падает у тестировщиков

Production-сборка ведёт себя не так, как Expo Go и development-сборки: нет dev-сервера, JavaScript минифицирован, и доступны только нативные модули, которые вы вкомпилировали. Воспроизведите то, что видят тестировщики, прежде чем строить догадки.

  1. Запустите production-режим локально

    npx expo start --no-dev --minify выполняет ваш JavaScript так же, как релизный бандл, и показывает ошибки, которых режим разработки никогда не выдаёт.

  2. Читайте нативные логи

    Подключите телефон по USB и запустите adb logcat. Нативные логи часто показывают причину, когда JavaScript error boundary не перехватывает проблему.

  3. Проверьте Play Console

    Сбои у тестировщиков появляются в разделе Мониторинг и улучшение → Android Vitals → Сбои и ANR. Отчёт перед запуском, который Google автоматически создаёт после загрузки, тоже запускает приложение на тестовых устройствах и перечисляет найденные сбои.

  4. Сделайте ошибки 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 дней и заявка на продакшен, шаг за шагом на одной странице.

Открыть шаги в Play Console

Быстрые исправления: новые сборки и EAS Update

С удалённым версионированием просто снова запустите продакшен-сборку и загрузите или отправьте её в закрытый трек; код версии увеличится сам.

Terminal
eas build -p android --profile production

Для исправлений только в JavaScript EAS Update может доставить новый бандл без повторной отправки в магазин. Политика Google Play о злоупотреблении устройствами и сетями разрешает так обновлять код, который выполняется в интерпретаторе или виртуальной машине, например JavaScript; загружать нативный код она не разрешает. Используйте обновления для настоящих исправлений и не выходите за рамки того, что делает проверенная сборка.

Terminal
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 может заметить ошибку и откатиться к предыдущему рабочему обновлению. Также можно заново опубликовать последнее стабильное обновление поверх неудачного.

Источники

Технические детали сверены с официальной документацией ниже. Меню и значения по умолчанию меняются от версии к версии; если сомневаетесь, ориентируйтесь на официальную страницу.

Впервые слышите о правиле 12 тестировщиков?

Общее руководство объясняет требование Google, как день за днём проходит кампания TestBunny и что мы можем и не можем гарантировать.

Читать общее руководство

Нужны 12 настоящих тестировщиков на 14 дней?

Добавьте приложение и ссылку на закрытое тестирование, выберите Starter (15 тестировщиков) или Pro (25 тестировщиков) и следите за активностью каждого тестировщика по дням в своей панели.

TestBunny не связан с Google. Тестировщики получают кредиты, а не деньги. Никто не может гарантировать решение Google о доступе к продакшену, и мы тоже.