برای Doze و App Standby بهینه سازی کنید

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

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

Doze و App Standby رفتار همه برنامه‌هایی که در Android نسخه 6.0 یا بالاتر اجرا می‌شوند را مدیریت می‌کنند، صرفنظر از اینکه به‌طور خاص سطح API 23 را هدف قرار می‌دهند. برای اطمینان از بهترین تجربه برای کاربران، برنامه خود را در حالت‌های Doze و App Standby آزمایش کنید و هر مورد لازم را انجام دهید. تنظیمات کد شما بخش های زیر جزئیات را ارائه می دهند.

دوز را درک کنید

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

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

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

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

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

محدودیت های چرت زدن

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

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

چک لیست دوز

برنامه خود را با Doze تطبیق دهید

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

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

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

برای تأیید اینکه برنامه شما مطابق انتظار با Doze رفتار می کند، می توانید از دستورات adb برای وادار کردن سیستم به ورود و خروج Doze و مشاهده رفتار برنامه خود استفاده کنید. برای جزئیات، به تست با Doze و App Standby مراجعه کنید.

برنامه آماده به کار را درک کنید

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

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

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

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

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

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

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

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

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

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

برنامه‌ای که تا حدی مستثنی است می‌تواند از شبکه استفاده کند و در طول Doze و App Standby ، wake lock‌های جزئی را نگه دارد. با این حال، محدودیت‌های دیگری همچنان برای برنامه اعمال می‌شود، همانطور که برای سایر برنامه‌ها اعمال می‌شود. برای مثال، کارها و همگام‌سازی‌های برنامه در سطح API 23 و پایین‌تر به تعویق افتاده است و آلارم‌های AlarmManager معمولی آن فعال نمی‌شوند. یک برنامه می تواند با فراخوانی isIgnoringBatteryOptimizations() بررسی کند که آیا در حال حاضر در لیست معافیت قرار دارد یا خیر.

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

توجه: خط‌مشی‌های Google Play برنامه‌ها را از درخواست معافیت مستقیم از ویژگی‌های مدیریت نیرو (Doze و App Standby) در Android نسخه 6.0 و بالاتر منع می‌کند، مگر اینکه عملکرد اصلی برنامه تحت تأثیر نامطلوب قرار گیرد.

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

تست با Doze و App Standby

برای کمک به اطمینان از تجربه عالی برای کاربران خود، برنامه خود را به طور کامل در Doze و App Standby آزمایش کنید.

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

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

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

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

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

  1. یک دستگاه سخت افزاری یا دستگاه مجازی را با تصویر سیستم Android 6.0 (سطح API 23) یا بالاتر پیکربندی کنید.
  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 استفاده کند.

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

نوع Use case آیا می توان از FCM استفاده کرد؟ معافیت قابل قبوله؟ یادداشت‌ها
برنامه پیام‌رسانی فوری، چت یا تماس. در زمانی که دستگاه در Doze یا برنامه در حالت آماده‌باش برنامه است، به ارسال پیام‌های هم‌زمان به کاربران نیاز دارد. بله، استفاده از FCM قابل قبول نیست برای بیدار کردن برنامه و دسترسی به شبکه از پیام‌های با اولویت بالای FCM استفاده کنید.
بله، اما از پیام های با اولویت بالا FCM استفاده نمی کند.
برنامه پیام‌رسانی فوری، چت یا تماس؛ برنامه های VOIP سازمانی نه، به دلیل وابستگی فنی به سرویس پیام‌رسانی دیگر، نمی‌توان از FCM استفاده کرد یا Doze و App Standby عملکرد اصلی برنامه را شکست. قابل قبول
اپلیکیشن ایمنی برنامه هایی که کاربران و خانواده هایشان را ایمن نگه می دارند. اگر قابل اجرا باشد. قابل قبول
برنامه اتوماسیون وظایف عملکرد اصلی برنامه، زمان‌بندی اقدامات خودکار، مانند پیام‌رسانی فوری، تماس صوتی یا مدیریت عکس جدید است. اگر قابل اجرا باشد. قابل قبول
برنامه همراه دستگاه جانبی. عملکرد اصلی برنامه حفظ ارتباط دائمی با دستگاه جانبی به منظور دسترسی به اینترنت دستگاه جانبی است. اگر قابل اجرا باشد. قابل قبول
برای همگام‌سازی برنامه فقط باید به‌صورت دوره‌ای به دستگاه جانبی متصل شود، یا فقط باید به دستگاه‌هایی مانند هدفون‌های بی‌سیم متصل شود که از طریق نمایه‌های بلوتوث استاندارد متصل هستند. اگر قابل اجرا باشد. قابل قبول نیست