اخبار محصول

باتری برنامه خود را با استفاده از معیار قفل بیدارباش Android Vitals بهینه کنید

۷ دقیقه مطالعه
Alice Yuan
مهندس روابط توسعه‌دهنده

عمر باتری جنبه‌ی بسیار مهمی از تجربه‌ی کاربری است و قفل‌های بیدارباش نقش مهمی در آن ایفا می‌کنند. آیا شما بیش از حد از آنها استفاده می‌کنید؟ در این پست وبلاگ، بررسی خواهیم کرد که قفل‌های بیدارباش چیستند، بهترین شیوه‌های استفاده از آنها چیست و چگونه می‌توانید رفتار برنامه‌ی خود را با معیار Play Console بهتر درک کنید.

استفاده بیش از حد از قفل بیداری جزئی در Android Vitals

کنسول Play اکنون میزان تخلیه باتری را با تمرکز بر استفاده بیش از حد از قفل بیداری جزئی ، به عنوان یک شاخص کلیدی عملکرد، رصد می‌کند.

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

هشدار.png

هشدار بیش از حد قفل بیداری در نمای کلی Android Vitals .

برای دستگاه‌های تلفن همراه، معیار Android Vitals برای قفل‌های بیداری معاف نشده‌ای که هنگام خاموش بودن صفحه نمایش و در حالی که برنامه در پس‌زمینه یا در حال اجرای یک سرویس پیش‌زمینه است، به دست می‌آیند، اعمال می‌شود. Android Vitals در صورت وجود موارد زیر، استفاده جزئی از قفل بیداری را بیش از حد در نظر می‌گیرد:

  • قفل‌های بیداری حداقل به مدت دو ساعت در یک دوره ۲۴ ساعته نگه داشته می‌شوند.
  • این مشکل بیش از ۵٪ از جلسات برنامه شما را که به طور متوسط ​​​​طی ۲۸ روز انجام شده است، تحت تأثیر قرار می‌دهد.

قفل‌های بیداری ایجاد شده توسط رابط‌های برنامه‌نویسی کاربردی (API) آغاز شده توسط کاربر audio ، location و JobScheduler از محاسبه قفل بیداری معاف هستند.

درک قفل‌های بیداری

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

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

دو روش برای ایجاد قفل‌های بیداری جزئی وجود دارد:

  • برنامه به صورت دستی قفل بیدارباش را با استفاده از APIهای PowerManager برای یک مورد استفاده خاص دریافت و آزاد می‌کند، که اغلب این کار همراه با یک سرویس پیش‌زمینه - یک API چرخه عمر پلتفرم که برای عملیات قابل درک توسط کاربر در نظر گرفته شده است - انجام می‌شود.
  • از طرف دیگر، قفل بیدارباش توسط یک API دیگر به دست می‌آید و به دلیل استفاده از API به برنامه نسبت داده می‌شود، در بخش بهترین شیوه‌ها بیشتر در این مورد صحبت خواهیم کرد.

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

بهترین روش‌ها برای استفاده از قفل بیدارباش

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

این چهار سوال حیاتی را در نظر بگیرید.


۱. آیا گزینه‌های جایگزین قفل بیدارباش را در نظر گرفته‌اید؟

قبل از اینکه به فکر خرید قفل بیداری جزئی دستی باشید، این نمودار تصمیم‌گیری را دنبال کنید:

قفل بیدارباش.png

