فرض الجودة الفنية للبطارية أصبح متاحًا: كيفية تحسين حالات الاستخدام الشائعة لقفل التنشيط
مدة القراءة: 8 دقائق
إدراكًا من Google أنّ استنزاف البطارية بشكل مفرط هو من أهم المشاكل التي تواجه مستخدمي Android، اتّخذت خطوات كبيرة لمساعدة المطوّرين في إنشاء تطبيقات أكثر كفاءة في استخدام الطاقة. في 1 مارس 2026، بدأ متجر Google Play بطرح إجراءات تحسين الجودة الفنية لقفل التنشيط من أجل تقليل استنزاف البطارية. سيتم طرح هذه الإجراءات تدريجيًا على التطبيقات المتأثرة خلال الأسابيع التالية. قد تشهد التطبيقات التي تتجاوز باستمرار الحدّ الأقصى المسموح به لـ "عمليات قفل التنشيط الجزئي الزائدة عن الحد" في "مؤشرات Android الحيوية" تأثيرات ملموسة على ظهورها في المتجر، بما في ذلك ظهور تحذيرات في بطاقة بيانات المتجر واستبعادها من أسطح العرض التي تتيح العثور على التطبيقات، مثل الاقتراحات.
قد يظهر للمستخدمين تحذير في بطاقة بيانات المتجر إذا تجاوز تطبيقك معيار تحديد الأداء السيئ.
رفعت هذه المبادرة كفاءة البطارية إلى مقياس أساسي حيوي إلى جانب مقاييس الثبات، مثل الأعطال والأخطاء التي لا تستجيب لها التطبيقات. يُعرَّف "الحدّ الأقصى المسموح به للسلوك السيئ" بأنّه الاحتفاظ بعملية قفل تنشيط جزئي غير معفاة لمدة ساعتين على الأقل في المتوسط أثناء إيقاف الشاشة في أكثر من % 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، قلِّل الاستخدام إلى فترات دورية وفقط عندما يمنح المستخدم الإذن صراحةً من خلال تفاعل واجهة المستخدِم. يمكن أن يؤدي رصد أجهزة الاستشعار بمعدّل عالٍ إلى استنزاف البطارية بشكل كبير بسبب عدد عمليات تنبيه وحدة المعالجة المركزية والمعالجة التي تحدث.
- إذا كنت تتتبّع عدد الخطوات أو المسافة المقطوعة، بدلاً من استخدام SensorManager، استخدِم Recording API أو ننصحك باستخدام 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.
- إذا كان يجب معالجة الأحداث على جهة العميل من خلال اتصال مقبس، ليس هناك حاجة إلى عملية قفل تنشيط للاستماع إلى انقطاعات الأحداث. عندما تصل حِزم البيانات إلى جهاز إرسال واستقبال 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 الحيوية". ننصحك أيضًا بالرجوع إلى مستندات عمليات قفل التنشيط المعدَّلة. لمساعدتنا في مواصلة تحسين مراجعنا الفنية، يُرجى مشاركة أي ملاحظات إضافية حول إرشاداتنا في استطلاع ملاحظات المستندات.
-
مقالات إرشاديةعلى الرغم من أنّ أداء التطبيق غالبًا ما يُقارن بواجهة مستخدِم سلسة وأوقات بدء تشغيل سريعة، فإنّ الذاكرة هي الأساس الصامت الذي تُبنى عليه هذه المقاييس المرئية. ليس سرًا أنّنا نشهد تحوّلاً حيث أصبحت ذاكرة الجهاز أكثر أهمية من أي وقت مضى.
-
مقالات إرشاديةيتضمّن دليل مستويات الأداء 5 مستويات. سنبدأ بالمستوى 1، الذي يقدّم أدوات تحسين الأداء التي تتطلّب الحد الأدنى من الجهد لاعتمادها، وسننتقل إلى المستوى 5، وهو مثالي للتطبيقات التي لديها الموارد اللازمة للحفاظ على إطار عمل مخصّص للأداء.
Alice Yuan • مدة القراءة: 9 دقائق -
مقالات إرشاديةيسرّنا اليوم الإعلان عن بيانات اعتماد جديدة لعنوان البريد الإلكتروني الذي تم التحقّق منه والصادرة عن Google، والتي يمكن للمطوّرين الآن استردادها مباشرةً من Credential Manager Digital Credential API في Android.
Niharika Arora, Jean-Pierre Pralle • مدة القراءة: 3 دقائق
يمكنك تلقّي أحدث الإحصاءات حول تطوير تطبيقات Android في بريدك الوارد أسبوعيًا.