בנוסף לכללי השמירה הכלליים, סוגים נוספים של כללי שמירה ואפשרויות גלובליות, אפשר להשתמש בכללים מסוימים כדי לפתור בעיות באופטימיזציה.
-checkdiscard
הכלל -checkdiscard מאפשר לבדוק אם R8 השליך בהצלחה מחלקה או מחבר שלה שציפיתם שיוסרו. אם המחלקה או החבר שצוינו לא נמחקים, הבנייה נכשלת.
התחביר של -checkdiscard הוא:
-checkdiscard <class_specification>
בדוגמה הבאה, ה-build נכשל אם השדה userId או השיטה setLabel() מהמחלקה com.example.models.User נשמרים:
-checkdiscard class com.example.models.User{
private java.lang.String userId;
public void setLabel(java.lang.String);
}
יכול להיות שהקוד של הכיתה עדיין יהיה באפליקציה אם השיטות שלה הוכנסו לשורות של כיתות אחרות. כדי לוודא שהקוד הוסר לחלוטין ולא רק הוטמע, מוסיפים כלל תואם שמונע מ-R8 לבצע אופטימיזציות במחלקת היעד, על ידי שילוב של -checkdiscard עם כלל -keep,allowshrinking. כך נמנעות אופטימיזציות כמו מיזוג מחלקות והוספה של קוד inline. אם הכלל -checkdiscard עובר, אף אחד מהתכנים מהמחלקות התואמות לא נמצא באפליקציה שעברה אופטימיזציה.
בדוגמה הבאה אפשר לראות איך משתמשים בפונקציה:
# Either keep or remove the class, don't rename or otherwise optimize it
-keep,allowshrinking class com.example.foo { *; }
# Verify that the class and all of its fields and methods are removed.
-checkdiscard class com.example.foo
-whyareyoukeeping
אפשר להשתמש בכלל -whyareyoukeeping כדי להבין למה R8 שמר על מחלקה, שדה או שיטה ספציפיים בגרסת ה-build של האפליקציה. פריט יכול להישמר מכמה סיבות, אבל הכלל הזה מספק רק את הסיבה שבה הנתיב לפריט מהפריט שנשמר הוא הקצר ביותר. אם תסירו את הנתיב הזה מהקוד, יכול להיות שהפריט עדיין יישמר אבל מסיבה אחרת.
סיבות אפשריות:
כלל שמירה: כלל השמירה יכול להיות מהאפליקציה, מספרייה בשימוש או מכללים שנוצרו על ידי AAPT (כלי לאריזת נכסים של Android).
הפניות טרנזיטיביות מקוד או ממשאבים שנשמרו: אם קוד או XML (כמו פריסות) נשמרים על ידי R8, כל מה שהם מפנים אליו באופן סטטי נשמר.
התחביר הוא:
-whyareyoukeeping <class_specification>
לדוגמה:
-whyareyoukeeping class com.example.foo.MainActivity {
private void setLabel(...);
}
הפלט מודפס במסוף.
אם אין לכם כלל ששומר את setLabel(), הפלט הוא:
com.example.foo.MainActivity
|- is referenced in keep rule:
| /app/build/intermediates/aapt_proguard_file/release/processReleaseResources/aapt_rules.txt:4:1
Nothing is keeping void com.example.foo.MainActivity.setLabel()
אם יש לכם כלל שמירה שמכוון אל setLabel(), הפלט ייראה כך:
com.example.foo.MainActivity
|- is referenced in keep rule:
| /app/proguard-rules.pro:23:1
void com.example.foo.MainActivity.setLabel()
|- is referenced in keep rule:
| /app/proguard-rules.pro:23:1