کاربران Android بهطور میانگین بیشاز ۵۰ برنامه در دستگاههایشان نصب میکنند (با افزایش سطح حافظه دسترسی تصادفی دستگاهها، این تعداد افزایش مییابد). بااینحال، تعداد قابلتوجهی از این برنامهها برای مدت طولانی توسط کاربر استفاده نمیشوند.
«خواب موقت برنامه» برنامههایی را که کاربر چند ماه از آنها استفاده نکرده است به خواب موقت میبرد، مشابه لغو خودکار اجازه. این کار باعث توقف اجباری برنامه میشود و آن را در وضعیتی قرار میدهد که بهجای عملکرد، برای فضای ذخیرهسازی بهینهسازی میکنیم. لغو خودکار اجازه نیز با این وضعیت همراه است و هر دو تنظیم معافیت یکسانی در تنظیمات دارند. برنامهای که توقف اجباری شده است، کارها یا هشدارها را در پسزمینه اجرا نمیکند و نمیتواند اعلان لحظهای ارسال کند. وقتی کاربر دوباره از برنامه استفاده میکند، برنامه از حالت خواب زمستانی خارج میشود و کارها/هشدارها/اعلانها دوباره مثل همیشه اجرا میشوند. هر کار/هشدار/اعلانی که قبلاز رفتن برنامه به حالت خواب زمستانی زمانبندی شده است باید زمانبندی مجدد شود.
تغییرات پلاتفرم توسط سازندگان تجهیزات اصلی ممکن است با پیادهسازی خواب زمستانی برنامه تداخل داشته باشد. برای مثال
- اصلاح تعریف استفاده از برنامه یا معرفی روشهایی برای بیدار کردن برنامه که در AOSP وجود ندارد ممکن است دقت خواب زمستانی برنامه را مختل کند
- سازوکار محدودیت اختصاصی سازنده اصلی محصول که مشابه سازوکار خواب زمستانی برنامه است ممکن است هدف مشابهی را دنبال کند. اگرچه هر دو میتوانند وجود داشته باشند، ممکن است همپوشانیهایی وجود داشته باشد.
CDD مجموعه جدیدی از الزامات را برای تغییراتی که براساس استفاده از برنامه است، مشابه الزام موجود ۳.۵.۱ مشخص میکند. خواب موقت برنامه از این الزامات پیروی میکند.
کد چارچوب در اینجا قرار دارد:
- repo: platform/frameworks/base
- فهرست راهنما: services/core/java/com/android/server/apphibernation
منطق خطمشی در این مکان قرار دارد:
- مخزن: platform/packages/modules/Permission
- directory: 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 نسخه ۱۲ دردسترس است. این ویژگی در نسخههای قدیمیتر کار نمیکند زیرا عناصر پلاتفرم (مثل سرویس سیستم جدید) در آنها وجود ندارد. لغو خودکار همچنان طبق آنچه برای نسخههای قبلی سیستمعامل پیادهسازی شده است عمل میکند.
از Android 12 به بعد، برای اطمینان از سازگاری با نسخههای قبلی، یک کلید روشن/خاموش برای حالت خواب زمستانی در صفحه برنامه در بخش برنامهها و اعلانها در تنظیمات اضافه میشود و کلید روشن/خاموش لغو خودکار اصلی در زیرمنو اجازهها حفظ میشود. این کلید معافیت کلی برنامه از سیستم خواب زمستانی برنامه را کنترل میکند.
سفارشیسازی
بخشی از پیادهسازی جزء سیستم مدولار است، بنابراین شرکا از اصلاح این ویژگی منع میشوند. شرکا میتوانند بهجای آن، ویژگیها یا عملکردهای مشابهی را پیادهسازی کنند، بهشرطی که از الزامات CDD پیروی کنند.
خواب موقت برنامه باید بهطور پیشفرض برای همه برنامههایی که Android نسخه ۱۱ یا بالاتر را هدفیابی میکنند روشن باشد. این ویژگی همان لغو خودکار اجازهها است. اگرچه خود تنظیم ممکن است «روشن» باشد، اما پیادهسازی خواب زمستانی برنامه ممکن است بین برنامههایی که Android 11 را هدف قرار میدهند درمقایسه با برنامههایی که Android 12 را هدف قرار میدهند متفاوت باشد. بهطور دقیقتر، «بهخواب رفتن برنامه» فقط برای برنامههایی کار میکند که Android 11 را هدفیابی میکنند درحالیکه برای برنامههایی که Android 12 را هدفیابی میکنند، اساساً همان لغو خودکار است.
علاوهبراین، تولیدکنندگان تجهیزات اصلی ممکن است ویژگی مشابهی را پیادهسازی کنند. بااینحال، این ویژگیها در مقیاس زمانی بسیار کوتاهتری برای بهینهسازی باتری هدفگذاری شدهاند که میتواند مختص OEM باشد. هرگونه ویژگی محدودیت برنامه مشابهی که توسط سازندگان تجهیزات اصلی توسعه یافته است، میتواند با سیستم خواب زمستانی برنامه همزیستی داشته باشد، به شرطی که با معیارهای موجود تعریفشده در CDD مطابقت داشته باشد.
آزمایش
«خواب زمستانی برنامه» دارای آزمونهای واحد و CTS است تا از عملکرد صحیح آن اطمینان حاصل شود.
AutoRevokeTestAppHibernationIntegrationTest