اخبار محصول

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

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

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

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

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

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

warning.png

هشدار قفل بیداری مفرط در نمای کلی «معیارهای کلیدی Android».

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

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

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

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

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

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

breakdowns2.png

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

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

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

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

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

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

taskinspector.png


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

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

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

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

‫WorkManager getStopReason

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

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

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

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

نتیجه‌گیری

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

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

نوشته:
ادامه خواندن