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

‫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 במאפיין הזה מאוחסנות הערות שרלוונטיות לשימושים בסוגים ולא רק להצהרות. המאפיין הזה לא גלוי בזמן הריצה.

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