أخبار المنتجات

تحسين أداء بطارية تطبيقك باستخدام مقياس عمليات قفل التنشيط في "مؤشرات Android الحيوية"

قراءة لمدة 7 دقائق
Alice Yuan
مهندسة علاقات المطوّرين

يُعدّ عمر البطارية من الجوانب المهمة لتجربة المستخدم، وتلعب أقفال التنشيط دورًا رئيسيًا في ذلك. هل تستخدمها بشكل مفرط؟ في مشاركة المدونة هذه، سنتناول مفهوم أقفال التنشيط، وأفضل الممارسات لاستخدامها، وكيفية فهم سلوك تطبيقك بشكل أفضل باستخدام مقياس Play Console.

الاستخدام المفرط لعمليات قفل التنشيط الجزئي في "مؤشرات Android الحيوية"

تتتبّع أداة Play Console الآن استنزاف البطارية، مع التركيز على الاستخدام المفرط لعمليات قفل التنشيط الجزئي كمؤشر أداء رئيسي.

تزيد هذه الميزة من أهمية كفاءة البطارية إلى جانب مؤشرات ثبات المقاييس الأساسية الحالية: الأعطال وأخطاء ANR الزائدة عن الحد التي لاحظها المستخدم. وضعنا معيارًا لتحديد الأداء السيئ من حيث عمليات قفل التنشيط الزائدة عن الحد. اعتبارًا من 1 مارس 2026، إذا لم يستوفِ المحتوى هذا الحد الأدنى للجودة، قد نستبعده من مساحات العرض البارزة، مثل الاقتراحات. في بعض الحالات، قد نعرض تحذيرًا في بطاقة بيانات المتجر لإعلام المستخدمين بأنّ تطبيقك قد يؤدي إلى استنزاف البطارية بشكل مفرط.

warning.png

التحذير من قفل التنشيط المفرط في نظرة عامة على مؤشرات Android الحيوية.

بالنسبة إلى الأجهزة الجوّالة، ينطبق مقياس "مؤشرات Android الحيوية" على عمليات قفل التنشيط غير المعفاة التي يتم الحصول عليها عندما تكون الشاشة مطفأة ويكون التطبيق مُشغَّلاً في الخلفية أو يشغّل خدمة تعمل في المقدّمة. تعتبر "مؤشرات Android الحيوية" استخدام عمليات قفل التنشيط الجزئي بشكل مفرط في الحالات التالية:

  • يتم الاحتفاظ بأقفال التنشيط لمدة ساعتين على الأقل خلال فترة 24 ساعة.
  • يؤثّر في أكثر من% 5 من جلسات تطبيقك، وذلك على مدار 28 يومًا.

يتم استثناء عمليات قفل التنشيط التي تم إنشاؤها بواسطة واجهات برمجة التطبيقات التي يبدأها المستخدمون في الصوت والموقع الجغرافي وJobScheduler من عملية احتساب عمليات قفل التنشيط.

التعرّف على عمليات قفل التنشيط

قفل التنشيط هو آلية تتيح لأحد التطبيقات إبقاء وحدة المعالجة المركزية (CPU) للجهاز قيد التشغيل حتى عندما لا يتفاعل المستخدم معه بشكل نشط. 

يُبقي قفل التنشيط الجزئي وحدة المعالجة المركزية (CPU) قيد التشغيل حتى إذا كانت الشاشة مطفأة، ما يمنع وحدة المعالجة المركزية من الدخول في حالة "تعليق" منخفضة الطاقة. يُبقي قفل التنشيط الكامل الشاشة ووحدة المعالجة المركزية قيد التشغيل.

تتوفّر طريقتان للحصول على عمليات قفل التفعيل الجزئية:

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

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

أفضل الممارسات لاستخدام Wake Lock

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

ضَع في اعتبارك هذه الأسئلة الأربعة المهمة.


1. هل فكّرت في خيارات بديلة لقفل التنشيط؟

قبل التفكير في الحصول على قفل تنبيه جزئي يدوي، اتّبِع مخطط اتخاذ القرار التالي:

wakelock.png

