چندین کتابخانه و API سیستم می توانند wake lockهایی را که به برنامه شما نسبت داده می شود، بدست آورند. این امر می تواند شناسایی wake lock در برنامه شما را که ممکن است باعث ایجاد مشکل شود، دشوار کند. اگر از یک API سوء استفاده کنید، ممکن است باعث شود برنامه شما wake lock را برای مدت طولانی نگه دارد، حتی اگر مستقیماً با wake lock API تماس نگیرید.
در سناریوهایی که یک wake lock توسط API های دیگر به دست می آید، باید از دستیابی wake lock دستی خودداری کنید.
این سند برخی از نامهای متداول wake lock را که ممکن است هنگام استفاده از ابزارهای اشکالزدایی wake lock مشاهده کنید، فهرست میکند. همچنین ممکن است این اسامی را در گزارشی از vitals ببینید. در برخی موارد، wake lock ممکن است توسط یک کتابخانه یا API سیستم ایجاد شده باشد. در موارد دیگر، دلیلی وجود دارد که چرا ابزار نام wake lock را که در برنامه استفاده میکنید مخفی میکند. میتوانید از ابزارهای اشکالزدایی برای شناسایی wake lockهای نادرست استفاده کنید، سپس نام wake lock را در این سند جستجو کنید تا مشخص کنید کدام API ممکن است باعث ایجاد مشکل شده باشد و چگونه آن را حل کنید.
این سند سناریوهایی را که ممکن است wake lock ایجاد شود را پوشش می دهد. در هر مورد، در حالی که wake lock ممکن است توسط یک کتابخانه یا API دیگر ایجاد شود، قفل به برنامه ای نسبت داده می شود که آن API را نامیده است.
- مدیر آلارم
- صدا و رسانه
- بلوتوث
- سنسورهای دستگاه
- Firebase Cloud Message (FCM)
- JobScheduler
- مکان
- مدیر کار
-
_UNKNOWN
: اگر به نظر می رسد نام wake lock از اطلاعات شناسایی شخصی (PII) استفاده می کند، با ابزارهای اشکال زدایی نشان داده می شود.
مدیر آلارم
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 های رسانه استفاده می کنید، جلسه رسانه را زمانی که دیگر به آن نیاز ندارید پایان دهید.
بلوتوث
APIهای بلوتوث پلتفرم هیچ wake lock قابل انتساب به برنامه را در حین انجام اقدامات بلوتوث در خود ندارند. برای کمک به تأیید اینکه انتقال بلوتوث در پسزمینه انجام میشود، با استفاده از WorkManager یک کار را برنامهریزی کنید.
توصیه
- از جفتسازی دستگاه همراه برای جفتسازی دستگاههای بلوتوث استفاده کنید تا در حین جفتسازی بلوتوث به قفل دستی بیدار نشوید.
- برای درک نحوه انجام ارتباط بلوتوث پسزمینه، با ارتباط در راهنمای پسزمینه مشورت کنید.
- اگر وایک لاک دستی ضروری تلقی می شود، قفل بیدار شدن را فقط برای مدت زمان عملکرد بلوتوث نگه دارید.
سنسورهای دستگاه
روش های مختلفی برای ردیابی داده های حسگر دستگاه مانند داده های شمارش گام، شتاب سنج یا ژیروسکوپ وجود دارد.
در Wear OS، از Wear Health Services برای گرفتن دادههای دستگاه مانند ارتفاع، ضربان قلب و مسافت طی شده استفاده کنید.
اگر داده ها توسط برنامه های دیگر جمع آوری شده است، می توانید از Health Connect همراه با WorkManager برای بازیابی داده ها استفاده کنید.
برای سناریوهایی مانند ردیابی دلتای مراحل یا مسافت طی شده، میتوانید از Recording API در تلفن همراه همراه با WorkManager برای بازیابی دادهها استفاده کنید.
در شرایط خاص، ممکن است با استفاده از SensorManager
به ردیابی حسگر دستگاه سفارشی نیاز باشد. SensorManager
از طرف برنامه، wake lock را دریافت نمی کند، مگر اینکه حسگر یک حسگر بیدار شدن باشد، که با استفاده از isWakeUpSensor
API قابل شناسایی است.
توصیه
استفاده از حسگرها برای ضبط با نرخ نمونه برداری بالا می تواند باتری را به میزان قابل توجهی تخلیه کند، در اینجا توصیه هایی برای کاهش تخلیه باتری و استفاده از wake lock وجود دارد:
- اگر تعداد گامهای ردیابی یا مسافت طی شده است، از Recording API برای ضبط دادهها به شیوهای باطری کارآمد استفاده کنید.
- برای ردیابی حسگر غیرفعال در Wear OS، از Wear Health Services برای بهینهسازی مصرف باتری استفاده کنید.
- فرکانس سنسور خود را به کمتر از 200 هرتز کاهش دهید.
- هنگام ثبت سنسور با
SensorManager
،maxReportLatencyUs
30 ثانیه را برای استفاده از منطق دستهبندی حسگر و کاهش تعداد وقفههایی که برنامه دریافت میکند، تعیین کنید. - از نگه داشتن قفل بیداری طولانی برای تمام مدت ردیابی حسگر خودداری کنید، در عوض با استفاده از AlarmManager هشدارها را برای نظرسنجی برای داده های حسگر هر 30+ ثانیه برنامه ریزی کنید.
Firebase Cloud Message (FCM)
هنگام ارسال پیام Firebase Cloud (FCM) به برنامه، یک wake lock به دست میآید. پس از اتمام اجرای متد پخش FCM onMessageReceived()
wake lock آزاد می شود.
نام های Wake lock
یک 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*
توصیه
- استفاده از مکان را بهینه کنید . برای مثال، زمانبندی، درخواستهای دستهای مکان یا استفاده از بهروزرسانیهای موقعیت مکانی غیرفعال را تنظیم کنید.
- اگر از APIهای مکان استفاده میکنید، نیازی نیست مستقیماً wake lock را دریافت کنید. برای به دست آوردن wake lock های لازم برای خود می توانید به API ها اعتماد کنید.
مدیر کار
کارگران 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 یا بالاتر دارند و از WorkManager 2.10.0+
استفاده میکنند، wake lock نامگذاری میشود:
*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
توصیه
- نسخه WorkManager خود را ارتقا دهید تا برچسبهای wake lock در اندروید 16 یا بالاتر پرمخاطبتر شوند.
- استفاده از کارگران WorkManager را بررسی کنید. بهویژه، راهنماییهای ما را برای بهینهسازی استفاده از باتری برای APIهای زمانبندی کار دنبال کنید.
_ناشناس
اگر ابزارهای اشکال زدایی فکر می کنند نام wake lock حاوی اطلاعات شخصی قابل شناسایی (PII) است، نام واقعی wake lock را نمایش نمی دهند. در عوض، آنها wake lock را به عنوان _UNKNOWN
برچسب گذاری می کنند. برای مثال، اگر نام wake lock حاوی یک آدرس ایمیل باشد، ممکن است ابزارها این کار را انجام دهند.
توصیه
بهترین شیوه های نامگذاری wake lock را دنبال کنید و از استفاده از PII در نام wake lock خودداری کنید. اگر wake lock به نام _UNKNOWN
را پیدا کردید که به برنامه شما نسبت داده شده است، سعی کنید wake lock را شناسایی کنید و نام دیگری برای آن بگذارید.