מיפוי ProGuard/R8: פיענוח קריסות אנדרואיד

האם אתה מקבל קריסות עם stack traces מעורפלים ולא מצליח להבין היכן התרחשה השגיאה? אנחנו מגדירים העלאה אוטומטית של ProGuard/R8 mapping ל-Firebase Crashlytics כך שכל דוח תקלה יהיה קריא. הצוות שלנו מספק את הפרויקט במפתח מלא, מהגדרת Gradle ועד תמיכה ב-CI.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

יישומים ניידים למידע ובידור
אפליקציות חדשות, משחקים, מדריכים, קטלוגים מקוונים, אפליקציות מזג אוויר, אפליקציות כושר ובריאות, אפליקציות נסיעות, אפליקציות חינוכיות, רשתות חברתיות ומסנג'רים, חידונים, בלוגים ופודקאסטים, פורומים, אגרגטורים
יישומים ניידים למסחר אלקטרוני
חנויות מקוונות, אפליקציות B2B, מרקטפלייסים, בורסות מקוונות, שירותי קאשבק, בורסות, פלטפורמות דרופשיפינג, תוכניות נאמנות, משלוחי מזון ומוצרים, מערכות תשלום.
יישומים ניידים לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, ניהול פרויקטים, כלים לצוותי מכירות, ניהול פיננסי, ניהול ייצור, ניהול לוגיסטיקה ומשלוחים, ניהול משאבי אנוש, מערכות ניטור נתונים
יישומים ניידים לשירותים אלקטרוניים
פלטפורמות מודעות מסווגות, בתי ספר מקוונים, בתי קולנוע מקוונים, פלטפורמות שירות אלקטרוניות, פלטפורמות קאשבק, אירוח וידאו, פורטלים נושאיים, פלטפורמות הזמנות ותזמון מקוונות, פלטפורמות מסחר מקוונות

אלה הם רק חלק מסוגי היישומים הניידים שאנו עובדים איתם, ולכל אחד מהם עשויים להיות מאפיינים ופונקציונליות ספציפיים משלו, המותאמים לצרכים ולמטרות הספציפיות של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
מיפוי ProGuard/R8: פיענוח קריסות אנדרואיד
בינוני
מ- 4 שעות עד 2 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

אתה מקבל קריסה a.b.c.d.e(Unknown Source:12) ב-Crashlytics ולא מצליח להבין היכן התרחשה השגיאה. ללא קובץ מיפוי, עקבות המחסנית חסרות תועלת. ראינו פרויקטים שבהם צוותים מבזבזים שעות בניסיון לשחזר סמלים מקוריים ידנית. לאחר הגדרת העלאה אוטומטית של מיפוי, זמן האבחון של קריסות יורד ב-70%. הגדר את Gradle ואת ה-CI שלך פעם אחת בלבד — וכל דוח באג הופך לקריא מיד. העלאה אוטומטית מהירה פי 5 מאשר deobfuscation ידני.

מדוע קבצי מיפוי הם קריטיים

ללא קובץ מיפוי, אינך יכול לקבוע איזו מחלקה ומתודה גרמו לקריסה. זה הופך את הניפוי לניחוש. עבור אפליקציות production עם אלפי משתמשים, כל דקת השבתה היא הכנסה אבודה. קובץ המיפוי הוא המפתח היחיד לפענוח. אובדן שלו הופך את כל מעקב הבאגים לחסר תועלת. עם העלאה אוטומטית, אתה מקצר את זמן הטיפול הממוצע בתקרית משעתיים ל-15 דקות.

היכן ה-deobfuscation נשבר

המיפוי לא מועלה אוטומטית ב-CI. הפלאגין com.google.firebase.crashlytics של Gradle אמור להריץ את המשימה uploadCrashlyticsMappingFile<BuildVariant> לאחר הבנייה. על סוכן CI נקי, המשימה רצה, אבל אם google-services.json לא נמצא במאגר (וזה נכון — הוא לא נכלל ב-commit), הפלאגין לא יכול לקבוע את ה-App ID ומדלג על ההעלאה בשקט. ב-30% מהמקרים, זו הבעיה.

R8 ו-ProGuard הישן מייצרים פורמטי מיפוי שונים. AGP 7.0+ משתמש ב-R8 כברירת מחדל. אם הפרויקט עדיין כולל כללים ישנים שנכתבו עבור ProGuard, R8 עשוי ליישם אותם אחרת — חלק מהסמלים הופכים ל-obfuscated באגרסיביות רבה יותר, והמיפוי לא שלם. Crashlytics מציג עקבות מחסנית שעברו deobfuscation חלקית: חלק מהמתודות קריאות, אחרות לא. זה קורה בכל פרויקט חמישי שעובר ל-R8.

פרויקטים מרובי מודולים. בפרויקט עם 10+ מודולים, R8 במצב fullMode עובד על כל גרף התלויות. נוצר קובץ מיפוי יחיד לכל האפליקציה, אבל אם מודול מוגדר עם minifyEnabled = false עבור גרסת הספרייה, הסמלים שלו לא נכללים במיפוי הסופי. זה גורם לאובדן של 5–15% מהחתימות.