مخطّط انسيابي لتحديد وقت الحصول على قفل التنشيط يدويًا

  1. هل يجب أن تبقى الشاشة قيد التشغيل؟
  2. هل يشغّل التطبيق خدمة تعمل في المقدّمة؟
    • لا، لست بحاجة إلى الحصول على قفل التنشيط يدويًا.
  3. هل يؤدي تعليق الجهاز إلى الإضرار بتجربة المستخدم؟
    • لا: على سبيل المثال، لا يتطلّب تعديل إشعار بعد تنشيط الجهاز قفل تنشيط.
    • نعم: إذا كان من الضروري منع الجهاز من التعليق، مثل التواصل المستمر مع جهاز خارجي، يمكنك المتابعة.
  4. هل هناك واجهة برمجة تطبيقات حالية تبقي الجهاز نشطًا نيابةً عنك؟
  5. إذا أجبت عن كل هذه الأسئلة وتبيّن لك أنّه لا يوجد بديل، عليك المتابعة والحصول على قفل التنشيط يدويًا.

2. هل تسمّي قفل التنشيط بشكل صحيح؟

عند الحصول على أقفال التنشيط يدويًا، من المهم تسميتها بشكل صحيح لتسهيل عملية تصحيح الأخطاء:

  • لا تُدرِج أي معلومات تكشف الهوية الشخصية (PII) في الاسم، مثل عناوين البريد الإلكتروني. في حال رصد معلومات تكشف الهوية الشخصية، يتم تسجيل قفل التنشيط على أنّه _UNKNOWN، ما يعيق عملية تصحيح الأخطاء.
  • لا تسمِّ قفل التنشيط آليًا باستخدام أسماء الفئات أو الطرق، لأنّ هذه الأسماء يمكن أن يتم تشويشها باستخدام أدوات مثل Proguard. بدلاً من ذلك، استخدِم سلسلة مبرمَجة.
  • لا تُضِف عدّادات أو معرّفات فريدة إلى علامات قفل التنشيط. يجب استخدام العلامة نفسها في كل مرة يتم فيها تشغيل قفل التنشيط للسماح للنظام بتجميع بيانات الاستخدام حسب الاسم، ما يسهّل رصد السلوك غير الطبيعي.

3. هل يتم دائمًا إيقاف قفل التنشيط الذي تم الحصول عليه؟

إذا كنت تحصل على قفل تنشيط يدويًا، تأكَّد من تنفيذ عملية إيقاف قفل التنشيط دائمًا. قد يؤدي عدم إيقاف قفل التنشيط إلى استنزاف البطارية بشكل كبير. 

على سبيل المثال، إذا تم طرح استثناء لم يتم رصده أثناء processingWork()، قد لا يتم تنفيذ استدعاء release() أبدًا. بدلاً من ذلك، يمكنك استخدام كتلة try-finally لضمان تحرير قفل التنشيط، حتى إذا حدث استثناء.

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

fun processingWork() {
    wakeLock.apply {
        try {
            acquire(60 * 10 * 1000) // timeout after 10 minutes
            doTheWork()
        } finally {
            release()
        }
    }
}

‫4. هل يمكن تقليل معدّل التنشيط؟

بالنسبة إلى طلبات البيانات الدورية، يُعدّ تقليل عدد مرات تنبيه تطبيقك للجهاز أمرًا أساسيًا لتوفير استهلاك البطارية. في ما يلي بعض الأمثلة على تقليل عدد مرات التنشيط:

  • WorkManager: زيادة الفاصل الزمني الدوري في PeriodicWorkRequests
  • SensorManager: يمكنك الاستفادة من ميزة تجميع البيانات عن طريق تحديد maxReportLatencyMs عند تسجيل أداة معالجة الحدث.
  • موفِّر الموقع الجغرافي المدمج:
    • يمكنك تقليل عدد مرات استرجاع الموقع الجغرافي باستخدام getLastLocation للحصول على أحدث موقع جغرافي مخزّن مؤقتًا.
    • استخدِم setPriority(PRIORITY_PASSIVE) للحصول على طريقة تعديل أقل استهلاكًا للبطارية.
    • يمكنك أيضًا الاستفادة من آلية تجميع المواقع الجغرافية عن طريق ضبط الحدّ الأدنى لفاصل التعديل باستخدام setMinUpdateIntervalMillis.

