تتضمّن منصة Android 17 تغييرات في السلوك قد تؤثّر في تطبيقك.
تسري تغييرات السلوك التالية على جميع التطبيقات عند تشغيلها على Android 17،
بغض النظر عن targetSdkVersion. عليك اختبار تطبيقك ثم تعديله حسب الحاجة لدعم هذه التغييرات، حيثما ينطبق ذلك.
احرص أيضًا على مراجعة قائمة تغييرات السلوك التي تؤثّر فقط في التطبيقات التي تستهدف Android 17.
الوظيفة الأساسية
يتضمّن Android 17 (المستوى 37 لواجهة برمجة التطبيقات) التغييرات التالية التي تعدِّل أو توسِّع إمكانات أساسية مختلفة في نظام Android.
الحدود القصوى لذاكرة التطبيق
يقدّم نظام التشغيل Android 17 حدودًا لذاكرة التطبيقات استنادًا إلى إجمالي سعة ذاكرة الوصول العشوائي (RAM) بالجهاز، وذلك بهدف توفير بيئة أكثر استقرارًا وقابلية للتحديد لتطبيقاتك ومستخدمي Android. في Android 17، يتم ضبط الحدود بشكل متحفّظ لتحديد خطوط أساس للنظام، مع استهداف تسرّبات الذاكرة الشديدة وغيرها من القيم الشاذّة قبل أن تؤدي إلى عدم استقرار على مستوى النظام، ما يؤدي إلى تقطُّع واجهة المستخدم واستنزاف البطارية وإيقاف التطبيقات. مع أنّنا نتوقّع أن يكون التأثير ضئيلاً على الغالبية العظمى من جلسات التطبيقات، ننصحك باتّباع أفضل الممارسات التالية المتعلّقة بالذاكرة، بما في ذلك تحديد خط أساس للذاكرة.
يمكنك تحديد ما إذا كانت جلسة تطبيقك قد تأثّرت من خلال استدعاء getDescription في ApplicationExitInfo. وإذا تأثّر تطبيقك، سيكون سبب الخروج هو REASON_OTHER وسيتضمّن الوصف السلسلة "MemoryLimiter:AnonSwap" بالإضافة إلى معلومات أخرى. يمكنك أيضًا استخدام إنشاء الملفات الشخصية المستند إلى المشغّلات مع
TRIGGER_TYPE_ANOMALY للحصول على عمليات تفريغ الذاكرة المؤقتة التي يتم جمعها عند بلوغ الحد الأقصى للذاكرة.
لمساعدتك في العثور على تسريبات الذاكرة، يضيف إصدار Panda من "استوديو Android" إمكانية دمج LeakCanary مباشرةً في "أداة فحص الأداء في استوديو Android" كمهمة مخصّصة، مع توفير سياق داخل بيئة التطوير المتكاملة ودمجها بالكامل مع الرمز المصدري.
الخصوصية
يتضمّن Android 17 التغييرات التالية لتحسين خصوصية المستخدم.
الحماية من كلمات المرور لمرة واحدة (OTP) المستلَمة عبر الرسائل القصيرة
اعتبارًا من الإصدار 17 من نظام التشغيل Android، سيوسّع Android نطاق الحماية ليشمل الرسائل القصيرة التي تحتوي على كلمات مرور صالحة لمرة واحدة.
في الإصدارات السابقة من Android، كانت هذه الحماية تركّز بشكل أساسي على تنسيق SMS Retriever. تم تأخير تسليم الرسائل التي تحتوي على رمز تجزئة خاص بخدمة SMS Retriever لمدة ثلاث ساعات لمعظم التطبيقات. ومع ذلك، تم استثناء بعض التطبيقات (مثل معالج الرسائل القصيرة التلقائي) من التأخير، كما تم استثناء التطبيق الذي يملك التجزئة.
بدءًا من الإصدار 17 من نظام التشغيل Android، يتم تطبيق الحماية أيضًا على الرسائل بتنسيق WebOTP. إذا كان أحد التطبيقات لديه إذن بقراءة رسائل SMS، ولكنّه ليس المستلِم المقصود لرسالة WebOTP (كما هو محدّد من خلال إثبات ملكية النطاق)، لن يتمكّن التطبيق من الوصول إلى الرسالة إلا بعد ثلاث ساعات من استلامها. يهدف هذا التغيير إلى تحسين أمان المستخدمين من خلال التأكّد من أنّ التطبيقات المرتبطة بالنطاق المذكور في الرسالة فقط هي التي يمكنها قراءة رمز التحقّق آليًا.
خلال فترة التأخير هذه التي تبلغ ثلاث ساعات، يتم حجب البث SMS_RECEIVED_ACTION وتتم فلترة طلبات البحث في قاعدة بيانات مقدّم خدمة الرسائل القصيرة. تتوفّر رسالة SMS لهذه التطبيقات بعد التأخير. ينطبق هذا التغيير على جميع التطبيقات، بغض النظر عن مستوى واجهة برمجة التطبيقات المستهدَف.
يتم استثناء بعض التطبيقات من هذا التأخير، مثل تطبيق مساعد الرسائل القصيرة التلقائي وتطبيقات الأجهزة المرتبطة وغيرها. يجب أن تنتقل جميع التطبيقات التي تعتمد على قراءة رسائل SMS لاستخراج كلمات المرور لمرة واحدة إلى استخدام واجهات برمجة التطبيقات SMS Retriever أو SMS User Consent لضمان استمرار الوظائف.
الأمان
يتضمّن Android 17 التحسينات التالية على أمان الجهاز والتطبيق.
خطة إيقاف نهائي للسمة `usesCleartextTraffic`
في إصدار مستقبلي، نخطّط لإيقاف نهائي للعنصر usesCleartextTraffic.
على التطبيقات التي تحتاج إلى إجراء اتصالات غير مشفّرة (HTTP) الانتقال إلى استخدام ملف إعداد أمان الشبكة، ما يتيح لك تحديد النطاقات التي يحتاج تطبيقك إلى إجراء اتصالات نص عادي بها.
يُرجى العِلم أنّ ملفات إعداد أمان الشبكة لا تتوفّر إلا على مستويات واجهة برمجة التطبيقات 24 والإصدارات الأحدث. إذا كان الحد الأدنى لمستوى واجهة برمجة التطبيقات في تطبيقك أقل من 24، عليك تنفيذ كلا الإجراءَين التاليَين:
- ضبط السمة
usesCleartextTrafficعلىtrue - استخدام ملف إعداد الشبكة
إذا كان الحد الأدنى لمستوى واجهة برمجة التطبيقات في تطبيقك هو 24 أو أعلى، يمكنك استخدام ملف إعداد الشبكة وليس عليك ضبط usesCleartextTraffic.
حظر منح معرّفات الموارد المنتظمة (URI) الضمنية
في الوقت الحالي، إذا أطلق تطبيق intent مع معرّف موارد منتظم (URI) يتضمّن الإجراء Send أو SendMultiple أو ImageCapture، يمنح النظام تلقائيًا أذونات القراءة والكتابة لمعرّف الموارد المنتظم (URI) إلى التطبيق المستهدف. ونخطّط لتغيير هذا السلوك في Android 18. لهذا السبب، ننصح التطبيقات بمنح أذونات عناوين URI ذات الصلة بشكل صريح بدلاً من الاعتماد على النظام لمنحها.
الحدود القصوى لمخزن المفاتيح لكل تطبيق
يجب أن تتجنّب التطبيقات إنشاء أعداد كبيرة من المفاتيح في "مخزن مفاتيح Android"، لأنّه مورد مشترك لجميع التطبيقات على الجهاز. بدءًا من Android 17، يفرض النظام حدًا أقصى لعدد المفاتيح التي يمكن أن يملكها التطبيق. الحدّ الأقصى هو 50,000 مفتاح للتطبيقات غير التابعة للنظام التي تستهدف Android 17 (المستوى 37 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، و200,000 مفتاح لجميع التطبيقات الأخرى. يبلغ الحدّ الأقصى للتطبيقات التابعة للنظام 200,000 مفتاح، بغض النظر عن مستوى واجهة برمجة التطبيقات الذي تستهدفه.
إذا حاول أحد التطبيقات إنشاء مفاتيح تتجاوز الحدّ الأقصى، سيتعذّر إنشاء المفاتيح وسيظهر الخطأ
KeyStoreException. يحتوي سلسلة رسالة الاستثناء على معلومات حول الحدّ الأقصى للمفاتيح. إذا استدعى التطبيق getNumericErrorCode() على الـ
استثناء، ستعتمد القيمة المعروضة على مستوى واجهة برمجة التطبيقات الذي يستهدفه التطبيق:
- التطبيقات التي تستهدف Android 17 (مستوى واجهة برمجة التطبيقات 37) أو الإصدارات الأحدث: تعرض الدالة
getNumericErrorCode()القيمة الجديدةERROR_TOO_MANY_KEYS. - جميع التطبيقات الأخرى: تعرض الدالة
getNumericErrorCode()القيمةERROR_INCORRECT_USAGE.
حظر حركة المرور بين الملفات الشخصية
بدءًا من Android 17، لم يعُد مسموحًا تلقائيًا بحركة بيانات الاتصال الحلقي بين الملفات الشخصية. لا تتأثر حركة بيانات الاتصال الحلقي ضمن الملف الشخصي نفسه. ينطبق هذا التغيير على جميع التطبيقات التي تعمل على Android 17 أو الإصدارات الأحدث، بغض النظر عن مستوى واجهة برمجة التطبيقات الذي يستهدفه التطبيق.
تجربة المستخدم وواجهة مستخدم النظام
يتضمّن Android 17 التغييرات التالية التي تهدف إلى توفير تجربة مستخدم أكثر اتساقًا وسهولة.
استعادة ظهور طريقة الإدخال التلقائية بعد تدوير الشاشة
بدءًا من الإصدار 17 من نظام التشغيل Android، عندما تتغيّر إعدادات الجهاز (على سبيل المثال، من خلال التدوير)، ولا يعالج التطبيق هذا التغيير، لن تتم استعادة حالة ظهور طريقة الإدخال السابقة.
إذا كان تطبيقك يخضع لتغيير في الإعدادات لا يمكنه التعامل معه، وكان التطبيق بحاجة إلى أن تظل لوحة المفاتيح مرئية بعد التغيير، عليك طلب ذلك بشكل صريح. يمكنك تقديم هذا الطلب بإحدى الطرق التالية:
- اضبط السمة
android:windowSoftInputModeعلىstateAlwaysVisible. - يمكنك طلب لوحة المفاتيح الافتراضية برمجياً في طريقة
onCreate()الخاصة بالنشاط، أو إضافة طريقةonConfigurationChanged().
المعلومات المقدَّمة
يتضمّن Android 17 التغييرات التالية التي تؤثّر في كيفية تفاعل التطبيقات مع أجهزة إدخال المعلومات، مثل لوحات المفاتيح ولوحات التتبّع.
تقدّم لوحات التتبّع أحداثًا نسبية تلقائيًا أثناء عملية التقاط المؤشر
بدءًا من Android 17، إذا طلب تطبيق التقاط المؤشر باستخدام
View.requestPointerCapture() واستخدم المستخدم لوحة لمس، سيتعرّف النظام على
حركة المؤشر وإيماءات التمرير التي يجريها المستخدم
ويُبلغ التطبيق بها بالطريقة نفسها التي يتم بها الإبلاغ عن حركات المؤشر وعجلة التمرير
من خلال فأرة تم التقاطها. في معظم الحالات، يؤدي ذلك إلى إزالة الحاجة إلى أن تضيف التطبيقات التي تتوافق مع المؤشرات التي تم التقاطها منطق معالجة خاصًا بلوحات اللمس. لمزيد من التفاصيل، يُرجى الاطّلاع على مستندات View.POINTER_CAPTURE_MODE_RELATIVE.
في السابق، لم يكن النظام يحاول التعرّف على الإيماءات من لوحة اللمس، بل كان يرسل إلى التطبيق المواقع الجغرافية المطلقة للأصابع بتنسيق مشابه للمس الشاشة. إذا كان أحد التطبيقات لا يزال يتطلّب هذه البيانات المطلقة، عليه استدعاء طريقة View.requestPointerCapture(int) الجديدة مع View.POINTER_CAPTURE_MODE_ABSOLUTE بدلاً من ذلك.
الوسائط
يتضمّن Android 17 التغييرات التالية على سلوك الوسائط.
تعزيز أمان الصوت في الخلفية
اعتبارًا من Android 17، يفرض إطار عمل الصوت قيودًا على التفاعلات الصوتية في الخلفية، بما في ذلك تشغيل الصوت وطلبات أولوية الصوت وواجهات برمجة التطبيقات لتغيير مستوى الصوت، وذلك لضمان أن يبدأ المستخدم هذه التغييرات عن قصد.
إذا حاول التطبيق استدعاء واجهات برمجة التطبيقات الصوتية أثناء عدم توفّره في مراحل نشاط صالحة، ستتعذّر واجهات برمجة التطبيقات لتشغيل الصوت وتغيير مستوى الصوت بدون إظهار استثناء أو تقديم رسالة خطأ. تفشل واجهة برمجة التطبيقات لأولوية الصوت مع رمز النتيجة AUDIOFOCUS_REQUEST_FAILED.
لمزيد من المعلومات، بما في ذلك استراتيجيات التخفيف، يُرجى الاطّلاع على مقالة تعزيز أمان الصوت في الخلفية.
إمكانية الاتصال
يتضمّن Android 17 التغييرات التالية لتحسين إمكانية اتصال الجهاز.
إعادة الربط التلقائي في حال فقدان ربط البلوتوث
يقدّم نظام التشغيل Android 17 ميزة إعادة الإقران الذاتي، وهي تحسين على مستوى النظام مصمَّم لحل مشكلة فقدان ربط البلوتوث تلقائيًا.
في السابق، إذا تم فقدان عملية الربط، كان على المستخدمين الانتقال يدويًا إلى "الإعدادات" لإلغاء الربط ثم إعادة ربط الجهاز الطرفي. تستند هذه الميزة إلى تحسين الأمان في Android 16 من خلال السماح للنظام بإعادة إنشاء عمليات الربط في الخلفية بدون أن يضطر المستخدمون إلى الانتقال يدويًا إلى "الإعدادات" لإلغاء ربط الأجهزة الطرفية وإعادة ربطها.
على الرغم من أنّ معظم التطبيقات لن تتطلّب تغييرات في الرموز البرمجية، على المطوّرين الانتباه إلى التغييرات التالية في سلوك حزمة Bluetooth:
- سياق الاقتران الجديد: يتضمّن
ACTION_PAIRING_REQUESTالآن الإضافةEXTRA_PAIRING_CONTEXTالتي تتيح للتطبيقات التمييز بين طلب اقتران عادي ومحاولة إعادة الاقتران التي يبدأها النظام المستقل. - تحديثات المفاتيح الشرطية: لن يتم استبدال مفاتيح الأمان الحالية إلا إذا تم إعادة الربط بنجاح وكان الاتصال الجديد يستوفي مستوى الأمان المطلوب أو يتجاوزه.
- تعديل توقيت الغرض: لن يتم بث الغرض
ACTION_KEY_MISSINGإلا إذا تعذّرت محاولة إعادة الاقتران التلقائي. يؤدي ذلك إلى تقليل معالجة الأخطاء غير الضرورية في التطبيق إذا استعاد النظام عملية الربط بنجاح في الخلفية. - إشعار المستخدم: يدير النظام عملية إعادة الاقتران من خلال إشعارات واجهة المستخدم الجديدة ومربّعات الحوار. سيُطلب من المستخدمين تأكيد محاولة إعادة الربط للتأكّد من أنّهم على علم بعملية إعادة الاتصال.
على الشركات المصنّعة للأجهزة الطرفية ومطوّري التطبيقات المصاحبة التأكّد من أنّ الأجهزة والمعدّات والتطبيقات تتعامل بسلاسة مع عمليات انتقال الربط. لاختبار هذا السلوك، يمكنك محاكاة فقدان الربط عن بُعد باستخدام إحدى الطريقتَين التاليتَين:
- إزالة معلومات الربط يدويًا من الجهاز الطرفي
- إلغاء إقران الجهاز يدويًا من خلال: الإعدادات > الأجهزة المتصلة