التغييرات في الإصدار 6.0 من Android

إلى جانب الميزات والإمكانات الجديدة، يتضمّن الإصدار Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات) مجموعة متنوعة من التغييرات في النظام والتغييرات في سلوك واجهة برمجة التطبيقات. يسلط هذا المستند الضوء على بعض التغييرات الرئيسية التي يجب أن تفهمها وتراعيها في تطبيقاتك.

إذا نشرت سابقًا تطبيقًا لنظام التشغيل Android، يُرجى العلم بأن هذه التغييرات التي تطرأ على نظام التشغيل تؤثر في تطبيقك.

أذونات وقت التشغيل

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

في تطبيقاتك التي تستهدف الإصدار Android 6.0 (المستوى 23 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، احرص على التحقق من الأذونات وطلبها أثناء وقت التشغيل. لتحديد ما إذا كان قد تم منح تطبيقك إذنًا، عليك استدعاء طريقة checkSelfPermission() الجديدة. لطلب إذن، يمكنك استدعاء طريقة requestPermissions() الجديدة. وحتى إذا كان تطبيقك لا يستهدف الإصدار Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات)، عليك اختبار تطبيقك بموجب نموذج الأذونات الجديد.

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

القيلولة وتطبيقات وضع الاستعداد

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

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

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

إزالة عميل Apache HTTP

يزيل إصدار Android 6.0 التوافق مع عميل Apache HTTP. إذا كان تطبيقك يستخدم هذا البرنامج ويستهدف Android 2.3 (المستوى 9 لواجهة برمجة التطبيقات) أو إصدارًا أحدث، استخدِم فئة HttpURLConnection بدلاً من ذلك. تتميز واجهة برمجة التطبيقات هذه بكفاءة أكبر لأنها تقلل من استخدام الشبكة من خلال التخزين المؤقت للضغط والاستجابة الشفافين، كما أنها تقلل من استهلاك الطاقة. لمواصلة استخدام واجهات برمجة تطبيقات Apache HTTP، عليك أولاً الإعلان عن تبعية وقت التجميع التالية في ملف build.gradle:

android {
    useLibrary 'org.apache.http.legacy'
}

BoingSSL (طبقة المقابس الآمنة)

سيتم نقل نظام Android من مكتبة OpenSSL إلى مكتبة BoringSSL. إذا كنت تستخدم Android NDK في تطبيقك، يجب عدم الربط بمكتبات التشفير التي لا تشكل جزءًا من NDK API، مثل libcrypto.so وlibssl.so. هذه المكتبات ليست واجهات برمجة تطبيقات عامة، وقد تتغير أو تتعطل بدون إشعار على مستوى الإصدارات والأجهزة. بالإضافة إلى ذلك، قد تعرّض نفسك للثغرات الأمنية. بدلاً من ذلك، يمكنك تعديل الكود الأصلي لاستدعاء واجهات برمجة تطبيقات تشفير Java عبر JNI أو للربط الثابت بمكتبة تشفير من اختيارك.

الوصول إلى معرّف الأجهزة

لتزويد المستخدمين بمزيد من الحماية للبيانات، يزيل نظام التشغيل Android بدءًا من هذا الإصدار إمكانية الوصول الآلي إلى معرّف الجهاز المحلي للتطبيقات التي تستخدم واجهات برمجة تطبيقات Wi-Fi والبلوتوث. تعرض الآن طريقة WifiInfo.getMacAddress() وطريقتي BluetoothAdapter.getAddress() قيمة ثابتة تبلغ 02:00:00:00:00:00.

للوصول إلى معرّفات الأجهزة الخارجية القريبة عبر عمليات البحث عن بلوتوث وشبكة Wi-Fi، يجب أن يحصل تطبيقك الآن على الإذنَين ACCESS_FINE_LOCATION أو ACCESS_COARSE_LOCATION:

ملاحظة: عندما يبدأ جهاز يعمل بالإصدار Android 6.0 (المستوى 23 لواجهة برمجة التطبيقات) البحث عن شبكة Wi-Fi أو بلوتوث في الخلفية، تكون العملية مرئية للأجهزة الخارجية كمصدرها عنوان MAC عشوائي.

الإشعارات

