اخبار محصول

بهینه‌سازی باتری برنامه بااستفاده از سنجه قفل بیداری معیارهای کلیدی Android

زمان خواندن: ۷ دقیقه
مشاهده نمایه Alice Yuan
Alice Yuan مهندس روابط توسعه‌دهندگان، Android

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

استفاده مفرط از قفل بیداری جزئی در «معیارهای کلیدی Android»

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

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

warning.png

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

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

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

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

آشنایی با قفل‌های بیداری

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

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

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

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

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

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

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

این چهار سؤال مهم را درنظر بگیرید.


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

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

wakelock.png

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

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

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

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

  • هیچ‌گونه «اطلاعات شناساننده شخصی» (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 تفکیک نام‌های قفل بیداری معاف‌نشده مرتبط با برنامه‌تان را ارائه می‌دهد و جلسه‌ها و مدت‌های تحت‌تأثیرقرارگرفته را نشان می‌دهد. یادآوری برای استفاده از اسناد برای کمک به شما در شناسایی اینکه آیا نام قفل بیداری توسط برنامه نگه‌داشته شده است یا توسط میانای برنامه‌سازی کاربردی دیگری نگه‌داشته شده است.

breakdowns2.png

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

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

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

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

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

نظارتگر وظایف پس‌زمینه «استودیو Android»

taskinspector.png


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

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

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

برای جزئیات بیشتر، سند «نظارتگر وظایف پس‌زمینه» را ببینید.

WorkManager getStopReason

برای اشکال‌زدایی در محل کارگران با قفل‌های بیداری بیش‌ازحد، از WorkInfo.getStopReason() در WorkManager نسخه ۲.۹.۰ یا بالاتر یا برای JobScheduler، از JobParameters.getStopReason() دردسترس در کیت توسعه نرم‌افزار نسخه ۳۱ یا بالاتر استفاده کنید. 

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

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

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

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

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

مجموعه ردیابی سیستم

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

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

powermgmt.png

دسته Atrace «power:PowerManagement» را در «رابط کاربری Perfetto» در برگه برنامه‌ها و سرویس‌های Android فعال کنید. 

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

بازرسی میانای کاربر Perfetto و تجزیه‌وتحلیل SQL

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

perfetto.png


قطعه‌های «قفل بیداری» را که در بخش «وضعیت دستگاه» قرار دارند (مانند «برنامه برتر»، «وضعیت صفحه‌نمایش»، «قفل‌های بیداری طولانی»، و «کارها») سنجاق کنید تا بتوانید بخش‌های قفل بیداری طولانی‌مدت را به‌صورت بصری شناسایی کنید.

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

برای تحلیل مقیاس‌پذیر چند ردیابی، می‌توانید از تحلیل 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) یک میانای برنامه‌سازی کاربردی برنامه‌ای است که به توسعه‌دهندگان امکان می‌دهد ردگیری‌های سیستم را در فیلد با راه‌اندازهای شروع و پایان جمع‌آوری کنند. این ابزار کنترل بیشتری بر نقاط راه‌انداز شروع و پایان برای جمع‌آوری نمایه ارائه می‌دهد و محدودیت نرخ در سطح سیستم را اعمال می‌کند تا از تأثیر بر عملکرد دستگاه جلوگیری کند. 

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

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

نتیجه‌گیری

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

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

نویسنده:
ادامه خواندن