يتضمّن الإصدار 17 من نظام التشغيل Android تغييرات في السلوك قد تؤثّر في تطبيقك.
تنطبق تغييرات السلوك التالية على جميع التطبيقات عند تشغيلها على الإصدار 17 من نظام التشغيل Android،
بغض النظر عن targetSdkVersion. عليك اختبار تطبيقك ثم تعديله حسب الحاجة ليتوافق مع هذه التغييرات، حيثما ينطبق ذلك.
احرص أيضًا على مراجعة قائمة التغييرات في السلوك التي تؤثّر فقط في التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android.
الوظيفة الأساسية
يتضمّن نظام التشغيل Android 17 (المستوى 37 لواجهة برمجة التطبيقات) التغييرات التالية التي تعدّل أو توسّع العديد من الإمكانات الأساسية لنظام Android.
الحدود القصوى لذاكرة التطبيقات
يقدّم Android 17 حدودًا للذاكرة المستخدَمة من التطبيقات استنادًا إلى إجمالي مساحة ذاكرة الوصول العشوائي (RAM) في الجهاز، ما يساعد على إنشاء بيئة أكثر استقرارًا وقابلية للتحديد لتطبيقاتك ومستخدمي Android. تركز هذه الحدود على تسرّبات الذاكرة والقيم المتطرّفة الأخرى قبل أن تؤدي إلى عدم استقرار على مستوى النظام، ما يؤدي إلى حدوث تقطّع في واجهة المستخدم واستهلاك أكبر للبطارية وإيقاف التطبيقات. على الرغم من أنّنا نتوقّع تأثيرًا ضئيلاً على الغالبية العظمى من جلسات التطبيقات، ننصح باتّباع أفضل الممارسات التالية المتعلّقة بالذاكرة، بما في ذلك وضع خط أساس للذاكرة.
يمكنك تحديد ما إذا تأثرت جلسة تطبيقك من خلال استدعاء
getDescription في ApplicationExitInfo. إذا تأثر تطبيقك، سيكون سبب الخروج هو REASON_OTHER وسيحتوي الوصف على السلسلة "MemoryLimiter:AnonSwap" بالإضافة إلى معلومات أخرى. يمكنك أيضًا استخدام إنشاء الملفات الشخصية المستند إلى المشغّلات مع
TRIGGER_TYPE_ANOMALY للحصول على عمليات تفريغ الذاكرة المؤقتة التي يتم جمعها عند بلوغ الحدّ الأقصى للذاكرة.
تقدّم مستندات إدارة ذاكرة تطبيقك معلومات لمساعدتك في تشخيص مشاكل الذاكرة في تطبيقك وتحسين استهلاكه للموارد.
اختبار سلوك تطبيقك في ظلّ قيود الذاكرة
يمكنك استخدام Android Debug Bridge (adb) لتعديل حدود الذاكرة أو إيقافها على أي جهاز يفرضها. يوفّر أمر shell am ثلاثة أوامر فرعية لتعديل حدود الذاكرة. (لا تؤثر هذه الأوامر في جهاز لا يفرض حدودًا للذاكرة.)
am memory-limiter ignore <uid>|none|allam memory-limiter manual <pid> <limit>|max|noneam memory-limiter status
ignoreيوجّه هذا الأمر أداة تحديد الذاكرة إلى تجاهل بعض العمليات أو جميعها. يؤدي تمرير معرّف مستخدم (UID) إلى توجيه أداة تحديد الذاكرة إلى تجاهل فرض القيود على جميع العمليات المرتبطة بهذا المعرّف. يمكنك أيضًا تمرير
all(لتجاهل جميع التطبيقات) أوnone(لعدم تجاهل أي تطبيقات). يؤدي تمريرnoneإلى إلغاء أي طلبات سابقة تم إرسالها إلىam memory-limiter ignore.إذا طلبت من أداة تحديد الذاكرة تجاهل معرّف مستخدم، سيظل بإمكانك تطبيق حدّ أقصى يدوي للذاكرة على عملية داخل التطبيق من خلال استدعاء
am memory-limiter manual.manualيوجّه هذا الأمر النظام إلى فرض قيد على الذاكرة في العملية التي تحمل معرّف العملية (PID) المحدّد. يتم تحديد قيد الذاكرة كعدد صحيح من الميغابايت (MB)، على سبيل المثال، يؤدي تمرير
30إلى تحديد الذاكرة التي يمكن للعملية استخدامها بـ 30 ميغابايت. تؤدي القيمةmaxإلى إزالة جميع حدود الذاكرة في تلك العملية. تؤدي القيمةnoneإلى إزالة أي حدود يدوية تم ضبطها على العملية، ما يؤدي إلى استعادة الحدّ التلقائي للنظام (إن وجد).statusيعرض هذا الأمر الحالة الحالية لأداة تحديد الذاكرة. تشمل الحالة حدود الذاكرة المفروضة على العمليات المرئية وغير المرئية.
الخصوصية
يتضمّن نظام التشغيل Android 17 التغييرات التالية لتحسين خصوصية المستخدم.
الحماية من خلال كلمة المرور الصالحة لمرة واحدة (OTP) عبر الرسائل القصيرة
بدءًا من Android 17، يوسّع Android نطاق حمايته للرسائل القصيرة التي تحتوي على كلمات مرور لمرة واحدة (OTP).
في الإصدارات السابقة من Android، كانت هذه الحماية تركّز بشكل أساسي على تنسيق SMS Retriever. تم تأخير تسليم الرسائل التي تحتوي على علامة التجزئة SMS Retriever لمدة ثلاث ساعات لمعظم التطبيقات. ومع ذلك، تم استثناء بعض التطبيقات (مثل معالج الرسائل القصيرة التلقائي) من التأخير، كما تم استثناء التطبيق الذي يملك علامة التجزئة.
بدءًا من Android 17، يتم تطبيق الحماية أيضًا على الرسائل بتنسيق WebOTP. إذا كان لدى أحد التطبيقات إذن قراءة الرسائل القصيرة، ولكنّه ليس المستلِم المقصود لرسالة WebOTP (كما يتم تحديده من خلال التحقّق من النطاق)، لا يمكن للتطبيق الوصول إلى الرسالة إلا بعد ثلاث ساعات من استلامها. يهدف هذا التغيير إلى تحسين أمان المستخدمين من خلال التأكّد من أنّ التطبيقات المرتبطة بالنطاق المذكور في الرسالة فقط هي التي يمكنها قراءة رمز التحقّق آليًا.
خلال فترة التأخير هذه التي تبلغ ثلاث ساعات، يتم حجب بث SMS_RECEIVED_ACTION ويتم فلترة طلبات البحث في قاعدة بيانات موفّر الرسائل القصيرة. تصبح الرسالة القصيرة متاحة لهذه التطبيقات بعد التأخير. ينطبق هذا التغيير على
جميع التطبيقات، بغض النظر عن مستوى واجهة برمجة التطبيقات المستهدَف.
يتم استثناء بعض التطبيقات من هذا التأخير، مثل تطبيق مساعد الرسائل القصيرة التلقائي وتطبيقات الأجهزة المصاحبة المتصلة وما إلى ذلك. يجب أن تنتقل جميع التطبيقات التي تعتمد على قراءة الرسائل القصيرة لاستخراج كلمات المرور لمرة واحدة إلى استخدام واجهات برمجة التطبيقات SMS Retriever أو SMS User Consent لضمان استمرار الوظائف.
الأمان
يتضمّن نظام التشغيل Android 17 التحسينات التالية على أمان الأجهزة والتطبيقات.
خطة إيقاف usesClearTraffic نهائيًا
我们计划在未来的版本中弃用 usesCleartextTraffic 元素。需要建立未加密 (HTTP) 连接的应用应迁移为使用网络安全配置文件,该文件可让您指定应用需要与哪些网域建立明文连接。
请注意,网络安全配置文件仅在 API 级别 24 及更高版本中受支持。如果您的应用的最低 API 级别低于 24,您应执行以下两项操作:
- 将
usesCleartextTraffic属性设置为true - 使用网络配置文件
如果应用的最低 API 级别为 24 或更高,您可以使用网络配置文件,而无需设置 usesCleartextTraffic。
حظر منح أذونات ضمنية لمعرّف الموارد المنتظم (URI)
في الوقت الحالي، إذا أطلق تطبيق غرضًا باستخدام معرّف موارد منتظم (URI) يتضمّن الإجراء ACTION_SEND أو ACTION_SEND_MULTIPLE أو ACTION_IMAGE_CAPTURE، يمنح النظام تلقائيًا أذونات القراءة والكتابة لمعرّف الموارد المنتظم (URI) إلى التطبيق المستهدف. بدءًا من الإصدار 18 من نظام التشغيل Android، لن يمنح النظام هذه الأذونات تلقائيًا. لهذا السبب، ننصح بأن تمنح التطبيقات بشكل صريح أذونات عناوين URI ذات الصلة بدلاً من الاعتماد على النظام لمنحها.
لرصد استخدام هذه الـ intents في تطبيقك، استخدِم StrictMode مع
detectImplicitUriPermissionGrant() لتشغيل مخالفة:
Kotlin
val policy = StrictMode.VmPolicy.Builder() .detectImplicitUriPermissionGrant() .penaltyLog() .build() StrictMode.setVmPolicy(policy)
Java
StrictMode.VmPolicy policy = new StrictMode.VmPolicy.Builder() .detectImplicitUriPermissionGrant() .penaltyLog() .build(); StrictMode.setVmPolicy(policy);
بدلاً من ذلك، يمكنك مراقبة الاستثناءات المسجّلة التي تتضمّن الرسالة
Please set the grant explicitly in the app التي تظهر عندما يضبط النظام الإذن ضمنيًا. يمكنك مراقبة هذه السجلات باستخدام الأمر adb التالي:
adb logcat | grep "Please set the grant explicitly in the app"
لمنح الأذونات اللازمة بشكل صريح، أضِف العلامة
FLAG_GRANT_READ_URI_PERMISSION إلى الغرضين ACTION_SEND وACTION_SEND_MULTIPLE:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
تضمين كل من علامتَي FLAG_GRANT_READ_URI_PERMISSION وFLAG_GRANT_WRITE_URI_PERMISSION للغرض ACTION_IMAGE_CAPTURE:
Kotlin
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
Java
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
الحدود القصوى لمخزن مفاتيح كل تطبيق
يجب أن تتجنّب التطبيقات إنشاء أعداد كبيرة من المفاتيح في "مخزن مفاتيح 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 或更高版本上运行的所有应用,无论应用以哪个 API 级别为目标平台。
تجربة المستخدم وواجهة مستخدم النظام
يتضمّن نظام التشغيل 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 的安全改进为基础,允许系统在后台重新建立配对信息,而无需用户手动前往“设置”取消配对并重新配对外围设备。
虽然大多数应用不需要更改代码,但开发者应注意蓝牙堆栈中的以下行为变更:
- 新的配对上下文:
ACTION_PAIRING_REQUEST现在包含EXTRA_PAIRING_CONTEXTextra,允许应用区分 标准配对请求和自主系统发起的重新配对尝试。 - 有条件的密钥更新:只有在重新配对成功且新连接达到或超过之前配对信息的安全级别时,才会替换现有安全密钥。
- 修改后的 intent 时间:现在,只有在自主重新配对尝试失败时,才会广播
ACTION_KEY_MISSINGintent。如果系统在后台成功恢复配对信息,则可以减少应用中不必要的错误处理。 - 用户通知:系统通过新的界面通知和对话框管理重新配对。系统会提示用户确认重新配对尝试,以确保用户了解重新连接。
外围设备制造商和配套应用开发者应验证硬件和应用是否能妥善处理配对信息转换。如需测试此行为,请使用以下任一方法模拟远程配对信息丢失:
- 从外围设备中手动移除配对信息
- 在“设置”>“已连接的设备”中手动取消配对设备