فلوچارت برای تصمیم‌گیری در مورد زمان دریافت دستی قفل بیداری

  1. آیا صفحه نمایش باید روشن بماند؟
    • بله: به جای آن به مستندات Keep Screen On مراجعه کنید
  2. آیا برنامه یک سرویس پیش‌زمینه را اجرا می‌کند؟
    • خیر: نیازی نیست قفل بیدارباش را به صورت دستی فعال کنید.
  3. آیا اگر دستگاه از کار بیفتد، برای تجربه کاربری مضر است؟
    • خیر: برای مثال، به‌روزرسانی یک اعلان پس از بیدار شدن دستگاه نیازی به قفل بیدارباش ندارد.
    • بله: اگر جلوگیری از تعلیق دستگاه، مانند ارتباط مداوم با یک دستگاه خارجی، بسیار مهم است، ادامه دهید.
  4. آیا از قبل API وجود دارد که دستگاه را از طرف شما بیدار نگه دارد؟
  5. اگر به همه این سؤالات پاسخ داده‌اید و هیچ جایگزینی وجود ندارد، باید به صورت دستی قفل بیدارباش (wake lock) را فعال کنید.

۲. آیا نام قفل بیدارباش را درست انتخاب کرده‌اید؟

هنگام دریافت دستی قفل‌های بیداری، نامگذاری مناسب برای اشکال‌زدایی مهم است:

  • هرگونه اطلاعات شخصی قابل شناسایی (PII) مانند آدرس‌های ایمیل را در نام ذکر نکنید. در صورت شناسایی PII، قفل بیداری به صورت _UNKNOWN ثبت می‌شود که اشکال‌زدایی را مختل می‌کند.
  • قفل بیداری خود را به صورت برنامه‌نویسی شده و با استفاده از نام کلاس یا متد نامگذاری نکنید، زیرا این نام‌ها می‌توانند توسط ابزارهایی مانند Proguard مبهم‌سازی شوند. در عوض، از یک رشته‌ی کدگذاری شده‌ی ثابت استفاده کنید.
  • برای برچسب‌های قفل بیداری، شمارنده یا شناسه منحصر به فرد اضافه نکنید. هر بار که قفل بیداری اجرا می‌شود، باید از همان برچسب استفاده شود تا سیستم بتواند میزان استفاده را بر اساس نام جمع‌آوری کند و تشخیص رفتارهای غیرعادی را آسان‌تر کند.

۳. آیا قفل بیداریِ به‌دست‌آمده همیشه آزاد می‌شود؟

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

برای مثال، اگر یک خطای کنترل نشده در طول processingWork() رخ دهد، ممکن است فراخوانی release() هرگز اتفاق نیفتد. در عوض، می‌توانید از یک بلوک try-finally برای تضمین آزاد شدن قفل بیدار شدن، حتی در صورت وقوع خطا، استفاده کنید.

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

  fun processingWork() {
    wakeLock.apply {
        try {
            acquire(60 * 10 * 1000) // timeout after 10 minutes
            doTheWork()
        } finally {
            release()
        }
    }
}

۴. آیا می‌توانید دفعات بیدار شدن از خواب را کاهش دهید؟

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

  • WorkManager: فاصله تناوبی را در PeriodicWorkRequest ها افزایش دهید.
  • SensorManager: با مشخص کردن maxReportLatencyMs هنگام ثبت شنونده، از دسته‌بندی استفاده کنید.
  • ارائه دهنده موقعیت مکانی فیوزد:
    • با استفاده از getLastLocation برای آخرین مکان ذخیره شده، فرکانس بازیابی مکان را کاهش دهید.
    • برای یک روش به‌روزرسانی که مصرف باتری کمتری دارد، از setPriority(PRIORITY_PASSIVE ) استفاده کنید.
    • همچنین، می‌توانید با تنظیم حداقل فاصله به‌روزرسانی با setMinUpdateIntervalMillis ، از مکانیسم دسته‌بندی موقعیت مکانی بهره ببرید.

می‌توانید جزئیات بیشتر را در مستندات بهترین شیوه‌های قفل بیدارباش مشاهده کنید.

اشکال‌زدایی استفاده بیش از حد از قفل بیداری

حتی با بهترین نیت‌ها، استفاده بیش از حد از قفل بیدارباش ممکن است رخ دهد. اگر برنامه شما در کنسول Play علامت‌گذاری شده است، در اینجا نحوه اشکال‌زدایی آن آمده است:

