تحديد حالات استخدام قفل التنشيط وتحسينها

يساعدك هذا المستند في تحديد حالات استخدام عمليات قفل التنشيط وتحسينها في تطبيقك، بالإضافة إلى توضيح ما إذا كانت هناك عمليات قفل تنشيط تم الحصول عليها من خلال مكتبات أخرى أو واجهات برمجة تطبيقات النظام المرتبطة بحالة الاستخدام هذه. وبما أنّ عمليات قفل التنشيط هذه ترجع إلى تطبيقك، قد يكون من الصعب تحديد مصدر عملية قفل التنشيط التي تسبّب مشاكل. يمكن أن يؤدي الاستخدام غير الصحيح لواجهات برمجة التطبيقات إلى وضع علامة على تطبيقك بسبب الاستخدام المفرط لعمليات قفل التنشيط، حتى إذا لم تكن تحصل على عمليات قفل التنشيط بشكل صريح.

تتضمّن هذه الوثيقة بعض أسماء أقفال التنشيط الشائعة التي قد تصادفك عند استخدام أدوات تصحيح أخطاء أقفال التنشيط أو في التقارير الواردة من المؤشرات الحيوية. يمكن أن تكون هذه الأسماء مأخوذة من مكتبة أو واجهة برمجة تطبيقات للنظام، أو قد تكون مشفّرة. باستخدام أدوات تصحيح الأخطاء لتحديد عمليات قفل التنشيط التي لا تعمل بشكل صحيح، ثم البحث عن اسم عملية قفل التنشيط في هذا المستند، يمكنك تحديد واجهة برمجة التطبيقات التي قد تتسبّب في المشكلة والعثور على اقتراحات حول كيفية تحسين استخدامها.

يوضّح هذا المستند حالات الاستخدام الشائعة للحصول على أقفال التنشيط، مع تفصيل أسماء أقفال التنشيط التي تستخدمها واجهات برمجة التطبيقات والمكتبات المختلفة، كما يقدّم اقتراحات وأفضل الممارسات لتحسين استخدام أقفال التنشيط وتقليله.

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 من أجل تحسين استخدام البطارية.
  • عند تسجيل جهاز استشعار باستخدام 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>
‫Android 16 QPR2 والإصدارات الأحدث

تنشئ المهام التي يبدأها المستخدم أقفال تنبيه بأسماء تتّبع النمط التالي:

*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

على الأجهزة التي تعمل بالإصدار Android 16 QPR2 أو الإصدارات الأحدث، سيتم تسمية قفل التنشيط على النحو التالي:

*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService

الاقتراح

  • لا تحصل على قفل تنشيط يدوي لحالات الاستخدام التي يبدأ فيها المستخدم عملية التنزيل أو التحميل. يمكنك بدلاً من ذلك استخدام واجهة برمجة التطبيقات لنقل البيانات التي بدأها المستخدم (UIDT). هذا هو المسار المخصّص لمهام نقل البيانات الطويلة الأمد التي يبدأها المستخدم.
  • إذا رصدت عمليات قفل تنشيط أنشأها JobScheduler مع ارتفاع معدّل استخدام قفل التنشيط، قد يكون ذلك بسبب إعداد مهمتك بشكل خاطئ بحيث لا تكتمل في سيناريوهات معيّنة. ننصحك بتحليل أسباب توقّف المهمة، خاصةً إذا لاحظت تكرارًا كبيرًا للخطأ STOP_REASON_TIMEOUT.
  • راجِع استخدامك لمهام JobScheduler. على وجه الخصوص، اتّبِع إرشاداتنا حول تحسين استخدام البطارية لواجهات برمجة التطبيقات الخاصة بجدولة المهام.

الموقع الجغرافي

تستخدم LocationManager وFusedLocationProviderClient أقفال التنشيط للحصول على الموقع الجغرافي للجهاز وتقديمه. يتم تحديد مصدر عمليات التنشيط على أنّها التطبيق الذي طلب استخدام واجهات برمجة التطبيقات هذه.

أسماء عمليات قفل التنشيط

تستخدم خدمات الموقع الجغرافي الأسماء التالية:

  • CollectionLib-SigCollector
  • NetworkLocationLocator
  • NetworkLocationScanner
  • NlpCollectorWakeLock
  • NlpWakeLock
  • *location*

الاقتراح

  • راجِع إرشاداتنا حول تحسين استخدام الموقع الجغرافي. ننصحك بتحديد مهلات زمنية أو الاستفادة من تجميع طلبات تحديد الموقع الجغرافي أو استخدام إشعارات الموقع الجغرافي غير النشطة.
  • تجنَّب الحصول على قفل تنشيط منفصل ومستمر لتخزين بيانات الموقع الجغرافي مؤقتًا، لأنّ ذلك غير ضروري ويجب إزالته. عند طلب تحديثات الموقع الجغرافي باستخدام واجهات برمجة التطبيقات FusedLocationProvider أو LocationManager، سيؤدي النظام تلقائيًا إلى تنشيط الجهاز أثناء معاودة الاتصال بحدث الموقع الجغرافي. بدلاً من ذلك، خزِّن أحداث الموقع الجغرافي في الذاكرة أو وحدة التخزين، وعالِج أحداث الموقع الجغرافي بشكل دوري باستخدام WorkManager.

المراسلة عن بُعد

