التغييرات في السلوك: التطبيقات التي تستهدف الإصدار 17 من Android أو الإصدارات الأحدث

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

احرص أيضًا على مراجعة قائمة التغييرات في السلوك التي تؤثّر في جميع التطبيقات التي تعمل على Android 17 بغض النظر عن targetSdkVersion لتطبيقك.

تجربة المستخدم وواجهة مستخدم النظام

يتضمّن نظام التشغيل Android 17 التغييرات التالية التي تهدف إلى توفير تجربة استخدام أكثر اتساقًا وسلاسة.

أداة الحدّ الأقصى للذاكرة

بدءًا من الإصدار 17 من نظام التشغيل Android، يفرض النظام حدًا صارمًا للذاكرة (1.5 * عرض الشاشة * ارتفاع الشاشة * 4) على إجمالي استخدام الذاكرة لكل من الصور النقطية والرموز المتوفرة في حزمة RemoteViews، وذلك للتطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث. ويؤدي تجاوز هذه الحدود إلى حدوث خطأ فادح IllegalArgumentException وتعطُّل عملية التطبيق.

لمزيد من المعلومات، اطّلِع على UpdateAppWidget.

الوظيفة الأساسية

يتضمّن نظام التشغيل Android 17 التغييرات التالية التي تعدّل أو توسّع العديد من الإمكانات الأساسية لنظام التشغيل Android.

تنفيذ جديد لـ MessageQueue بدون قفل

Beginning with Android 17, apps targeting Android 17 (API level 37) or higher receive a new lock-free implementation of android.os.MessageQueue. The new implementation improves performance and reduces missed frames, but may break clients that reflect on MessageQueue private fields and methods.

For more information, including mitigation strategies, see MessageQueue behavior change guidance.

أصبحت الحقول الثابتة النهائية غير قابلة للتعديل

لا يمكن للتطبيقات التي تعمل على الإصدار 17 من نظام التشغيل Android أو الإصدارات الأحدث والتي تستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث تغيير حقول static final. إذا حاول تطبيق تغيير حقل static final باستخدام الانعكاس، سيؤدي ذلك إلى حدوث IllegalAccessException. سيؤدي محاولة تعديل أحد هذه الحقول من خلال واجهات برمجة تطبيقات JNI (مثل SetStaticLongField()) إلى تعطُّل التطبيق.

تسهيل الاستخدام

يُجري نظام التشغيل Android 17 التغييرات التالية لتحسين ميزات تسهيل الاستخدام.

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

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

عدد التطبيقات التي تستخدم حِزم SDK

  • تطبيقات IME: عند ضبط نص التأليف في حقول التعديل، يمكن لأدوات IME استخدام TextAttribute.Builder.setTextSuggestionSelected() للإشارة إلى ما إذا تم اختيار مرشح إحالة ناجحة معيّن.

  • التطبيقات التي تتضمّن حقول تعديل: التطبيقات التي تحتفظ InputConnection مخصّصًا يمكنها استرداد بيانات اختيار المرشّحين من خلال طلب TextAttribute.isTextSuggestionSelected(). بعد ذلك، يجب أن تستدعي هذه التطبيقات AccessibilityEvent.setTextChangeTypes() عند إرسال أحداث TYPE_VIEW_TEXT_CHANGED. سيتم تفعيل هذه الميزة تلقائيًا في التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 37) والتي تستخدم TextView العادي. (أي أنّ TextView ستتولّى استرداد البيانات من محرّك IME وتحديد أنواع تغييرات النص عند إرسال الأحداث إلى خدمات تسهيل الاستخدام).

  • خدمات تسهيل الاستخدام: يمكن لخدمات تسهيل الاستخدام التي تعالج أحداث TYPE_VIEW_TEXT_CHANGED استدعاء AccessibilityEvent.getTextChangeTypes() لتحديد طبيعة التعديل وتعديل استراتيجيات الملاحظات وفقًا لذلك.

الخصوصية

يتضمّن نظام التشغيل Android 17 التغييرات التالية لتحسين خصوصية المستخدم.

تفعيل ECH (Encrypted Client Hello)

Android 17 introduces platform support for Encrypted Client Hello (ECH), a TLS extension that enhances user privacy by encrypting the Server Name Indication (SNI) in the TLS handshake. This encryption helps prevent network observers from easily identifying the specific domain your app is connecting to.

