Android 11 QPR3 ואילך תומך בהקפאת האפליקציות שנשמרו במטמון. התכונה הזו מפסיקה את הביצוע של תהליכים שנשמרו במטמון, ומפחיתה את השימוש במשאבים על ידי אפליקציות שמתנהגות בצורה לא תקינה ועשויות לנסות לפעול בזמן שהן שמורות במטמון. ה-framework מקפיא אפליקציות שנשמרו במטמון על ידי העברת התהליכים שלהן ל-cgroup קפוא. כך אפשר לצמצם את הצריכה של מעבדים פעילים ולא פעילים בנוכחות של אפליקציות פעילות שנשמרו במטמון. אפשר להפעיל את המקפיא של האפליקציות באמצעות דגל של הגדרת המערכת או אפשרות למפתחים.
הטמעת מקפיא האפליקציות
הכלי להקפאת אפליקציות ששמורות במטמון משתמש ב-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\)"