R8 מספק אפשרויות גלובליות שמשנות את האופטימיזציות של R8 בכל האפליקציה או משפיעות על כל כלל keep. האפשרויות האלה מתעדכנות בקובץ proguard-rules.pro, יחד עם כללי השמירה. חלק מהאפשרויות הגלובליות האלה מגדירות אופטימיזציה נוספת, ואחרות משביתות היבטים מסוימים של האופטימיזציה.
אפשרויות גלובליות לאופטימיזציה נוספת
האפשרויות הגלובליות הבאות מאפשרות אופטימיזציה נוספת:
-
-repackageclasses [<optional-package-name>]: אורז מחדש את המחלקות לחבילה אחת כדי להקטין את גודל האפליקציה. אם לא מציינים את שם החבילה האופציונלי, המחלקות מועברות לחבילת ברירת המחדל ללא שם. זו ההגדרה המומלצת לאפליקציות, כי היא יוצרת קובצי DEX קטנים יותר על ידי השמטת הקידומת של החבילה משמות המחלקה. -
-allowaccessmodification: מאפשר ל-R8 לשנות (בדרך כלל להרחיב) את הרשאות הגישה של מחלקות, שדות ושיטות כדי לבצע אופטימיזציות נרחבות יותר. מופעל כשמשתמשים ב-proguard-android-optimize.txt. החל מ-Android Gradle Plugin (AGP) 8.2, זוהי הגדרת ברירת המחדל אם מפעילים אופטימיזציה מלאה עם R8.
דוגמה להגדרה שבה מופעלת אופטימיזציה נוספת:
-repackageclasses
-allowaccessmodification
אפשרויות כלליות להגבלת האופטימיזציה
האפשרויות הגלובליות הבאות מאפשרות להשבית היבטים מסוימים של אופטימיזציה של אפליקציות, והן שימושיות כשמשפרים את כללי השמירה או כשמפעילים את R8 בפעם הראשונה.
-
-dontoptimize: מונע אופטימיזציה של הקוד, למשל הטמעה של שיטה. אפשר להשתמש באפשרות הזו במהלך הפיתוח, אבל לא בגרסאות ייצור. -
-dontshrink: מונע את ההסרה של קוד לא מפוענח ואת האופטימיזציה של הקוד. אפשר להשתמש באפשרות הזו במהלך הפיתוח, אבל לא בגרסאות ייצור. -
-dontobfuscate: מונע קיצור של שמות המחלקות והשיטות. השבתת ההסתרה יכולה להיות שימושית במיוחד במהלך ניפוי באגים, כדי שיהיה קל יותר לקרוא את עקבות המחסנית. אפשר להשתמש באפשרות הזו במהלך הפיתוח, אבל לא מומלץ להשתמש בה בגרסאות ייצור. -
-keepattributes <attributes>: מקבל רשימה מופרדת בפסיקים של מאפיינים שצריך לשמור. אם לא משתמשים בברירת המחדלproguard-android-optimize.txt, R8 מסיר את כל המאפיינים, כוללRuntimeVisibleAnnotationsו-Signature. עם זאת, כדאי לשמור את המאפיינים האלה אם הם נדרשים במקרים כמו רפלקציה. רשימת המאפיינים שאפשר לציין מופיעה במאמר שמירת מאפיינים.
שמירת מאפיינים
מאפיינים הם קטעי מידע נוספים שמצורפים לחלקים שונים בקוד. בתכונות נשמר מידע כמו הערות וחתימות כלליות מהקוד.
כדי להפעיל פעולות רפלקטיביות מסוימות, צריך לשמור מאפיינים ספציפיים. לדוגמה:
- כשניגשים למבנה של מחלקה פנימית או חיצונית באמצעות
getEnclosingMethod()אוgetDeclaredClasses(), צריך להשתמש במאפייניםEnclosingMethodו-InnerClasses. - כשניגשים לחתימות גנריות באמצעות
getTypeParameters(), צריך להשתמש במאפייןSignature. כשניגשים להערות באמצעות
getAnnotation(), צריך להשתמש במאפייןRuntimeVisibleAnnotations.
מאפיינים נפוצים שנדרשים
כשמשתמשים בקובץ ברירת המחדל של Proguard (proguard-android-optimize.txt או proguard-android.txt), התוסף Android Gradle (AGP) שומר את המאפיינים הבאים. שימו לב שחלק מהמאפיינים האלה דורשים גרסאות חדשות יותר של AGP:
| מאפיין | תיאור |
|---|---|
AnnotationDefault |
המאפיין הזה נמצא בסוגי ההערות עצמם, והוא מאחסן את ערך ברירת המחדל של רכיב הערה. הערה: המאפיין הזה נשמר כברירת מחדל החל מ-AGP 7.1, וצריך לשמור אותו באופן מפורש רק באפליקציות שמשתמשות בגרסאות קודמות של AGP. |
EnclosingMethod |
המאפיין הזה מופיע במחלקות פנימיות שהן לא מחלקות מקומיות או אנונימיות. הוא מזהה את השיטה או את האתחול שמכילים את המחלקה באופן מיידי. |
InnerClasses |
המאפיין הזה מתעד מידע על כיתות מוטמעות (כיתות פנימיות, כיתות מוטמעות סטטיות, כיתות מקומיות וכיתות אנונימיות) שמוגדרות בתוך כיתה אחרת. |
LineNumberTable |
המאפיין הזה ממפה הוראות של קוד בייט למספרי השורות התואמים שלהן בקובץ המקור המקורי. הערה: מאפיין זה נשמר כברירת מחדל החל מגרסה 8.6 של Android Gradle Plugin (AGP), וצריך לשמור אותו באופן מפורש רק באפליקציות שמשתמשות בגרסאות קודמות של AGP. |
RuntimeVisibleAnnotations |
במאפיין הזה מאוחסנות הערות שניתן לראות בזמן הריצה באמצעות רפלקציה. בדרך כלל, אם משתמשים בהערות בזמן ריצה, זו ההערה היחידה ממאפייני *Annotation שנדרשת לאפליקציות ולכללים של צרכני ספריות. |
RuntimeVisibleParameterAnnotations |
במאפיין הזה מאוחסנות הערות שניתן לראות בזמן הריצה באמצעות רפלקציה על הפרמטרים של שיטה. |
RuntimeVisibleTypeAnnotations |
במאפיין הזה מאוחסנות הערות שרלוונטיות לשימושים בסוגים ולא רק להצהרות. המאפיין הזה גלוי בזמן הריצה. |
Signature |
במאפיין הזה מאוחסן חתימת סוג כללית יותר של מחלקות, שיטות ושדות, במיוחד כשהם משתמשים בגנריות (כמו List<String>). |
SourceFile |
במאפיין הזה מאוחסן השם של קובץ המקור (קובץ .kt או .java) שממנו בוצעה קומפילציה של מחלקה. הוא משמש בעיקר לניפוי באגים כדי להציג את השורות המקוריות של קוד המקור כשמבצעים ניפוי באגים בקוד Java שעבר קומפילציה. הוא עוזר למפתחים לעקוב אחרי ההרצה עד לקוד שהם כתבו. הערה: המאפיין הזה נשמר כברירת מחדל החל מ-AGP 8.2, וצריך לשמור אותו באופן מפורש רק באפליקציות שמשתמשות בגרסאות קודמות של AGP. |
ברוב המקרים, כללי השמירה שמוגדרים על ידי AGP מספיקים לאפליקציות שמשתמשות ב-proguard-android-optimize.txt. עם זאת, אם אתם כותבים קוד לספרייה, אתם צריכים לציין את כל המאפיינים שנדרשים בספרייה בכללי השמירה של הצרכן, גם אם הם מוגדרים ברשימה הזו. כך תוכלו לוודא שהספרייה שלכם תהיה חזקה אם המפתחים יחליטו לא לכלול את proguard-android-optimize.txt.