[REQUIRED] Step 2: Describe your environment
- Android Studio version: Narwhal | 2025.2 (irrelevant for this bug — caused by a string constant baked into the AAR)
- Firebase Component: App Distribution
- Component version:
com.google.firebase:firebase-appdistribution:16.0.0-beta18 (regression vs. beta17)
[REQUIRED] Step 3: Describe the problem
In firebase-appdistribution:16.0.0-beta18, the in-app updater fails silently after the APK has been downloaded. InstallActivity crashes in onResume() because it looks up its own FirebaseAppDistributionFileProvider under a malformed authority string. Beta17 works correctly.
Steps to reproduce
- Set up a project that uses
firebase-appdistribution:16.0.0-beta18 and the in-app updater (firebase-appdistribution-api).
- Install an old build on a real device.
- Distribute a newer build via Firebase App Distribution.
- Open the app → accept the in-app update prompt.
- Let the APK download finish (the FAD notification reads "Download complete").
- Expected: the system package installer dialog opens.
- Actual: the activity crashes silently, the process dies, the user is dropped back to the launcher.
The merged manifest of any consumer app correctly registers the authority ${applicationId}.FirebaseAppDistributionFileProvider, which is what the AAR's <provider> entry expects:
<provider
android:name="com.google.firebase.appdistribution.impl.FirebaseAppDistributionFileProvider"
android:authorities="${applicationId}.FirebaseAppDistributionFileProvider"
android:exported="false"
android:grantUriPermissions="true">
But InstallActivity constructs a different authority string at runtime and the lookup fails.
Logcat
E AndroidRuntime: java.lang.RuntimeException: Unable to resume activity
{com.example.app/com.google.firebase.appdistribution.impl.InstallActivity}
E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Couldn't find
meta-data for provider with authority
com.example.appcom.google.firebase.appdistribution.impl..FirebaseAppDistributionFileProvider
E AndroidRuntime: at com.google.firebase.appdistribution.impl.InstallActivity
.startAndroidPackageInstallerIntent(InstallActivity.java:149)
I ActivityManager: Process com.example.app has died
Note the authority string the SDK is searching for:
com.example.appcom.google.firebase.appdistribution.impl..FirebaseAppDistributionFileProvider
^ ^^
no dot after packageName double dot before provider name
Root cause — bytecode diff between beta17 and beta18
I downloaded both AARs from Google Maven, extracted classes.jar, and disassembled InstallActivity with javap -p -c. The method startAndroidPackageInstallerIntent has one changed instruction:
64: invokevirtual ... getApplicationContext:()Landroid/content/Context;
67: invokevirtual ... android/content/Context.getPackageName:()Ljava/lang/String;
70: invokevirtual ... java/lang/StringBuilder.append:(Ljava/lang/String;)…
- 73: ldc_w // String .FirebaseAppDistributionFileProvider
+ 73: ldc_w // String com.google.firebase.appdistribution.impl..FirebaseAppDistributionFileProvider
76: invokevirtual ... java/lang/StringBuilder.append:(Ljava/lang/String;)…
In short, packageName + ".FirebaseAppDistributionFileProvider" (beta17) was changed to packageName + "com.google.firebase.appdistribution.impl..FirebaseAppDistributionFileProvider" (beta18) — the separator dot was dropped and a double dot slipped in before the provider name. The merged manifest still declares only the short authority, so the lookup fails.
InstallActivity.onResume() is also not robust against this — the IllegalArgumentException propagates out and crashes the process instead of being reported as a failed update.
Workaround
Downgrade to 16.0.0-beta17. Both firebase-appdistribution and firebase-appdistribution-api have working beta17 artifacts and can be pinned independently of firebase-bom.
Relevant code
The defect lives in:
firebase-appdistribution/src/main/java/com/google/firebase/appdistribution/impl/InstallActivity.java
in startAndroidPackageInstallerIntent(), around the getUriForFile(...) / authority construction.
[REQUIRED] Step 2: Describe your environment
com.google.firebase:firebase-appdistribution:16.0.0-beta18(regression vs. beta17)[REQUIRED] Step 3: Describe the problem
In
firebase-appdistribution:16.0.0-beta18, the in-app updater fails silently after the APK has been downloaded.InstallActivitycrashes inonResume()because it looks up its ownFirebaseAppDistributionFileProviderunder a malformed authority string. Beta17 works correctly.Steps to reproduce
firebase-appdistribution:16.0.0-beta18and the in-app updater (firebase-appdistribution-api).The merged manifest of any consumer app correctly registers the authority
${applicationId}.FirebaseAppDistributionFileProvider, which is what the AAR's<provider>entry expects:But
InstallActivityconstructs a different authority string at runtime and the lookup fails.Logcat
Note the authority string the SDK is searching for:
Root cause — bytecode diff between beta17 and beta18
I downloaded both AARs from Google Maven, extracted
classes.jar, and disassembledInstallActivitywithjavap -p -c. The methodstartAndroidPackageInstallerIntenthas one changed instruction:In short,
packageName + ".FirebaseAppDistributionFileProvider"(beta17) was changed topackageName + "com.google.firebase.appdistribution.impl..FirebaseAppDistributionFileProvider"(beta18) — the separator dot was dropped and a double dot slipped in before the provider name. The merged manifest still declares only the short authority, so the lookup fails.InstallActivity.onResume()is also not robust against this — theIllegalArgumentExceptionpropagates out and crashes the process instead of being reported as a failed update.Workaround
Downgrade to
16.0.0-beta17. Bothfirebase-appdistributionandfirebase-appdistribution-apihave working beta17 artifacts and can be pinned independently offirebase-bom.Relevant code
The defect lives in:
in
startAndroidPackageInstallerIntent(), around thegetUriForFile(...)/ authority construction.