يمكنك الاطّلاع على مزيد من التفاصيل في مستند أفضل ممارسات استخدام أقفال التنشيط.

تصحيح أخطاء الاستخدام المفرط لعمليات قفل التنشيط

وحتى مع أفضل النوايا، يمكن أن يحدث استخدام مفرط لقفل التنشيط. إذا تم الإبلاغ عن تطبيقك في Play Console، إليك كيفية تصحيح أخطائه:

تحديد الهوية الأولي باستخدام Play Console

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

breakdowns2.png

تم التمرير للأسفل في لوحة بيانات "عمليات قفل التنشيط الجزئي بشكل مفرط" ضمن "مؤشرات Android الحيوية" إلى قسم "التصنيفات" لعرض علامات عمليات قفل التنشيط بشكل مفرط.

تصحيح أخطاء عمليات قفل التنشيط الزائدة التي تحتفظ بها العمليات/المهام

يمكنك تحديد أقفال التنشيط التي يحتفظ بها العامل باستخدام اسم قفل التنشيط التالي:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

تتوفّر القائمة الكاملة بأشكال أسماء أقفال التنشيط التي يحتفظ بها العامل في المستندات. لتصحيح أخطاء عمليات قفل التنشيط هذه، يمكنك استخدام &quot;أداة فحص المهام في الخلفية&quot; لتصحيح الأخطاء محليًا، أو الاستفادة من getStopReason لتصحيح الأخطاء في بيئة التشغيل. 

أداة فحص المهام في الخلفية في "استوديو Android"

taskinspector.png


تصوير الشاشة لأداة فحص المهام في الخلفية، حيث تمكّنت من تحديد عامل باسم WeatherSyncWorker تمت إعادة محاولته بشكل متكرّر وتعذّر تنفيذه.

لتصحيح الأخطاء محليًا في WorkManager، استخدِم هذه الأداة على محاكي أو جهاز متصل (المستوى 26 من واجهة برمجة التطبيقات أو أعلى). تعرض هذه الأداة قائمة بالعاملين وحالاتهم (تم الانتهاء من التنفيذ، أو قيد التنفيذ، أو تمت إضافتهم إلى قائمة الانتظار)، ما يتيح لك فحص التفاصيل وفهم سلاسل العاملين. 

على سبيل المثال، يمكن أن يكشف عمّا إذا كان أحد العمال يفشل أو يعيد المحاولة بشكل متكرر بسبب بلوغ حدود النظام. 

يمكنك الاطّلاع على مستندات "أداة فحص المهام في الخلفية" للحصول على مزيد من التفاصيل.

WorkManager getStopReason

لتصحيح أخطاء العمال الذين يستخدمون عمليات قفل التنشيط بشكل مفرط في الحقل، استخدِم WorkInfo.getStopReason() في WorkManager 2.9.0 أو إصدار أحدث أو JobParameters.getStopReason() المتاح في حزمة تطوير البرامج (SDK) 31 أو إصدار أحدث في JobScheduler. 

تساعد واجهة برمجة التطبيقات هذه في تسجيل سبب توقّف العامل (مثل STOP_REASON_TIMEOUT أو STOP_REASON_QUOTA)، وتحديد المشاكل مثل انتهاء المهلة بشكل متكرر بسبب استنفاد مدة وقت التشغيل.

backgroundScope.launch {
    WorkManager.getInstance(context)
        .getWorkInfoByIdFlow(workRequest.id)
        .collect { workInfo ->
            logStopReason(workRequest.id, workInfo?.stopReason)
        }
}

يمكنك الاطّلاع على تحسين استخدام البطارية لواجهات برمجة التطبيقات الخاصة بجدولة المهام للحصول على مزيد من التفاصيل.

تصحيح الأخطاء في الأنواع الأخرى من عمليات قفل التنشيط الزائدة عن الحد

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

تجميع بيانات تتبُّع النظام

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

