הוספת אפשרויות גלובליות

‫ב-R8 אפשר לקבוע הגדרות גלובליות שמשנות את האופטימיזציות של R8 בכל האפליקציה או משפיעות בבת אחת על כל כללי השמירה הספציפיים (keep rule). ההגדרות האלה מנוהלות בקובץ 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: מונעת את הקיצור של שמות המחלקות והמתודות. כדאי להשבית את ערפול הקוד (obfuscation) במיוחד בזמן ניפוי באגים, כדי שיהיה קל יותר לקרוא את דוח הקריסות. אפשר להשתמש באפשרות הזו במהלך הפיתוח, אבל לא מומלץ להשתמש בה בגרסאות ייצור.
  • -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 המאפיין הזה ממפה הוראות של בייטקוד (bytecode) למספרי השורות התואמים שלהן בקובץ המקורי.

שימו לב: המאפיין הזה נשמר באופן אוטומטי החל מגרסה 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.

מאפיינים נוספים לשמירה

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

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

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

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

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

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