From 5ec258944466b62e0c25243dbfec4f103d5eb0ca Mon Sep 17 00:00:00 2001 From: Hadrian Burkhardt Date: Wed, 14 Oct 2026 00:09:55 +0200 Subject: [PATCH] docs: answer Play's native-debug-symbols warning Uploading the bundle shows "This App Bundle contains native code, and you've not uploaded debug symbols". Record the answer next to the upload step so it is not re-investigated on every release: - the bundle's only native code is libandroidx.graphics.path.so (4 ABIs, ~37 KB), which arrives transitively through androidx.compose.ui:ui-graphics -> androidx.graphics:graphics-path:1.0.1; this project builds no native code at all, - ndk.debugSymbolLevel = "FULL" was tried and emits nothing for such a project (no native-debug-symbols output, nothing added to the bundle), and - the published AAR ships stripped libs only (symtab=0, no .debug_* sections, no symbol entries at all), so there is no symbol file in existence to upload. The warning is advisory and does not block review or rollout. Kotlin/Java stack traces are already deobfuscated from the R8 mapping that rides inside the bundle, so the only thing lost is symbolication of frames inside that Compose helper library. --- docs/PLAY_RELEASE_CHECKLIST.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/PLAY_RELEASE_CHECKLIST.md b/docs/PLAY_RELEASE_CHECKLIST.md index 71b97fe..959e7ae 100644 --- a/docs/PLAY_RELEASE_CHECKLIST.md +++ b/docs/PLAY_RELEASE_CHECKLIST.md @@ -46,6 +46,26 @@ the rest are things you must do in the Play Console / with your own accounts. exactly the permission set listed in step 5 — **no `INTERNET`**, so "nothing leaves the device" holds in the shipped artefact, not just in the source manifest. - [ ] Upload the **`.aab`** (not the APK) to the Play Console. + ⚠️ **Expect a native-debug-symbols warning here, and ignore it.** Play scans the bundle, finds + `base/lib//libandroidx.graphics.path.so`, and reports *"This App Bundle contains native + code, and you've not uploaded debug symbols"*. It is a recommendation, not an error: it does + not block the upload, review or rollout. + - That one library (4 ABIs, ~37 KB total) is **not** this project's code — it arrives + transitively through `androidx.compose.ui:ui-graphics` → + `androidx.graphics:graphics-path:1.0.1`. The project has no `ndk` / `externalNativeBuild` / + `jniLibs` config and no native sources at all. + - There is nothing to upload: the published `graphics-path-1.0.1.aar` ships **stripped** libs + (`symtab=0`, no `.debug_*` sections, no symbol entries anywhere in the AAR), and the + commonly-suggested fix does not apply — with `ndk.debugSymbolLevel = "FULL"` the build + succeeds but produces no `app/build/outputs/native-debug-symbols/` output and adds nothing + to the bundle, because AGP only packages symbols for native code it builds itself. + - Excluding the lib (`packaging { jniLibs { excludes += "**/libandroidx.graphics.path.so" } }`) + would silence the warning but risks `UnsatisfiedLinkError` inside Compose's path handling, + for a 37 KB saving. Not worth it. + - What it actually costs: symbolication of frames *inside that Compose helper*. Kotlin/Java + crashes are unaffected — the R8 mapping rides inside the bundle + (`BUNDLE-METADATA/com.android.tools.build.obfuscation/proguard.map`), so Play deobfuscates + them automatically. - [ ] Keep `app/build/outputs/mapping/release/mapping.txt` for every release so you can de-obfuscate crash reports (upload it under *Release > App bundle explorer*).