شناسایی اولیه با کنسول Play

داشبورد قفل بیداری جزئی بیش از حد Android Vitals، جزئیات نام‌های قفل بیداری غیر معاف مرتبط با برنامه شما را ارائه می‌دهد و جلسات و مدت زمان‌های تحت تأثیر را نشان می‌دهد. یادآوری می‌کنم که از مستندات استفاده کنید تا به شما در تشخیص اینکه آیا نام قفل بیداری توسط برنامه نگهداری می‌شود یا توسط API دیگری نگهداری می‌شود، کمک کند.

breakdowns2.png

داشبورد قفل بیداری جزئی بالای دستگاه‌های اندروید به پایین اسکرول کرد تا برچسب‌های قفل بیداری اضافی را مشاهده کند.

اشکال‌زدایی قفل‌های بیداری بیش از حد که توسط کارگران/شغل‌ها نگهداری می‌شوند

شما می‌توانید قفل‌های بیداری که توسط کارگران نگهداری می‌شوند را با این نام قفل بیداری شناسایی کنید:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

لیست کامل انواع نام‌های قفل بیداری که توسط کارگر نگهداری می‌شوند، در مستندات موجود است. برای اشکال‌زدایی این قفل‌های بیداری، می‌توانید از Background Task Inspector برای اشکال‌زدایی محلی استفاده کنید، یا از getStopReason برای اشکال‌زدایی مشکلات در محل استفاده کنید.

بازرس وظایف پس‌زمینه اندروید استودیو

بازرس وظیفه.png


تصویر صفحه نمایش Background Task Inspector، که در آن توانسته یک worker با نام "WeatherSyncWorker" را شناسایی کند که مرتباً تلاش مجدد کرده و ناموفق بوده است.

برای اشکال‌زدایی محلی مشکلات WorkManager ، از این ابزار روی یک شبیه‌ساز یا دستگاه متصل (سطح API 26+) استفاده کنید. این ابزار لیستی از workerها و وضعیت آنها (تمام‌شده، در حال اجرا، در صف انتظار) را نشان می‌دهد و به شما امکان می‌دهد جزئیات را بررسی کرده و زنجیره‌های worker را درک کنید.

برای مثال، می‌تواند نشان دهد که آیا یک کارگر به دلیل محدودیت‌های سیستم مرتباً شکست می‌خورد یا دوباره تلاش می‌کند.

برای جزئیات بیشتر به مستندات Background Task Inspector مراجعه کنید.

WorkManager getStopReason

برای اشکال‌زدایی درون‌برنامه‌ایِ کارگرانی که قفل‌های بیداری بیش از حد دارند، از WorkInfo.getStopReason() در WorkManager 2.9.0+ یا برای JobScheduler JobParameters.getStopReason() موجود در SDK 31+ استفاده کنید.

این API به ثبت دلیل توقف یک worker (مثلاً STOP_REASON_TIMEOUT ، STOP_REASON_QUOTA ) کمک می‌کند و مشکلاتی مانند وقفه‌های مکرر به دلیل مدت زمان اجرای طولانی را مشخص می‌کند.

  backgroundScope.launch {
    WorkManager.getInstance(context)
        .getWorkInfoByIdFlow(workRequest.id)
        .collect { workInfo ->
            logStopReason(workRequest.id, workInfo?.stopReason)
        }
}

برای جزئیات بیشتر، به «بهینه‌سازی مصرف باتری برای APIهای زمان‌بندی وظایف» مراجعه کنید.

اشکال‌زدایی انواع دیگر قفل‌های بیداری بیش از حد

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

جمع‌آوری ردیابی سیستم