يزيل هذا الإصدار طريقة Notification.setLatestEventInfo(). واستخدِم الصف Notification.Builder بدلاً من ذلك لإنشاء الإشعارات. لتعديل إشعار بشكل متكرّر، يُرجى إعادة استخدام المثيل Notification.Builder. عليك استدعاء طريقة build() للحصول على Notification مثيل محدّث.

لم يعُد الأمر adb shell dumpsys notification يطبع نص الإشعار. يمكنك استخدام الأمر adb shell dumpsys notification --noredact بدلاً من ذلك لطباعة النص في كائن الإشعار.

التغييرات في مدير الصوت

لم يعُد من الممكن ضبط مستوى الصوت مباشرةً أو كتم صوت مجموعات بث محدّدة عبر الفئة AudioManager. تم إيقاف الإجراء setStreamSolo() نهائيًا، ويجب استدعاء الطريقة requestAudioFocus() بدلاً من ذلك. وبالمثل، تم إيقاف الإجراء setStreamMute() نهائيًا. وبدلاً من ذلك، عليك استدعاء الطريقة adjustStreamVolume() وتمرير قيمة الاتجاه ADJUST_MUTE أو ADJUST_UNMUTE.

تحديد النص

شاشة تعرض ميزات جديدة لتحديد النص ضمن شريط أدوات عائم

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

لتنفيذ شريط أدوات عائم لتحديد النص، قم بإجراء التغييرات التالية في تطبيقاتك الحالية:

  1. في العنصر View أو Activity، غيِّر استدعاءات ActionMode من startActionMode(Callback) إلى startActionMode(Callback, ActionMode.TYPE_FLOATING).
  2. يمكنك استخدام عملية تنفيذ ActionMode.Callback الحالية وتمديدها ActionMode.Callback2 بدلاً من ذلك.
  3. يمكنك تجاهُل طريقة onGetContentRect() لتوفير إحداثيات العنصر Rect للمحتوى (مثل مستطيل تحديد النص) في طريقة العرض.
  4. إذا لم تعد قيمة تحديد موضع المستطيل صالحة، وكان هذا هو العنصر الوحيد الذي يمكن إبطاله، عليك استدعاء طريقة invalidateContentRect().

إذا كنت تستخدم الإصدار 22.2 من مكتبة دعم Android، يُرجى العلم أنّ أشرطة الأدوات العائمة غير متوافقة مع الأنظمة القديمة، كما تتحكّم appcompat في عناصر ActionMode تلقائيًا. وهذا يمنع عرض أشرطة الأدوات العائمة. لإتاحة دعم ActionMode في AppCompatActivity، استدعِ getDelegate()، ثم استدعِ setHandleNativeActionModesEnabled() على العنصر AppCompatDelegate المعروض واضبط معلَمة الإدخال على false. يؤدي هذا الاستدعاء إلى إعادة التحكم في كائنات ActionMode إلى إطار العمل. في الأجهزة التي تعمل بنظام التشغيل Android 6.0 (مستوى واجهة برمجة التطبيقات 23)، ما يسمح لإطار العمل بدعم ActionBar أو أوضاع شريط الأدوات العائم، أما على الأجهزة التي تعمل بنظام التشغيل Android 5.1 (مستوى واجهة برمجة التطبيقات 22) أو الإصدارات الأقدم، يتم دعم أوضاع ActionBar فقط.

تغييرات الإشارات المرجعية في المتصفِّح

يؤدي هذا الإصدار إلى إزالة إمكانية استخدام الإشارات المرجعية العالمية. تمت إزالة الطريقتين android.provider.Browser.getAllBookmarks() وandroid.provider.Browser.saveBookmark(). وبالمثل، تتم إزالة إذنَي READ_HISTORY_BOOKMARKS وWRITE_HISTORY_BOOKMARKS. إذا كان تطبيقك يستهدف الإصدار 6.0 من نظام التشغيل Android (المستوى 23 من واجهة برمجة التطبيقات) أو إصدارًا أحدث، يجب عدم الوصول إلى الإشارات المرجعية من مزوّد الخدمة العام أو استخدام أذونات الإشارات المرجعية. بدلاً من ذلك، يجب على تطبيقك تخزين بيانات الإشارات داخليًا.

التغييرات في ملف تخزين مفاتيح Android

مع هذا الإصدار، لم يعُد مقدّم ملف تخزين مفاتيح Android يتيح استخدام الإعلانات الديناميكية على شبكة البحث. ولا يزال مشروع ECDSA متاحًا.

