Crashlyticsปลั๊กอิน Gradle จะตรวจหาโดยอัตโนมัติเมื่อคุณทำให้โค้ดอ่านยาก เมื่อบิลด์สร้างไฟล์การแมป ปลั๊กอินจะอัปโหลดไฟล์ดังกล่าวเพื่อให้เซิร์ฟเวอร์ Crashlytics ใช้ไฟล์เพื่อแสดงผล Stack Trace ของแอปเป็นโค้ดที่อ่านได้และไม่อ่านยาก
การกำหนดค่าที่จำเป็นเมื่อใช้ R8, ProGuard และ DexGuard
Crashlytics สามารถถอดรหัสซอร์สโค้ดที่ปรับให้ยากต่อการอ่าน (Obfuscate) ด้วยไฟล์การแมปที่เข้ากันได้กับ ProGuard และ ได้รับการทดสอบเพิ่มเติมกับ ProGuard, R8 และ DexGuard
หากแอปใช้ R8 โดยเปิดการปกปิดโค้ดร่วมกับ Android Gradle 4.2.0 ขึ้นไป Crashlytics จะสร้างรายงานข้อขัดข้องที่อ่านได้ โปรดทราบว่าCrashlytics เราเพิ่งปรับปรุงการรองรับแอปที่ใช้ทั้ง Kotlin และ R8 ซึ่งอาจส่งผลให้การติดป้ายกำกับปัญหาที่ไม่คาดคิดบางอย่างเกิดขึ้น
หากแอปใช้ไฟล์กำหนดค่า ProGuard คุณจะต้องเก็บรักษาข้อมูลที่ Crashlytics ต้องการเพื่อสร้างรายงานข้อขัดข้องที่อ่านได้ โดยการเพิ่มบรรทัดต่อไปนี้ลงในไฟล์การกำหนดค่า ProGuard หรือ DexGuard
-keepattributes SourceFile,LineNumberTable # Keep file names and line numbers. -keep public class * extends java.lang.Exception # Optional: Keep custom exceptions.
หากต้องการความช่วยเหลือสำหรับคำถามหรือปัญหาที่เกี่ยวข้องกับ DexGuard โปรดติดต่อทีมสนับสนุนของ Guardsquare โดยตรง หากต้องการความช่วยเหลือเกี่ยวกับ ProGuard โปรดไปที่ฟอรัมชุมชน Guardsquare เพื่อรับความช่วยเหลือจากผู้เชี่ยวชาญ
เก็บตัวแปรของบิลด์ที่ผ่านการปกปิด
หากต้องการป้องกันไม่ให้ปลั๊กอิน Gradle Crashlyticsอัปโหลดไฟล์การแมปสำหรับ
ตัวแปรที่ใช้การปกปิดโค้ด ให้ตั้งค่าพร็อพเพอร์ตี้ส่วนขยาย Gradle firebaseCrashlytics.mappingFileUploadEnabledเป็น
false ในไฟล์ Gradle ของโมดูล (ระดับแอป)
(โดยปกติคือ <project>/<app-module>/build.gradle.kts หรือ
<project>/<app-module>/build.gradle) ซึ่งจะช่วยเร่งเวลาบิลด์
สำหรับการบิลด์ที่ปกปิดโค้ดได้ แต่โปรดทราบว่า Stack Trace ที่ได้จะ
ปรากฏในรูปแบบที่ปกปิดโค้ดในหน้าCrashlyticsของคอนโซล Firebase
Kotlin
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // To enable Crashlytics mapping file upload for specific build types: buildTypes { getByName("debug") { minifyEnabled = true configure<CrashlyticsExtension> { mappingFileUploadEnabled = false } } } ... // To enable Crashlytics mapping file upload for specific product flavors: flavorDimensions += "environment" productFlavors { create("staging") { dimension = "environment" ... configure<CrashlyticsExtension> { mappingFileUploadEnabled = false } } create("prod") { dimension = "environment" ... configure<CrashlyticsExtension> { mappingFileUploadEnabled = true } } } }
Groovy
android { // To enable Crashlytics mapping file upload for specific build types: buildTypes { debug { minifyEnabled true firebaseCrashlytics { mappingFileUploadEnabled false } } } ... // To enable Crashlytics mapping file upload for specific product flavors: flavorDimensions "environment" productFlavors { staging { dimension "environment" ... firebaseCrashlytics { mappingFileUploadEnabled false } } prod { dimension "environment" ... firebaseCrashlytics { mappingFileUploadEnabled true } } } }