یک کاربر اندرویدی به طور متوسط بیش از 50 برنامه را روی دستگاه های خود نصب می کند (این تعداد با افزایش سطح RAM دستگاه ها افزایش می یابد). با این حال، تعداد قابل توجهی از این برنامه ها برای مدت طولانی توسط کاربر استفاده نمی شود.
خواب زمستانی برنامه، برنامه هایی را که کاربر برای چند ماه از آنها استفاده نمی کند، شبیه به لغو خودکار مجوز، خواب زمستانی می کند. این برنامه برنامه را متوقف میکند و آن را در حالتی قرار میدهد که به جای عملکرد، فضای ذخیرهسازی را بهینه میکنیم. ابطال خودکار مجوز نیز با این وضعیت همراه است و تنظیمات معافیت یکسانی را در تنظیمات به اشتراک میگذارند. برنامه اجباری توقف کارها یا هشدارها را در پسزمینه اجرا نمیکند و قادر به ارسال اعلانهای فشاری نیست. هنگامی که کاربر دوباره از برنامه استفاده می کند، برنامه از حالت خواب زمستانی خارج می شود و مشاغل/هشدارها/اعلان ها دوباره مانند همیشه اجرا می شوند. هر شغل/هشدار/اعلانی که قبل از خواب زمستانی برنامه برنامه ریزی شده بود باید دوباره برنامه ریزی شود.
OEM هایی که پلتفرم را تغییر می دهند ممکن است با اجرای خواب زمستانی برنامه تضاد داشته باشند. به عنوان مثال
- تغییر تعریف استفاده از برنامه یا معرفی روشهایی برای بیدار کردن برنامههایی که در AOSP نیستند، ممکن است دقت خواب زمستانی برنامه را مختل کند.
- مکانیسم محدودیت اختصاصی OEM مشابه خواب زمستانی برنامه ممکن است هدف مشابهی را انجام دهد. در حالی که هر دو می توانند وجود داشته باشند، ممکن است همپوشانی هایی وجود داشته باشد.
CDD مجموعه جدیدی از الزامات را برای تغییراتی که بر اساس استفاده از برنامه است، شبیه به الزامات 3.5.1 موجود ترسیم می کند. خواب زمستانی برنامه از این الزامات پیروی می کند.
کد فریمورک در زیر زندگی می کند:
- مخزن: پلت فرم / چارچوب / پایه
- دایرکتوری: services/core/java/com/android/server/apphibernation
منطق سیاست در موارد زیر است:
- مخزن: پلت فرم / بسته ها / ماژول ها / مجوز
- دایرکتوری: PermissionController/src/com/android/permissioncontroller/hibernation
معماری سطح بالا
سرویس سیستم خواب زمستانی برنامههای کم استفاده کاربر را برای ذخیرهسازی بهینه میکند و از اجرای آن برنامهها در پسزمینه جلوگیری میکند. برای دستیابی به این نتایج، هنگامی که یک برنامه را در حالت خواب زمستانی قرار می دهیم، به طور خاص:
- لغو خودکار مجوزها
- اجباری برنامه را متوقف کنید
- فایل های ODEX و VDEX را حذف کنید
- کش برنامه را حذف کنید
هدف ما اجرای خواب زمستانی به عنوان یک عمل برگشت پذیر است تا برنامه همچنان از طریق Launcher و سایر سطوح با داده های برنامه دست نخورده در دسترس کاربر باشد. پس از راهاندازی برنامه، آن را از حالت توقف اجباری برمیگردانیم و طبق معمول به ایجاد فایلهای ODEX و VDEX ادامه میدهیم.
طراحی برنامه ریزی شده حول دو بخش اصلی متمرکز است:
- تعیین زمان خواب زمستانی یک بسته
- بهینه سازی بسته خواب زمستانی
یک سرویس سیستم جدید، AppHibernationService
، و یک سرویس شغلی، AppHibernationJobService,
در PermissionController
چسبی است که تصمیم گیری و منطق کلی را کنترل می کند.
تعیین زمانی که یک بسته باید در حالت Hibernate باشد، در درجه اول توسط UsageStatsService
ارائه می شود و توسط AppHibernationJobService
در PermissionController
مدیریت می شود. این منطق خط مشی در PermissionController
وجود دارد تا به ما امکان به روز رسانی پویا از طریق Mainline را بدهد. علاوه بر این، ما قصد داریم یک سیگنال جدید، استفاده از مؤلفه، اضافه کنیم تا استفاده از اجزای بسته (به عنوان مثال، خدمات، ارائه دهندگان محتوا) را به عنوان یک معیار جدید در UsageStatsService
ثبت کنیم.
بهینه سازی یک بسته جایی است که تمام صرفه جویی ها و بهینه سازی های واقعی اتفاق می افتد. AppHibernationService
با بخش های مختلف سیستم برای توقف بسته، حذف داده های حافظه پنهان، حذف مصنوعات ART و غیره ارتباط برقرار می کند. لغو مجوز مستقیماً از AppHibernationJobService
برای حفظ عملکرد لغو خودکار در دستگاههای Android 11 و پایینتر آغاز میشود.
تجربه کاربری
هم اطلاعات و هم کنترلهایی در اختیار کاربر قرار میگیرد که برنامهها را میتوان در حالت Hibernate قرار داد.
مشابه ابطال خودکار، کاربر اعلانی در مورد اینکه کدام برنامهها در حالت Hibernate هستند دریافت میکند و این گزینه را دارد که مستقیماً از طریق اعلان به تنظیمات برود تا برنامه را باز کند و از حالت Hibernation خارج کند یا در صورت نیاز برنامه استفاده نشده را حذف کند.
ما همچنان از قصد توسعهدهنده برای درخواست از کاربر برای معافیت از خواب زمستانی با هدف معافیت لغو خودکار مجوزهای موجود حمایت میکنیم.
سازگاری به عقب
ویژگیهای خاص Hibernation از Android 12 در دسترس هستند. این ویژگی نمیتواند در نسخههای قبلی کار کند زیرا اجزای پلتفرم (مانند سرویس سیستم جدید) وجود ندارد. ابطال خودکار همانطور که برای نسخه های قبلی سیستم عامل اجرا شده بود به کار خود ادامه می دهد.
از Android 12 شروع میشود، برای اطمینان از سازگاری به عقب، یک ضامن حالت خواب زمستانی در صفحه برنامه در زیر برنامهها و اعلانها در تنظیمات اضافه میشود، در حالی که کلید لغو خودکار اصلی در زیر منوی مجوزها حفظ میشود. این ضامن، معافیت کلی سیستم خواب زمستانی برنامه را برای برنامه کنترل می کند.
سفارشی سازی
برخی از پیاده سازی ها بخشی از مؤلفه سیستم مدولار است، بنابراین شرکا از تغییر ویژگی منصرف می شوند. شرکا می توانند در عوض ویژگی ها یا عملکردهای مشابه را تا زمانی که از الزامات CDD پیروی کنند، پیاده سازی کنند.
خواب زمستانی برنامه باید به طور پیش فرض برای همه برنامه هایی که اندروید 11 یا بالاتر را هدف قرار می دهند روشن باشد. این همان لغو خودکار مجوزها است. در حالی که ممکن است خود تنظیم روشن باشد، اجرای خواب زمستانی برنامه ممکن است بین برنامههایی که Android 11 را هدف قرار میدهند و Android 12 متفاوت باشد. به طور خاص، خواب زمستانی برنامه فقط برای برنامههایی که Android 11 را هدف قرار میدهند کار میکند، در حالی که اساساً برای برنامههایی که Android 12 را هدف قرار میدهند، فقط لغو خودکار است.
علاوه بر این، OEM ها ممکن است ویژگی مشابهی را پیاده سازی کنند. با این حال، این ویژگیها در مقیاس زمانی بسیار کوتاهتری برای بهینهسازی باتری که میتواند مختص OEM باشد، هدف قرار میگیرد. هر گونه ویژگی محدودیت برنامه مشابه که توسط OEMها ایجاد شده است میتواند با سیستم خواب زمستانی برنامه وجود داشته باشد تا زمانی که معیارهای موجود تعریف شده در CDD را برآورده کند.
تست کردن
خواب زمستانی برنامه دارای تستهای CTS و واحد برای اطمینان از درست کار کردن است.
-
AutoRevokeTest
-
AppHibernationIntegrationTest