For apps targeting Android 17 (API level 37) or higher, ECH is used for TLS connections. ECH is active only if the networking library used by the app (for example, HttpEngine, WebView, or OkHttp) has integrated ECH support and the remote server also supports the ECH protocol. If ECH cannot be negotiated, the client sends an ECH extension with randomized contents (a mechanism called ECH GREASE). See RFC 9849 for more details on how ECH GREASE works.

To allow apps to customize this behavior, Android 17 adds a new <domainEncryption> element to the Network Security Configuration file. Developers can use <domainEncryption> within <base-config> or <domain-config> tags to select an ECH mode (for example, "enabled" or "disabled") on a global or per-domain basis.

For more information, see the Encrypted Client Hello documentation.

يجب منح إذن الوصول إلى الشبكة المحلية للتطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android

يقدّم نظام التشغيل Android 17 إذن التشغيل ACCESS_LOCAL_NETWORK لحماية المستخدمين من الوصول غير المصرَّح به إلى الشبكة المحلية. وبما أنّ هذا الإذن يندرج ضمن مجموعة أذونات NEARBY_DEVICES الحالية، لن يُطلب من المستخدمين الذين سبق لهم منح أذونات NEARBY_DEVICES أخرى الموافقة على هذا الإذن مرة أخرى. يمنع هذا الشرط الجديد التطبيقات الضارة من استغلال إمكانية الوصول غير المحدود إلى الشبكة المحلية لتتبُّع المستخدمين واستكشاف تفاصيلهم بشكل سرّي. من خلال الإفصاح عن هذا الإذن وطلبه، يمكن لتطبيقك اكتشاف الأجهزة المتصلة بشبكة المنطقة المحلية (LAN) والربط بها، مثل أجهزة المنزل الذكي أو أجهزة استقبال البث.

تتوفّر الآن طريقتان للتطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث للحفاظ على التواصل مع الأجهزة على الشبكة المحلية: استخدام أدوات اختيار الأجهزة التي تتوسّط فيها الأنظمة وتحافظ على الخصوصية لتخطّي طلب الإذن، أو طلب هذا الإذن الجديد بشكل صريح في وقت التشغيل للحفاظ على التواصل مع الشبكة المحلية.

لمزيد من المعلومات، يُرجى الاطّلاع على مستندات إذن الوصول إلى الشبكة المحلية.

إخفاء كلمات المرور من الأجهزة المادية

إذا كان التطبيق يستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث وكان المستخدم يستخدم جهاز إدخال ماديًا (مثل لوحة مفاتيح خارجية)، سيطبِّق نظام التشغيل Android إعداد show_passwords_physical الجديد على جميع الأحرف في حقل كلمة المرور. يخفي هذا الإعداد تلقائيًا جميع أحرف كلمة المرور.

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

إذا كان المستخدم يستعمل شاشة الجهاز التي تعمل باللمس، سيطبّق النظام الإعداد الجديد show_passwords_touch.

حماية كلمات المرور الصالحة لمرة واحدة في رسائل SMS العادية

بدءًا من الإصدار 17 من نظام التشغيل Android، سيوسّع Android نطاق حماية كلمات المرور لمرة واحدة (OTP) المستندة إلى الرسائل القصيرة ليشمل رسائل SMS العادية (رسائل SMS التي تحتوي على كلمة مرور لمرة واحدة ولا تستخدم تنسيقات WebOTP أو SMS Retriever). بالنسبة إلى معظم التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، لا تصبح رسائل SMS هذه متاحة إلا بعد ثلاث ساعات من استلامها. يهدف هذا التأخير إلى المساعدة في منع اختطاف كلمات المرور لمرة واحدة. خلال فترة التأخير هذه التي تبلغ ثلاث ساعات، يتم حجب SMS_RECEIVED_ACTIONالبث وتتم فلترة طلبات البحث في قاعدة بيانات مقدّم خدمة الرسائل القصيرة. تتوفّر رسالة SMS لهذه التطبيقات بعد التأخير.

