העדכונים של R8 משנים את הקוד של האפליקציה, ולכן חשוב לבצע בדיקות מקיפות של התנהגות האפליקציה כדי לוודא שהיא פועלת כמצופה. במקרה של התנהגות בלתי צפויה, אפשר להשתמש בדף הזה כמדריך לפתרון בעיות פוטנציאליות אחרי האופטימיזציה.
במהלך פתרון הבעיות, כדאי להתמקד במצבים הבאים:
- אופטימיזציה מוגזמת שגורמת לקריסת האפליקציה: האפליקציה קורסת כי R8 ביצע אופטימיזציה של יותר מדי קוד.
- אופטימיזציה לא ברורה או לא מספקת: האופטימיזציה של האפליקציה באמצעות R8 לא הייתה כמו שציפיתם, או שאתם צריכים הסברים נוספים על האופטימיזציות.
קריסות של אפליקציה
אם האפליקציה קורסת אחרי אופטימיזציה באמצעות R8, בדרך כלל זה קורה בגלל שיקוף פגום. כדי לזהות שיקוף פגום, פועלים לפי ההנחיות הבאות:
- התקבל חריג, שבדרך כלל מציין שהמחלקה, השיטה או השדה שצוינו נמצאים בשימוש באמצעות השתקפות.
החריגים האלה הם בדרך כלל אחד מהערכים הבאים:
ClassNotFoundException,NoSuchMethodException, NoSuchFieldException, NoClassDefFoundError,NoSuchMethodError, NoSuchFieldError. - מופיע קוד שמפנה לרפלקציה עם
import kotlin.reflect.*אוimport java.lang.reflect.*. - אפשר לראות את השימוש בבונה המחלקה באופן הבא:
Something::class.constructors. - מוצג
Class.forName(...).
הפתרון: מוסיפים כלל שמירה.
אופטימיזציה לא ברורה או לא מספקת
הכללים מוחלים על האפליקציה וגם על הספריות הכלולות בה, ולכן יכול להיות שתצטרכו הבהרות נוספות לגבי הכללים שחלים, או הסבר למה R8 שמר על חלקים מסוימים בקוד שציפיתם שיעברו אופטימיזציה.
אי בהירות לגבי הכללים שחלים: כללים מספרייה כלולה חלים גם על האפליקציה, ואפשרויות גלובליות מהספריות האלה מועברות גם לאפליקציה. לכן, יכול להיות שלא תדעו אילו כללים חלים.
פתרון: כדי לראות אילו כללים מוחלים, אפשר לעיין בדוח של כל הכללים ש-R8 מחיל כשיוצרים את הפרויקט. אפשר למצוא את הדוח הזה בכתובת
./app/build/outputs/mapping/configuration.txt. הדוח הזה מכיל את כל הכללים הממוזגים מכל ספרייה ומודול ששימשו להגדרת R8, ואפשר להשתמש בו כדי לזהות כללים לא יעילים.יותר מדי קוד נשמר: יכול להיות שהאופטימיזציה של R8 תשמור קוד שציפיתם שיוסר.
פתרון: משתמשים באפשרות ההגדרה
-whyareyoukeepingכדי להבין למה הקוד נשמר. הפלט מכיל נתיב מהקוד שנשמר לאחת מנקודות הכניסה של האפליקציה. מידע נוסף זמין במאמר-whyareyoukeeping.קשה להבין את דוח הקריסה המקורי: R8 משנה את הקוד בדרכים שונות, ולכן דוח הקריסה כבר לא מתייחס לקוד המקורי. לדוגמה, מספרי השורות והשמות של המחלקות והשיטות יכולים להשתנות.
פתרון: החל מ-Android Studio Otter 3 Feature Drop ו-AGP 9.0, Logcat מסיר אוטומטית את ההסתרה של עקבות מחסנית. עם זאת, אם אתם משתמשים בגרסה קודמת של Android Studio, אתם צריכים לשחזר את מעקב המחסנית המקורי באופן ידני. כדי לשחזר את מעקב המחסנית המקורי, משתמשים בכלי שורת הפקודה
retrace, שמצורף לחבילת כלי שורת הפקודה.כדי להשתמש ב-
retrace, צריך לספק לפקודה את הנתיב לקובץ מיפוי ולקובץ מעקב אחר מחסנית. קובץ המיפוי, שנקראmapping.txt, מצורף אוטומטית ל-Android App Bundle (AAB). פרטים נוספים זמינים במסמכי התיעוד בנושא retrace ובמאמר במרכז העזרה של Play Console בנושא ביטול ההסתרה של עקבות מחסנית של קריסות. כשמשתמשים ב-Play וב-Firebase Crashlytics, צריך להשתמש בקובץmapping.txtעם הקריסות שהשירות אוסף ממשתמשי האפליקציה. הפקודה הבאה מראה איך אפשר להריץ אתretraceמהספרייה הראשית של הפרויקט:$ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
דיווח על באגים
אם לא הצלחתם לפתור בעיה ב-R8, אתם יכולים לדווח על באג.