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

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

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

הכלי להקפאת אפליקציות ששמורות במטמון משתמש ב-freezer של הליבה 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: באמצעות grep.

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

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

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