Crashlytics troubleshooting and FAQStay organized with collectionsSave and categorize content based on your preferences.
This page provides troubleshooting help and answers to frequently-asked
questions about usingCrashlytics. If you
can't find what you're looking for or need additional help, contactFirebase support.
On this page, you can find information about the following types of topics:
General troubleshooting, including questions about
display of data or working with data in theFirebaseconsole and questions
about regressed issues.
Seeing different formats
(and sometimes "variants") for some issues in theIssuestable
You might notice two different formats for issues listed in yourIssuestable
in theFirebaseconsole. And you might also notice a feature called
"variants" within some of your issues. Here's why!
In early 2023, we rolled out an improved analysis engine for grouping events as
well as an updated design and some advanced features for new issues (like
variants!). Check out our recentblog postfor all the details, but you can read below for the highlights.
Crashlyticsanalyzes all the events from your app (like crashes, non-fatals,
and ANRs) and creates groups of events calledissues— all events in an
issue have a common point of failure.
To group events into these issues, the improved analysis engine now looks at
many aspects of the event, including the frames in the stack trace, the
exception message, the error code, and other platform or error type
characteristics.
However, within this group of events, the stack traces leading to the failure
might be different. A different stack trace could mean a different root cause.
To represent this possible difference within an issue, we now createvariantswithin issues - each variant is a sub-group of events in an issue
that have the same failure pointanda similar stack trace.With variants,
you can debug the most common stack traces within an issue and determine if
different root causes are leading to the failure.
Here's what you'll experience with these improvements:
Revamped metadata displayed within the issue rowIt's now easier to understand and triage issues in your app.
Fewer duplicate issuesA line number change doesn't result in a new issue.
Easier debugging of complex issues with various root causesUse variants to debug the most common stack traces within an issue.
More meaningful alerts and signalsA new issue actually represents a new bug.
More powerful searchEach issue contains more searchable metadata,
like exception type and package name.
Here's how these improvements are rolling out:
When we get new events from your app, we'll check if they match to an existing
issue.
If there's no match, we'll automatically apply our smarter event-grouping
algorithm to the event and create a new issue with the revamped metadata
design.
This is the first big update that we're making to our event grouping. If you
have feedback or encounter any issues, let us know byfiling a report.
Not seeing breadcrumb logs
If you're not seeing breadcrumb logs
(iOS+|Android|Flutter|Unity),
we recommend checking your app's configuration forGoogle Analytics.
Make sure you meet the following requirements:
You've added to your app the Firebase SDK forGoogle Analytics:iOS+|Android|Flutter|Unity. This SDK must be addedin additionto theCrashlyticsSDK.
You're using the latest Firebase SDK versions for all the products that you
use in your app
(iOS+|Android|Flutter|Unity).
For Apple platforms and Android apps, especially check that you're usingat minimumthe following version of the
Firebase SDK forGoogle Analytics:iOS+— v6.3.1+(v8.9.0+ for macOS and tvOS) |Android— v17.2.3+(BoMv24.7.1+).
Not seeing velocity alerts
If you're not seeing velocity alerts, make sure that you're using the
Not seeing crash-free metrics (or seeing unreliable metrics)
If you're not seeing crash-free metrics (like crash-free users and sessions) or
seeing unreliable metrics, check the following:
Make sure that you're using the
Make sure that your data collection settings aren't impacting the quality of
your crash-free metrics:
If youenable opt-in reportingby disabling automatic crash reporting, crash information can only be sent
toCrashlyticsfrom users who have explicitly opted into data
collection. Thus, the accuracy of crash-free metrics will be affected sinceCrashlyticsonly has crash information from these opted-in users (rather
thanallyour users). This means that your crash-free metrics may be less
reliable and less reflective of the overall stability of your app.
If you have automatic data collection disabled, you can usesendUnsentReportsto send on-device cached reports toCrashlytics.
Using this method will sendcrashdata toCrashlytics, but notsessionsdata which causes the console charts to show low or zero values
for crash-free metrics.
Who can view, write, and delete notes on an issue?
Notes allow project members to comment on specific issues with questions, status
updates, etc.
When a project member posts a note, it's labeled with the email of their Google
Account. This email address is visible, along with the note, to all project
members with access to view the note.
The following describes the access required to view, write, and delete
notes:
Project members with any of the following roles can view and delete existing
notes and write new notes on an issue.
An issue has had a regression when you've previously closed the issue butCrashlyticsgets a new report that the issue has re-occurred.Crashlyticsautomatically re-opens these regressed issues so that you can
address them as appropriate for your app.
Here's an example scenario that explains howCrashlyticscategorizes an
issue as a regression:
For the first time ever,Crashlyticsgets a crash report about Crash
"A".Crashlyticsopens a corresponding issue for that crash (Issue "A").
You fix this bug quickly, close Issue "A", and then release a new version of
your app.
Crashlyticsgets another report about Issue "A" after you've closed the
issue.
If the report is from an app version thatCrashlyticsknew aboutwhen you closed the issue (meaning that the version had sent a crash
report foranycrash at all), thenCrashlyticswon't consider the
issue as regressed. The issue will remain closed.
If the report is from an app version thatCrashlyticsdidnotknow aboutwhen you closed the issue (meaning that the version hadneversentanycrash report for any crash at all), thenCrashlyticsconsiders the issue regressed and will re-open the
issue.
When an issue regresses, we send a regression detection alert and add a
regression signal to the issue to let you know thatCrashlyticshas
re-opened the issue. If you don't want an issue to re-open due to our
regression algorithm, "mute" the issue instead of closing it.
Why am I seeing regressed
issues for older app versions?
If a report is from an old app version that had never sent any crash reports at
all when you closed the issue, thenCrashlyticsconsiders the issue
regressed and will re-open the issue.
This situation can happen in the following situation: You've fixed a bug and
released a new version of your app, but you still have users on earlier versions
without the bug fix. If, by chance, one of those earlier versions hadneversent any crash reports at all when you closed the issue, and those users start
encountering the bug, then those crash reports would trigger a regressed issue.
If you don't want an issue to re-open due to our regression algorithm, "mute"
the issue instead of closing it.
Platform-specific support
The following sections provide support for platform-specific troubleshooting
and FAQ:iOS+|Android|Unity.
Apple platforms support
dSYMs are missing/not uploading
To upload your project's dSYMs and get verbose output, check the following:
Make sure your project's build phase contains theCrashlyticsrun script,
which allows Xcode to upload your project's dSYMs at build time (readInitializingCrashlyticsfor instructions on adding the script). After updating your project,force a crashand confirm that
the crash appears in theCrashlyticsdashboard.
If you see a "Missing dSYM" alert in theFirebaseconsole, check Xcode to
make sure it'sproperly producing dSYMsfor the build.
If Xcode is properly producing dSYMs, and you're still seeing missing dSYMs,
it's likely the run script tool is getting stuck while uploading the dSYMs.
In this case, try each of the following:
Make sure you're using the latest version ofCrashlytics.
Upload the missing dSYM files manually:
Option 1:Use the console-based "Drag and Drop" option in thedSYMstabto upload a zip archive containing the missing dSYM files.
Option 2:Use theupload-symbolsscriptto upload the missing dSYM files, for the provided UUIDs in thedSYMstab.
If you continue to see missing dSYMs, or uploads are still unsuccessful,
contactFirebase Supportand be sure to include your logs.
Crashes are poorly
symbolicated
If your stack traces seem to be poorly symbolicated, check the following:
If frames from your app's library lack references to your app's code, make
sure that-fomit-frame-pointeris not set as a
compilation flag.
If you see several(Missing)frames for your app's library, check if there
are optional dSYMs listed as missing (for the affected app version) in theCrashlyticsdSYMstabof theFirebaseconsole. If so, follow the "Missing dSYM alert"
troubleshooting step in thedSYMs are missing/not uploading FAQon this page. Note that uploading these dSYMs won't symbolicate crashes that
havealreadyoccurred, but this will help ensure symbolication forfuturecrashes.
Can I useCrashlyticsfor macOS or tvOS?
Yes, you can implementCrashlyticsin macOS and tvOS projects. Make sure to
include v8.9.0+ of the Firebase SDK forGoogle Analyticsso that crashes
will have access to metrics collected byGoogle Analytics(crash-free
users, latest release, velocity alerts, and breadcrumb logs).
Can I useCrashlyticsin a Firebase
project with multiple apps on different Apple platforms?
You can now report crashes for multiple apps in a single Firebase project,
even when the apps are built for different Apple platforms (for example,
iOS, tvOS, and Mac Catalyst). Previously, you needed to separate the apps into
individual Firebase projects if they contained the same bundle ID.
Android support
Why are ANRs only
reported for Android 11+?
Crashlyticssupports ANR reporting for Android apps from devices that run
Android 11 and higher. The underlying API that we use to collect ANRs
(getHistoricalProcessExitReasons)
is more reliable than SIGQUIT or watchdog-based approaches. This API is
available only on Android 11+ devices.
Why are some ANRs missing
theirBuildIds?
If some of your ANRs are missing theirBuildIds, troubleshoot as follows:
Make sure that you're using an up-to-dateCrashlyticsAndroid SDK andCrashlyticsGradle plugin version.
If you're missingBuildIds for Android 11 and some Android 12 ANRs, then
it's likely that you're using an out-of-date SDK, Gradle plugin, or both.
To properly collectBuildIds for these ANRs, you need to use the following
versions:
Check if you're using a non-standard location for your shared libraries.
If you're only missingBuildIds for your app’s shared libraries, it's likely
that you're not using the standard, default location for shared libraries. If
this is the case, thenCrashlyticsmight not be able to locate the
associatedBuildIds. We recommend that you consider using the standard
location for shared libraries.
Make sure that you're not strippingBuildIds during the build process.
Note that the following troubleshooting tips apply to both ANRs and native
crashes.
Check if theBuildIds exist by runningreadelf -non your binaries. If
theBuildIds are absent, then add-Wl,--build-idto the flags for your
build system.
Check that you're not unintentionally stripping theBuildIds in an effort
to reduce your APK size.
If you keep stripped and unstripped versions of a library, make sure to
point to the correct version in your code.
Differences
between ANR reports in theCrashlyticsdashboard and
Google Play Console
There can be a mismatch between the count of ANRs between Google Play andCrashlytics. This is expected due to the difference in the mechanism of
collecting and reporting ANR data.Crashlyticsreports ANRs when the app
next starts up, whereas Android Vitals sends ANR data after the ANR occurs.
Additionally,Crashlyticsonly displays ANRs that occur on devices running
Android 11+, compared to Google Play which displays ANRs from devices with
Google Play services and data collection consent accepted.
Why do I see crashes
from.ktfiles labeled as.javaissues?
When an app uses an obfuscator that doesn't expose the file extension,Crashlyticsgenerates each issue with a.javafile extension by default.
So thatCrashlyticscan generate issues with the correct file extension,
make sure your app uses the following setup:
Uses Android Gradle 4.2.0 or higher
Uses R8 with obfuscation turned on. To update your app to R8, follow thisdocumentation.
Note that after updating to the setup described above, you might start seeing
new.ktissues that are duplicates of existing.javaissues. See theFAQto learn more about that circumstance.
Why do I see.ktissues that are duplicates of existing.javaissues?
Starting in mid-December 2021,Crashlyticsimproved support for applications
that use Kotlin.
Until recently, the available obfuscators did not expose the file extension, soCrashlyticsgenerated each issue with a.javafile extension by default.
However, as of Android Gradle 4.2.0, R8 supports file extensions.
With this update,Crashlyticscan now determine if each class used within
the app is written in Kotlin and include the correct filename in the issue
signature. Crashes are now correctly attributed to.ktfiles (as appropriate)
if your app has the following setup:
Your app uses Android Gradle 4.2.0 or higher.
Your app uses R8 with obfuscation turned on.
Since new crashes now include the correct file extension in their issue
signatures, you might see new.ktissues that are actually just duplicates of
existing.java-labeled issues. In theFirebaseconsole, we try to identify
and communicate to you if a new.ktissue is a possible duplicate of an
existing.java-labeled issue.
Not getting crashes with
Dexguard
If you see the following exception, it's likely you're using a version of
DexGuard that's incompatible with theFirebase CrashlyticsSDK:
java.lang.IllegalArgumentException: Transport backend 'cct' is not registered
This exception does not crash your app but prevents it from sending crash
reports. To fix this:
Make sure you're using the latest DexGuard 8.x release. The latest version
contains rules that are required by theFirebase CrashlyticsSDK.
If you don't want to change your DexGuard version, try adding the following
line to your obfuscation rules (in your DexGuard config file):
The latest release of theCrashlyticsGradle plugin is a major
version (v3.0.0) and modernizes the SDK by dropping support for lower versions
of Gradle and the Android Gradle plugin. Additionally, the changes in this
release resolve issues with AGP v8.1+ and improve support for native apps and
customized builds.
Minimum requirements
TheCrashlyticsGradle plugin v3 has the following minimum requirements:
TheuploadCrashlyticsSymbolFilesBasicReleasetask
will only upload the symbols inMY/NATIVE/LIBS,
butuploadCrashlyticsSymbolFilesFeatureXReleasewill upload symbols in bothMY/NATIVE/LIBSandMY/FEATURE_X/LIBS.
Replaced the closure fieldsymbolGeneratorwith two new top level fields:
symbolGeneratorType, a String of either"breakpad"(default) or"csym".
breakpadBinary, a File of a localdump_symsbinary override.
Differences
between NDK stack traces inCrashlyticsdashboard and logcat
LLVM and GNU toolchains have distinct defaults and treatments for the read-only
segment of your app's binaries, which may generate inconsistent stack traces
in theFirebaseconsole. To mitigate this, add the following linker flags
to your build process:
If you're using thelldlinker from the LLVM toolchain, add:
-Wl,--no-rosegment
If you're using theld.goldlinker from the GNU toolchain, add:
-Wl,--rosegment
If you're still seeing stack trace inconsistencies (or if neither flag is
pertinent to your toolchain), try adding the following to your build process
instead:
-fno-omit-frame-pointer
How do I use
my own Breakpad symbol file generator binary for NDK?
TheCrashlyticsplugin bundles acustomized Breakpad symbol file generator.
If you prefer to use your own binary for generating Breakpad symbol files (for
example, if you prefer to build all native executables in your build chain from
source), use the optionalsymbolGeneratorBinaryextension property to specify
the path to the executable.
You can specify the path to the Breakpad symbol file generator binary in one
of two ways:
Option 1: Specify the path via thefirebaseCrashlyticsextension in yourbuild.gradlefile
Add the following to your app-levelbuild.gradle.ktsfile:
Gradle plugin v3.0.0+
android{buildTypes{release{configure<CrashlyticsExtension>{nativeSymbolUploadEnabled=true// Add these optional fields to specify the path to the executablesymbolGeneratorType="breakpad"breakpadBinary=file("/PATH/TO/BREAKPAD/DUMP_SYMS")}}}}
lower plugin versions
android{// ...buildTypes{// ...release{// ...firebaseCrashlytics{// existing; required for either symbol file generatornativeSymbolUploadEnabledtrue// Add this optional new block to specify the path to the executablesymbolGenerator{breakpad{binaryfile("/PATH/TO/BREAKPAD/DUMP_SYMS")}}}}}
Option 2: Specify the path via a property line in your Gradle
properties file
You can use thecom.google.firebase.crashlytics.breakpadBinaryproperty to specify the path to the executable.
You can manually update your Gradle properties file or update the file
via the command line. For example, to specify the path via the command
line, use a command like the following:
TheFirebase CrashlyticsNDK does not support ARMv5 (armeabi).
Support for this ABI was removed as of NDK r17.
Unity support
Seeing unsymbolicated
stack traces for Android apps in theCrashlyticsdashboard
If you're using UnityIL2CPPand you're seeing unsymbolicated stack traces, then try the following:
Make sure that you're using v8.6.1 or higher of theCrashlyticsUnity
SDK.
Make sure that you're set up for and running theFirebaseCLIcrashlytics:symbols:uploadcommand to generate and upload your symbol
file.
You need to run this CLI command each time that you create a release
build or any build for which you want to see symbolicated stack traces in
theFirebaseconsole. Learn more inGet readable crash reports.
CanCrashlyticsbe used
with apps that use IL2CPP?
Yes,Crashlyticscan display symbolicated stack traces for your apps that
use IL2CPP. This capability is available for apps released on either Android or
Apple platforms. Here's what you need to do:
Make sure that you're using v8.6.0 or higher of theCrashlyticsUnity
SDK.
Complete the necessary tasks for your platform:
For Apple platform apps: No special actions are needed. For Apple
platform apps, the Firebase Unity Editor plugin automatically configures
your Xcode project to upload symbols.
For Android apps: Make sure that you're set up for and running theFirebaseCLIcrashlytics:symbols:uploadcommand to generate and
upload your symbol file.
You need to run this CLI command each time that you create a release
build or any build for which you want to see symbolicated stack traces in
theFirebaseconsole. Learn more inGet readable crash reports.
Reporting uncaught exceptions as fatals
Crashlyticscan report uncaught exceptions as fatals (starting withv10.4.0of the Unity SDK). The following FAQs help to explain the rationale and best
practices for using this feature.
Why should an app report uncaught exceptions as fatals?
By reporting uncaught exceptions as fatals, you get a more realistic indication
of what exceptions may result in the game being unplayable – even if the app
continues to run.
Note that if you start reporting fatals, your crash-free users (CFU) percentage
will likely decrease, but the CFU metric will be more representative of the
end-users' experiences with your app.
Which exceptions will be
reported as fatals?
In order forCrashlyticsto report an uncaught exception as fatal, both of
the following two conditions must be met:
Exceptions are created and thrown to reflectunexpected or exceptional states.
Resolving the issues reflected by a thrown exception involves returning the
program to a known state (a process known asexception handling).
It's best practice to catch and handleallforeseen exceptions unless the
program cannot be returned to a known state.
To control which sorts of exceptions are caught and handled by what code,wrap code that might generate an exception in atry-catchblock.
Make sure that the conditions in thecatchstatements are as narrow as
possible to handle the specific exceptions appropriately.
Log exceptions in Unity orCrashlytics
There are multiple ways to record exceptions in Unity orCrashlyticsto help
debug the issue.
When usingCrashlytics, here are the two most common and recommended
options:
Option 1: Print in the Unity console, but don't report toCrashlytics,
during development or troubleshooting
Print to the Unity console usingDebug.Log(exception),Debug.LogWarning(exception), andDebug.LogError(exception)which
print the contents of the exception to the Unity console and don't
re-throw the exception.
Option 2: Upload toCrashlyticsfor consolidated reporting in theCrashlyticsdashboard for the following situations:
If an exception is worth logging to debug a possible subsequentCrashlyticsevent, then useCrashlytics.Log(exception.ToString()).
If an exception should still be reported toCrashlyticsdespite
being caught and handled, then useCrashlytics.LogException(exception)to log it as a nonfatal event.
However, if you want to manually report a fatal event to Unity Cloud
Diagnostics, you can useDebug.LogException. This option prints the exception
to the Unity console like Option 1, but italso throws the exception(whether or not it has been thrown or caught yet). It throws the error
nonlocally. This means that even a surroundingDebug.LogException(exception)withtry-catchblocks still results in an uncaught exception.
Therefore, callDebug.LogExceptionif and only if you want to doallof
the following:
To print the exception to the Unity console.
To upload the exception toCrashlyticsas a fatal event.
To throw the exception, have it be treated as anuncaughtexception, and
have it be reported to Unity Cloud Diagnostics.
Note that if you want to print a caught exception to the Unity consoleandupload toCrashlyticsas a nonfatal event, do the following instead:
try{methodThatThrowsMyCustomExceptionType();}catch(MyCustomExceptionTypeexception){// Print the exception to the Unity console at the error level.Debug.LogError(exception);// Upload the exception toCrashlyticsas a non-fatal event.Crashlytics.LogException(exception);// not Debug.LogException//// Code that handles the exception//}
Integrations support
App also uses theGoogle Mobile AdsSDK but not getting crashes
If your project usesCrashlyticsalongside theGoogle Mobile AdsSDK,
it's likely that the crash reporters are interfering when
registering exception handlers. To fix the issue, turn off crash reporting in
theMobile AdsSDK by callingdisableSDKCrashReporting.
Where is my BigQuery dataset located?
Firebase exports data to the dataset location you selected when you set up data
export toBigQuery.
This location applies to both theCrashlyticsdataset and the
Firebase sessions dataset (if sessions data is enabled for export).
This location is only applicable for the data exported intoBigQuery, and it does not impact the location of data stored for
use in theCrashlyticsdashboard of theFirebaseconsole or in
Android Studio.
After a dataset is created, its location can't be changed, but you can
copy the dataset to a different location or manually move (recreate) the
dataset in a different location. To learn more, seeChange the location for existing exports.
How to upgrade to the new export infrastructure forBigQuery?
In mid-October 2024,Crashlyticslaunched a new infrastructure forbatchexport ofCrashlyticsdata intoBigQuery.
If you enabled batch exportafterOctober 2024, then your Firebase
project is automatically using the new export infrastructure.No action is
needed.
If you enabled batch exportbefore or duringOctober 2024, review the
information in this FAQ
to determine if you need to take any action.
All Firebase projects will be automatically upgraded to the new batch export
infrastructure as early as January 9, 2026.You canupgradebefore this
date, but make sure that yourBigQuerybatch tables meet theprerequisitesfor upgrading.
You canupgradeto the new
infrastructure, but make sure that yourBigQuerybatch tables meet theprerequisitesfor upgrading.
Determine if you're on the new infrastructure
If you enabled batch export in mid-October 2024 or later, then your Firebase
project is automatically using the new export infrastructure.
You can check which infrastructure your project is using:
Go to theGoogle Cloudconsole, and if your"data transfer config"is labeledFirebase Crashlytics with Multi-Region Support, then your
project is using the new export infrastructure.
Important differences between the old export infrastructure and the new export infrastructure
The new infrastructure supportsCrashlyticsdataset locations outside the
United States.
Export enabledbeforemid-October 2024andupgraded to the new export
infrastructure — You can now optionallychange the location for data export.
Export enabled in mid-October 2024 or later — You were prompted during
setup to select a location for data export.
The new infrastructure doesn't support backfills of data frombeforeyou
enabled export.
The old infrastructure supported backfill up to 30 days prior to the date
when you enabled export.
The new infrastructure supportsbackfillsup to the past 30 daysorfor the most recent date when you enabled export
toBigQuery(whichever is most recent).
The new infrastructure namesBigQuerybatch tables using the
identifiers set for your Firebase Apps in your Firebase project.
The old infrastructure wrote data to batch tables with names based on the
bundle IDs or package namesin your app's binary.
The new infrastructure writes data to batch tables with names based on the
bundle IDs or package namesset for your registered Firebase Apps in your Firebase project.
Step 1: Prerequisite for upgrading
Check that your existingBigQuerybatch tables use
matching identifiers to the bundle IDs or package namesset for your registered Firebase Apps in your Firebase project.If they
don't match, then you might experience disruptions to your exported batch
data. Most projects will be in a proper and compatible state, but it's
important to check before upgrading.
You can find all the Firebase Apps registered in your Firebase project in
theFirebaseconsole: Go to yoursettingsProject settings,
then scroll to theYour appscard to see all your Firebase Apps and
their information.
You can find all yourBigQuerybatch tables in theBigQuerypageof theGoogle Cloudconsole.
For example, here are ideal states where you won't have any issues
upgrading:
You have a batch table namedcom_yourcompany_yourproject_IOSand a
Firebase iOS+ App with the bundle IDcom.yourcompany.yourprojectregistered in your Firebase project.
You have a batch table namedcom_yourcompany_yourproject_ANDROIDand a
Firebase Android App with the package namecom.yourcompany.yourprojectregistered in your Firebase project.
If you have batch table names that donotmatch the
identifiers set for your registered Firebase Apps, thenfollow the instructionslater on this pagebefore manually upgrading or
before January 9, 2026to avoid disruption to your batch export.
Step 2: Manually upgrade to the new infrastructure
If you enabled batch exportbeforemid-October 2024, then you can manually
upgrade to the new infrastructure simply by togglingCrashlyticsdata export
off and then on again in theFirebaseconsole.
Toggle off theCrashlyticsslider to disable export. When prompted,
confirm that you want data export to stop.
Immediately toggle on again theCrashlyticsslider to re-enable export.
When prompted, confirm that you want to export data.
YourCrashlyticsdata export toBigQueryis now using the new
export infrastructure.
Your existing batch table name doesn't match your Firebase App identifier
If your existing batch table name doesnotmatch the bundle ID or package name set for your registered Firebase App, then expand this section and implement one of the options to avoid disruptions to your exported batch data.
If you have existingBigQuerybatch tables in this state, then it means
that they're not compatible with Firebase's new batch
export-to-BigQueryinfrastructure.
Note that all Firebase projects will be automatically migrated to the new export
infrastructure as early as January 9, 2026.
Follow the guidance in this sectionbefore manually upgrading
or before January 9, 2026to avoid disruption
to the batch export of yourCrashlyticsdata toBigQuery.
Understand how the export infrastructure uses identifiers to write data toBigQuerytables
Here's how the two export infrastructures writeCrashlyticsdata toBigQuerybatch tables:
Legacy export infrastructure: Writes data to a table with a name that's
based on the bundle ID or package namein your app's binary.
New export infrastructure: Writes data to a table with a name that's
based on the bundle ID or package nameset for your registered Firebase App in your Firebase project.
Unfortunately, sometimes the bundle ID or package namein your app's binarydoesn't match the bundle ID or package nameset for your registered Firebase App in your Firebase project. This usually
happens if someone didn't enter the actual identifier during app registration.
What happens if this isn't fixed before upgrading?
If the identifiers in these two locations don't match, then the following
happens after upgrading to the new export infrastructure:
YourCrashlyticsdata will start writing to anewBigQuerybatch table — that is, a new table with a name based on the
bundle ID or package nameset for your registered Firebase App
in your Firebase project.
Any existing "legacy" table with a name based on the identifierin your app's binarywill no longer have data written to it.
Example scenarios of mismatched identifiers
Note thatBigQuerybatch table names are automatically appended with_IOSor_ANDROIDto indicate the platform of the app.
Identifier(s) in your app's binary
Identifier(s) set for your Firebase App(s)
Legacy behavior
Behavior after upgrade to new export infrastructure
Solution
foo
bar
Writes to asingletable named after the identifier in app's
binary (foo)
Creates then writes to asingletable named after the
identifier set for Firebase App (bar)
Implement either Option 1 or 2 described below.
foo
bar,qux, etc.
Writes to asingletable named after the identifier in app's
binary (foo)
Creates* then writes tomultipletables named after the
identifiers set for Firebase Apps (bar,qux,
etc.)
Implement Option 2 described below.
foo,baz, etc.
bar
Writes tomultipletables named after the multiple identifiers
in app's binary (foo,baz, etc.)
Creates** then writes every app's data to asingletable named
after the identifier set for Firebase App (bar)
None of the options can be implemented.
You can still differentiate data from each app within the single
table by using the app'sbundle_identifierwhich is
exported alongside the data.
*If the identifier in your app's binary matched one of the
identifiers set for a Firebase App, then the new export infrastructure won't
create a new table for that identifier. Instead, it will continue writing
data for that specific app to it. All other apps will be written to new tables.
**If one of the identifiers in your app's binary matched the
identifier set for the Firebase App, then the new export infrastructure won't
create a new table. Instead, it will maintain that table and start writing
data for all apps to it.
Options to avoid disruption
To avoid any disruptions, follow the instructions for one of the options
described belowbeforeyou manually upgrade
orbeforeJanuary 9, 2026.
OPTION 1: Use the new table created by the new export infrastructure.
You'll copy data from your existing table to the new table.
This action creates a new batch table with a name that's based on the
bundle ID or package nameset for your registered Firebase App in your Firebase project.
In theGoogle Cloudconsole,copy all the datafrom your legacy table to the new table that was just created.
If you have any downstream dependencies that depend on your batch table,
change them to use the new table.
OPTION 2: Continue writing to your existing table. You'll override some
defaults in aBigQueryconfig to achieve this.
In theFirebaseconsole, find and take note of the Firebase App ID
(for example,1:1234567890:ios:321abc456def7890) of the app with the
mismatched batch table name and identifier: Go to yoursettingsProject settings,
then go theYour appscard to see all your Firebase Apps and
their information.
Creates a new batch table with a name that's based on the
bundle ID or package nameset for your registered Firebase App
in your Firebase project.
(You'll eventually delete this table, but donotdelete it yet.)
Creates aBigQuery"data transfer config" with the sourceFirebase Crashlytics with Multi-Region Support.
In theGoogle Cloudconsole, change the new "data transfer config" so
that data will continue to write to your existing table:
Go toBigQuery>Data transfersto view your "data transfer config".
Select the config that has the sourceFirebase Crashlytics with Multi-Region Support.
ClickEditin the top-right corner.
In theData source detailssection, find a list forgmp_app_idand a list forclient_namespace.
InBigQuery, the Firebase App ID is called thegmp_app_id.
By default, theclient_namespacevalue inBigQueryis the
corresponding unique bundle ID / package name of the app, but you'll
be overriding this default configuration.
BigQueryuses theclient_namespacevalue for the name of
the batch table that each linked Firebase App writes to.
Find thegmp_app_idof the Firebase App for which you want to
override default settings. Change itsclient_namespacevalue to
the name of the table you want the Firebase App to write to instead
(usually this is the name of the legacy table the app was writing to
with the legacy export infrastructure).
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-12-11 UTC."],[],[]]