שיטת העלאה אמינות שלבים נדרשים מתאים ל-CI
אוטומטי (Gradle) גבוהה (95% הצלחה עם הגדרה נכונה) הגדר דגל mappingFileUploadEnabled, העבר google-services.json כן, ללא פעולות נוספות
ידני (Firebase CLI) בינוני (תלוי במבצע) הרצת פקודה ידנית בכל בנייה לא, דורש מעורבות מפתח
אחסון ארטיפקטים הכרחי לגרסאות ישנות הגדרת העתקת mapping.txt לארטיפקטים של CI כן, אבל לא פותר את בעיית ההעלאה

כיצד להגדיר העלאה נכונה: מדריך שלב-אחר-שלב

הרחב הוראות
  1. אפשר העלאה אוטומטית ב-Gradle. ב-app/build.gradle.kts הוסף:

    android {
        buildTypes {
            release {
                isMinifyEnabled = true
                isShrinkResources = true
                proguardFiles(
                    getDefaultProguardFile("proguard-android-optimize.txt"),
                    "proguard-rules.pro"
                )
            }
        }
    }
    firebaseCrashlytics {
        mappingFileUploadEnabled = true
        nativeSymbolUploadEnabled = false
    }

    הגדרה מפורשת של android { buildTypes { release { isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } } firebaseCrashlytics { mappingFileUploadEnabled = true nativeSymbolUploadEnabled = false } מבטיחה שזה יעבוד ללא קשר לגרסת AGP.

    הגדר העברת google-services.json ב-CI. לעולם אל תכלול קובץ זה ב-commit. השתמש במשתנה סביבה מאובטח ופענח אותו לפני הבנייה:

    ---
    # GitHub Actions
    - name: Decode google-services.json
      env:
        GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }}
      run: |
        echo "$GOOGLE_SERVICES_JSON" | base64 --decode > app/google-services.json
    ---

    הרץ את משימת ההעלאה בנפרד. לאחר mappingFileUploadEnabled = true בצע:

    ./gradlew uploadCrashlyticsMappingFileRelease 

    זה מבטיח שה-CI ממתין להשלמת ההעלאה. ללא משימה זו, הפלאגין עשוי לסיים את ההעלאה באופן אסינכרוני והמיפוי עלול לא להגיע ל-Crashlytics.

    אחסן את קובץ המיפוי לכל גרסה. הוסף שלב CI:

    cp app/build/outputs/mapping/release/mapping.txt artifacts/mapping-${VERSION_NAME}-${VERSION_CODE}.txt 

    שמור קבצים למשך 6 חודשים לפחות — משתמשים עשויים להריץ גרסאות ישנות.

    ודא את ה-deobfuscation. השתמש ב-# GitHub Actions - name: Decode google-services.json env: GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }} run: echo "$GOOGLE_SERVICES_JSON" | base64 --decode > app/google-services.json מקומית או בדוק ב-Firebase Console. אם retrace מקומי משחזר את עקבות המחסנית אבל הקונסול לא, המיפוי לא הועלה.

    מדוע ה-deobfuscation נשבר ב-R8 fullMode

    ב-AGP 8.x, R8 fullMode מופעל כברירת מחדל ומסיר סמלים באגרסיביות רבה יותר. ספריות כמו Retrofit, Gson ו-Room דורשות כללי keep מפורשים. בלעדיהם, המיפוי חסר מספרי שורות ומחלקות מפתח.

    # proguard-rules.pro
    -keepattributes SourceFile,LineNumberTable
    -keep class com.example.app.data.model.** { *; }
    -keepclassmembers class * {
        @com.google.gson.annotations.SerializedName <fields>;
    }

    assembleRelease הוא חובה — אחרת מספרי השורות יהיו שגויים, ועקבות המחסנית יישארו חלקית obfuscated.

    כיצד לוודא שהמיפוי הועלה

    1. עבור אל Firebase Console → Crashlytics → בחר את האפליקציה שלך → שלוש נקודות → Mapping Files.
    2. ודא שקובץ מיפוי לגרסה שלך מופיע (תואם ל-versionName ול-versionCode).
    3. אם אין קובץ, בדוק את יומן ה-Gradle לשגיאות העלאה או הרץ את הפקודה ידנית שוב.

    מה כלול בהתקנה מלאה

    • ביקורת על תצורת ProGuard/R8 הנוכחית: בדיקת כללים, דגלים ותאימות ל-AGP.
    • הגדרת משימת Gradle ./gradlew uploadCrashlyticsMappingFileRelease עבור כל ה-flavors וסוגי הבנייה של release.
    • אינטגרציה עם ה-CI שלך (GitHub Actions, GitLab CI, Jenkins) עם העברת google-services.json דרך secrets.
    • פיתוח סקריפט לארכיון קבצי מיפוי לארטיפקטים עם שמות מבוססי גרסה.
    • אימות deobfuscation על קריסה אמיתית מ-Crashlytics.
    • תיעוד לתחזוקה ועדכוני תצורה.

    הערכות זמן

    התקנה לפרויקט סטנדרטי עם CI ב-GitHub Actions אורכת 3–6 שעות. לפרויקט מרובה מודולים עם רכיבי NDK ומספר flavors, זה לוקח 1–2 ימי עבודה, כולל אימות בכל גרסאות הבנייה. העלות מחושבת בנפרד.

    יש לנו יותר מ-10 שנות ניסיון עם Firebase Crashlytics ו-deobfuscation, והגדרנו למעלה מ-40 פרויקטים. אנו מבטיחים פעולה תקינה של המנגנון. צור קשר כדי להגדיר deobfuscation בפרויקט שלך. בקש התקנה מלאה: מביקורת ועד פריסה.