يمكنك تسجيل تتبُّع النظام باستخدام عدة طرق: 

powermgmt.png

فعِّل فئة Atrace‏ "power:PowerManagement" في واجهة مستخدم Perfetto ضِمن علامة التبويب "تطبيقات Android وخدماته". 

بغض النظر عن الطريقة التي تختارها، من المهم التأكّد من أنّك تجمع فئة Atrace‏ "power:PowerManagement" لتتمكّن من عرض مسارات حالة الجهاز. 

فحص واجهة مستخدم Perfetto وتحليل SQL

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

perfetto.png


ثبِّت المقاييس ضمن "حالة الجهاز"، مثل المقاييس "أهم تطبيق" و"حالة الشاشة" و"عمليات قفل التنشيط الطويلة" و"المهام" لتحديد شرائح عمليات قفل التنشيط الطويلة بشكل مرئي.

تعرض كلّ كتلة اسم الحدث ووقت بدئه ووقت انتهائه. في Perfetto، يُطلق على ذلك اسم "شريحة".

لتحليل قابل للتوسيع لعمليات تتبُّع متعددة، يمكنك استخدام تحليل SQL في Perfetto. يمكن أن يعثر استعلام SQL على جميع عمليات قفل التنشيط مرتّبة حسب المدة، ما يساعد في تحديد أهم العوامل المساهمة في الاستخدام المفرط.

في ما يلي مثال على طلب بحث يجمع كل علامات قفل التنشيط التي حدثت في تتبُّع نشاط النظام، ويتم ترتيبها حسب المدة الإجمالية:

SELECT slice.name as name, track.name as track_name,SUM(dur / 100000) as total_dur_ms
FROM slice
JOIN track ON slice.track_id = track.id
WHERE track.name = 'WakeLocks'GROUP BY slice.name, track.name
ORDER BY total_dur_ms DESC

استخدام ProfilingManager لجمع عمليات التتبُّع داخل الحقل

بالنسبة إلى المشاكل التي يصعب إعادة إنتاجها، ProfilingManager (التي تمت إضافتها في حزمة SDK 35) هي واجهة برمجة تطبيقات آلية تتيح للمطوّرين جمع عمليات تتبُّع النظام في المجال باستخدام مشغّلات البدء والانتهاء. ويوفّر هذا الخيار المزيد من التحكّم في نقاط بدء وإيقاف تشغيل جمع الملفات الشخصية، ويفرض الحدّ الأقصى لعدد مرات جمع البيانات على مستوى النظام لمنع التأثير في أداء الجهاز. 

راجِع مستندات ProfilingManager لمعرفة المزيد من الخطوات حول كيفية تنفيذ عملية جمع بيانات تتبُّع النظام في الحقل، بما في ذلك كيفية تسجيل عملية تتبُّع آليًا وتحليل بيانات تحديد الأداء واستخدام أوامر تصحيح الأخطاء المحلية.

ستبدو عمليات تتبُّع النظام التي يتم جمعها باستخدام ProfilingManager مشابهة لتلك التي يتم جمعها يدويًا، ولكن سيتم إخفاء عمليات النظام وعمليات التطبيقات الأخرى من عملية التتبُّع.

الخاتمة

إنّ مقياس "عمليات قفل التنشيط الجزئي الزائدة عن الحد" في "مؤشرات Android الحيوية" هو جزء صغير فقط من التزامنا المستمر بتقديم الدعم للمطوّرين في الحدّ من استنزاف البطارية وتحسين جودة التطبيقات. 

من خلال فهم أقفال التنشيط واستخدامها بشكل صحيح، يمكنك تحسين أداء تطبيقك من حيث استهلاك البطارية بشكل كبير. يُعدّ الاستفادة من واجهات برمجة التطبيقات البديلة والالتزام بأفضل ممارسات قفل التنشيط واستخدام أدوات تصحيح الأخطاء الفعّالة، مثل "أداة فحص المهام في الخلفية" وعمليات تتبُّع النظام وProfilingManager، من العوامل الأساسية لضمان نجاح تطبيقك على Google Play.

تأليف:

متابعة القراءة