R8 מספק אפשרויות גלובליות שמשנות את האופטימיזציות של R8 בכל האפליקציה או משפיעות על כל כלל שמירה. האפשרויות האלה מתעדכנות בקובץ proguard-rules.pro
, יחד עם כללי השמירה. חלק מהאפשרויות הגלובליות האלה מגדירות אופטימיזציה נוספת, ואחרות משביתות היבטים מסוימים של האופטימיזציה.
אפשרויות גלובליות לאופטימיזציה נוספת
האפשרויות הגלובליות הבאות מאפשרות אופטימיזציה נוספת:
-
-repackageclasses [<optional-package-name>]
: אורז מחדש את המחלקות בחבילה אחת שצוינה, כדי להקטין עוד יותר את גודל האפליקציה. אם לא מציינים את שם החבילה האופציונלי, הכיתות מועברות לחבילת ברירת המחדל הריקה. זו הגדרה מומלצת לאפליקציות. -
-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
.
מאפיינים נוספים של Keep
אפשר לציין מאפיינים נוספים שרוצים לשמור, אבל הם לא נדרשים ברוב המקרים של גישה רפלקטיבית או גישת JNI. עם זאת, יכול להיות שחלק מהספריות האלה עדיין ישמשו לעיתים קרובות בזמן אופטימיזציה של ספריות.
מאפיין | תיאור |
---|---|
MethodParameters |
המאפיין הזה מספק מידע על הפרמטרים של שיטה, ובפרט על השמות ועל דגלי הגישה שלהם. |
Exceptions |
במאפיין הזה מפורטים החריגים המסומנים ששיטה מוצהרת להפעיל. בדרך כלל לא משתמשים במאפיין הזה לאפליקציות. לרוב לא משתמשים בו בכללי השמירה של הצרכנים, אבל משתמשים בו לעיתים קרובות כשיוצרים ספריות. פרטים על אופטימיזציה של ספריות זמינים במאמר אופטימיזציה למפתחי ספריות. |
RuntimeInvisibleAnnotations |
במאפיין הזה מאוחסנות הערות שלא נראות בהשתקפות בזמן הריצה במחלקה, בשדה או בשיטה. מפתחי אפליקציות לא צריכים לשמור את המאפיין הזה. למחברי ספריות, המאפיין הזה לא רלוונטי בכללי שמירה של צרכנים, אבל הוא משמש לעיתים קרובות כשמפתחים ספריות. פרטים על אופטימיזציה של ספריות זמינים במאמר אופטימיזציה למפתחי ספריות. |
RuntimeInvisibleParameterAnnotations |
במאפיין הזה מאוחסנות הערות שלא גלויות באמצעות רפלקציה בזמן ריצה בפרמטרים של שיטה. מפתחי אפליקציות לא צריכים לשמור את המאפיין הזה. למחברי ספריות, המאפיין הזה לא רלוונטי בכללי שמירה של צרכנים, אבל הוא משמש לעיתים קרובות כשמפתחים ספריות. פרטים על אופטימיזציה של ספריות זמינים במאמר אופטימיזציה למפתחי ספריות. |
RuntimeInvisibleTypeAnnotations |
במאפיין הזה מאוחסנות הערות שרלוונטיות לשימושים בסוגים ולא רק להצהרות. המאפיין הזה לא גלוי בזמן הריצה. מפתחי אפליקציות לא צריכים לשמור את המאפיין הזה. למחברי ספריות, המאפיין הזה לא רלוונטי בכללי שמירה של צרכנים, אבל הוא משמש לעיתים קרובות כשמפתחים ספריות. פרטים על אופטימיזציה של ספריות זמינים במאמר אופטימיזציה למפתחי ספריות. |