يتم استثناء بعض التطبيقات من هذا التأخير، مثل تطبيق المساعد التلقائي للرسائل القصيرة وتطبيقات الأجهزة المرتبطة وغيرها. يجب أن تنتقل جميع التطبيقات التي تعتمد على قراءة رسائل SMS لاستخراج كلمات المرور لمرة واحدة إلى استخدام واجهات برمجة التطبيقات SMS Retriever أو SMS User Consent لضمان استمرار الوظائف.

الأمان

يُجري نظام التشغيل Android 17 التحسينات التالية على أمان الأجهزة والتطبيقات.

أمان النشاط

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

تشمل التأثيرات الرئيسية على المطوّرين ما يلي:

  • تعزيز أمان ميزة "تشغيل التطبيقات في الخلفية" وتحسين خيار الموافقة: نعمل على تحسين القيود المفروضة على ميزة "تشغيل التطبيقات في الخلفية" من خلال توسيع نطاق الحماية ليشمل IntentSender. على المطوّرين التوقّف عن استخدام الثابت القديم MODE_BACKGROUND_ACTIVITY_START_ALLOWED. بدلاً من ذلك، يجب استخدام عناصر تحكّم دقيقة، مثل MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE، التي تقصر عمليات بدء النشاط على الحالات التي يكون فيها تطبيق الاتصال مرئيًا، ما يقلّل بشكل كبير من مساحة الثغرات الأمنية.
  • أدوات التوافق: على المطوّرين استخدام الوضع الصارم وعمليات التحقّق المعدَّلة من أخطاء Lint لتحديد الأنماط القديمة وضمان الاستعداد لمتطلبات حزمة تطوير البرامج (SDK) المستقبلية.

تفعيل "المحادثة الذكية" تلقائيًا

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

Safer Native DCL—C

If your app targets Android 17 (API level 37) or higher, the Safer Dynamic Code Loading (DCL) protection introduced in Android 14 for DEX and JAR files now extends to native libraries.

All native files loaded using System.load() must be marked as read-only. Otherwise, the system throws UnsatisfiedLinkError.

We recommend that apps avoid dynamically loading code whenever possible, as doing so greatly increases the risk that an app can be compromised by code injection or code tampering.

تقييد حقول معلومات التعريف الشخصية في عرض بيانات CP2

بالنسبة إلى التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات (API) في Android) والإصدارات الأحدث، يفرض "مقدِّم جهات الاتصال 2" (CP2) قيودًا على أعمدة معيّنة تحتوي على معلومات تكشف الهوية الشخصية (PII) من عرض البيانات. عند تفعيل هذا التغيير، تتم إزالة هذه الأعمدة من عرض البيانات لتحسين خصوصية المستخدم. تشمل الأعمدة المحظورة ما يلي:

يمكن للتطبيقات التي تستخدم هذه الأعمدة من ContactsContract.Data استخراجها من ContactsContract.RawContacts بدلاً من ذلك، من خلال الربط بـ RAW_CONTACT_ID.

فرض عمليات التحقّق الصارمة من لغة الاستعلامات البنيوية (SQL) في CP2

For apps targeting Android 17 (API level Android 17 (API level 37)) and higher, Contacts Provider 2 (CP2) enforces strict SQL query validation when the ContactsContract.Data table is accessed without READ_CONTACTS permission.

With this change, if an app doesn't have READ_CONTACTS permission, StrictColumns and StrictGrammar options are set when querying the ContactsContract.Data table. If a query uses a pattern that isn't compatible with these, it will be rejected and cause an exception to be thrown.

Intelligence

يتضمّن نظام التشغيل Android 17 التغييرات التالية على ميزة "الذكاء الاصطناعي في النظام".

إيقاف طريقة setContentCaptureEnabled نهائيًا

تكون ميزة "التقاط المحتوى" مفعَّلة تلقائيًا على بعض الأجهزة للسماح لميزات الذكاء الاصطناعي على الجهاز بتحليل محتوى الشاشة من أجل تقديم تجارب ذكية.

اعتبارًا من الإصدار 17 من نظام التشغيل Android، سيتم إيقاف طريقة واجهة برمجة التطبيقات ContentCaptureManager.setContentCaptureEnabled(boolean) نهائيًا. بالنسبة إلى التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 37) أو الإصدارات الأحدث، لن يؤدي استدعاء setContentCaptureEnabled(false) إلى إيقاف ميزة "التقاط المحتوى".