عند إيقاف شاشة القفل الآمنة أو إعادة ضبطها (على سبيل المثال، من قِبل المستخدم أو أحد مشرفي الجهاز)، لن يتم حذف المفاتيح التي لا تتطلب تشفيرًا أثناء عدم النشاط. وخلال هذه الأحداث، سيتم حذف المفاتيح التي تتطلّب تشفيرًا في حالة عدم النشاط.

التغييرات في شبكة Wi-Fi والشبكات

يقدم هذا الإصدار التغييرات التالية في سلوك واجهات برمجة تطبيقات Wi-Fi والشبكات.

  • لا يمكن لتطبيقاتك الآن تغيير حالة عناصر WifiConfiguration إلا إذا كنت قد أنشأت هذه العناصر. ولا يُسمح لك بتعديل أو حذف عناصر WifiConfiguration التي أنشأها المستخدم أو تطبيقات أخرى.
  • في السابق، إذا كان أحد التطبيقات يفرض اتصال الجهاز بشبكة Wi-Fi محدَّدة باستخدام enableNetwork() مع الإعداد disableAllOthers=true، كان الجهاز ينقطع اتصاله بالشبكات الأخرى مثل بيانات شبكة الجوّال. في هذا الإصدار، لن ينقطع اتصال الجهاز بهذه الشبكات الأخرى. إذا كانت قيمة targetSdkVersion في تطبيقك تبلغ “20” أو أقل، سيتم تثبيته في شبكة Wi-Fi المحدّدة. إذا كانت قيمة targetSdkVersion في تطبيقك تبلغ “21” أو أعلى، استخدِم واجهات برمجة التطبيقات للشبكات المتعددة (مثل openConnection() وbindSocket() وطريقة bindProcessToNetwork() الجديدة) لضمان إرسال حركة بيانات الشبكة على الشبكة المحدّدة.

التغييرات في خدمة الكاميرا

في هذا الإصدار، تم تغيير نموذج الوصول إلى الموارد المشتركة في خدمة الكاميرا من نموذج الوصول السابق "حسب الأسبقية على العرض" إلى نموذج وصول يتم فيه تفضيل العمليات ذات الأولوية العالية. وتشمل التغييرات التي تطرأ على سلوك الخدمة ما يلي:

  • يُمنح الوصول إلى موارد النظام الفرعي للكاميرا، بما في ذلك فتح جهاز كاميرا وإعداده، استنادًا إلى "أولوية" عملية تطبيق العميل. بشكل عام، تُعطى عمليات التطبيق ذات الأنشطة المرئية للمستخدم أو التي تعمل في المقدّمة ذات أولوية أعلى، ما يجعل الحصول على موارد الكاميرا واستخدامها أكثر موثوقية.
  • قد يتم "طرد" برامج الكاميرا النشطة للتطبيقات ذات الأولوية المنخفضة عندما يحاول المستخدمون ذوو الأولوية العالية استخدام الكاميرا. في واجهة برمجة تطبيقات Camera التي تم إيقافها نهائيًا، يؤدي هذا الإجراء إلى طلب onError() من العميل الذي تم استبعاده. في واجهة برمجة تطبيقات Camera2، يؤدي ذلك إلى طلب onDisconnected() للعميل الذي تم إبعاده.
  • في الأجهزة المزوّدة بمعدّات كاميرا مناسبة، يمكن لعمليات التطبيقات المنفصلة فتح واستخدام أجهزة كاميرا منفصلة بشكل مستقل في الوقت نفسه. ومع ذلك، يتم الآن اكتشاف حالات الاستخدام متعدد العمليات التي يتسبب فيها الدخول المتزامن إلى تدهور كبير في أداء أو إمكانات أي من أجهزة الكاميرا المفتوحة، ومنع خدمة الكاميرا من رصد هذه الحالات. قد يؤدي هذا التغيير إلى "إخلاء" العملاء ذوي الأولوية المنخفضة حتى إذا لم يحاول أي تطبيق آخر الوصول مباشرةً إلى جهاز الكاميرا نفسه.
  • يؤدي تغيير المستخدم الحالي إلى إزالة برامج الكاميرا النشطة في التطبيقات التي يملكها حساب المستخدم السابق. يقتصر الوصول إلى الكاميرا على الملفات الشخصية للمستخدمين التي يملكها مستخدم الجهاز الحالي. ومن الناحية العملية، يعني هذا أن حساب "الضيف"، على سبيل المثال، لن يتمكن من ترك العمليات قيد التشغيل التي تستخدم النظام الفرعي للكاميرا عند تبديل المستخدم إلى حساب مختلف.

