التغييرات في السلوك: التطبيقات التي تستهدف الإصدار 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 بدون قفل

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

لمزيد من المعلومات، بما في ذلك استراتيجيات تخفيف الأثر، يُرجى الاطّلاع على إرشادات تغيير سلوك MessageQueue.

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

如果应用在 Android 17 或更高版本上运行,且以 Android 17(API 级别 37)或更高版本为目标平台,则无法更改 static final 字段。如果应用尝试使用反射来更改 static final 字段,则会导致 IllegalAccessException。尝试通过 JNI API(例如 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)

يتيح الإصدار 17 من نظام التشغيل Android استخدام Encrypted Client Hello ‏(ECH)، وهي إضافة إلى بروتوكول أمان طبقة النقل (TLS) تعمل على تحسين خصوصية المستخدم من خلال تشفير إشارة اسم الخادم (SNI) في عملية تبادل البيانات عبر بروتوكول أمان طبقة النقل (TLS). يساعد هذا التشفير في منع مراقبي الشبكة من تحديد النطاق المحدّد الذي يتصل به تطبيقك بسهولة.

بالنسبة إلى التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 37) أو الإصدارات الأحدث، يتم استخدام ECH لاتصالات بروتوكول أمان طبقة النقل (TLS). لا تكون إضافة ECH نشطة إلا إذا كانت مكتبة الشبكات التي يستخدمها التطبيق (مثل HttpEngine أو WebView أو OkHttp) تتضمّن ميزة ECH، وكان الخادم البعيد يتيح أيضًا بروتوكول ECH. إذا تعذّر التفاوض بشأن ECH، يرسل العميل إضافة ECH تتضمّن محتوى عشوائيًا (آلية تُعرف باسم ECH GREASE). يمكنك الاطّلاع على RFC 9849 للحصول على مزيد من التفاصيل حول طريقة عمل ECH GREASE.

للسماح للتطبيقات بتخصيص هذا السلوك، يضيف نظام التشغيل Android 17 عنصر <domainEncryption> جديدًا إلى ملف إعدادات أمان الشبكة. يمكن للمطوّرين استخدام <domainEncryption> ضمن العلامات <base-config> أو <domain-config> لاختيار أحد أوضاع ECH (على سبيل المثال، "enabled" أو "disabled") على مستوى العالم أو على مستوى كل نطاق.

لمزيد من المعلومات، يُرجى الاطّلاع على مستندات Encrypted Client Hello.

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

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

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

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

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

如果应用以 Android 17(API 级别 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 中,平台继续向“默认安全”架构转变,引入了一系列旨在缓解严重程度较高的漏洞利用(例如网络钓鱼、交互劫持和混淆代理攻击)的增强功能。此更新要求开发者明确选择启用新的安全标准,以保持应用兼容性和用户保护。

对开发者的主要影响包括:

  • BAL 安全加固和改进的选择启用机制:我们正在通过将保护范围扩展到 IntentSender 来完善后台 Activity 启动 (BAL) 限制。开发者必须弃用旧版 MODE_BACKGROUND_ACTIVITY_START_ALLOWED 常量。相反,您应采用精细的控制措施,例如 MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE,该措施会将 activity 启动限制在调用应用可见的场景中,从而显著减小攻击面。
  • 采用工具:开发者应利用严格模式和更新后的 lint 检查来识别旧版模式,并确保应用符合未来的目标 SDK 要求。

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

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

Safer Native DCL—C

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

يجب وضع علامة "للقراءة فقط" على جميع الملفات الأصلية التي يتم تحميلها باستخدام System.load(). وفي الحالات الأخرى، يعرض النظام الخطأ UnsatisfiedLinkError.

ننصح التطبيقات بتجنُّب تحميل الرموز البرمجية بشكل ديناميكي كلما أمكن ذلك، لأنّ هذا الإجراء يزيد بشكل كبير من خطر تعرُّض التطبيق للاختراق من خلال إدخال رموز برمجية أو التلاعب بها.

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

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

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

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

بالنسبة إلى التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يفرض الإصدار 2 من "موفّر جهات الاتصال" (CP2) عملية تحقّق صارمة من صحة طلبات بحث SQL عند الوصول إلى الجدول ContactsContract.Data بدون إذن READ_CONTACTS.

بموجب هذا التغيير، إذا لم يكن لدى التطبيق إذن READ_CONTACTS، سيتم ضبط الخيارَين StrictColumns وStrictGrammar عند طلب البحث في جدول ContactsContract.Data. إذا كان طلب البحث يستخدم نمطًا غير متوافق مع هذه الأنماط، سيتم رفضه وسيؤدي إلى حدوث استثناء.

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. يضمن ذلك إنهاء الحلقة بشكل صحيح عند قطع اتصال الجهاز البعيد أو إغلاق المقبس. للاطّلاع على مثال على عملية التنفيذ المقترَحة، راجِع مقتطف الرمز في دليل نقل البيانات عبر البلوتوث.