چندین کتابخانه و 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 را نامیده است.
-
*alarm*
: ایجاد شده توسطAlarmManager
. -
AudioIn
،AudioMix
: ایجاد شده توسط API های رسانه. -
GOOGLE_C2DM
: هنگام ارسال پیام Firebase Cloud (FCM) به برنامه به دست آمد. -
*job*/<package_name>/<package_and_job_name>
: ایجاد شده توسط JobScheduler jobs. -
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
: ایجاد شده توسط کارگران WorkManager. -
NetworkLocationLocator
،FusedLocation
،*location*
: ایجاد شده توسط APIهای مکان. -
_UNKNOWN
: اگر به نظر می رسد نام wake lock از اطلاعات شناسایی شخصی (PII) استفاده می کند، با ابزارهای اشکال زدایی نشان داده می شود.
*alarm*
این wake lock توسط AlarmManager
به دست آمده و به برنامه تماس نسبت داده شده است. AlarmManager
با خاموش شدن زنگ هشدار wake lock را دریافت می کند و زمانی که اجرای متد onReceive()
پخش زنگ به پایان می رسد قفل را آزاد می کند.
توصیه
ما اقدامات زیر را برای بهینه سازی رفتار هشدار توصیه می کنیم:
- از
AlarmManager
برای بهینه سازی فرکانس زمان بندی زنگ هشدار استفاده کنید. - فقط در صورت لزوم از زنگ های
RTC_WAKEUP
(که دستگاه را بیدار می کند) استفاده کنید. - استفاده از آلارم ها را به حداقل برسانید و از انجام کارهای طولانی در متد
onReceive()
اجتناب کنید.
AudioIn
، AudioMix
و غیره
Wake lock های مختلفی که نام آنها با Audio
شروع می شود توسط API های رسانه هنگام ضبط یا پخش صدا به دست می آیند. wake lock ها به برنامه تماس نسبت داده می شوند.
AudioIn
هنگام ضبط AudioRecord
در حالت دوربین فیلمبرداری، در حالی که میکروفون فعال است، به دست می آید. AudioMix
در حین پخش AudioTrack
در دستگاه به دست می آید. سایر APIهای رسانه ممکن است wake lock با نامهای دیگری که با Audio
شروع میشوند، دریافت کنند.
توصیه
ما اقدامات زیر را توصیه می کنیم:
- از نامهای wake lock که با
Audio
شروع میشوند استفاده نکنید. - اگر از API های رسانه استفاده می کنید، نباید به طور مستقیم نیازی به دریافت wake locks داشته باشید. برای به دست آوردن wake lock های لازم برای خود می توانید به API ها اعتماد کنید.
- هنگامی که از API های رسانه استفاده می کنید، جلسه رسانه را زمانی که دیگر به آن نیاز ندارید پایان دهید.
GOOGLE_C2DM
این wake lock توسط GCM در حالی که یک پیام Firebase Cloud (FCM) را به برنامه پخش میکند به دست میآورد. پس از اتمام اجرای متد پخش FCM onMessageReceived()
wake lock آزاد می شود.
توصیه
ما اقدامات زیر را برای بهینه سازی رفتار FCM توصیه می کنیم:
- فرکانس تحویل FCM را بهینه کنید.
- از FCM با اولویت بالا استفاده نکنید مگر اینکه پیام واقعاً نیاز به تحویل فوری داشته باشد.
- متد
onMessageReceived()
را در سریع ترین زمان ممکن تکمیل کنید. برای اطلاعات بیشتر به راهنمای firebase مراجعه کنید.
*job*/<package_name>/<package_and_job_name>
این wake lock توسط JobScheduler jobها هنگام اجرای وظایف در پسزمینه استفاده میشود. wake lockها به برنامه ای که کارگران را ایجاد کرده است نسبت داده می شود.
"<package_name>" نام بسته برنامه شما است، نه متن تحت اللفظی <package name>
. به طور مشابه، "<package_and_job_name>" نام بسته است که با نام شغل همراه است. *job*
دنباله کاراکتر *job*
با ستاره است. از ستاره ها به عنوان کارت های وحشی استفاده نمی شود. در اینجا یک نمونه از چنین نام wake lock آورده شده است:
*job*/com.example.app/com.example.app.example.path.ExampleJobService
توصیه
استفاده خود از وظایف JobScheduler را بررسی کنید. بهویژه، راهنماییهای ما را برای بهینهسازی استفاده از باتری برای APIهای زمانبندی کار دنبال کنید.
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
این wake lock توسط کارگران WorkManager هنگام اجرای وظایف در پس زمینه استفاده می شود. wake lockها به برنامه ای که کارگران را ایجاد کرده است نسبت داده می شود.
"<package_name>" نام بسته برنامه شما است، نه متن تحت اللفظی <package name>
. *job*
دنباله کاراکتر *job*
با ستاره است. از ستاره ها به عنوان کارت های وحشی استفاده نمی شود.
توصیه
استفاده از کارگران WorkManager را بررسی کنید. بهویژه، راهنماییهای ما را برای بهینهسازی استفاده از باتری برای APIهای زمانبندی کار دنبال کنید.
NetworkLocationLocator
, FusedLocation
, *location*
این نامهای wake lock توسط LocationManager
و FusedLocationProviderClient
برای بدست آوردن و تحویل مکان دستگاه استفاده میشوند. wake lock ها به برنامه ای نسبت داده می شوند که آن API ها را نامیده است.
توصیه
استفاده از مکان را بهینه کنید . برای مثال، زمانبندی، درخواستهای دستهای مکان یا استفاده از بهروزرسانیهای موقعیت مکانی غیرفعال را تنظیم کنید.
_ناشناس
اگر ابزارهای اشکال زدایی فکر می کنند نام wake lock حاوی اطلاعات شخصی قابل شناسایی (PII) است، نام واقعی wake lock را نمایش نمی دهند. در عوض، آنها wake lock را به عنوان _UNKNOWN
برچسب گذاری می کنند. برای مثال، اگر نام wake lock حاوی یک آدرس ایمیل باشد، ممکن است ابزارها این کار را انجام دهند.
توصیه
بهترین شیوه های نامگذاری wake lock را دنبال کنید و از استفاده از PII در نام wake lock خودداری کنید. اگر wake lock به نام _UNKNOWN
را پیدا کردید که به برنامه شما نسبت داده شده است، سعی کنید wake lock را شناسایی کنید و نام دیگری برای آن بگذارید.