משתמש Android ממוצע מתקין יותר מ-50 אפליקציות במכשירים שלו (המספר גדל ככל שרמת זיכרון ה-RAM של המכשירים עולה). עם זאת, משתמשים לא משתמשים במספר משמעותי מהאפליקציות האלה במשך תקופה ארוכה.
תרדמת אפליקציות מעבירה למצב תרדמה אפליקציות שהמשתמש לא משתמש בהן במשך כמה חודשים, בדומה לביטול אוטומטי של הרשאות. הפעולה הזו תגרום לסגירה ידנית של האפליקציה, והיא תעבור למצב שבו מתבצעת אופטימיזציה של האחסון ולא של הביצועים. ביטול הרשאה אוטומטי כלול גם הוא במצב הזה, וההגדרה של ההחרגה משותפת לשניהם בהגדרות. אפליקציה שהופסקה בכוח לא מריצה משימות או התראות ברקע, ולא יכולה לשלוח התראות פוש. כשהמשתמש משתמש באפליקציה שוב, היא יוצאת ממצב שינה והפעולות, ההתראות וההודעות שלה פועלות שוב כרגיל. צריך לתזמן מחדש את כל המשימות, ההתראות וההודעות שהיו מתוזמנות לפני שהאפליקציה נכנסה למצב שינה.
יכול להיות ששינויים בפלטפורמה שבוצעו על ידי יצרני ציוד מקורי (OEM) יתנגשו עם ההטמעה של תכונת התרדמה של האפליקציה. לדוגמה
- שינוי ההגדרה של השימוש באפליקציה או הוספת דרכים להפעלת אפליקציה שלא קיימות ב-AOSP עלולים לפגוע בדיוק של תכונת התרדמת של האפליקציה
- מנגנון הגבלה קנייני של יצרן ציוד מקורי (OEM) שדומה לתרדמת אפליקציות עשוי לשמש למטרה דומה. יכול להיות שיהיו חפיפות בין שני הסוגים.
ב-CDD מפורטות דרישות חדשות לשינויים שמבוססים על השימוש באפליקציה, בדומה לדרישה הקיימת 3.5.1. האפליקציה נכנסת למצב שינה אם מתקיימות הדרישות הבאות.
קוד המסגרת נמצא במיקום הבא:
- repo: platform/frameworks/base
- ספרייה: services/core/java/com/android/server/apphibernation
הלוגיקה של המדיניות נמצאת ב:
- 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) ובדיקות יחידה לתרדמת האפליקציה כדי לוודא שהיא פועלת בצורה תקינה.
AutoRevokeTest
AppHibernationIntegrationTest