بهینه‌سازی برای «حالت چرت» و «حالت آماده‌به‌کار برنامه»

Android دو ویژگی صرفه‌جویی در مصرف انرژی دارد که با مدیریت رفتار برنامه‌ها در زمانی که دستگاه به منبع برق متصل نیست، عمر باتری را برای کاربران افزایش می‌دهد: Doze و App Standby. Doze مصرف باتری را با به‌تعویق انداختن فعالیت شبکه و CPU پس‌زمینه برای برنامه‌ها در مواقعی که از دستگاه برای مدت طولانی استفاده نمی‌شود کاهش می‌دهد. حالت آماده به‌کار برنامه فعالیت شبکه پس‌زمینه را برای برنامه‌هایی که اخیراً فعالیت کاربر نداشته‌اند به‌تعویق می‌اندازد.

وقتی دستگاه در حالت «چرت زدن» است، دسترسی برنامه‌ها به برخی منابعی که باتری زیادی مصرف می‌کنند تا پنجره نگهداری به‌تعویق می‌افتد. محدودیت‌های خاص در محدودیت‌های مدیریت مصرف برق فهرست شده است.

Doze و «حالت آماده به‌کار برنامه» رفتار همه برنامه‌هایی را که در Android نسخه ۶.۰ یا بالاتر اجرا می‌شوند مدیریت می‌کنند، صرف‌نظر از اینکه به‌طور خاص سطح میانای برنامه‌سازی کاربردی ۲۳ را هدف قرار داده باشند یا نه. برای کمک به تضمین بهترین تجربه برای کاربران، برنامه‌تان را در حالت‌های «چرت زدن» و «آماده‌به‌کار برنامه» آزمایش کنید و هرگونه اصلاحات لازم را در کدتان انجام دهید. بخش‌های زیر جزئیات را ارائه می‌دهند.

آشنایی با «حالت چرت»

اگر کاربر دستگاه را برای مدتی بدون اتصال به برق و ثابت رها کند و صفحه‌نمایش خاموش باشد، دستگاه وارد حالت «چرت زدن» می‌شود. در حالت «چرت»، سیستم تلاش می‌کند با محدود کردن دسترسی برنامه‌ها به شبکه و سرویس‌های با مصرف بالای CPU، شارژ باتری را حفظ کند. همچنین از دسترسی برنامه‌ها به شبکه جلوگیری می‌کند و کارها، همگام‌سازی‌ها، و هشدارهای استاندارد آن‌ها را به‌تعویق می‌اندازد.

سیستم به‌طور دوره‌ای برای مدت کوتاهی از Doze خارج می‌شود تا به برنامه‌ها اجازه دهد فعالیت‌های به‌تعویق‌افتاده خود را تکمیل کنند. درطول این بازه زمانی تعمیرات، سیستم همه همگام‌سازی‌ها، کارها، و هشدارهای معلقه را اجرا می‌کند و به برنامه‌ها اجازه می‌دهد به شبکه دسترسی داشته باشند.

شکل ۱. Doze پنجره نگهداری تکرارشونده‌ای برای برنامه‌ها فراهم می‌کند تا از شبکه استفاده کنند و فعالیت‌های معلق را مدیریت کنند.

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

وقتی کاربر دستگاه را با حرکت دادن، روشن کردن صفحه‌نمایش، یا وصل کردن شارژر بیدار می‌کند، سیستم از حالت «چرت زدن» خارج می‌شود و همه برنامه‌ها فعالیت عادی را ازسر می‌گیرند.

محدودیت‌های Doze

