Distribute Android apps to testers using the Firebase CLI


This guide describes how to distribute APKs to testersusing theFirebase CLI. The CLI tool lets you specify testers andrelease notes for a build, then distributes the build accordingly.

Before you begin

If you haven't already,add Firebase to your Androidproject.

If you aren't using any other Firebase products, you only have to create aproject and register your app. However, if you decide to use additionalproducts in the future, be sure to complete all of the steps on the pagelinked above.

Caution: When you register your app with Firebase, make sure to enter the samepackage name as the app you're distributing. The package name value iscase-sensitive and cannot be changed for your app in Firebase after it'sregistered with your Firebase project.

Step 1. Build your app

When you're ready to distribute a pre-release version of your app to testers,build your APK using your normal process. You must sign the APK with your debugkey or app signing key.

Step 2. Distribute your app to testers

To distribute your app to testers, upload your app's file using theFirebase CLI:

  1. Install or update to the latest version of theFirebase CLI (we recommend downloading the standalone binary for the CLI specific to your OS). Make sure tosign in and test that you can access your projects.Note: If you're using the Firebase CLI in a CI environment,you can also authenticate with aservice account or by usinglogin:ci.
  2. Run theappdistribution:distribute command to upload your app and distribute it to testers. Use the following parameters to configure the distribution:

    appdistribution:distribute options
    --app

    Required: Your app's Firebase App ID. You can find the App ID in theFirebase console, on theGeneral Settings page.

    --app 1:1234567890:android:0a1b2c3d4e5f67890
    --token

    A refresh token that's printed when you authenticate your CI environment with theFirebase CLI (readUse the CLI with CI systems for more information).

    --token "$FIREBASE_TOKEN"
    --release-notes
    --release-notes-file

    Release notes for this build.

    You can either specify the release notes directly:

    --release-notes "Text of release notes"

    Or, specify the path to a plain text file:

    --release-notes-file "/path/to/release-notes.txt"
    --testers
    --testers-file

    The email addresses of the testers you want to invite.

    You can specify the testers as a comma-separated list of email addresses:

    --testers "ali@example.com, bri@example.com, cal@example.com"

    Or, you can specify the path to a plain text file containing a comma-separated list of email addresses:

    --testers-file "/path/to/testers.txt"
    --groups
    --groups-file

    The tester groups you want to invite (refer toManage testers). Groups are specified usinggroup aliases, which you can look up in theFirebase console.

    You can specify the groups as a comma-separated list:

    --groups "qa-team, trusted-testers"

    Or, you can specify the path to a plain text file containing a comma-separated list of group names:

    --groups-file "/path/to/groups.txt"
    --debug

    A flag you can include to print verbose log output.

    --test-devices
    --test-devices-file

    The following distribution types are part of theAutomated tester beta feature.

    The test devices you want to distribute builds to (refer toAutomated tests).

    You can specify the testers as a comma-separated list of email addresses:

    --test-devices: "model=shiba,version=34,locale=en,orientation=portrait;model=b0q,version=33,locale=en,orientation=portrait"

    Or, you can specify the path to a plain text file containing a semicolon-separated list of test devices:

    --test-devices-file: "/path/to/test-devices.txt"
    --test-username

    The username for automatic login to be used duringautomated tests.

    --test-password
    --test-password-file

    The password for automatic login to be used duringautomated tests.

    Or, you can specify the path to a plain text file containing a password:

    --test-password-file: "/path/to/test-password.txt"
    --test-username-resource

    Resource name for the username field for automatic login to be used duringautomated tests.

    --test-password-resource

    Resource name for the password field for automatic login to be used duringautomated tests.

    --test-non-blocking

    Runautomated tests asynchronously. Visit the Firebase console for the automatic test results.

    For example:

    firebase appdistribution:distribute test.apk  \    --app 1:1234567890:android:0a1b2c3d4e5f67890  \    --release-notes "Bug fixes and improvements" --testers-file testers.txt

    The Firebase CLI outputs the following links after the release upload. These links help you manage binaries and ensure that testers and other developers have the right release:

    • firebase_console_uri - A link to theFirebase console displaying a single release. You can share this link with other developers in your org.
    • testing_uri - A link to the release in the tester experience (Android native app) that lets testers view release notes and install the app onto their device. The tester needs access to the release in order to use the link.
    • binary_download_uri - A signed link that directly downloads and installs the app binary (APK or AAB file) . The link expires after one hour.

    Manage testers and groups

    In addition to distributing releases, you can also useappdistribution:testers:add andappdistribution:testers:remove to invite new testers or remove existing testers from your Firebase project.

    Once a tester has been added to your Firebase project, you can add them to individual releases. Once you remove a tester, they will no longer have access to releases in your project. Note that testers who are recently removed can still retain access to your releases for a window of time.

    For example:

    firebaseappdistribution:testers:addanothertester@email.commoretesters@email.comfirebaseappdistribution:testers:removeanothertester@email.commoretesters@email.com

    Tester emails must be separated by a space. You can also specify testers using--file /path/to/testers.txt.

    If you have a large number of testers you should consider using groups: You can useappdistribution:group:create andappdistribution:group:delete to create or delete groups in your Firebase project.

    Use--group-alias to specify a group for theappdistribution:testers:add andappdistribution:testers:remove commands.

    For example:

    firebaseappdistribution:group:create"QA team"qa-teamfirebaseappdistribution:testers:add--group-alias=qa-team anothertester@email.com moretesters@email.comfirebaseappdistribution:testers:remove--group-alias=qa-team anothertester@email.com moretesters@email.comfirebaseappdistribution:group:deleteqa-team

Once you distribute your build, it becomes available in theApp Distribution dashboard of theFirebase console for 150 days (five months).When the build is 30 days from expiring, an expiration notice appears in boththe console and your tester's list of builds on their test device.

Testers who haven't been invited to test the app receive email invitations toget started, and existing testers receive email notifications that a new buildis ready to test (read thetester set up guidefor instructions on how to install the testapp). You can monitor the status of each tester-whether they accepted theinvitation and whether they downloaded the app-in theFirebase console.

Testers have 30 days to accept an invitation to test the app before it expires.When an invitation is 5 days from expiring, an expiration notice appears in theFirebase console next to the tester on a release. An invitation can berenewed by resending it using the drop-down menu on the tester row.

Next steps

Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2025-12-17 UTC.