يناقش هذا القسم سيناريوهات تتضمّن المراسلة عن بُعد حيث قد تحتاج التطبيقات إلى الحفاظ على الاتصالات أو الاستجابة للأحداث من الأجهزة الأخرى، ما قد يؤثّر في استخدام قفل التنشيط. تشمل حالات الاستخدام الشائعة ما يلي:

  • تطبيقات مصاحبة لمراقبة الفيديو أو الصوت تحتاج إلى رصد الأحداث التي تحدث على جهاز خارجي متصل عبر شبكة محلية
  • تطبيقات المراسلة التي تحافظ على اتصال مقبس الشبكة مع إصدار سطح المكتب

معظم عمليات التنشيط في سيناريوهات المراسلة عن بُعد هذه هي عمليات تنشيط قفل التنشيط في النواة. بما أنّه لا يتم تحديد مصدر أقفال التنشيط على مستوى النواة للتطبيق، لا تتوفّر أسماء أقفال تنشيط مرتبطة لعرضها هنا.

الاقتراح

  • إذا كان من الممكن معالجة أحداث الشبكة من جهة الخادم، استخدِم FCM لتلقّي المعلومات على الجهاز. يمكنك اختيار جدولة عامل سريع إذا كانت هناك حاجة إلى معالجة إضافية لبيانات FCM.
  • إذا كان يجب معالجة الأحداث من جهة العميل باستخدام اتصال مقبس، لن يكون هناك حاجة إلى قفل التنشيط للاستماع إلى مقاطعات الأحداث. عندما تصل حِزم البيانات إلى جهاز استقبال Wi-Fi أو شبكة الجوّال، يؤدي جهاز الاستقبال إلى إطلاق مقاطعة في شكل قفل تنشيط في النواة. يمكنك بعد ذلك اختيار جدولة منفِّذ أو الحصول على قفل التنشيط لمعالجة البيانات.
  • على سبيل المثال، إذا كنت تستخدم ktor-network لتتبّع حِزم البيانات على مقبس شبكة، عليك الحصول على قفل التنشيط فقط عند تسليم الحِزم إلى البرنامج.

WorkManager

تكتسب مهام WorkManager أقفال تنشيط أثناء تنفيذ المهام في الخلفية. يتم إرجاع عمليات قفل التنشيط إلى التطبيق الذي أنشأ العاملين.

أسماء عمليات قفل التنشيط

تعتمد أسماء عمليات قفل التنشيط التي يحصل عليها WorkManager على إصدار نظام Android الذي يتم تشغيلها عليه.

الإصدار 15 من نظام التشغيل Android والإصدارات الأقدم

تنشئ مهام WorkManager أقفال تنشيط بأسماء تتّبع النمط التالي:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
‫Android 16 QPR2 والإصدارات الأحدث

تنشئ المهام المعجَّلة أقفال تنبيه تحمل أسماءً تتّبع النمط التالي:

*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

على الأجهزة التي تعمل بالإصدار Android 16 QPR2 أو الإصدارات الأحدث وتستخدم WorkManager 2.10.0+، سيكون اسم قفل التنشيط كما يلي:

*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

الاقتراح

  • يجب ترقية إصدار WorkManager إلى أحدث إصدار ثابت لجعل علامات قفل التنشيط أكثر تفصيلاً على Android 16 QPR2 أو الإصدارات الأحدث.
  • راجِع استخدامك لبرامج WorkManager. وعليك بشكل خاص التأكّد من أنّها تتّبع إرشاداتنا بشأن تحسين استخدام البطارية لواجهات برمجة التطبيقات الخاصة بجدولة المهام. لجعل علامات قفل التنشيط أكثر تفصيلاً على الإصدار Android 16 QPR2 أو الإصدارات الأحدث، استخدِم طريقة setTraceTag في المنفِّذ لإضافة المزيد من معلومات تصحيح الأخطاء، مثل الفئة التي جدولت المنفِّذ.
  • إذا رصدت عمليات قفل تنشيط أنشأها WorkManager مع ارتفاع معدّل استخدام قفل التنشيط، قد يكون ذلك بسبب إعدادات غير صحيحة للمنفِّذ بحيث لا يكتمل في سيناريوهات معيّنة. ننصحك بتحليل أسباب توقّف المنفِّذ، خاصةً إذا لاحظت تكرارًا كبيرًا للخطأ STOP_REASON_TIMEOUT.
  • بالإضافة إلى تسجيل أسباب توقّف المنفّذين، يُرجى الرجوع إلى مستنداتنا حول تصحيح أخطاء المنفّذين. ننصحك أيضًا بجمع عمليات تتبُّع النظام وتحليلها لمعرفة وقت الحصول على أقفال التنشيط ووقت إيقافها.

_UNKNOWN

إذا رصدت أدوات تصحيح الأخطاء أنّ اسم قفل التنشيط يتضمّن معلومات تكشف الهوية الشخصية، لن تعرض اسم قفل التنشيط الفعلي. بدلاً من ذلك، يتم تصنيف قفل التنشيط على أنّه _UNKNOWN. على سبيل المثال، قد تفعل الأدوات ذلك إذا كان اسم قفل التنشيط يتضمّن عنوان بريد إلكتروني.

الاقتراح

اتّبِع أفضل الممارسات لتسمية أقفال التنشيط، وتجنَّب استخدام معلومات تكشف الهوية الشخصية في اسم قفل التنشيط. إذا عثرت على عملية قفل تنشيط باسم _UNKNOWN منسوبة إلى تطبيقك، حاوِل تحديد عملية قفل التنشيط هذه ومنحها اسمًا مختلفًا.