Deobfuscate
Crash reports are a lot more useful when you see your deobfuscated stack traces.
Introduction
Android is using R8 tool to shrink, obfuscate and optimize your code when app is built in release mode - this makes crash stack traces hard to read. Shake allows you to upload build's mapping.txt files so you can see deobfuscated stack traces on the Shake dashboard.
Upload manually to Shake dashboard
By default, the mapping.txt file is created in your app's build directory: project/app/build/outputs/mapping/release/mapping.txt.
To upload your app's mapping files to the Shake dashboard:
- Visit Workspace administration → Apps
- Click your app name to expand it
- Select Crash reports menu and click Choose a file button
- Drag and drop your mapping.txt file there
Using the script
If you prefer to do this automatically, you can do it using this script:
- Windows
- Mac
upload_mapper.bat
@echo offset PATH_TO_MAPPING_FILE=%1set API_KEY=%2set VERSION_CODE=%3set VERSION_NAME=%4set APPLICATION_ID=%5rem Replace URL with valid Endpoint for file uploadingset FILES_ENDPOINT="https://api.shakebugs.com/api/2.0/crash_reporting/app_debug_file"if NOT exist %PATH_TO_MAPPING_FILE% (echo "Mapping file not found!"exit)echo "Mapping file found!"echo "Uploading mapping file..."FOR /F "tokens=*" %%A IN ('curl -H "X-API-KEY: %API_KEY%" -H "X-OS: Android" -H "X-PLATFORM: Android" -H "X-APP-ID: %APPLICATION_ID%" -F "file=@%PATH_TO_MAPPING_FILE%" -F "app_version_code=%VERSION_CODE%" -F "app_version_name=%VERSION_NAME%" -X POST %FILES_ENDPOINT% -w "%%{http_code}"') DO SET STATUS=%%Aif %STATUS% NEQ 200 (echo "Failed to upload mapping file."exit)echo "Success! Mapping file uploaded successfully."exit
upload_mapper.sh
#!/bin/bashPATH_TO_MAPPING_FILE=$1API_KEY=$2VERSION_CODE=$3VERSION_NAME=$4APPLICATION_ID=$5# Replace URL with valid Endpoint for file uploadingFILES_ENDPOINT="https://api.shakebugs.com/api/2.0/crash_reporting/app_debug_file"echo "Shake: Start mapping file upload: $PATH_TO_MAPPING_FILE"if [ ! -f $PATH_TO_MAPPING_FILE ]; thenecho "Mapping file not found!"exit 0fiecho "Mapping file found!"echo "Uploading mapping file..."STATUS=$(curl -H "X-API-KEY: $API_KEY" -H "X-OS: Android" -H "X-PLATFORM: Android" -H "X-APP-ID: $APPLICATION_ID" \-F app_version_code="${VERSION_CODE}"\-F app_version_name="${VERSION_NAME}"\-F "file=@${PATH_TO_MAPPING_FILE}"\-X POST "$FILES_ENDPOINT" --write-out %{http_code})if [ "${STATUS: -3}" != "200" ]; thenecho "Error while uploading mapping files"exit 0fiecho "Success! Mapping file uploaded successfully."
After that, add the following gradle task to your app's build.gradle file:
build.gradle
import org.apache.tools.ant.taskdefs.condition.Ostasks.register('uploadMappingFile') {def apiKey = 'app-api-key'doLast {android.applicationVariants.configureEach {if (it.buildType.isMinifyEnabled() && it.buildType.name == 'release') {def mappingProvider = it.getMappingFileProvider()def mappingFile = mappingProvider.get().singleFiledef applicationId = it.applicationIddef versionName = it.versionNamedef versionCode = it.versionCodeif (mappingFile != null && mappingFile.exists()) {if (Os.isFamily(Os.FAMILY_WINDOWS)) {exec {commandLine 'cmd', '/c', 'start', 'upload_mapper.bat', mappingFile, apiKey, versionCode, versionName, applicationId}} else if (Os.isFamily(Os.FAMILY_UNIX)) {exec {commandLine 'sh', './upload_mapper.sh', mappingFile, apiKey, versionCode, versionName, applicationId}} else {throw new GradleException('Not supported OS!')}}}}}}