מצב תנומה של אפליקציה

משתמש Android ממוצע מתקין יותר מ-50 אפליקציות במכשירים שלו (המספר עולה ככל שרמת ה-RAM של המכשירים עולה). עם זאת, משתמשים לא משתמשים במספר משמעותי מהאפליקציות האלה במשך תקופה ארוכה.

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

יכול להיות שיהיה ניגוד בין שינויים בפלטפורמה שמבצעים יצרני ציוד מקורי (OEM) לבין ההטמעה של מצב תנומה של אפליקציה. לדוגמה

  • שינוי ההגדרה של השימוש באפליקציה או הוספת דרכים להפעלת אפליקציה שלא קיימות ב-AOSP עלולים לפגוע בדיוק של תכונת התרדום של האפליקציה
  • מנגנון הגבלה קנייני של יצרן ציוד מקורי (OEM) שדומה לתרדמת אפליקציות עשוי לשמש למטרה דומה. יכול להיות שיהיו חפיפות בין שני הסוגים.

במסמך CDD מפורטות דרישות חדשות לשינויים שמבוססים על השימוש באפליקציה, בדומה לדרישה הקיימת 3.5.1. מצב תנומה של אפליקציה עומד בדרישות הבאות.

קוד המסגרת נמצא במיקום הבא:

לוגיקת המדיניות נמצאת ב:

  • repo: platform/packages/modules/Permission
  • ספרייה: PermissionController/src/com/android/permissioncontroller/hibernation

ארכיטקטורה ברמה גבוהה

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

  • ביטול אוטומטי של הרשאות
  • סגירה ידנית של האפליקציה
  • מחיקת קובצי ODEX ו-VDEX
  • מחיקת המטמון של האפליקציה

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

העיצוב המתוכנן מתמקד בשני חלקים עיקריים:

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

שירות מערכת חדש, AppHibernationService, ושירות עבודות, AppHibernationJobService,, ב-PermissionController הם הגורמים שמבצעים את ההחלטות והלוגיקה הכוללות.

ההחלטה מתי להעביר חבילה למצב שינה מתבססת בעיקר על UsageStatsService ומנוהלת על ידי AppHibernationJobService ב-PermissionController. הלוגיקה של המדיניות הזו נמצאת ב-PermissionController, כדי לאפשר לנו לעדכן אותה באופן דינמי דרך Mainline. בנוסף, אנחנו מתכננים להוסיף אות חדש, שימוש ברכיבים, כדי לתעד את השימוש ברכיבים של החבילה (לדוגמה, שירותים, ספקי תוכן) כמדד חדש ב-UsageStatsService.

האופטימיזציה של חבילה היא המקום שבו מתבצעים החיסכון והאופטימיזציה בפועל. ‫AppHibernationService מתקשר עם חלקים שונים במערכת כדי לעצור את החבילה, למחוק נתוני מטמון, למחוק פריטי מידע של ART וכו'. ביטול ההרשאה מתבצע ישירות מ-AppHibernationJobService כדי לשמור על הפונקציונליות של ביטול אוטומטי במכשירים עם Android מגרסה 11 ומגרסאות קודמות.

חוויית משתמש

המשתמש מקבל מידע על האפליקציות שאפשר להעביר למצב שינה, ויש לו אפשרות לשלוט בהן.

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

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

תאימות לדורות קודמים

תכונות ספציפיות למצב שינה זמינות החל מ-Android 12. התכונה הזו לא יכולה לפעול בגרסאות קודמות כי רכיבי הפלטפורמה (כמו שירות המערכת החדש) לא קיימים. ביטול הרשאה אוטומטי ממשיך לפעול כמו שהוא פעל בגרסאות קודמות של מערכת ההפעלה.

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

התאמה אישית

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

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

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

בדיקה

יש בדיקות CTS ובדיקות יחידה למצב תנומה של אפליקציה כדי לוודא שהיא פועלת בצורה תקינה.