وقت التشغيل

ينفِّذ وقت تشغيل ART الآن قواعد الوصول إلى طريقة newInstance() بشكل صحيح. ويعمل هذا التغيير على إصلاح المشكلة، حيث كان Dalvik يتحقق من قواعد الوصول بشكل غير صحيح في الإصدارات السابقة. إذا كان تطبيقك يستخدم طريقة newInstance() وتريد إلغاء عمليات التحقّق من إمكانية الوصول، يمكنك استدعاء الطريقة setAccessible() مع ضبط معلَمة الإدخال على true. إذا كان تطبيقك يستخدم مكتبة التطبيقات المتوافقة مع الإصدار 7 من الإصدار أو مكتبة الإصدار 7 من أداة إعادة التدوير، عليك تحديث التطبيق لاستخدام أحدث إصدارات من هذه المكتبات. وبخلاف ذلك، تأكَّد من تحديث أي فئات مخصصة مُشار إليها من XML بحيث يمكن الوصول إلى دوال إنشاء الفئات.

يعدِّل هذا الإصدار سلوك علامة الربط الديناميكي. يدرك الرابط الديناميكي الآن الفرق بين soname للمكتبة ومسارها ( الخطأ العام 6670)، وقد تم الآن تنفيذ عملية البحث بواسطة soname. وقد يتعذّر تحميل التطبيقات التي كانت تعمل في السابق والتي تحتوي على إدخالات DT_NEEDED غير صالحة (عادةً ما تكون مسارات مطلقة على نظام الملفات في جهاز الإصدار).

تم تنفيذ العلامة dlopen(3) RTLD_LOCAL الآن بشكل صحيح. يُرجى ملاحظة أنّ RTLD_LOCAL هو الإعداد التلقائي، لذا ستتأثر المكالمات التي يتم توجيهها إلى dlopen(3) والتي لم يتم استخدامها بشكل صريح RTLD_LOCAL (ما لم يستخدم تطبيقك RTLD_GLOBAL بشكل صريح). باستخدام RTLD_LOCAL، لن يتم توفير الرموز للمكتبات التي تم تحميلها عن طريق الاستدعاءات اللاحقة لـ dlopen(3) (بدلاً من أن تتم الإشارة إليها في إدخالات DT_NEEDED).

في الإصدارات السابقة من Android، إذا طلب تطبيقك من النظام تحميل مكتبة مشتركة تحتوي على عمليات نقل نصوص، كان النظام يعرض تحذيرًا ولكنه لا يزال يسمح بتحميل المكتبة. بدءًا من هذا الإصدار، يرفض النظام هذه المكتبة إذا كان إصدار SDK المستهدف للتطبيق هو 23 أو إصدار أحدث. لمساعدتك في رصد ما إذا تعذَّر تحميل مكتبة، يجب أن يسجِّل تطبيقك حالة تعذُّر dlopen(3)، وأن يتضمّن نص وصف المشكلة الذي يعرضه استدعاء dlerror(3). لمزيد من المعلومات حول معالجة عمليات نقل النصوص، يمكنك الاطّلاع على هذا الدليل.

التحقق من صحة APK

يجري النظام الأساسي الآن عمليات تحقق أكثر صرامة بشأن حِزم APK. يُعتبر ملف APK تالفًا إذا تم الإعلان عن ملف في ملف البيان ولكنّه غير متوفّر في حزمة APK نفسها. يجب إعادة توقيع ملف APK في حال إزالة أي من المحتوى.

اتصال USB

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

التغييرات التي طرأت على Android for Work

