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

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

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

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

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

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

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

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

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

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

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

إزالة عميل Apache HTTP

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

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

BuringSSL

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

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

لتوفير حماية أكبر للبيانات للمستخدمين، بدءًا من هذا الإصدار، إزالة إمكانية الوصول الآلي إلى معرّف الجهاز المحلي للجهاز التطبيقات التي تستخدم واجهات برمجة تطبيقات البلوتوث و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 متوافقًا قانون الخدمات الرقمية (DSA). وما زال خيار 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(). هذا النمط تغيير إصلاح المشكلة المتمثلة في أن دالفيك كان يتحقق من قواعد الوصول بشكل غير صحيح في الإصدارات السابقة. إذا كان تطبيقك يستخدم طريقة واحدة (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، إذا طلب التطبيق من النظام تحميل مكتبة مشتركة باستخدام عمليات تغيير موقع النص، عرض النظام تحذيرًا ولكن ما زال يسمح بتحميل المكتبة. بدءًا من هذا الإصدار، يرفض النظام هذه المكتبة إذا كان الإصدار 23 من حزمة تطوير البرامج (SDK) المستهدَف لتطبيقك هو أو أعلى. لمساعدتك في اكتشاف ما إذا تعذَّر تحميل مكتبة ما، يجب أن يسجّل التطبيق أخطاء 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 فقط.
    • تمت الآن إزالة واجهات برمجة تطبيقات أداة إعداد الجهاز التي كانت متوفّرة في الإصدار 6.0 من نظام التشغيل Android (المستوى 23 من واجهة برمجة التطبيقات).
    • تمت إزالة EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS حتى يحدث اصطدام الاتصال القصير المدى (NFC) لا يمكن لتوفير المتطلبات اللازمة فتح قفل جهاز محمي تمت إعادة ضبطه على الإعدادات الأصلية آليًا.
    • يمكنك الآن استخدام بطاقة EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE. إضافية لتمرير البيانات إلى تطبيق مالك الجهاز أثناء توفير NFC للجهاز المُدار.
    • تم تحسين واجهات برمجة تطبيقات Android for Work لأذونات وقت تشغيل M، بما في ذلك ملفات العمل، وطبقة المساعدة وغيرها. ما من أذونات جديد في واجهات برمجة التطبيقات لأذونات "DevicePolicyManager" تؤثر على تطبيقات ما قبل M.
    • عند خروج المستخدمين من الجزء المتزامن من تدفق الإعداد الذي يتم بدؤه من خلال ACTION_PROVISION_MANAGED_PROFILE أو ACTION_PROVISION_MANAGED_DEVICE intent، النظام الآن رمز نتيجة RESULT_CANCELED.
  • التغييرات على واجهات برمجة التطبيقات الأخرى:
    • استخدام البيانات: تمت إعادة تسمية الصف android.app.usage.NetworkUsageStats NetworkStats
  • التغييرات على الإعدادات العامة: