מקפיא לאפליקציות שנשמרו במטמון

‫Android מגרסה 11 QPR3 ואילך תומך בהקפאה של אפליקציות שנשמרו במטמון. התכונה הזו מפסיקה את הביצוע של תהליכים שנשמרו במטמון ומפחיתה את השימוש במשאבים על ידי אפליקציות שמתנהגות בצורה לא תקינה ועשויות לנסות לפעול בזמן שהן שמורות במטמון. המסגרת מקפיאה אפליקציות שנשמרו במטמון על ידי העברת התהליכים שלהן לקבוצת בקרה (cgroup) קפואה. כך מצטמצמת צריכת המעבד המרכזי (CPU) במצב פעיל ובמצב סרק, כשיש אפליקציות פעילות שנשמרו במטמון. אפשר להפעיל את ההקפאה של האפליקציות באמצעות feature flag של תצורת המערכת או אפשרות למפתחים.

הטמעה של הקפאת אפליקציות

הכלי להקפאת אפליקציות שמורות במטמון מסתמך על הכלי להקפאה cgroup v2 של ליבת המערכת. במכשירים שנשלחים עם ליבה תואמת אפשר (באופן אופציונלי) להפעיל אותה. כדי לעשות את זה, מפעילים את אפשרות המפתחים 'השהיית הביצוע של אפליקציות שנשמרו במטמון' או מגדירים את התכונה הניסיונית activity_manager_native_boot use_freezer של תצורת המכשיר לערך true. לדוגמה:

adb shell device_config put activity_manager_native_boot use_freezer true && adb reboot

ההקפאה מושבתת אם התכונה הניסיונית use_freezer מוגדרת כ-false או אם האפשרות למפתחים מושבתת. אפשר לשנות את ההגדרה הזו על ידי שינוי הגדרת המכשיר בגרסת תוכנה או בעדכון.

הכלי להקפאת אפליקציות לא חושף ממשקי API רשמיים (ואין לו לקוח הטמעה לדוגמה), אבל הוא משתמש בממשקי ה-API הנסתרים של המערכת setProcessFrozen ו-enableFreezer. פרטים על ממשקי ה-API האלה זמינים במאמרים בנושא Process.java של ActivityManager ובנושא ActivityManagerService API. מפתחים יכולים גם לעיין בקוד הלקוח ב-ActivityManager כדי לקבל מידע על ניסויים.

טיפול בתכונות מותאמות אישית

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

כפתרון עקיף, אם לאפליקציה יש תהליך שצריך לבצע פעולות בזמן שהיא נמצאת במטמון, צריך לשנות את סטטוס התהליך ל'לא במטמון' (למשל Bound ForeGround Service‏ (BFGS) או בחזית) לפני שהתהליך צריך לבצע עבודה כלשהי, כדי לאפשר לאפליקציה להישאר פעילה.

בדיקת ההקפאה של האפליקציות

כדי לוודא שהקפאת האפליקציות פועלת כמצופה, אפשר להשתמש במקורות המידע הבאים:

  • כדי לבדוק אם יש רשימה של תהליכים קפואים, משתמשים בפקודה adb shell dumpsys activity ומחפשים את Apps frozen:.

  • בודקים אם הקובץ /sys/fs/cgroup/uid_0/cgroup.freeze קיים.

  • צפייה ב-logcat, שבו מוצגות רשומות שהוקפאו ורשומות שלא הוקפאו בכל פעם שתהליך עובר אל ה-freezer או יוצא ממנו. לדוגמה:

    adb logcat | grep -i "\(freezing\|froze\)"