چندین کتابخانه و API سیستم می توانند wake lockهایی را که به برنامه شما نسبت داده می شود، بدست آورند. این امر می تواند شناسایی wake lock در برنامه شما را که ممکن است باعث ایجاد مشکل شود، دشوار کند. اگر از یک API سوء استفاده کنید، ممکن است باعث شود برنامه شما wake lock را برای مدت طولانی نگه دارد، حتی اگر مستقیماً با wake lock API تماس نگیرید.
این سند برخی از نامهای متداول wake lock را که ممکن است هنگام استفاده از ابزارهای اشکالزدایی wake lock مشاهده کنید، فهرست میکند. همچنین ممکن است این نامها را در گزارشی از Android vitals ببینید. در برخی موارد، wake lock ممکن است توسط یک کتابخانه یا API سیستم ایجاد شده باشد. در موارد دیگر، دلیلی وجود دارد که چرا ابزار نام wake lock را که در برنامه استفاده میکنید مخفی میکند. میتوانید از ابزارهای اشکالزدایی برای شناسایی wake lockهای نادرست استفاده کنید، سپس نام wake lock را در این سند جستجو کنید تا مشخص کنید کدام API ممکن است باعث ایجاد مشکل شده باشد و چگونه آن را حل کنید.
این سند سناریوهایی را که ممکن است wake lock ایجاد شود را پوشش می دهد. در هر مورد، در حالی که wake lock ممکن است توسط یک کتابخانه یا API دیگر ایجاد شود، قفل به برنامه ای نسبت داده می شود که آن API را نامیده است.
-
AlarmManager
- صدا و رسانه
- Firebase Cloud Message (FCM)
- JobScheduler
- مکان
- مدیر کار
-
_UNKNOWN
: اگر به نظر می رسد نام wake lock از اطلاعات شناسایی شخصی (PII) استفاده می کند، با ابزارهای اشکال زدایی نشان داده می شود.
AlarmManager
AlarmManager
wake lock ها را بدست می آورد و آنها را به برنامه تماس نسبت می دهد. AlarmManager
با خاموش شدن زنگ هشدار wake lock را دریافت می کند و زمانی که اجرای متد onReceive()
پخش زنگ به پایان می رسد قفل را آزاد می کند.
نام های Wake lock
AlarmManager
قفل های wake را با نام *alarm*
ایجاد می کند. (ستاره ها بخشی از نام wake lock هستند، آنها کارت های وحشی را نشان نمی دهند.)
توصیه
ما اقدامات زیر را برای بهینه سازی رفتار هشدار توصیه می کنیم:
- از
AlarmManager
برای بهینه سازی فرکانس زمان بندی زنگ هشدار استفاده کنید. - فقط در صورت لزوم از زنگ های
RTC_WAKEUP
(که دستگاه را بیدار می کند) استفاده کنید. - استفاده از آلارم ها را به حداقل برسانید و از انجام کارهای طولانی در متد
onReceive()
اجتناب کنید.
صدا و رسانه
رسانههای API میتوانند هنگام ضبط یا پخش صدا، wake lock دریافت کنند. wake lock ها به برنامه تماس نسبت داده می شوند.
نام های Wake lock
API های رسانه ای wake lock با نام های مختلفی دریافت می کنند که با Audio
شروع می شود:
-
AudioBitPerfect
: برای پخش صدای USB بدون تلفات استفاده می شود. -
AudioDirectOut
: برای پخش صدای بدون افت در تلویزیون یا دستگاه خاص استفاده می شود. -
AudioDup
: برای پخش اعلان ها در حین اتصال از طریق بلوتوث یا USB استفاده می شود. -
AudioIn
: برای ضبط صدا در حالت دوربین فیلمبرداری در حالی که میکروفون فعال است استفاده می شود. -
AudioMix
: برای پخش صدا در یک دستگاه معمولی استفاده می شود. -
AudioOffload
: برای پخش طولانی مدت فقط موسیقی، برای برنامه هایی که از این حالت پشتیبانی می کنند استفاده می شود. -
AudioSpatial
: برای پخش صدای چند کاناله فیلم یا موسیقی در دستگاه هایی که از صدای فضایی پشتیبانی می کنند استفاده می شود. -
AudioUnknown
: زمانی استفاده می شود که سایر موقعیت ها اعمال نمی شوند. -
MmapCapture
: برای ضبط صدا با تاخیر کم استفاده می شود. -
MmapPlayback
: برای پخش با تاخیر کم، مانند بازی یا برنامه های صوتی حرفه ای استفاده می شود.
توصیه
ما اقدامات زیر را توصیه می کنیم:
- از نامهای wake lock که با
Audio
شروع میشوند استفاده نکنید. - اگر از API های رسانه استفاده می کنید، نباید به طور مستقیم نیازی به دریافت wake locks داشته باشید. برای به دست آوردن wake lock های لازم برای خود می توانید به API ها اعتماد کنید.
- هنگامی که از API های رسانه استفاده می کنید، جلسه رسانه را زمانی که دیگر به آن نیاز ندارید پایان دهید.
Firebase Cloud Message (FCM)
GCM در حین ارسال پیام Firebase Cloud (FCM) به برنامه، یک wake lock دریافت میکند. پس از اتمام اجرای متد پخش FCM onMessageReceived()
wake lock آزاد می شود.
نام های Wake lock
GCM یک wake lock با نام GOOGLE_C2DM
دریافت می کند.
توصیه
ما اقدامات زیر را برای بهینه سازی رفتار FCM توصیه می کنیم:
- فرکانس تحویل FCM را بهینه کنید.
- از FCM با اولویت بالا استفاده نکنید مگر اینکه پیام واقعاً نیاز به تحویل فوری داشته باشد.
- متد
onMessageReceived()
را در سریع ترین زمان ممکن تکمیل کنید. برای اطلاعات بیشتر به راهنمای firebase مراجعه کنید.
JobScheduler
کارهای JobScheduler هنگام اجرای وظایف در پسزمینه، wake lock را به دست میآورند. wake lockها به برنامه ای که کارگران را ایجاد کرده است نسبت داده می شود.
نام های Wake lock
نامهای wake lock که توسط JobScheduler به دست میآیند به نسخهای از سیستم اندرویدی که روی آن اجرا میشوند و هدف کار بستگی دارد.
مواردی که با براکت های زاویه احاطه شده اند متغیر هستند. به عنوان مثال، "<package_name>" نام بسته برنامه شما است، نه متن تحت اللفظی <package name>
. با این حال، *job*
دنباله کاراکتر *job*
، با ستاره است. از ستاره ها به عنوان کارت های وحشی استفاده نمی شود.
اندروید 15 و پایین تر
مشاغل آغاز شده توسط کاربر، wake lockهایی را با نامهای زیر این الگو ایجاد میکنند:
*job*u/@<name_space>@/<package_name>/<classname>
مشاغل دیگر از این الگو استفاده می کنند:
*job*/@<name_space>@/<package_name>/<classname>
اندروید 16 و بالاتر
کارهایی که توسط کاربر راه اندازی می شوند، wake lock هایی با نام های زیر این الگو ایجاد می کنند:
*job*u/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
مشاغل تسریع شده از این الگو استفاده می کنند:
*job*e/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
مشاغل معمولی از این الگو استفاده می کنند:
*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
مثال
فرض کنید یک کار تسریع شده با backup
فضای نام وجود دارد و تگ ردیابی started
. نام بسته com.example.app
است و کلاسی که کار را ایجاد کرده است com.backup.BackupFileService
است.
در دستگاههایی که Android 15 یا پایینتر دارند، wake lock نامگذاری میشود:
*job*/@backup@/com.example.app/com.backup.BackupFileService
در دستگاههایی که دارای Android نسخه 16 یا بالاتر هستند، wake lock نامگذاری میشود:
*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService
توصیه
استفاده خود از وظایف JobScheduler را بررسی کنید. بهویژه، راهنماییهای ما را برای بهینهسازی استفاده از باتری برای APIهای زمانبندی کار دنبال کنید.
مکان
LocationManager
و FusedLocationProviderClient
از wake lock برای به دست آوردن و تحویل مکان دستگاه استفاده می کنند. wake lock ها به برنامه ای نسبت داده می شوند که آن API ها را نامیده است.
نام های Wake lock
سرویس های مکان از نام های زیر استفاده می کنند:
-
CollectionLib-SigCollector
-
NetworkLocationLocator
-
NetworkLocationScanner
-
NlpCollectorWakeLock
-
NlpWakeLock
-
*location*
توصیه
استفاده از مکان را بهینه کنید . برای مثال، زمانبندی، درخواستهای دستهای مکان یا استفاده از بهروزرسانیهای موقعیت مکانی غیرفعال را تنظیم کنید.
مدیر کار
کارگران WorkManager هنگام اجرای وظایف در پسزمینه، wake lock را به دست میآورند. wake lockها به برنامه ای که کارگران را ایجاد کرده است نسبت داده می شود.
نام های Wake lock
نامهای wake lock که توسط WorkManager به دست میآیند به نسخهای از سیستم اندرویدی که در حال اجرا هستند بستگی دارد.
اندروید 15 و پایین تر
وظایف WorkManager قفلهای wake را با نامهای زیر این الگو ایجاد میکنند:
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
اندروید 16 و بالاتر
وظایف تسریعشده، wake lockهایی با نامهایی که از این الگو پیروی میکنند ایجاد میکنند:
*job*e/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
کارهای منظم از این الگو پیروی می کنند:
*job*r/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
به طور پیش فرض، <trace_tag>
نام کارگر است.
مثال
فرض کنید یک کارگر تسریع شده به نام BackupFileWorker
وجود دارد. نام بسته com.example.app
است.
در دستگاههایی که Android 15 یا پایینتر دارند، wake lock نامگذاری میشود:
*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
در دستگاههایی که دارای Android نسخه 16 یا بالاتر هستند، wake lock نامگذاری میشود:
*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
توصیه
استفاده از کارگران WorkManager را بررسی کنید. بهویژه، راهنماییهای ما را برای بهینهسازی استفاده از باتری برای APIهای زمانبندی کار دنبال کنید.
_ناشناس
اگر ابزارهای اشکال زدایی فکر می کنند نام wake lock حاوی اطلاعات شخصی قابل شناسایی (PII) است، نام واقعی wake lock را نمایش نمی دهند. در عوض، آنها wake lock را به عنوان _UNKNOWN
برچسب گذاری می کنند. برای مثال، اگر نام wake lock حاوی یک آدرس ایمیل باشد، ممکن است ابزارها این کار را انجام دهند.
توصیه
بهترین شیوه های نامگذاری wake lock را دنبال کنید و از استفاده از PII در نام wake lock خودداری کنید. اگر wake lock به نام _UNKNOWN
را پیدا کردید که به برنامه شما نسبت داده شده است، سعی کنید wake lock را شناسایی کنید و نام دیگری برای آن بگذارید.