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

> Play Console warns the App Bundle contains native code and you have not uploaded debug symbols. Add ndk debugSymbolLevel to the Gradle file and rebuild.

Canonical: https://app369.com/fix/google-play-native-code-debug-symbols/
Last updated: 2026-11-08

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**](https://support.google.com/googleplay/android-developer/answer/9848633) 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**](https://developer.android.com/build/include-native-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**](https://developer.android.com/build/include-native-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**](https://developer.android.com/build/include-native-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 November 8, 2026: [Play Console Help: Deobfuscate or symbolicate crash stack traces](https://support.google.com/googleplay/android-developer/answer/9848633); [Android Developers: Include native debug symbols](https://developer.android.com/build/include-native-symbols).

## **Rather hand it over?**

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

- [from $450**App Fix Ticket**One reproducible bug in an existing mobile or web app, diagnosed and fixed.**See scope and start**](https://app369.com/fixed-price/flutter-firebase-bug-fix/)

Related: [**Google Play “signed with the wrong key”**](https://app369.com/fix/google-play-app-bundle-wrong-key/) · [**Google Play version code already used**](https://app369.com/fix/google-play-version-code-already-used/) · [**Google Play target API level**](https://app369.com/fix/google-play-target-api-level-35/) · [**Google Play Billing Library version deprecated**](https://app369.com/fix/google-play-billing-library-deprecated/)

Questions

## **More on this launch**

<details>

<summary>**Is this the same as Flutter’s --split-debug-info? **+</summary>

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.

</details>

<details>

<summary>**Can I publish with the warning? **+</summary>

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

</details>

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.

[**Describe your problem **→](https://app369.com/contact/) [**All fixes**](https://app369.com/fix/)