Source Maps

Upload ProGuard Mapping for Android Crash Symbolication

Learn how to upload ProGuard mapping files to Google Play Console to deobfuscate Android crashes. Step-by-step guide with CI/CD automation.

When you obfuscate an Android app with ProGuard or R8, method names, class names, and variable names get renamed to short, meaningless identifiers. This compression cuts app size and deters reverse engineering — but it leaves crash logs nearly unreadable. A stack trace becomes a jumble of a.b.c instead of com.myapp.MyClass.processData. Learning how to upload proguard mapping files to Google Play Console is essential if you want to understand what's actually breaking in production.

Google Play Console offers built-in symbol crash reporting, and uploading your mapping files there ensures that crashes sent to Play's own backend are automatically deobfuscated. If you're also sending errors to LightTrace or another third-party error tracker, you'll need to handle symbol mapping on both sides. This guide walks you through the Play Console upload process, common gotchas, and how to integrate with your monitoring stack.

Why ProGuard Mapping Matters for Production Debugging

Obfuscation is a necessary step in Android release builds. Your build.gradle enables it with minifyEnabled true, and the build process generates two artifacts: the minified APK or AAB, and a mapping.txt file that contains the lookup table.

Without that mapping file, a stack trace like:

at a.b.c.d(SourceFile:42)
at e.f.g.process(SourceFile:101)

tells you nothing. With the mapping file, it becomes:

at com.myapp.analytics.EventTracker.logEvent(SourceFile:42)
at com.myapp.network.ApiClient.process(SourceFile:101)

The difference is the gap between "something broke" and "the analytics logger broke the API client." Google Play Console crashes are only useful if they're readable, and that's why the mapping file upload exists.

Save your mapping files from every release build. Store them alongside your release artifacts—you'll need them later if a crash comes in weeks or months after launch and you need to reproduce it against the right version.

Preparing Your ProGuard Mapping Files

Every time you build a release APK or App Bundle (AAB), your build system generates a mapping.txt file. For a typical Android project:

  • Gradle project (standard): app/build/outputs/mapping/release/mapping.txt
  • Multi-module project: Each module has its own mapping at module/build/outputs/mapping/release/mapping.txt

If you're using R8 (the modern successor to ProGuard), the file format is identical—still called mapping.txt and compatible with Play Console.

Before uploading, confirm the file exists and is non-empty:

ls -lh app/build/outputs/mapping/release/mapping.txt
head -20 app/build/outputs/mapping/release/mapping.txt

A valid mapping file starts with obfuscation rules and class mappings like:

com.android.tools.build.bundletool.R -> a.a.a.a:
    1:2:int[] m -> a
    2:2:com.android.tools.build.bundletool.SomeClass m -> b

If the file is empty or missing, your ProGuard config may be incomplete or minification is disabled.

Never commit mapping files to your main repository—they're bulky and version-specific. Instead, archive them per-release in a secure location (cloud storage, release management system, or artifact repository).

How to Upload ProGuard Mapping Files to Google Play Console

The web UI process is straightforward:

  1. Log into Google Play Console and select your app.
  2. Navigate to Release → Your Release (Production, Beta, or Internal Testing).
  3. Scroll down to "App bundle explorer" or go directly to Testing → Internal testing (or Production), then select the build you want to add symbols to.
  4. Click "View details" on the build.
  5. Scroll to "Symbols" or "Symbol files" section.
  6. Click "Upload symbols" and select your mapping.txt file.
  7. Confirm and save.

Google Play will process the file within minutes. Once uploaded, any crash reports for that build will be automatically deobfuscated in the Play Console crash dashboard.

You can upload mapping files for past builds too. If you forgot to upload symbols for last week's release, you can still do it now—crashes will be retroactively deobfuscated.

Automating Symbol Upload in CI/CD

Uploading manually is error-prone; automate it as part of your release pipeline using the bundletool command or the Google Play API.

Using bundletool (easier for small teams):

First, download bundletool and authenticate:

bundletool install-fakes --bundletool-path=bundletool.jar
gcloud auth login
gcloud config set project YOUR_PROJECT_ID

Then upload symbols after your release build:

bundletool upload-symbols \
  --symbol-file=app/build/outputs/mapping/release/mapping.txt \
  --package-name=com.myapp \
  --version-code=42

Using the Play Developer API (recommended for scaled teams):

If you're already using CI/CD tools like GitHub Actions, GitLab CI, or Jenkins, consider integrating the Play Developer API. You'll need:

  • A service account with Play Developer access
  • A JSON key file (store securely in your CI secrets)
  • A small script to POST the mapping file

A minimal GitHub Actions example:

- name: Upload ProGuard Mapping to Play Console
  env:
    PLAY_KEY: ${{ secrets.PLAY_SERVICE_ACCOUNT_JSON }}
  run: |
    echo "$PLAY_KEY" > /tmp/play-key.json
    curl -X POST \
      -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
      -F "symbolFile=@app/build/outputs/mapping/release/mapping.txt" \
      "https://www.googleapis.com/upload/androidpublisher/v3/applications/com.myapp/edits/$(gcloud ... get-latest-version)/apks/42/symbols"

The exact API calls depend on your setup, but the pattern is: authenticate, then POST the mapping file to your package's latest version.

Integrating with Error Tracking Platforms

Google Play Console's crash reporting is valuable, but it's only one channel. If you're using LightTrace or another error tracker, you'll need to also upload your mapping files there.

LightTrace accepts mapping files directly—often via an upload endpoint or REST API—so crashes captured by your Sentry SDK (or LightTrace SDK) are deobfuscated in real time. This gives you richer filtering: group by class name, search by method, correlate with distributed traces across your backend. For a complete picture of production behavior, you want both:

  • Play Console symbols for crashes reported by Google's native Play Services integration
  • Error tracker symbols for crashes caught by your SDK instrumentation

The additional upload to your error tracker is a single extra step in your pipeline and ensures that every crash channel speaks readable stack traces. For workflows using R8 deobfuscation, some tools also offer automatic Play Console symbol syncing, which can save you the double-upload.

Verifying Symbol Upload and Viewing Deobfuscated Crashes

After uploading, Google Play's dashboard will show a checkmark or "Symbols uploaded" status in the build details. Allow 5–10 minutes for processing.

To verify the symbols are working:

  1. Trigger a test crash in your app on a device running the build you just uploaded.
  2. Wait 5 minutes for the crash to appear in Play Console.
  3. Go to Crashes & ANRs in Play Console and find your test crash.
  4. Check the stack trace — it should now show full class and method names, not obfuscated ones.

If the trace is still obfuscated:

  • Confirm the mapping file was from the exact build version you tested
  • Check that minification is actually enabled in your release build
  • Verify the mapping file isn't corrupt (non-empty, proper format)
  • Re-upload the symbols and wait a few minutes

Key Takeaways

Uploading ProGuard mapping files to Google Play Console is a simple, critical step in Android release management. Set it up once in your CI/CD pipeline and you'll have readable crash logs for every release. Pair it with an error tracking service like LightTrace to get even deeper insights—cross-app tracing, custom grouping, and AI-powered root cause analysis alongside your Play Console baseline.

For a deeper look at obfuscation patterns and how modern tools handle symbolication, check out our guide on source maps explained.

Start tracking errors in minutes

Start tracking Android crashes today with LightTrace's Sentry-compatible error tracking. Get 5,000 events free every month, upload your symbol files, and see unobfuscated stack traces instantly.

Fix your next production error faster

Point any Sentry SDK at LightTrace — free up to 5,000 events/month.