يتضمّن هذا الإصدار التغييرات التالية في السلوك لتطبيق Android for Work:

  • جهات اتصال العمل في السياقات الشخصية: يعرض سجل المكالمات في Google Dialer الآن جهات اتصال العمل عندما يشاهد المستخدم المكالمات السابقة. ويؤدي ضبط setCrossProfileCallerIdDisabled() على true إلى إخفاء جهات الاتصال في الملف الشخصي للعمل في سجلّ مكالمات Google Dialer. لا يمكن عرض جهات اتصال العمل مع جهات الاتصال الشخصية على الأجهزة عبر البلوتوث إلا إذا ضبطت setBluetoothContactSharingDisabled() على false. وقد تم ضبطها تلقائيًا على true.
  • إزالة إعدادات شبكة Wi-Fi: تتم الآن إزالة إعدادات شبكة Wi-Fi التي أضافها مالك الملف الشخصي (على سبيل المثال، من خلال المكالمات إلى طريقة addNetwork()) في حال حذف الملف الشخصي للعمل.
  • إلغاء قفل إعدادات Wi-Fi: لا يمكن للمستخدم تعديل أي إعدادات Wi-Fi أنشأها مالك جهاز نشط أو حذفها إذا كانت قيمة WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN بقيمة صفرية. سيظل بإمكان المستخدم إنشاء إعدادات شبكة Wi-Fi الخاصة به وتعديلها. يحصل مالكو الأجهزة النشطون على امتياز تعديل أو إزالة أي إعدادات لشبكة Wi-Fi، بما في ذلك الإعدادات التي لم يتم إنشاؤها.
  • تنزيل وحدة التحكم في سياسة الجهاز من خلال إضافة حساب Google: عندما تتم إضافة حساب Google يتطلب إدارة عبر تطبيق وحدة التحكم في سياسة الجهاز (DPC) إلى جهاز خارج سياق مُدار، يطالب مسار إضافة الحساب المستخدم الآن بتثبيت WPC المناسب. وينطبق هذا السلوك أيضًا على الحسابات التي تتم إضافتها عبر الإعدادات > الحسابات وفي معالج الإعداد الأولي للجهاز.
  • تغييرات على سلوكيات محدّدة لواجهة برمجة التطبيقات DevicePolicyManager:
    • إنّ طلب الإجراء setCameraDisabled() يؤثر في الكاميرا للمستخدم الذي يتصل فقط، ولا يؤثر طلبه من الملف الشخصي المُدار في تطبيقات الكاميرا التي تعمل على المستخدم الأساسي.
    • بالإضافة إلى ذلك، أصبحت طريقة setKeyguardDisabledFeatures() متاحة الآن لمالكي الملفات الشخصية ومالكي الأجهزة.
    • يمكن لمالك الملف الشخصي ضبط قيود قفل المفاتيح التالية:
    • تم إيقاف الإجراءَين DevicePolicyManager.createAndInitializeUser() وDevicePolicyManager.createUser() نهائيًا.
    • تحظر الطريقة setScreenCaptureDisabled() الآن أيضًا بنية المساعدة عندما يكون تطبيق المستخدم المحدَّد في المقدّمة.
    • تم ضبط EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM الآن على SHA-256 تلقائيًا. لا تزال خوارزمية SHA-1 متوافقة مع الأنظمة القديمة، ولكن ستتم إزالتها في المستقبل. تقبل دالة EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM الآن خوارزمية SHA-256 فقط.
    • تمت الآن إزالة واجهات برمجة التطبيقات لأداة إعداد الجهاز التي كانت متوفّرة في الإصدار Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات).
    • تمت إزالة EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS، لذا لا يمكن توفير تطبيق NFC لميزة توفير المتطلبات اللازمة لفتح قفل جهاز محمي تمت إعادة ضبطه على الإعدادات الأصلية آليًا.
    • يمكنك الآن استخدام الإضافة EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE لتمرير البيانات إلى تطبيق مالك الجهاز أثناء توفير تقنية NFC للجهاز المُدار.
    • تم تحسين واجهات برمجة تطبيقات Android for Work لإذن تشغيل M، بما في ذلك الملفات الشخصية للعمل وطبقة المساعدة وغير ذلك. لا تؤثر واجهات برمجة التطبيقات لأذونات DevicePolicyManager الجديدة في التطبيقات التي تسبق مرحلة الإصدار الرئيسي.
    • عندما يخرج المستخدمون عن غير الجزء المتزامن من مسار الإعداد الذي بدأ من خلال هدف ACTION_PROVISION_MANAGED_PROFILE أو ACTION_PROVISION_MANAGED_DEVICE، يعرض النظام الآن رمز نتيجة RESULT_CANCELED.
  • التغييرات على واجهات برمجة التطبيقات الأخرى:
    • استخدام البيانات: تمت إعادة تسمية الصف android.app.usage.NetworkUsageStats NetworkStats.
  • التغييرات على الإعدادات العامة: