یک کاربر اندروید به طور متوسط بیش از ۵۰ برنامه روی دستگاههای خود نصب میکند (این تعداد با افزایش رم دستگاهها افزایش مییابد). با این حال، تعداد قابل توجهی از این برنامهها برای مدت طولانی توسط کاربر استفاده نمیشوند.
خواب زمستانی برنامه، برنامههایی را که کاربر برای چند ماه از آنها استفاده نمیکند، مانند لغو خودکار مجوز، به خواب زمستانی میبرد. این حالت، برنامه را به حالت توقف اجباری میبرد و آن را در حالتی قرار میدهد که به جای عملکرد، برای ذخیرهسازی بهینهسازی میشود. لغو خودکار مجوز نیز با این حالت همراه است و تنظیمات معافیت یکسانی را در تنظیمات به اشتراک میگذارند. یک برنامه که به حالت توقف اجباری رفته است، کارها یا هشدارها را در پسزمینه اجرا نمیکند و قادر به ارسال اعلانهای فوری نیست. وقتی کاربر دوباره از برنامه استفاده میکند، برنامه از خواب زمستانی خارج میشود و کارها/هشدارها/اعلانها دوباره طبق معمول اجرا میشوند. هر کار/هشدار/اعلانی که قبل از رفتن برنامه به حالت خواب زمستانی برنامهریزی شده بود، باید دوباره برنامهریزی شود.
تولیدکنندگان اصلی تجهیزات (OEM) که پلتفرم را تغییر میدهند، ممکن است با پیادهسازی حالت خواب زمستانی برنامه (hibernation) تداخل داشته باشند. برای مثال
- تغییر تعریف استفاده از برنامه یا معرفی روشهایی برای بیدار کردن برنامهای که در AOSP نیست، ممکن است دقت خواب زمستانی برنامه را مختل کند.
- یک مکانیزم محدودسازی اختصاصی تولیدکننده اصلی (OEM) مشابه حالت خواب زمستانی برنامه (app hibernation) ممکن است هدف مشابهی را انجام دهد. اگرچه هر دو میتوانند وجود داشته باشند، اما ممکن است برخی همپوشانیها نیز وجود داشته باشد.
CDD مجموعهای جدید از الزامات را برای تغییراتی که مبتنی بر استفاده از برنامه هستند، مشابه الزامات موجود در نسخه ۳.۵.۱، تشریح میکند. خواب زمستانی برنامه از این الزامات پیروی میکند.
کد فریمورک در مسیر زیر قرار دارد:
- مخزن: پلتفرم/فریمورکها/پایه
- دایرکتوری: services/core/java/com/android/server/apphibernation
منطق این سیاست در موارد زیر نهفته است:
- مخزن: پلتفرم/بستهها/ماژولها/مجوزها
- دایرکتوری: PermissionController/src/com/android/permissioncontroller/hibernation
معماری سطح بالا
سرویس سیستم خواب زمستانی برنامه، برنامههای کماستفادهی کاربر را برای ذخیرهسازی بهینه میکند و از اجرای این برنامهها در پسزمینه جلوگیری میکند. برای دستیابی به این نتایج، وقتی یک برنامه را خواب زمستانی میکنیم، بهطور خاص:
- لغو خودکار مجوزها
- برنامه را به زور متوقف کنید
- فایلهای ODEX و VDEX را حذف کنید.
- حافظه پنهان برنامه را حذف کنید
هدف ما پیادهسازی حالت خواب زمستانی به عنوان یک اقدام برگشتپذیر است تا برنامه همچنان از طریق لانچر و سایر سطوح با دادههای برنامه دستنخورده در دسترس کاربر باشد. پس از اجرای برنامه، آن را از حالت توقف اجباری بازیابی میکنیم و طبق معمول به ایجاد فایلهای ODEX و VDEX ادامه میدهیم.
طراحی برنامهریزیشده حول دو بخش اصلی متمرکز است:
- تعیین زمان لازم برای hibernate کردن یک بسته
- بهینهسازی بستهی hibernating
یک سرویس سیستمی جدید به AppHibernationService و یک سرویس کاری به نام AppHibernationJobService, در PermissionController ، رابطی هستند که تصمیمگیری و منطق کلی را کنترل میکنند.
تعیین زمان خواب زمستانی یک بسته در درجه اول توسط UsageStatsService انجام میشود و توسط AppHibernationJobService در PermissionController مدیریت میشود. منطق این سیاست در PermissionController قرار دارد تا به ما امکان بهروزرسانی پویا از طریق Mainline را بدهد. علاوه بر این، ما قصد داریم یک سیگنال جدید به نام component usage اضافه کنیم تا میزان استفاده از اجزای بسته (به عنوان مثال، سرویسها، ارائه دهندگان محتوا) را به عنوان یک معیار جدید در UsageStatsService ثبت کند.
بهینهسازی یک پکیج جایی است که تمام صرفهجوییها و بهینهسازیهای واقعی اتفاق میافتد. AppHibernationService با بخشهای مختلف سیستم ارتباط برقرار میکند تا پکیج را متوقف کند، دادههای کش را حذف کند، مصنوعات ART را حذف کند و غیره. لغو مجوز مستقیماً از AppHibernationJobService آغاز میشود تا قابلیت لغو خودکار در دستگاههای اندروید ۱۱ و پایینتر حفظ شود.
تجربه کاربری
به کاربر هم اطلاعات و هم کنترلهایی در مورد اینکه کدام برنامهها میتوانند در حالت خواب زمستانی قرار گیرند، ارائه میشود.
مشابه لغو خودکار، کاربر اعلانی درباره برنامههای در حال خواب زمستانی دریافت میکند و میتواند مستقیماً از طریق اعلان به تنظیمات برود تا برنامه را باز کرده و آن را از خواب زمستانی خارج کند یا در صورت لزوم برنامه بلااستفاده را حذف کند.
ما همچنان از هدف توسعهدهنده مبنی بر درخواست معافیت از حالت خواب زمستانی با استفاده از هدف معافیت لغو خودکار مجوزهای موجود، پشتیبانی میکنیم.
سازگاری با نسخههای قبلی
ویژگیهای مخصوص خواب زمستانی (Hibernation) از اندروید ۱۲ به بعد در دسترس هستند. این ویژگی در نسخههای قبلی نمیتوانست عمل کند، زیرا اجزای پلتفرم (مانند سرویس سیستم جدید) وجود نداشتند. لغو خودکار همچنان به همان شکلی که برای نسخههای قبلی سیستم عامل پیادهسازی شده بود، عمل میکند.
از اندروید ۱۲ به بعد، برای اطمینان از سازگاری با نسخههای قبلی، یک گزینهی «خواب زمستانی» در صفحهی برنامه در بخش «برنامهها و اعلانها» در تنظیمات اضافه شده است، در حالی که گزینهی اصلی لغو خودکار در زیرمنوی «مجوزها» باقی مانده است. این گزینه، معافیت کلی برنامه از خواب زمستانی در سیستم را کنترل میکند.
سفارشیسازی
بخشی از پیادهسازی، بخشی از مؤلفه سیستم ماژولار است، بنابراین شرکا از تغییر این ویژگی منع میشوند. در عوض، شرکا میتوانند ویژگیها یا عملکردهای مشابهی را پیادهسازی کنند، مشروط بر اینکه الزامات CDD را رعایت کنند.
خواب زمستانی برنامه باید برای همه برنامههایی که اندروید ۱۱ یا بالاتر را هدف قرار میدهند، به طور پیشفرض روشن باشد. این همان لغو خودکار مجوزها است. در حالی که خود تنظیم ممکن است روشن باشد، پیادهسازی خواب زمستانی برنامه ممکن است بین برنامههایی که اندروید ۱۱ را هدف قرار میدهند در مقابل اندروید ۱۲ متفاوت باشد. به طور خاص، خواب زمستانی برنامه فقط برای برنامههایی که اندروید ۱۱ را هدف قرار میدهند کار میکند در حالی که اساساً فقط برای برنامههایی که اندروید ۱۲ را هدف قرار میدهند، لغو خودکار است.
علاوه بر این، تولیدکنندگان اصلی تجهیزات (OEM) ممکن است در حال پیادهسازی یک ویژگی مشابه باشند. با این حال، این ویژگیها در یک بازه زمانی بسیار کوتاهتر برای بهینهسازی باتری هدف قرار گرفتهاند که میتواند مختص تولیدکنندگان اصلی تجهیزات باشد. هرگونه ویژگی محدودکننده برنامه مشابه که توسط تولیدکنندگان اصلی تجهیزات توسعه داده شده است، میتواند با سیستم خواب زمستانی برنامه (app hibernation system) همراه باشد، تا زمانی که معیارهای موجود تعریف شده در CDD را برآورده کند.
آزمایش
حالت خواب زمستانی برنامه دارای تستهای CTS و واحد است تا از عملکرد صحیح آن اطمینان حاصل شود.
-
AutoRevokeTest -
AppHibernationIntegrationTest