إذا كان تطبيقك بحاجة إلى مواصلة إيقاف ميزة &quot;التقاط المحتوى&quot; أو حظر التقاط النظام لمحتوى الشاشة، عليك الانتقال إلى استخدام مَعلمة تخطيط النافذة FLAG_SECURE.

لإيقاف ميزة &quot;التقاط المحتوى&quot;، اضبط العلامة FLAG_SECURE في نافذتك كما هو موضّح في المثال التالي:

Kotlin

window.setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
)

Java

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_SECURE,
    WindowManager.LayoutParams.FLAG_SECURE
);

لمزيد من التفاصيل، راجِع مستندات WindowManager.LayoutParams.FLAG_SECURE المرجعية.

الوسائط

يتضمّن نظام التشغيل Android 17 التغييرات التالية على سلوك الوسائط.

تعزيز أمان الصوت في الخلفية

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

تنطبق بعض القيود الصوتية على جميع التطبيقات. ومع ذلك، تكون القيود أكثر صرامة إذا كان التطبيق يستهدف الإصدار 17 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 37). إذا كان أحد هذه التطبيقات يتفاعل مع الصوت أثناء تشغيله في الخلفية، يجب أن تكون خدمة تعمل في المقدّمة قيد التشغيل. بالإضافة إلى ذلك، يجب أن يستوفي التطبيق أحد المتطلبات التالية أو كليهما:

  • يجب أن تتضمّن الخدمة التي تعمل في المقدّمة إمكانات الوصول إلى الموقع الجغرافي أثناء الاستخدام.
  • يجب أن يكون لدى التطبيق إذن المنبّه الدقيق وأن يتفاعل مع USAGE_ALARM بث الصوت.

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

أشكال الأجهزة

يتضمّن Android 17 التغييرات التالية لتحسين تجربة المستخدم على مجموعة من أحجام الأجهزة وأشكالها.

تغييرات في واجهة برمجة التطبيقات للمنصة لتجاهل القيود المتعلقة باتجاه الشاشة وإمكانية تغيير الحجم ونسبة العرض إلى الارتفاع على الشاشات الكبيرة (sw>=600dp)

أجرينا تغييرات على Platform API في Android 16 لتجاهل قيود اتجاه الشاشة ونسبة العرض إلى الارتفاع وإمكانية تغيير الحجم على الشاشات الكبيرة (sw >= 600 وحدة بكسل مستقلة الكثافة) للتطبيقات التي تستهدف المستوى 36 من واجهة برمجة التطبيقات أو الإصدارات الأحدث. يمكن للمطوّرين إيقاف هذه التغييرات باستخدام حزمة SDK 36، ولكن لن يكون خيار الإيقاف هذا متاحًا للتطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 37) أو الإصدارات الأحدث.

لمزيد من المعلومات، يُرجى الاطّلاع على تجاهل القيود المفروضة على الاتجاه وإمكانية تغيير الحجم.

إمكانية الاتصال

يقدّم نظام التشغيل Android 17 التغيير التالي لتحسين التوافق والتوافق مع سلوك InputStream العادي في Java لمقابس RFCOMM عبر البلوتوث.

سلوك متسق للدالة read()‎ في BluetoothSocket مع RFCOMM

بالنسبة إلى التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 لواجهة برمجة التطبيقات)، ستعرض الطريقة read() الخاصة بـ InputStream التي يتم الحصول عليها من BluetoothSocket المستند إلى RFCOMM القيمة -1 عند إغلاق المقبس أو قطع الاتصال.

يؤدي هذا التغيير إلى تطابق سلوك مقابس RFCOMM مع مقابس LE CoC ويتوافق مع مستندات InputStream.read() المعيارية التي تنص على أنّه يتم عرض -1 عند الوصول إلى نهاية البث.

قد تتأثر التطبيقات التي تعتمد فقط على رصد IOException للخروج من حلقة قراءة بهذا التغيير، ويجب تعديل حلقات قراءة BluetoothSocket للتحقّق بشكل صريح من القيمة المعروضة -1. يضمن ذلك إنهاء الحلقة بشكل صحيح عند قطع اتصال الجهاز البعيد أو إغلاق المقبس. للاطّلاع على مثال على عملية التنفيذ المقترَحة، راجِع مقتطف الرمز في دليل نقل البيانات عبر البلوتوث.