Дополнительные пакеты Firebase App Distribution для iOS и Android SDK позволяют отображать внутри приложения оповещения для тестировщиков о новых сборках приложения, доступных для установки. В этом руководстве объясняется, как использовать App Distribution для iOS и Android SDK для создания и настройки оповещений о новых сборках для тестировщиков.
Прежде чем начать
Если вы еще этого не сделали, добавьте Firebase в свой Android-проект .
Шаг 1 : включите API App Distribution Tester
- Выберите свой проект в консоли Google Cloud . 
- В разделе Firebase App Testers API нажмите Включить . 
Шаг 2 : Добавьте App Distribution в свое приложение
App Distribution Android SDK состоит из двух библиотек:
-  firebase-appdistribution-api— библиотека, работающая только с API, которую можно включить во все варианты сборки .
-  firebase-appdistribution— полная реализация SDK (необязательно).
Библиотека, работающая только с API, позволяет вашему коду обращаться к SDK. Эти обращения не будут иметь никакого эффекта, если отсутствует полная реализация SDK.
 Объявите зависимость для App Distribution Android SDK в файле Gradle вашего модуля (уровня приложения) (обычно <project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle ). Чтобы избежать включения функции самообновления полной реализации SDK в ваши сборки Play , добавьте зависимость библиотеки API-only ко всем вариантам сборки . Добавляйте полную реализацию SDK только в варианты, предназначенные исключительно для предварительного тестирования.
dependencies {
    // ADD the API-only library to all variants
    implementation("com.google.firebase:firebase-appdistribution-api:16.0.0-beta17")
    // ADD the full SDK implementation to the "beta" variant only (example)
    betaImplementation("com.google.firebase:firebase-appdistribution:16.0.0-beta17")
}
Ищете модуль библиотеки, специфичный для Kotlin? Начиная с релиза за октябрь 2023 года , разработчики как Kotlin, так и Java смогут использовать основной модуль библиотеки (подробности см. в разделе часто задаваемых вопросов об этой инициативе ).
Шаг 3 : Настройте оповещения в приложении
App Distribution Android SDK предоставляет следующие способы настройки оповещений о сборке приложения для ваших тестировщиков:
- Базовая конфигурация оповещений, включающая готовые диалоговые окна обновления и входа в приложение для отображения тестировщикам.
- Расширенная конфигурация оповещений, позволяющая вам настраивать собственный пользовательский интерфейс.
Если вы впервые используете App Distribution Android SDK, мы рекомендуем использовать базовую конфигурацию .
Базовая конфигурация
 Используйте updateIfNewReleaseAvailable , чтобы отобразить готовое диалоговое окно включения оповещений для тестировщиков, которые ещё не включили оповещения, а затем проверить, доступна ли новая сборка. При вызове метод выполняет следующую последовательность:
- Проверяет, включил ли тестировщик оповещения. Если тестировщик ещё не включил оповещения, метод предлагает ему войти в App Distribution , используя свой аккаунт Google. 
- Проверяет наличие новых доступных сборок, которые может установить тестер. 
- Отображает предварительно созданное оповещение, предлагающее тестировщику обновиться. 
- Если новая сборка представляет собой Android App Bundle (AAB), перенаправляет тестировщика в Google Play для завершения процесса обновления. - Если новая сборка представляет собой пакет приложений Android (APK), SDK загружает её в фоновом режиме и предлагает тестировщику установить её после завершения загрузки. SDK отправляет пользователю уведомления о ходе загрузки с помощью - NotificationManager. Вы также можете добавить собственный индикатор хода выполнения, прикрепив обработчик- onProgressUpdateк задаче- updateIfNewReleaseAvailable.
 Вы можете вызвать updateIfNewReleaseAvailable в любой момент вашего приложения. Например, вы можете вызвать updateIfNewReleaseAvailable во время метода onResume основной активности приложения.
В следующем примере проверяется, включены ли у тестировщика оповещения и есть ли у него доступ к новой сборке. Если эти условия выполнены, отображается диалоговое окно, когда сборка становится доступной для установки:
Kotlin
// Copy and paste this into any part of your app - for example, in your main
// activity's onResume method.
val firebaseAppDistribution = FirebaseAppDistribution.getInstance()
firebaseAppDistribution.updateIfNewReleaseAvailable()
    .addOnProgressListener { updateProgress ->
      // (Optional) Implement custom progress updates in addition to
      // automatic NotificationManager updates.
    }
    .addOnFailureListener { e ->
      // (Optional) Handle errors.
      if (e is FirebaseAppDistributionException) {
        when (e.errorCode) {
          Status.NOT_IMPLEMENTED -> {
            // SDK did nothing. This is expected when building for Play.
          }
          else -> {
            // Handle other errors.
          }
        }
      }
    }
Java
// Copy and paste this into any part of your app - for example, in your main
// activity's onResume method.
FirebaseAppDistribution firebaseAppDistribution = FirebaseAppDistribution.getInstance();
firebaseAppDistribution.updateIfNewReleaseAvailable()
    .addOnProgressListener(updateProgress -> {
      // (Optional) Implement custom progress updates in addition to
      // automatic NotificationManager updates.
    })
    .addOnFailureListener(e -> {
      // (Optional) Handle errors.
      if (e instanceof FirebaseAppDistributionException) {
        switch (((FirebaseAppDistributionException)e).getErrorCode()) {
          case NOT_IMPLEMENTED:
            // SDK did nothing. This is expected when building for Play.
            break;
          default:
            // Handle other errors.
            break;
        }
      }
    });
Расширенная конфигурация
Расширенная конфигурация входа
 Методы signInTester и isTesterSignedIn предоставляют вам больше гибкости в настройке процесса входа тестировщика, чтобы он лучше соответствовал внешнему виду и стилю вашего приложения.
 В следующем примере проверяется, вошел ли тестировщик уже в свою учетную запись App Distribution . Это позволяет вам отображать пользовательский интерфейс входа только для тех тестировщиков, которые еще не вошли в систему. После того, как тестировщик войдет в систему, вы можете вызвать updateIfNewReleaseAvailable , чтобы проверить, есть ли у него доступ к новой сборке. 
Kotlin
// Only show sign-in UI if this is the "beta" variant (example).
if (BuildConfig.BUILD_TYPE == "beta" && !firebaseAppDistribution.isTesterSignedIn) {
    // Start your sign-in UI here.
}
// Only check for updates if the tester is already signed in (do not prompt).
if (firebaseAppDistribution.isTesterSignedIn) {
    firebaseAppDistribution.updateIfNewReleaseAvailable().addOnFailureListener {
        // Handle failed update.
    }
}
Java
// Only show sign-in UI if this is the "beta" variant (example).
if (BuildConfig.BUILD_TYPE == "beta" && !firebaseAppDistribution.isTesterSignedIn()) {
    // Start your sign-in UI here.
}
// Only check for updates if the tester is already signed in (do not prompt).
if (firebaseAppDistribution.isTesterSignedIn()) {
    firebaseAppDistribution.updateIfNewReleaseAvailable().addOnFailureListener( e -> {
        // Handle failed update.
    });
}
 Из пользовательского интерфейса входа, когда тестировщик решит продолжить, вызовите signInTester() : 
Kotlin
firebaseAppDistribution.signInTester().addOnSuccessListener {
  // Handle successful sign-in.
}.addOnFailureListener {
  // Handle failed sign-in.
});
Java
firebaseAppDistribution.signInTester().addOnSuccessListener( unused -> {
  // Handle successful sign-in.
}).addOnFailureListener(e -> {
  // Handle failed sign-in.
});
Расширенная конфигурация обновления
 Методы checkForNewRelease и updateApp предоставляют больше гибкости в настройке условий обновления для тестировщика. Вы также можете настроить встроенный диалог обновления и индикатор хода загрузки, чтобы они лучше соответствовали внешнему виду вашего приложения.
 Обратите внимание, что updateApp не отображает ход загрузки. Это означает, что вам необходимо реализовать собственный индикатор хода загрузки с помощью NotificationManager , какого-либо встроенного в приложение отображения статуса или иного подхода.
 В следующем примере проверяется доступность нового релиза, а затем отображается пользовательский интерфейс. Перед вызовом checkForNewRelease и updateApp убедитесь, что тестировщик вошел в систему, используя расширенную конфигурацию входа . 
Kotlin
firebaseAppDistribution.checkForNewRelease().addOnSuccessListener { release ->
    if (release != null) {
        // New release available. Start your update UI here.
    }
}.addOnFailureListener {
    // Handle failed check for new release. Fails with Status#NOT_IMPLEMENTED
    // if built for Play.
}
Java
firebaseAppDistribution.checkForNewRelease().addOnSuccessListener(release -> {
    if (release != null) {
        // New release available. Start your update UI here.
    }
}).addOnFailureListener(e -> {
    // Handle failed check for new release. Fails with Status#NOT_IMPLEMENTED
    // if built for Play.
});
 Когда тестировщик решит продолжить обновление из вашего пользовательского интерфейса обновления, вызовите updateApp() : 
Kotlin
firebaseAppDistribution.updateApp()
    .addOnProgressListener { updateState ->
      // Use updateState to show update progress.
    }
Java
firebaseAppDistribution.updateApp()
    .addOnProgressListener(updateState -> {
      // Use updateState to show update progress.
    });
Шаг 4 : Создайте и протестируйте свою реализацию
Создайте свое приложение и протестируйте его реализацию, распространив сборку среди тестировщиков с помощью консоли Firebase .
Ознакомьтесь с руководством по устранению неполадок App Distribution , чтобы получить помощь по решению распространенных проблем, таких как:
- Тестировщик не получает оповещения в приложении
- Тестировщику предлагается войти в Google более одного раза