خواب زمستانی برنامه

یک کاربر اندرویدی به طور متوسط ​​بیش از 50 برنامه را روی دستگاه های خود نصب می کند (این تعداد با افزایش سطح RAM دستگاه ها افزایش می یابد). با این حال، تعداد قابل توجهی از این برنامه ها برای مدت طولانی توسط کاربر استفاده نمی شود.

خواب زمستانی برنامه، برنامه هایی را که کاربر برای چند ماه از آنها استفاده نمی کند، شبیه به لغو خودکار مجوز، خواب زمستانی می کند. این برنامه برنامه را متوقف می‌کند و آن را در حالتی قرار می‌دهد که به جای عملکرد، فضای ذخیره‌سازی را بهینه می‌کنیم. ابطال خودکار مجوز نیز با این وضعیت همراه است و تنظیمات معافیت یکسانی را در تنظیمات به اشتراک می‌گذارند. برنامه اجباری توقف کارها یا هشدارها را در پس‌زمینه اجرا نمی‌کند و قادر به ارسال اعلان‌های فشاری نیست. هنگامی که کاربر دوباره از برنامه استفاده می کند، برنامه از حالت خواب زمستانی خارج می شود و مشاغل/هشدارها/اعلان ها دوباره مانند همیشه اجرا می شوند. هر کار/هشدار/اعلانی که قبل از خواب زمستانی برنامه برنامه ریزی شده بود باید دوباره برنامه ریزی شود.

OEM هایی که پلتفرم را تغییر می دهند ممکن است با اجرای خواب زمستانی برنامه تضاد داشته باشند. مثلا

  • تغییر تعریف استفاده از برنامه یا معرفی روش‌هایی برای بیدار کردن برنامه‌هایی که در AOSP نیستند، ممکن است دقت خواب زمستانی برنامه را مختل کند.
  • مکانیسم محدودیت اختصاصی OEM مشابه خواب زمستانی برنامه ممکن است هدف مشابهی را انجام دهد. در حالی که هر دو می توانند وجود داشته باشند، ممکن است همپوشانی هایی وجود داشته باشد.

CDD مجموعه جدیدی از الزامات را برای تغییراتی که بر اساس استفاده از برنامه است، شبیه به الزامات 3.5.1 موجود ترسیم می کند. خواب زمستانی برنامه از این الزامات پیروی می کند.

کد فریمورک در زیر زندگی می کند:

منطق سیاست در موارد زیر است:

  • مخزن: پلت فرم / بسته ها / ماژول ها / مجوز
  • دایرکتوری: PermissionController/src/com/android/permissioncontroller/hibernation

معماری سطح بالا

سرویس سیستم App 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، برای اطمینان از سازگاری با عقب، یک ضامن حالت خواب زمستانی در صفحه برنامه در زیر برنامه‌ها و اعلان‌ها در تنظیمات اضافه می‌شود، در حالی که کلید لغو خودکار اصلی را در منوی فرعی مجوزها نگه می‌دارید. این ضامن، معافیت کلی سیستم Hibernation برنامه را برای برنامه کنترل می کند.

سفارشی کردن

از آنجایی که برخی از پیاده سازی ها بخشی از اجزای سیستم مدولار است، شرکا از اصلاح ویژگی منصرف می شوند. شرکا می توانند در عوض ویژگی ها/کارکردهای مشابه را تا زمانی که از الزامات CDD پیروی کنند، پیاده سازی کنند.

خواب زمستانی برنامه باید به طور پیش فرض برای همه برنامه هایی که اندروید 11 یا بالاتر را هدف قرار می دهند روشن باشد. این همان لغو خودکار مجوزها است. در حالی که ممکن است خود تنظیم روشن باشد، اجرای خواب زمستانی برنامه ممکن است بین برنامه‌هایی که Android 11 را هدف قرار می‌دهند و Android 12 متفاوت باشد. به طور خاص، خواب زمستانی برنامه فقط برای برنامه‌هایی که Android 11 را هدف قرار می‌دهند کار می‌کند، در حالی که اساساً برای برنامه‌هایی که Android 12 را هدف قرار می‌دهند، فقط لغو خودکار است.

علاوه بر این، OEM ها ممکن است ویژگی مشابهی را پیاده سازی کنند. با این حال، این ویژگی‌ها در مقیاس زمانی بسیار کوتاه‌تری برای بهینه‌سازی باتری که می‌تواند مختص OEM باشد، هدف قرار می‌گیرد. هر گونه ویژگی محدودیت برنامه مشابه که توسط OEM ها ایجاد شده است می تواند با سیستم خواب زمستانی برنامه همراه باشد تا زمانی که معیارهای موجود تعریف شده در CDD را برآورده کند.

آزمایش کردن

خواب زمستانی برنامه دارای تست‌های CTS و واحد برای اطمینان از درست کار کردن است.