سیستم محدودیت‌های زیر را بر برنامه‌هایتان درحین «چرت زدن» اعمال می‌کند:

  • دسترسی به شبکه را تعلیق می‌کند.
  • قفل‌های بیداری را نادیده می‌گیرد.
  • استاندارد را به‌تعویق می‌اندازد AlarmManager هشدارها، ازجمله setExact() و setWindow()، به پنجره نگهداری بعدی.
    • اگر لازم است زنگ‌های ساعتی تنظیم کنید که درحین «چرت زدن» فعال شوند، از setAndAllowWhileIdle() یا setExactAndAllowWhileIdle() استفاده کنید.
    • زنگ‌های تنظیم‌شده با setAlarmClock() همچنان به‌طور معمول به‌صدا درمی‌آیند. سیستم کمی قبل‌از به‌صدا درآمدن آن زنگ‌های ساعت از حالت «چرت زدن» خارج می‌شود.
  • اسکن Wi-Fi انجام نمی‌دهد.
  • اجازه نمی‌دهد وفق‌دهنده‌های همگام‌سازی اجرا شوند.
  • اجازه نمی‌دهد JobScheduler اجرا شود.

بازبینه Doze

  • درصورت امکان، از «پیام‌رسانی ابریِ Firebase»‏ (FCM) برای پیام‌رسانی پایین‌دست استفاده کنید.
  • اگر کاربران شما باید فوراً اعلانی را ببینند، از نوع پیام RemoteNotification استفاده کنید. برای راهنمایی بیشتر، به اسناد FCM درباره RemoteNotificationنوع پیام مراجعه کنید.
  • اطلاعات کافی را در بار داده پیام اولیه ارائه دهید تا دسترسی بعدی به شبکه غیرضروری شود.
  • با setAndAllowWhileIdle() و setExactAndAllowWhileIdle()، هشدارهای مهم تنظیم کنید.
  • برنامه‌تان را در Doze آزمایش کنید.

سازگار کردن برنامه با «حالت چرت»

«چرت زدن» می‌تواند بسته به قابلیت‌هایی که برنامه‌ها ارائه می‌دهند و سرویس‌هایی که استفاده می‌کنند، به‌طور متفاوتی بر آن‌ها تأثیر بگذارد. بسیاری از برنامه‌ها در چرخه‌های Doze بدون تغییر به‌طور عادی کار می‌کنند. در برخی موارد، باید روشی را که برنامه‌تان شبکه، زنگ‌های ساعت، کارها، و همگام‌سازی‌ها را مدیریت می‌کند بهینه‌سازی کنید. برنامه‌ها باید بتوانند فعالیت‌ها را درطول هر پنجره نگهداری به‌طور مؤثر مدیریت کنند.

برای کمک به زمان‌بندی زنگ‌های ساعت، می‌توانید از دو روش AlarmManager استفاده کنید: setAndAllowWhileIdle() و setExactAndAllowWhileIdle(). با این روش‌ها، می‌توانید زنگ‌های ساعتی تنظیم کنید که حتی اگر دستگاه در حالت «چرت زدن» باشد، به‌صدا درآیند.

محدودیت Doze در دسترسی به شبکه نیز احتمالاً بر برنامه شما تأثیر می‌گذارد، به‌ویژه اگر برنامه به پیام‌های هم‌زمان مانند تیک یا اعلان‌ها متکی باشد. اگر برنامه‌تان برای دریافت پیام‌ها به اتصال مداوم به شبکه نیاز دارد، درصورت امکان از پیام‌رسانی ابری Firebase (FCM) استفاده کنید.

برای تأیید اینکه برنامه‌تان با Doze طبق انتظار رفتار می‌کند، می‌توانید از فرمان‌های adb استفاده کنید تا سیستم را مجبور کنید وارد Doze شود و از آن خارج شود و رفتار برنامه‌تان را مشاهده کنید. برای جزئیات، به آزمایش با «چرت زدن» و «حالت آماده به‌کار برنامه» مراجعه کنید.

آشنایی با «حالت آماده به‌کار برنامه»

«حالت آماده‌به‌کار برنامه» به سیستم اجازه می‌دهد وقتی کاربر به‌طور فعال از برنامه‌ای استفاده نمی‌کند، آن برنامه را به‌عنوان غیرفعال تعیین کند. سیستم زمانی این تصمیم را می‌گیرد که کاربر برای مدت زمان مشخصی برنامه را لمس نکند و هیچ‌کدام از شرایط زیر اعمال نشود:

  • کاربر صریحاً برنامه را راه‌اندازی می‌کند.
  • برنامه فرایندی دارد که درحال‌حاضر در پیش‌زمینه است، چه به‌عنوان فعالیت یا سرویس پیش‌زمینه‌ای، یا درحال استفاده توسط فعالیت یا سرویس پیش‌زمینه‌ای دیگر.
  • برنامه اعلانی تولید می‌کند که کاربران در صفحه قفل یا در سینی اعلان می‌بینند.

وقتی کاربر دستگاه را به منبع برق وصل می‌کند، سیستم برنامه‌ها را از حالت آماده‌به‌کار آزاد می‌کند و به آن‌ها اجازه می‌دهد آزادانه به شبکه دسترسی داشته باشند و هرگونه کار و همگام‌سازی معلق را اجرا کنند. اگر دستگاه برای مدت طولانی غیرفعال باشد، سیستم به برنامه‌های غیرفعال اجازه می‌دهد تقریباً یک بار در روز به شبکه دسترسی داشته باشند.

استفاده از FCM برای تعامل با برنامه درحالی‌که دستگاه غیرفعال است

پیام‌رسانی ابریِ Firebase‏ (FCM) سرویسی ابری به دستگاه است که به شما امکان می‌دهد از پیام‌رسانی پایین‌دستی هم‌زمان بین سرویس‌های زیرینه و برنامه‌ها در دستگاه‌های Android پشتیبانی کنید. FCM اتصال واحد و پایداری به فضای ابری ارائه می‌دهد. همه برنامه‌هایی که به پیام‌رسانی هم‌زمان نیاز دارند می‌توانند از این اتصال استفاده کنند. این اتصال مشترک مصرف باتری را به‌طور قابل‌توجهی بهینه‌سازی می‌کند زیرا دیگر لازم نیست چندین برنامه اتصال‌های پایدار جداگانه خودشان را حفظ کنند، که می‌تواند باتری را به‌سرعت خالی کند. به همین دلیل، اگر برنامه‌تان به ادغام پیام‌رسانی با سرویس پس‌زمینه نیاز دارد، اکیداً توصیه می‌کنیم درصورت امکان از FCM استفاده کنید، نه اینکه اتصال شبکه پایدار خودتان را حفظ کنید.

FCM برای کار با حالت‌های غیرفعال Doze و App Standby بهینه‌سازی شده است. نوع پیام FCM RemoteNotification به شما امکان می‌دهد برنامه‌تان را برای تعامل با کاربر فعال کنید. در حالت «چرت زدن» یا «آماده‌به‌کار برنامه»، سیستم پیام را ارسال می‌کند و به برنامه دسترسی موقت به سرویس‌های شبکه و قفل‌های بیدارباش جزئی می‌دهد، سپس دستگاه یا برنامه را به حالت غیرفعال برمی‌گرداند. برای اعلان‌های حساس به زمان و قابل‌مشاهده برای کاربر، استفاده از انواع پیام RemoteNotification را برای فعال کردن تحویل در حالت «چرت زدن» درنظر بگیرید. این پیام‌ها می‌توانند منجر به اعلان شوند. برای اطلاعات بیشتر، راهنمای FCM را در RemoteNotification ببینید.

برای پیام‌هایی که منجر به اعلان نمی‌شوند، مانند به‌روز نگه داشتن محتوای برنامه در پس‌زمینه یا شروع همگام‌سازی داده‌ها، از پیام‌های BackgroundSync FCM استفاده کنید. این پیام‌ها عمداً اولویت پایینی دارند و ممکن است برای بهینه‌سازی باتری دستگاه، با تأخیر یا محدودیت ارسال شوند.

به‌عنوان یک روال مطلوب کلی، اگر برنامه شما به پیام‌رسانی پایین‌دست نیاز دارد، از FCM استفاده کنید. اگر برنامه‌تان ازقبل از FCM استفاده می‌کند، مطمئن شوید که از RemoteNotification برای پیام‌هایی که منجر به اعلان‌های سَمت کاربر می‌شوند استفاده می‌کند.

از RemoteNotification برای موقعیت‌های زیر استفاده نکنید:

  • وقتی اعلانی قطعاً نشان داده نخواهد شد.
  • برای ارسال فوری پیام‌هایی که فقط وضعیت برنامه را به‌روز می‌کنند، مانند به‌روز نگه داشتن محتوای برنامه در پس‌زمینه یا شروع همگام‌سازی داده‌ها.
  • به‌عنوان روشی برای درخواست از کاربر نهایی برای اعطای اجازه‌ها.

پشتیبانی از موارد استفاده دیگر

تقریباً همه برنامه‌ها می‌توانند با مدیریت اتصال شبکه، هشدارها، کارها، و همگام‌سازی‌ها، و بااستفاده از پیام‌های FCM، از Doze پشتیبانی کنند. برای مجموعه محدودی از موارد استفاده، این ممکن است کافی نباشد. برای چنین مواردی، سیستم فهرست قابل‌پیکربندی از برنامه‌هایی را ارائه می‌دهد که تاحدی از بهینه‌سازی‌های «چرت زدن» و «حالت آماده به‌کار برنامه» مستثنی هستند.

برنامه‌ای که تاحدی معاف است می‌تواند از شبکه استفاده کند و درطول «چرت زدن» و «حالت آماده به‌کار برنامه»، قفل‌های بیداری جزئی را نگه دارد. بااین‌حال، محدودیت‌های دیگر همچنان بر برنامه اعمال می‌شود، درست همان‌طور که بر برنامه‌های دیگر اعمال می‌شود. برای مثال، همگام‌سازی‌ها و کارهای برنامه در سطح میانای برنامه‌سازی کاربردی ۲۳ و پایین‌تر به‌تعویق می‌افتد و زنگ‌های معمولی AlarmManager آن به‌صدا درنمی‌آید. برنامه می‌تواند با فراخوانی isIgnoringBatteryOptimizations() بررسی کند که آیا درحال‌حاضر در فهرست معافیت قرار دارد یا نه.

کاربران می‌توانند فهرست برنامه‌های معاف‌شده را به‌طور دستی در تنظیمات > باتری > بهینه‌سازی باتری پیکربندی کنند. یا اینکه سیستم روش‌هایی را برای برنامه‌ها فراهم می‌کند تا از کاربران بخواهند آن‌ها را معاف کنند:

برنامه می‌تواند با فراخوانی isIgnoringBatteryOptimizations() بررسی کند که آیا درحال‌حاضر در فهرست معافیت قرار دارد یا نه.

آزمایش با Doze و «حالت آماده به‌کار برنامه»

برای کمک به تضمین تجربه عالی برای کاربران، برنامه‌تان را به‌طور کامل در Doze و «حالت آماده به‌کار برنامه» آزمایش کنید.

آزمایش کردن برنامه با Doze

می‌توانید حالت Doze را با انجام کارهای زیر آزمایش کنید:

  1. دستگاه سخت‌افزاری یا دستگاه مجازی را با تصویر سیستم Android 6.0 (سطح میانای برنامه‌سازی کاربردی ۲۳) یا بالاتر پیکربندی کنید.
  2. دستگاه را به ماشین توسعه نرم‌افزارتان متصل کنید و برنامه‌تان را نصب کنید.
  3. برنامه‌تان را اجرا کنید و آن را فعال نگه دارید.
  4. با اجرای فرمان زیر، سیستم را مجبور کنید به حالت غیرفعال برود:
        $ adb shell dumpsys deviceidle force-idle
        
  5. وقتی آماده بودید، با اجرای فرمان زیر از حالت غیرفعال خارج شوید:
        $ adb shell dumpsys deviceidle unforce
        
  6. دستگاه را با اجرای فرمان زیر دوباره فعال کنید:
        $ adb shell dumpsys battery reset
        
  7. پس‌از فعال کردن مجدد دستگاه، رفتار برنامه‌تان را مشاهده کنید. مطمئن شوید که وقتی دستگاه از حالت «چرت زدن» خارج می‌شود، برنامه به‌خوبی بازیابی می‌شود.

آزمایش کردن برنامه با «حالت آماده‌به‌کار برنامه»

برای آزمایش کردن حالت «آماده‌به‌کار برنامه» با برنامه‌تان، کارهای زیر را انجام دهید:

  1. دستگاه سخت‌افزاری یا دستگاه مجازی را با تصویر سیستم Android 6.0 (سطح میانای برنامه‌سازی کاربردی ۲۳) یا بالاتر پیکربندی کنید.
  2. دستگاه را به ماشین توسعه نرم‌افزارتان متصل کنید و برنامه‌تان را نصب کنید.
  3. برنامه‌تان را اجرا کنید و آن را فعال نگه دارید.
  4. با اجرای فرمان‌های زیر، برنامه را مجبور کنید به حالت «آماده‌به‌کار برنامه» برود:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. بااستفاده از فرمان‌های زیر، بیدار شدن برنامه‌تان را شبیه‌سازی کنید:
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. رفتار برنامه‌تان را پس‌از بیدار کردن آن مشاهده کنید. مطمئن شوید برنامه به‌درستی از حالت آماده‌به‌کار بازیابی می‌شود. به‌ویژه، بررسی کنید که آیا اعلان‌ها و کارهای پس‌زمینه برنامه‌تان طبق انتظار عمل می‌کنند یا نه.

موارد استفاده قابل‌قبول برای معافیت

جدول زیر چندین مورد استفاده را برجسته می‌کند و نشان می‌دهد که آیا استفاده از کنش هدف ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS برای برنامه‌ها در این شرایط قابل‌قبول است یا نه. به‌طور کلی، برنامه شما این استثناها را برآورده نمی‌کند، مگراینکه Doze یا App Standby عملکرد اصلی برنامه را مختل کند یا دلیل فنی وجود داشته باشد که چرا برنامه شما نمی‌تواند از پیام‌های FCM RemoteNotification استفاده کند.

برای اطلاعات بیشتر، پشتیبانی از موارد استفاده دیگر را ببینید.

نوع مورد استفاده می‌تواند از FCM استفاده کند؟ معافیت قابل‌قبول است؟ یادداشت‌ها
برنامه پیام‌رسانی فوری، گپ، یا تماس. نیاز به ارسال پیام‌های هم‌زمان به کاربران درحالی‌که دستگاه در حالت «چرت زدن» یا برنامه در حالت «آماده‌به‌کار برنامه» است. بله، بااستفاده از FCM غیرقابل‌قبول از پیام‌های FCM RemoteNotification برای فعال کردن برنامه و دسترسی به شبکه استفاده کنید.
بله، اما از پیام‌های FCM RemoteNotification استفاده نمی‌کند.
برنامه پیام‌رسانی فوری، گپ، یا تماس؛ برنامه‌های VOIP سازمانی. نه، نمی‌توانم از FCM استفاده کنم چون وابستگی فنی به سرویس پیام‌رسانی دیگری وجود دارد یا «چرت زدن» و «حالت آماده به‌کار برنامه» عملکرد اصلی برنامه را مختل می‌کند. قابل‌قبول
برنامه «ایمنی». برنامه‌هایی که امنیت کاربران و خانواده‌هایشان را حفظ می‌کنند. اگر درمورد شما صدق می‌کند. قابل‌قبول
برنامه خودکارسازی تکلیف. عملکرد اصلی برنامه زمان‌بندی کنش‌های خودکار است، مثلاً برای پیام‌رسانی فوری، تماس صوتی، یا مدیریت عکس جدید. اگر درمورد شما صدق می‌کند. قابل‌قبول
برنامه همپای دستگاه جانبی. کارکرد اصلی برنامه حفظ اتصال پایدار با دستگاه جانبی به‌منظور ارائه دسترسی به اینترنت برای دستگاه جانبی است. اگر درمورد شما صدق می‌کند. قابل‌قبول
برنامه فقط باید به‌طور دوره‌ای به دستگاه جانبی متصل شود تا همگام‌سازی کند، یا فقط باید به دستگاه‌هایی متصل شود که ازطریق نمایه‌های استاندارد بلوتوث متصل شده‌اند، مانند هدفون‌های بی‌سیم. اگر درمورد شما صدق می‌کند. غیرقابل‌قبول