Skip to content

Google Play upload warningGoogle Play: “This App Bundle contains native code, and you’ve not uploaded debug symbols”

Play Console shows a warning on the release: the App Bundle contains native code and no debug symbols were uploaded. Flutter, React Native and many SDKs ship native .so libraries, so many apps see it. It is a warning, not a rejection: the release can still go out. Without symbols, native crashes and ANRs in Android vitals show addresses instead of function names.

Short answer

Add ndk { debugSymbolLevel = "FULL" } to defaultConfig in android/app/build.gradle.kts (debugSymbolLevel 'FULL' in Groovy), make sure the NDK is installed, rebuild the bundle with flutter build appbundle or ./gradlew bundleRelease, and upload the new .aab. If the file is too large, use SYMBOL_TABLE.

Why Play has no symbols, and the fix

  1. 01

    The bundle was built without native debug symbols

    “If your project builds an Android App Bundle, you can automatically include the debug symbols file in it.” Google, Deobfuscate or symbolicate crash stack traces

    The Android Gradle plugin only packs the symbols into the bundle when you ask for them. Add the setting to the app module, bump the version code, and build a new bundle.

    // android/app/build.gradle.kts
    android {
        defaultConfig {
            ndk {
                debugSymbolLevel = "FULL"
            }
        }
    }
    
    // android/app/build.gradle (Groovy)
    // android { defaultConfig { ndk { debugSymbolLevel 'FULL' } } }
  2. 02

    The symbols file is over the size limit

    “Use SYMBOL_TABLE to get function names in the Play Console's symbolicated stack traces.” Android Developers, Include native debug symbols

    FULL adds file names and line numbers and can get large. If the build or the upload complains about size, switch to SYMBOL_TABLE, which still gives function names.

    ndk {
        debugSymbolLevel = "SYMBOL_TABLE"
    }
  3. 03

    You ship an APK, or the release is already out

    “Manually upload the native debug symbols file to the Google Play Console” Android Developers, Include native debug symbols

    An APK can’t carry the symbols, and Gradle only writes them when debugSymbolLevel is set. Set it and build again from the same commit and version code, or add symbols from the next release. Gradle writes native-debug-symbols.zip to build/app/outputs/native-debug-symbols/release/ in a Flutter project (app/build/outputs/… in a native Android project). In Play Console open App bundle explorer, pick the version, then Downloads, and upload it under Assets.

  4. 04

    A dependency ships stripped libraries

    “If your dependencies contain native libraries, the debug information is likely stripped to reduce size.” Android Developers, Include native debug symbols

    If the warning stays after the change, run the build with --info and look for the line that says the native debug metadata was already stripped. That library came without symbols; only its vendor can provide them, and the warning for it is safe to leave.

    ./gradlew bundleRelease --info | grep -i "native debug metadata"

Checked against the vendor’s docs on : Play Console Help: Deobfuscate or symbolicate crash stack traces; Android Developers: Include native debug symbols.

Rather hand it over?

Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.

Related: Google Play “signed with the wrong key” · Google Play version code already used · Google Play target API level · Google Play Billing Library version deprecated

Questions

More on this launch

Is this the same as Flutter’s --split-debug-info?

No. --split-debug-info saves symbols for your Dart code, used with flutter symbolize to read Dart stack traces. The Play warning is about the native .so libraries, and the Gradle setting above covers those.

Can I publish with the warning?

Yes. It doesn’t block the release. Adding the symbols only makes native crash reports in Play Console readable.

Something else?

Describe it and get a written quote

Describe the app and where it is in the launch. You get a written scope, a fixed price and a timeline; Simon replies by email, usually within one business day.