הפלאגין Crashlytics של Gradle יכול לזהות באופן אוטומטי מתי אתם מבצעים ערפול של הקוד. כשקובץ המיפוי נוצר ב-build, הפלאגין מעלה אותו כדי ששרתי Crashlytics יוכלו להשתמש בקובץ כדי להציג את מעקב ה-stack של האפליקציה כקוד ללא ערפול שאפשר לקרוא על ידי בני אדם.
ההגדרות הנדרשות לשימוש ב-R8, ב-ProGuard וב-DexGuard
אפשר לבטל את ההסתרה של Crashlytics באמצעות כל קובץ מיפוי תואם ל-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 כדי לקבל עזרה ממומחה.
שמירה של וריאנטים מעורפלים של גרסאות build
כדי למנוע מפלאגין Crashlytics של Gradle להעלות את קובץ המיפוי של הווריאנטים שמשתמשים בהסתרה, מגדירים את מאפיין התוסף firebaseCrashlytics.mappingFileUploadEnabled
של Gradle לערך false
בקובץ Gradle של המודול (ברמת האפליקציה) (בדרך כלל <project>/<app-module>/build.gradle.kts
או <project>/<app-module>/build.gradle
). הפעולה הזו יכולה לעזור לקצר את זמני ה-build של גרסאות build שהוסתרו, אבל חשוב לזכור ששרטוטי הסטאק שייווצרו יופיעו מוסתרים בדף 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 } } } }