يساعدك هذا المستند في تحديد حالات استخدام عمليات قفل التنشيط وتحسينها في تطبيقك، بالإضافة إلى توضيح ما إذا كانت هناك عمليات قفل تنشيط تم الحصول عليها من خلال مكتبات أخرى أو واجهات برمجة تطبيقات النظام المرتبطة بحالة الاستخدام هذه. وبما أنّ عمليات قفل التنشيط هذه ترجع إلى تطبيقك، قد يكون من الصعب تحديد مصدر عملية قفل التنشيط التي تسبّب مشاكل. يمكن أن يؤدي الاستخدام غير الصحيح لواجهة برمجة التطبيقات إلى الإبلاغ عن تطبيقك بسبب الاستخدام المفرط لعمليات قفل التنشيط، حتى إذا لم تكن تحصل على عمليات قفل التنشيط بشكل صريح.
تدرِج هذه الوثيقة بعض أسماء أقفال التنشيط الشائعة التي قد تصادفك عند استخدام أدوات تصحيح أخطاء أقفال التنشيط أو في التقارير الواردة من Vitals. يمكن أن تكون هذه الأسماء مأخوذة من مكتبة أو واجهة برمجة تطبيقات للنظام، أو قد تكون مشفّرة. باستخدام أدوات تصحيح الأخطاء لتحديد عمليات قفل التنشيط التي لا تعمل بشكل سليم، ثم البحث عن اسم عملية قفل التنشيط في هذا المستند، يمكنك تحديد واجهة برمجة التطبيقات التي قد تتسبّب في المشكلة والعثور على اقتراحات حول كيفية تحسين استخدامها.
يوضّح هذا المستند حالات الاستخدام الشائعة للحصول على أقفال التنشيط، مع تفصيل أسماء أقفال التنشيط التي تستخدمها واجهات برمجة التطبيقات والمكتبات المختلفة، كما يقدّم توصيات وأفضل الممارسات لتحسين استخدام أقفال التنشيط وتقليله.
- AlarmManager
- الصوت والوسائط
- البلوتوث
- أدوات الاستشعار في الجهاز
- خدمة المراسلة عبر السحابة الإلكترونية من Firebase (FCM)
- JobScheduler
- الموقع الجغرافي
- المراسلة عن بُعد
- WorkManager
-
_UNKNOWN: تعرضها أدوات تصحيح الأخطاء إذا بدا أنّ اسم قفل التنشيط يستخدم معلومات تحديد الهوية الشخصية (PII).
AlarmManager
يحصل AlarmManager على أقفال التنشيط وينسبها إلى التطبيق الذي يطلبها. يحصل AlarmManager على قفل التنشيط عندما يرنّ المنبّه، ويحرر القفل عند انتهاء تنفيذ طريقة onReceive() لبث المنبّه.
أسماء عمليات قفل التنشيط
تنشئ AlarmManager أقفال تنشيط بالاسم *alarm*. (علامات النجمة جزء من اسم قفل التنشيط، ولا تمثّل أحرف بدل).
الاقتراح
ننصحك باتّباع الممارسات التالية لتحسين سلوك المنبّه:
- راجِع اختيار نوع المنبّه لتحديد ما إذا كنت تريد استخدام منبّه غير دقيق أو دقيق. إذا لم يكن من الضروري أن يكون المنبّه دقيقًا، استخدِم المنبّهات غير المحدَّدة الوقت لمنح النظام مرونة أكبر في الجدولة، ما قد يؤدي إلى تحسين عمر البطارية.
- يجب أن تكون على دراية بحصص المنبّهات التي يفرضها النظام وأن تصمّم تطبيقك بما يتوافق معها.
- تجنَّب تنفيذ مهام طويلة في طريقة
onReceive()وجدولة الوحدات العاملة إذا كانت هناك حاجة إلى معالجة إضافية بعد المنبّه.
الصوت والوسائط
يمكن لواجهات برمجة التطبيقات الخاصة بالوسائط الحصول على أقفال التنشيط عند تسجيل الصوت أو تشغيله. يتمّ إسناد عمليات قفل التنشيط إلى تطبيق الاتصال.
أسماء عمليات قفل التنشيط
تكتسب واجهات برمجة التطبيقات الخاصة بالوسائط أقفال تنشيط بأسماء مختلفة تبدأ بـ Audio:
-
AudioBitPerfect: يُستخدَم لتشغيل الصوت عبر USB بدون فقدان جودته. -
AudioDirectOut: تُستخدَم لتشغيل الصوت بدون فقدان جودته على التلفزيون أو جهاز خاص. AudioDup: يُستخدَم لتشغيل الإشعارات أثناء الاتصال باستخدام البلوتوث أو كابل USB.AudioIn: يُستخدَم لتسجيل الصوت في وضع كاميرا الفيديو عندما يكون الميكروفون نشطًا.-
AudioMix: يُستخدَم لتشغيل الصوت على جهاز مشترك. AudioOffload: يُستخدم لتشغيل الموسيقى فقط لفترة طويلة، وذلك للتطبيقات التي تتيح هذا الوضع.AudioSpatial: يُستخدم لتشغيل فيلم أو مقطع موسيقي متعدد القنوات على الأجهزة التي تتوافق مع الصوت المكاني.AudioUnknown: تُستخدَم عندما لا تنطبق الحالات الأخرى.MmapCapture: يُستخدَم لتسجيل الصوت بزمن استجابة منخفض.-
MmapPlayback: تُستخدَم لتشغيل المحتوى بزمن استجابة منخفض، مثلاً في الألعاب أو تطبيقات الصوت الاحترافية.
الاقتراح
ننصحك باتّباع الممارسات التالية:
- لا تحدّد أسماء أقفال التنشيط التي تبدأ بـ
Audio. - إذا كنت تستخدم واجهات برمجة التطبيقات الخاصة بالوسائط، لن تحتاج إلى الحصول على أقفال التنشيط مباشرةً، بل يمكنك الاعتماد على واجهات برمجة التطبيقات للحصول على أقفال التنشيط اللازمة.
- عند استخدام واجهات برمجة تطبيقات الوسائط، يجب إنهاء جلسة الوسائط والخدمة المرتبطة بها التي تعمل في المقدّمة عندما لا تعود بحاجة إليها.
البلوتوث
تحتفظ واجهات برمجة تطبيقات البلوتوث الخاصة بالمنصة بشكل أساسي بأقفال التنشيط في النواة أثناء تنفيذ إجراءات البلوتوث، ولا يمكن ربطها بالتطبيق.
الاقتراح
- استخدِم ميزة إقران الأجهزة المساعدة لإقران أجهزة البلوتوث وتجنُّب الحصول على قفل تنبيه يدوي أثناء عملية الإقران.
- راجِع إرشادات التواصل في الخلفية للتعرّف على كيفية إجراء عملية التواصل عبر البلوتوث في الخلفية.
- غالبًا ما يكون استخدام
WorkManagerكافيًا إذا لم يكن هناك أي تأثير على المستخدم بسبب تأخُّر التواصل. إذا تبيّن أنّ قفل التنشيط اليدوي ضروري، يجب عدم إبقاء قفل التنشيط نشطًا إلا لمدة نشاط البلوتوث أو معالجة بيانات النشاط.
أدوات الاستشعار في الجهاز
تتوفّر عدة طرق لتتبُّع بيانات أجهزة الاستشعار في الجهاز، مثل عدد الخطوات أو بيانات مقياس التسارع أو الجيروسكوب.
على Wear OS، استخدِم خدمات Wear Health للحصول على بيانات الجهاز، مثل الارتفاع ومعدّل نبضات القلب والمسافة المقطوعة.
إذا كانت البيانات يتم جمعها من خلال تطبيقات أخرى، يمكنك استخدام Health Connect مع WorkManager لاسترداد البيانات بشكل دوري.
في سيناريوهات مثل تتبُّع الفرق في عدد الخطوات أو المسافة المقطوعة، يمكنك استخدام Recording API على الأجهزة الجوّالة مع WorkManager لاسترداد البيانات بشكل دوري. للوصول إلى بيانات الخطوات السابقة (مثل إجمالي عدد الخطوات اليومية أو الخطوات التي تمّت خلال آخر 6 ساعات)، يتيح تطبيق Health Connect أيضًا تتبُّع الخطوات على الجهاز للأجهزة التي تعمل بالإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث.
في حالات معيّنة، قد يكون من الضروري تتبُّع بيانات مستشعر الجهاز المخصّص باستخدام
SensorManager. لا تحصل SensorManager على عمليات قفل تنشيط نيابةً عن التطبيق، إلا إذا كان المستشعر مستشعر تنبيه، ويمكن تحديد ذلك باستخدام واجهة برمجة التطبيقات isWakeUpSensor.
الاقتراح
يمكن أن يؤدي استخدام أجهزة الاستشعار للتسجيل بمعدلات أخذ عينات عالية إلى استنزاف البطارية بشكل كبير، وفي ما يلي اقتراحات لتقليل استنزاف البطارية واستخدام عمليات قفل التنشيط:
- في حال تتبُّع عدد الخطوات أو المسافة المقطوعة، استخدِم Recording API لتسجيل البيانات بطريقة فعّالة من حيث استهلاك البطارية. بالنسبة إلى الأجهزة التي تعمل بالإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث، ننصحك باستخدام Health Connect للوصول إلى بيانات الجهاز السابقة وإجمالي عدد الخطوات.
- لاستخدام ميزة التتبُّع السلبي لأجهزة الاستشعار على Wear OS، استخدِم خدمات Wear Health Services لتحسين استخدام البطارية.
- عند تسجيل جهاز استشعار باستخدام
SensorManager، حدِّدmaxReportLatencyUsتزيد مدته عن 30 ثانية لاستخدام منطق تجميع بيانات أجهزة الاستشعار وتقليل عدد المقاطعات التي يتلقّاها التطبيق. عندما يتم تنبيه الجهاز لاحقًا بواسطة مشغّل آخر، مثل تفاعل المستخدم أو استرداد الموقع الجغرافي أو مهمة مُجدوَلة، سيرسل النظام بيانات أجهزة الاستشعار المخزَّنة مؤقتًا على الفور. - إذا كان تطبيقك يتطلّب بيانات الموقع الجغرافي وبيانات أجهزة الاستشعار، عليك مزامنة عملية استرجاع ومعالجة الأحداث. من خلال دمج قراءات المستشعر في قفل التنشيط الموجز الذي يحتفظ به النظام لتلقّي تحديثات الموقع الجغرافي، يمكنك تجنُّب الحاجة إلى قفل تنشيط لإبقاء وحدة المعالجة المركزية نشطة. استخدِم عاملًا أو قفل تنبيه قصير المدة للتعامل مع تحميل هذه البيانات المجمّعة ومعالجتها.
خدمة المراسلة عبر السحابة الإلكترونية من Firebase (FCM)
يتم الحصول على قفل التنشيط أثناء تسليم بث رسالة
من "المراسلة عبر السحابة الإلكترونية من Firebase" (FCM) إلى التطبيق.
ويتم إلغاء قفل التنشيط بعد انتهاء تنفيذ طريقة
onMessageReceived() لبث رسالة FCM.
أسماء عمليات قفل التنشيط
عند تلقّي رسالة من خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" على الجهاز، يتم الاحتفاظ بقفل تنشيط قصير بالاسم GOOGLE_C2DM، أما على الإصدار 16 من نظام التشغيل Android والإصدارات الأحدث، فيكون اسم قفل التنشيط هو GCM_MESSAGE.
الاقتراح
ننصحك باتّباع الممارسات التالية لتحسين سلوك FCM:
- تحسين معدّل تكرار إرسال الرسائل عبر خدمة "المراسلة عبر السحابة الإلكترونية من Firebase"
- لا تستخدِم رسائل FCM ذات الأولوية العالية إلا إذا كانت الرسالة بحاجة إلى التسليم الفوري.
- اجعل طريقة
onMessageReceived()تكتمل بأسرع ما يمكن أو جدوِل عاملًا لمواصلة المهمة إذا كانت هناك حاجة إلى معالجة إضافية. لمزيد من المعلومات، يُرجى الاطّلاع على إرشادات Firebase.
JobScheduler
تكتسب مهام JobScheduler عمليات قفل التنشيط أثناء تنفيذ المهام في الخلفية. يتم تحديد التطبيق المسؤول عن عمليات الإبقاء على الشاشة نشطة من خلال التطبيق الذي أنشأ العمليات.
أسماء عمليات قفل التنشيط
تعتمد أسماء أقفال التنشيط التي يكتسبها JobScheduler على إصدار نظام Android الذي يتم تشغيلها عليه، وعلى الغرض من المهمة.
العناصر المحاطة بأقواس معقوفة هي متغيرات. على سبيل المثال، "<package_name>" هو اسم حزمة تطبيقك، وليس النص الحرفي <package name>. ومع ذلك، فإنّ *job* هي تسلسل الأحرف
*job*، مع علامات النجمة، ولا يتم استخدام علامات النجمة كأحرف بدل.
الإصدار 15 من نظام التشغيل Android والإصدارات الأقدم
تنشئ المهام التي يبدأها المستخدم أقفال تنبيه بأسماء تتّبع النمط التالي:
*job*u/@<name_space>@/<package_name>/<classname>
تستخدم الوظائف الأخرى هذا النمط:
*job*/@<name_space>@/<package_name>/<classname>
الإصدار 16.1 من نظام التشغيل Android والإصدارات الأحدث
تنشئ المهام التي يبدأها المستخدم أقفال تنبيه بأسماء تتّبع النمط التالي:
*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.
على الأجهزة التي تعمل بالإصدار 15 من نظام التشغيل Android أو الإصدارات الأقدم، سيتم تسمية قفل التنشيط على النحو التالي:
*job*/@backup@/com.example.app/com.backup.BackupFileService
على الأجهزة التي تعمل بالإصدار 16.1 من نظام التشغيل Android أو إصدار أحدث، سيكون اسم قفل التنشيط كما يلي:
*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService
الاقتراح
- لا تحصل على قفل تنبيه يدوي لحالات الاستخدام التي يبدأ فيها المستخدم عملية التنزيل أو التحميل. يمكنك بدلاً من ذلك استخدام واجهة برمجة التطبيقات لنقل البيانات التي بدأها المستخدم (UIDT). هذا هو المسار المخصّص لمهام نقل البيانات الطويلة الأمد التي يبدأها المستخدم.
- إذا رصدت عمليات قفل تنشيط أنشأها JobScheduler مع ارتفاع معدّل استخدام قفل التنشيط، قد يكون ذلك بسبب إعداد مهمتك بشكل خاطئ بحيث لا تكتمل في سيناريوهات معيّنة. ننصحك بتحليل أسباب توقّف المهمة، خاصةً إذا لاحظت تكرارًا كبيرًا للخطأ
STOP_REASON_TIMEOUT. - راجِع استخدامك لمهام JobScheduler. على وجه الخصوص، اتّبِع إرشاداتنا بشأن تحسين استخدام البطارية لواجهات برمجة التطبيقات الخاصة بجدولة المهام.
الموقع الجغرافي
تستخدم LocationManager وFusedLocationProviderClient أقفال التنشيط للحصول على الموقع الجغرافي للجهاز وتقديمه. يتم تحديد التطبيق الذي استدعى واجهات برمجة التطبيقات هذه على أنّه المسؤول عن عمليات الإبقاء على الشاشة نشطة.
أسماء عمليات قفل التنشيط
تستخدم خدمات الموقع الجغرافي الأسماء التالية:
CollectionLib-SigCollectorNetworkLocationLocatorNetworkLocationScannerNlpCollectorWakeLockNlpWakeLock*location*
الاقتراح
- راجِع إرشاداتنا حول تحسين استخدام الموقع الجغرافي. ننصحك بتنفيذ عمليات المهلة أو الاستفادة من تجميع طلبات تحديد الموقع الجغرافي أو استخدام إشعارات الموقع الجغرافي غير النشطة.
- تجنَّب الحصول على قفل تنبيه منفصل ومستمر لتخزين بيانات الموقع الجغرافي مؤقتًا،
لأنّ ذلك غير ضروري ويجب إزالته.
عند طلب تحديثات الموقع الجغرافي باستخدام واجهات برمجة التطبيقات
FusedLocationProviderأوLocationManager، سيؤدي النظام تلقائيًا إلى تنشيط الجهاز أثناء معاودة الاتصال بحدث الموقع الجغرافي. بدلاً من ذلك، خزِّن أحداث الموقع الجغرافي في الذاكرة أو وحدة التخزين، وعالِج أحداث الموقع الجغرافي بشكل دوري باستخدامWorkManager.
المراسلة عن بُعد
يناقش هذا القسم سيناريوهات تتضمّن المراسلة عن بُعد حيث قد تحتاج التطبيقات إلى الحفاظ على الاتصالات أو الاستجابة للأحداث من الأجهزة الأخرى، ما قد يؤثر في استخدام قفل التنشيط. تشمل حالات الاستخدام الشائعة ما يلي:
- التطبيقات المصاحبة التي تراقب الفيديو أو الصوت والتي تحتاج إلى مراقبة الأحداث التي تحدث على جهاز خارجي متصل عبر شبكة محلية
- تطبيقات المراسلة التي تحافظ على اتصال مقبس الشبكة مع إصدار سطح المكتب
معظم عمليات التنشيط في سيناريوهات المراسلة عن بُعد هذه هي عمليات تنشيط قفل التنشيط في النواة. بما أنّه لا يتم تحديد مصدر أقفال التنشيط في النواة على أنّه التطبيق، لا تتوفّر أسماء أقفال تنشيط مرتبطة لعرضها هنا.
الاقتراح
- إذا كان من الممكن معالجة أحداث الشبكة من جهة الخادم، استخدِم FCM لتلقّي المعلومات على الجهاز. يمكنك اختيار جدولة عامل سريع إذا كانت هناك حاجة إلى معالجة إضافية لبيانات FCM.
- إذا كان يجب معالجة الأحداث على جهة العميل باستخدام اتصال socket، لن تحتاج إلى قفل تنبيه للاستماع إلى مقاطعات الأحداث. عندما تصل حِزم البيانات إلى جهاز استقبال Wi-Fi أو شبكة الجوّال، يؤدي جهاز استقبال الراديو إلى تشغيل مقاطعة في شكل قفل تنبيه في النواة. يمكنك بعد ذلك اختيار جدولة عامل أو الحصول على قفل تنبيه لمعالجة البيانات.
- على سبيل المثال، إذا كنت تستخدم
ktor-networkللاستماع إلى حِزم البيانات على مقبس شبكة، يجب ألا تحصل على قفل تنبيه إلا عند تسليم الحِزم إلى العميل.
WorkManager
تكتسب المهام في WorkManager عمليات قفل التنشيط أثناء تنفيذ المهام في الخلفية. يتم تحديد التطبيق المسؤول عن عمليات الإبقاء على الشاشة نشطة من خلال التطبيق الذي أنشأ العمليات.
أسماء عمليات قفل التنشيط
تعتمد أسماء أقفال التنشيط التي يحصل عليها WorkManager على إصدار نظام Android الذي يتم تشغيلها عليه.
الإصدار 15 من نظام التشغيل Android والإصدارات الأقدم
تنشئ مهام WorkManager أقفال تنشيط بأسماء تتّبع النمط التالي:
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
الإصدار 16.1 من نظام التشغيل Android والإصدارات الأحدث
تنشئ المهام المعجَّلة أقفال تنبيه تحمل أسماءً تتّبع النمط التالي:
*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.
على الأجهزة التي تعمل بالإصدار 15 من نظام التشغيل Android أو الإصدارات الأقدم، سيتم تسمية قفل التنشيط على النحو التالي:
*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
على الأجهزة التي تعمل بالإصدار 16 من نظام التشغيل Android أو الإصدارات الأحدث وتستخدم WorkManager 2.10.0+،
سيتم تسمية قفل التنشيط على النحو التالي:
*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
الاقتراح
- يمكنك ترقية إصدار WorkManager إلى أحدث إصدار ثابت لجعل علامات قفل التنشيط أكثر تفصيلاً على الإصدار 16.1 من نظام التشغيل Android أو الإصدارات الأحدث.
- راجِع استخدامك لبرامج WorkManager. وعليك بشكل خاص التأكّد من أنّها تتّبع إرشاداتنا بشأن تحسين استخدام البطارية لواجهات برمجة التطبيقات الخاصة بجدولة المهام.
لجعل علامات قفل التنشيط أكثر تفصيلاً على الإصدار 16.1 من Android أو الإصدارات الأحدث، استخدِم طريقة
setTraceTagفي العامل لإضافة المزيد من معلومات تصحيح الأخطاء، مثل الفئة التي جدولت العامل. - إذا رصدت عمليات قفل تنشيط أنشأتها WorkManager مع ارتفاع معدّل استخدام قفل التنشيط، قد يكون ذلك بسبب إعدادات غير صحيحة للعامل بحيث لا يكتمل في سيناريوهات معيّنة. ننصحك بتحليل أسباب توقّف العامل، خاصةً إذا لاحظت تكرارًا كبيرًا للخطأ
STOP_REASON_TIMEOUT. - بالإضافة إلى تسجيل أسباب توقّف العاملين، يُرجى الرجوع إلى مستنداتنا حول تصحيح أخطاء العاملين. ننصحك أيضًا بجمع عمليات تتبُّع النظام وتحليلها لمعرفة وقت الحصول على أقفال التنشيط ووقت إيقافها.
_UNKNOWN
إذا رصدت أدوات تصحيح الأخطاء أنّ اسم قفل التنشيط يتضمّن معلومات تحديد الهوية الشخصية، لن تعرض اسم قفل التنشيط الفعلي. بدلاً من ذلك، يتم تصنيف قفل التنشيط على أنّه _UNKNOWN. على سبيل المثال، قد تفعل الأدوات ذلك إذا كان اسم قفل التنشيط يتضمّن عنوان بريد إلكتروني.
الاقتراح
اتّبِع أفضل الممارسات لتسمية أقفال التنشيط، وتجنَّب استخدام معلومات تحديد الهوية الشخصية في اسم قفل التنشيط. إذا عثرت على عملية قفل تنشيط باسم _UNKNOWN منسوبة إلى تطبيقك، حاوِل تحديد عملية قفل التنشيط هذه ومنحها اسمًا مختلفًا.