طرق التنفيذ
أصبح بإمكانك الآن فرض معايير الجودة الفنية للبطارية: كيفية تحسين حالات الاستخدام الشائعة لعمليات قفل التنشيط
قراءة لمدة 8 دقائق
إدراكًا منّا أنّ استنزاف البطارية بشكل مفرط هو أوّل ما يخطر في بال مستخدمي Android، اتّخذت Google خطوات مهمة لمساعدة المطوّرين في إنشاء تطبيقات أكثر كفاءة في استهلاك الطاقة. في 1 مارس 2026، بدأ "متجر Google Play" في طرح إجراءات تحسين الجودة الفنية الخاصة بقفل التنشيط للمساعدة في الحدّ من استنزاف البطارية. سيتم طرح هذا الإجراء تدريجيًا على التطبيقات المتأثّرة خلال الأسابيع التالية. قد تتأثر التطبيقات التي تتجاوز باستمرار الحدّ المسموح به لـ "قفل التنشيط الجزئي المفرط" في "مؤشرات Android الحيوية" بشكل ملموس في توفّرها على المتجر، بما في ذلك ظهور تحذيرات في بطاقة بيانات المتجر واستبعادها من مساحات العرض التي تتيح اكتشاف التطبيقات، مثل الاقتراحات.
قد يظهر للمستخدمين تحذير في بطاقة بيانات المتجر إذا تجاوز تطبيقك معيار تحديد الأداء السيئ.
وقد أدّت هذه المبادرة إلى رفع مستوى كفاءة البطارية لتصبح أحد المقاييس الحيوية الأساسية إلى جانب مقاييس الثبات، مثل الأعطال وأخطاء ANR. يتم تحديد "الحدّ الأقصى لخلل الأداء" على أنّه الاحتفاظ بقفل تنشيط جزئي غير معفى لمدة ساعتين على الأقل في المتوسط أثناء إيقاف تشغيل الشاشة في أكثر من % 5 من جلسات المستخدمين خلال آخر 28 يومًا. يُستثنى قفل التنشيط إذا كان قفل تنشيط يحتفظ به النظام ويقدّم مزايا واضحة للمستخدم لا يمكن تحسينها أكثر، مثل تشغيل الصوت أو الوصول إلى الموقع الجغرافي أو نقل البيانات الذي يبدأه المستخدم. يمكنك الاطّلاع على التعريف الكامل لأقفال التنشيط المفرطة في مستندات مؤشرات Android الحيوية.
في إطار مبادرتنا المستمرة لتحسين عمر البطارية في جميع أنحاء منظومة Android المتكاملة، حلّلنا آلاف التطبيقات وطريقة استخدامها لأقفال التنشيط الجزئي. على الرغم من أنّ عمليات قفل التنشيط تكون ضرورية في بعض الأحيان، نلاحظ غالبًا أنّ التطبيقات تستخدمها بشكل غير فعّال أو غير ضروري، في حين تتوفّر حلول أكثر فعالية. ستتناول هذه المدوّنة السيناريوهات الأكثر شيوعًا التي تحدث فيها عمليات قفل تنبيه مفرطة، بالإضافة إلى اقتراحاتنا بشأن تحسين عمليات قفل التنبيه. لقد حقّقنا بالفعل نجاحًا ملموسًا مع شركاء مثل WHOOP، الذين استفادوا من هذه الاقتراحات لتحسين سلوك التطبيق في الخلفية.
استخدام خدمة تعمل في المقدّمة مقابل استخدام أقفال التنشيط الجزئية
لاحظنا في كثير من الأحيان أنّ المطوّرين يواجهون صعوبة في فهم الفرق بين مفهومَين عند تنفيذ العمليات في الخلفية، وهما الخدمة التي تعمل في المقدّمة وأقفال التنشيط الجزئية.
الخدمة التي تعمل في المقدّمة هي واجهة برمجة تطبيقات لمراحل النشاط تشير إلى النظام بأنّ التطبيق ينفّذ عملاً يمكن للمستخدم إدراكه ويجب عدم إيقافه لاستعادة الذاكرة، ولكنّها لا تمنع وحدة المعالجة المركزية تلقائيًا من الدخول في وضع السكون عند إيقاف الشاشة. في المقابل، قفل التنشيط الجزئي هو آلية مصمَّمة خصيصًا لإبقاء وحدة المعالجة المركزية قيد التشغيل حتى عندما تكون الشاشة مطفأة.
على الرغم من أنّ الخدمة التي تعمل في المقدّمة تكون ضرورية في كثير من الأحيان لمواصلة إجراء اتّخذه المستخدم، إلا أنّ الحصول يدويًا على قفل تنشيط جزئي لا يكون ضروريًا إلا بالتزامن مع خدمة تعمل في المقدّمة طوال مدة نشاط وحدة المعالجة المركزية. بالإضافة إلى ذلك، لن تحتاج إلى استخدام قفل التنشيط إذا كنت تستخدم حاليًا واجهة برمجة تطبيقات تحافظ على تنشيط الجهاز.
راجِع المخطط الانسيابي في اختيار واجهة برمجة التطبيقات المناسبة لإبقاء الجهاز نشطًا للتأكّد من فهمك جيدًا للأداة التي يجب استخدامها لتجنُّب الحصول على قفل تنبيه في السيناريوهات التي لا يكون فيها ذلك ضروريًا.
المكتبات التابعة لجهات خارجية التي تحصل على عمليات قفل التنشيط
من الشائع أن يكتشف التطبيق أنّه تم الإبلاغ عنه بسبب عمليات قفل التنشيط المفرطة التي تحتفظ بها حزمة تطوير برامج (SDK) أو واجهة برمجة تطبيقات نظام تابعة لجهة خارجية تعمل نيابةً عنه. لتحديد عمليات قفل التنشيط هذه وحلّها، ننصحك باتّباع الخطوات التالية:
- التحقّق من "مؤشرات Android الحيوية": ابحث عن الاسم الدقيق لقفل التنشيط المخالف في لوحة بيانات أقفال التنشيط الجزئية المفرطة. يمكنك الرجوع إلى هذا الاسم ومقارنته بالإرشادات الواردة في مقالة تحديد عمليات قفل التنشيط التي أنشأتها واجهات برمجة تطبيقات أخرى لمعرفة ما إذا كان قد تم إنشاؤه بواسطة إحدى واجهات برمجة التطبيقات المعروفة للنظام أو مكتبة Jetpack. إذا كان الأمر كذلك، قد تحتاج إلى تحسين استخدامك لواجهة برمجة التطبيقات ويمكنك الرجوع إلى الإرشادات المقترَحة.
- تسجيل تتبُّع أداء النظام: إذا تعذّر تحديد قفل التنشيط بسهولة، أعِد إنتاج مشكلة قفل التنشيط محليًا باستخدام عملية تتبُّع أداء النظام وافحصها باستخدام واجهة مستخدم Perfetto. يمكنك الاطّلاع على مزيد من المعلومات حول كيفية إجراء ذلك في قسم تصحيح أخطاء أنواع أخرى من عمليات قفل التنشيط المفرطة في منشور المدوّنة هذا.
- تقييم البدائل: إذا كانت إحدى المكتبات غير الفعّالة التابعة لجهات خارجية هي السبب ولا يمكن ضبطها للحفاظ على عمر البطارية، ننصحك بالتواصل مع مالكي حزمة تطوير البرامج (SDK) لإبلاغهم بالمشكلة أو البحث عن حزمة تطوير برامج (SDK) بديلة أو إنشاء الوظيفة داخليًا.
سيناريوهات شائعة لعمليات قفل التنشيط
في ما يلي تفصيل لبعض حالات الاستخدام المحدّدة التي راجعناها، بالإضافة إلى المسار المقترَح لتحسين تنفيذ عمليات قفل التنشيط.
التحميل أو التنزيل الذي يبدأه المستخدم
أمثلة على حالات الاستخدام:
- تطبيقات بث الفيديو التي يطلب فيها المستخدم تنزيل ملف كبير للوصول إليه بلا إنترنت
- تطبيقات الاحتفاظ بنسخة احتياطية من الوسائط، حيث يبدأ المستخدم في تحميل صوره الحديثة من خلال طلب إذن في الإشعار
كيفية الحدّ من عمليات قفل التنشيط:
- لا تحصل على قفل تنشيط يدوي. يمكنك بدلاً من ذلك استخدام User-Initiated Data Transfer (UIDT) API. هذا هو المسار المخصّص لمهام نقل البيانات الطويلة الأمد التي يبدأها المستخدم، وهو معفى من احتساب عمليات قفل التنشيط المفرطة.
عمليات المزامنة في الخلفية لمرة واحدة أو بشكل دوري
أمثلة على حالات الاستخدام:
- يُجري التطبيق عمليات مزامنة دورية في الخلفية لجلب البيانات التي يمكن الوصول إليها بلا إنترنت.
- تطبيقات عدّاد الخطوات التي تجلب عدد الخطوات بشكل دوري
كيفية الحدّ من عمليات قفل التنشيط:
-
لا تحصل على قفل تنشيط يدوي. استخدِم WorkManager الذي تم إعداده لتنفيذ مهام لمرة واحدة أو مهام دورية. تحترم
WorkManagerحالة النظام من خلال تجميع المهام، كما أنّها تتضمّن حدًا أدنى للفاصل الزمني الدوري (15 دقيقة)، وهو ما يكفي بشكل عام لإجراء التحديثات في الخلفية. -
إذا رصدت عمليات قفل تنشيط أنشأها
WorkManagerأو JobScheduler مع ارتفاع معدّل استخدام عمليات قفل التنشيط، قد يكون ذلك بسبب إعدادات غير صحيحة للعامل بحيث لا يكتمل في سيناريوهات معيّنة. ننصحك بتحليل أسباب توقّف العامل، خاصةً إذا لاحظت تكرارًا كبيرًا للخطأ STOP_REASON_TIMEOUT.
workManager.getWorkInfoByIdFlow(syncWorker.id)
.collect { workInfo ->
if (workInfo != null) {
val stopReason = workInfo.stopReason
logStopReason(syncWorker.id, stopReason)
}
}
- بالإضافة إلى تسجيل أسباب توقّف العاملين، يُرجى الرجوع إلى مستنداتنا حول تصحيح أخطاء العاملين. ننصحك أيضًا بجمع عمليات تتبُّع النظام وتحليلها لمعرفة وقت الحصول على أقفال التنشيط ووقت إيقافها.
- أخيرًا، يمكنك الاطّلاع على دراسة الحالة التي أجريناها مع WHOOP، حيث تمكّنت الشركة من رصد مشكلة في إعدادات العاملين لديها والحدّ بشكل كبير من تأثير قفل التنشيط.
الاتصال عبر البلوتوث
أمثلة على حالات الاستخدام:
- يطلب تطبيق تحكّم بجهاز آخر من المستخدم إقران جهازه الخارجي الذي يتضمّن بلوتوث.
- يستمع تطبيق تحكّم بجهاز آخر إلى أحداث الأجهزة على جهاز خارجي وإلى تغيير مرئي للمستخدم في الإشعار.
- يبدأ مستخدم تطبيق الجهاز المصاحب عملية نقل ملف بين الجهاز الجوّال وجهاز البلوتوث.
- يُجري تطبيق تحكّم بجهاز آخر تحديثات للبرامج الثابتة على جهاز خارجي من حين لآخر عبر البلوتوث.
كيفية الحدّ من عمليات قفل التنشيط:
- استخدِم إقران الأجهزة المصاحبة لإقران أجهزة البلوتوث وتجنُّب الحصول على قفل تنشيط يدوي أثناء إقران البلوتوث.
- راجِع إرشادات التواصل في الخلفية للتعرّف على كيفية إجراء عملية التواصل عبر البلوتوث في الخلفية.
-
يكون استخدام
WorkManagerكافيًا في أغلب الأحيان إذا لم يكن هناك أي تأثير على المستخدم بسبب تأخُّر التواصل. إذا كان من الضروري استخدام قفل تنبيه يدوي، لا تحتفظ بقفل التنبيه إلا لمدة نشاط البلوتوث أو معالجة بيانات نشاط المستخدم.
تتبع المواقع
أمثلة على حالات الاستخدام:
- تطبيقات اللياقة البدنية التي تخزّن بيانات الموقع الجغرافي مؤقتًا لتحميلها لاحقًا، مثل رسم مسارات الركض
- تطبيقات توصيل الطعام التي تسترد بيانات الموقع الجغرافي بمعدّل تكرار عالٍ لتعديل حالة التوصيل في إشعار أو واجهة مستخدم أداة
كيفية الحدّ من عمليات قفل التنشيط:
- راجِع إرشاداتنا حول تحسين استخدام الموقع الجغرافي. ننصحك بتنفيذ عمليات المهلة أو الاستفادة من تجميع طلبات الموقع الجغرافي أو استخدام تعديلات الموقع الجغرافي غير النشطة لضمان كفاءة البطارية.
- عند طلب تحديثات الموقع الجغرافي باستخدام واجهات برمجة التطبيقات FusedLocationProvider أو LocationManager، يُفعّل النظام تلقائيًا الجهاز أثناء معاودة الاتصال بحدث الموقع الجغرافي. يُستثنى قفل التنشيط الموجز الذي يديره النظام من عمليات احتساب عمليات قفل التنشيط الجزئي الزائدة عن الحد.
- تجنَّب الحصول على قفل تنشيط منفصل ومستمر لتخزين بيانات الموقع الجغرافي مؤقتًا، لأنّ ذلك غير ضروري. بدلاً من ذلك، يمكنك الاحتفاظ بأحداث الموقع الجغرافي في الذاكرة أو وحدة التخزين المحلية والاستفادة من WorkManager لمعالجتها على فترات منتظمة.
override fun onCreate(savedInstanceState: Bundle?) {
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
locationResult ?: return
// System wakes up CPU for short duration
for (location in locationResult.locations){
// Store data in memory to process at another time
}
}
}
}
مراقبة المستشعر عالي التردد
أمثلة على حالات الاستخدام:
- تطبيقات عدّاد الخطوات التي تجمع الخطوات أو المسافة المقطوعة بشكل غير نشط
- تطبيقات الأمان التي تراقب أجهزة استشعار الجهاز لرصد التغييرات السريعة في الوقت الفعلي، وذلك لتوفير ميزات مثل رصد حوادث السير أو رصد السقوط
كيفية الحدّ من عمليات قفل التنشيط:
- في حال استخدام SensorManager، يجب تقليل الاستخدام إلى فواصل زمنية دورية وفقط عندما يمنح المستخدم الإذن بالوصول بشكل صريح من خلال تفاعل مع واجهة المستخدم. يمكن أن يؤدي تتبُّع أجهزة الاستشعار ذات التردد العالي إلى استنزاف البطارية بشكل كبير بسبب عدد عمليات تنشيط وحدة المعالجة المركزية والمعالجة التي تحدث.
- إذا كنت تتتبّع عدد الخطوات أو المسافة المقطوعة، يمكنك الاستفادة من Recording API بدلاً من استخدام SensorManager، أو يمكنك استخدام Health Connect للوصول إلى عدد الخطوات السابقة والمجمّعة على الجهاز من أجل تسجيل البيانات بطريقة موفّرة لشحن البطارية.
- إذا كنت تسجّل جهاز استشعار باستخدام SensorManager، حدِّد قيمة maxReportLatencyUs تبلغ 30 ثانية أو أكثر للاستفادة من تجميع بيانات أجهزة الاستشعار من أجل تقليل معدّل تكرار مقاطعات وحدة المعالجة المركزية. عندما يتم تنشيط الجهاز لاحقًا من خلال مشغّل آخر، مثل تفاعل المستخدم أو استرداد الموقع الجغرافي أو مهمة مُجدوَلة، سيرسل النظام على الفور بيانات أجهزة الاستشعار المخزَّنة مؤقتًا.
val accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
sensorManager.registerListener(this,
accelerometer,
samplingPeriodUs, // How often to sample data
maxReportLatencyUs // Key for sensor batching
)
- إذا كان تطبيقك يتطلّب بيانات الموقع الجغرافي وبيانات أجهزة الاستشعار، عليك مزامنة عملية استرجاع ومعالجة الأحداث. من خلال الاستفادة من قراءات أداة الاستشعار في قفل التنشيط الموجز الذي يحتفظ به النظام لتحديثات الموقع الجغرافي، يمكنك تجنُّب الحاجة إلى قفل تنشيط لإبقاء وحدة المعالجة المركزية نشطة. استخدِم عاملًا أو قفل تنشيط قصير المدة للتعامل مع تحميل هذه البيانات المجمّعة ومعالجتها.
المراسلة عن بُعد
أمثلة على حالات الاستخدام:
- التطبيقات المصاحبة التي تراقب الفيديو أو الصوت والتي تحتاج إلى رصد الأحداث التي تحدث على جهاز خارجي متصل باستخدام شبكة محلية
- تطبيقات المراسلة التي تحافظ على اتصال مقبس الشبكة مع إصدار سطح المكتب
كيفية الحدّ من عمليات قفل التنشيط:
- إذا كان من الممكن معالجة أحداث الشبكة من جهة الخادم، استخدِم FCM لتلقّي المعلومات على العميل. يمكنك اختيار جدولة عامل سريع إذا كانت هناك حاجة إلى معالجة إضافية لبيانات FCM.
- إذا كان يجب معالجة الأحداث من جهة العميل من خلال اتصال socket، لن يكون قفل التنشيط مطلوبًا للاستماع إلى مقاطعات الأحداث. عندما تصل حِزم البيانات إلى راديو Wi-Fi أو شبكة الجوّال، يؤدي جهاز الراديو إلى تشغيل مقاطعة الأجهزة في شكل قفل التنشيط في النواة.يمكنك بعد ذلك اختيار جدولة عامل أو الحصول على قفل التنشيط لمعالجة البيانات.
- على سبيل المثال، إذا كنت تستخدم ktor-network للاستماع إلى حِزم البيانات على مقبس شبكة، يجب ألا تحصل على قفل التنشيط إلا عند تسليم الحِزم إلى العميل والحاجة إلى معالجتها.
val readChannel = socket.openReadChannel()
while (!readChannel.isClosedForRead) {
// CPU can safely sleep here while waiting for the next packet
val packet = readChannel.readRemaining(1024)
if (!packet.isEmpty) {
// Data Arrived: The system woke the CPU and we should keep it awake via manual wake lock (urgent) or scheduling a worker (non-urgent)
performWorkWithWakeLock {
val data = packet.readBytes()
// Additional logic to process data packets
}
}
}
ملخّص
من خلال اعتماد هذه الحلول المقترَحة لحالات الاستخدام الشائعة، مثل عمليات المزامنة في الخلفية وتتبُّع الموقع الجغرافي ومراقبة المستشعرات والتواصل عبر الشبكة، يمكن للمطوّرين العمل على تقليل الاستخدام غير الضروري لعمليات قفل التنشيط. لمواصلة التعلّم، يمكنك قراءة منشور المدوّنة الفنية الأخرى أو مشاهدة الفيديو الفني حول كيفية استكشاف عمليات قفل التنشيط وتصحيح أخطائها: تحسين بطارية تطبيقك باستخدام مقياس قفل التنشيط في "مؤشرات Android الحيوية". يمكنك أيضًا الرجوع إلى مستندات wakelock المعدّلة. لمساعدتنا في مواصلة تحسين المراجع الفنية، يُرجى مشاركة أي ملاحظات إضافية حول إرشاداتنا في استطلاع ملاحظات حول المستندات.
متابعة القراءة
-
طرق التنفيذ
يتضمّن دليل مستويات الأداء 5 مستويات. سنبدأ بالمستوى 1 الذي يقدّم أدوات أداء تتطلّب الحد الأدنى من جهد التكيّف، وسننتقل إلى المستوى 5، وهو المستوى المثالي للتطبيقات التي لديها الموارد اللازمة للحفاظ على إطار عمل مخصّص للأداء.
Alice Yuan • مدة القراءة: 9 دقائق
-
طرق التنفيذ
سواء كنت تستخدم "Gemini في استوديو Android" أو Gemini CLI أو Antigravity أو وكلاء تابعين لجهات خارجية، مثل Claude Code أو Codex، تتمثّل مهمتنا في ضمان إمكانية تطوير تطبيقات Android عالية الجودة في كل مكان.
Adarsh Fernando, Esteban de la Canal • مدة القراءة: 4 دقائق
-
طرق التنفيذ
أردنا أن نقدّم لك أمثلة على الميزات المستندة إلى الذكاء الاصطناعي والتي تستخدم نماذج على الجهاز فقط ونماذج على السحابة الإلكترونية، وأن نلهمك لإنشاء تجارب رائعة للمستخدمين.
Thomas Ezan, Ivy Knight • مدة القراءة: دقيقتان
البقاء على اطّلاع على آخر التحديثات
يمكنك تلقّي أحدث الإحصاءات حول تطوير تطبيقات Android في بريدك الوارد أسبوعيًا.