ردیابی سیستم یک ابزار اشکال‌زدایی قدرتمند است که سابقه‌ای دقیق از فعالیت سیستم را در طول یک دوره ثبت می‌کند و بینش‌هایی در مورد وضعیت CPU، فعالیت نخ‌ها، فعالیت شبکه و معیارهای مرتبط با باتری مانند مدت زمان کار و استفاده از قفل بیدارباش ارائه می‌دهد.

شما می‌توانید با استفاده از چندین روش، ردیابی سیستم را ثبت کنید:

powermgmt.png

دسته Atrace با عنوان "power:PowerManagement" را در رابط کاربری Perfetto و زیر تب Android apps & svcs فعال کنید.

صرف نظر از روش انتخاب شده، بسیار مهم است که مطمئن شوید دسته‌بندی Atrace مربوط به "power:PowerManagement" را جمع‌آوری می‌کنید تا امکان مشاهده‌ی مسیرهای وضعیت دستگاه فراهم شود.

بازرسی رابط کاربری Perfetto و تحلیل SQL

ردپاهای سیستم را می‌توان در رابط کاربری Perfetto باز و بررسی کرد. وقتی ردپا را باز می‌کنید، تجسمی از فرآیندهای مختلف را در یک جدول زمانی مشاهده خواهید کرد. ردپاهایی که در این راهنما بر آنها تمرکز خواهیم کرد، آنهایی هستند که در قسمت «وضعیت دستگاه» قرار دارند.

کامل.png


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

هر بلوک نام رویداد، زمان شروع رویداد و زمان پایان آن را فهرست می‌کند. در Perfetto، به این بخش، برش (slice) گفته می‌شود.

برای تحلیل مقیاس‌پذیر چندین ردپا، می‌توانید از تحلیل SQL شرکت Perfetto استفاده کنید. یک کوئری SQL می‌تواند تمام قفل‌های بیداری را که بر اساس مدت زمان مرتب شده‌اند، پیدا کند و به شناسایی عوامل اصلی استفاده بیش از حد کمک کند.

در اینجا یک مثال از کوئری آورده شده است که تمام برچسب‌های قفل بیداری که در ردیابی سیستم رخ داده‌اند را بر اساس مدت زمان کل مرتب می‌کند:

  SELECT slice.name as name, track.name as track_name,SUM(dur / 100000) as total_dur_ms
FROM slice
JOIN track ON slice.track_id = track.id
WHERE track.name = 'WakeLocks'GROUP BY slice.name, track.name
ORDER BY total_dur_ms DESC

استفاده از ProfilingManager برای جمع‌آوری داده‌های ردیابی درون میدانی

برای مشکلاتی که بازتولید آنها دشوار است، ProfilingManager (که در SDK 35 اضافه شده است) یک API برنامه‌نویسی است که به توسعه‌دهندگان اجازه می‌دهد تا ردیابی‌های سیستم را در فیلد با تریگرهای شروع و پایان جمع‌آوری کنند. این API کنترل بیشتری بر نقاط تریگر شروع و پایان برای جمع‌آوری پروفایل ارائه می‌دهد و محدودیت سرعت در سطح سیستم را برای جلوگیری از تأثیر بر عملکرد دستگاه اعمال می‌کند.

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

ردپاهای سیستمی جمع‌آوری‌شده با استفاده از ProfilingManager مشابه ردپاهای جمع‌آوری‌شده به‌صورت دستی خواهند بود، اما فرآیندهای سیستمی و سایر فرآیندهای برنامه از ردپا حذف می‌شوند.

نتیجه‌گیری

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

با درک و پیاده‌سازی صحیح قفل‌های بیدارباش، می‌توانید عملکرد باتری برنامه خود را به میزان قابل توجهی بهینه کنید. استفاده از APIهای جایگزین، پایبندی به بهترین شیوه‌های قفل بیدارباش و استفاده از ابزارهای اشکال‌زدایی قدرتمند مانند Background Task Inspector، system traces و ProfilingManager کلید موفقیت برنامه شما در Google Play هستند.

    نوشته شده توسط:

    ادامه مطلب