التغييرات في سلوك الإصدار Android 8.0

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

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

التغييرات لجميع التطبيقات

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

حدود التنفيذ في الخلفية

أحد التغييرات التي أُطلقها على Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) تحسين عمر البطارية، عندما يدخل تطبيقك مخزَّن مؤقتًا الحالة، غير نشطة والمكونات، يُصدِر النظام أي عمليات قفل التنشيط التي يحتفظ بها التطبيق.

بالإضافة إلى ذلك، لتحسين أداء الجهاز، يقيّد النظام بعض سلوكيات التطبيقات التي لا تعمل في المقدّمة. وعلى وجه التحديد:

  • يتم فرض قيود على مدى حرية التطبيقات التي تعمل في الخلفية حاليًا. يمكنهم الوصول إلى الخدمات التي تعمل في الخلفية.
  • لا يمكن للتطبيقات استخدام ملفات البيان الخاصة بها للتسجيل في معظم عمليات البث الضمنية. (أي عمليات البث التي لا تستهدف التطبيق على وجه التحديد).

بشكل تلقائي، لا يتم تطبيق هذه القيود إلا على التطبيقات التي تستهدف O. ومع ذلك، يمكن للمستخدمين تفعيل هذه القيود لأي تطبيق من شاشة الإعدادات، حتى إذا لم يستهدف التطبيق O.

يتضمّن إصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) أيضًا التغييرات التالية على طرق محدّدة:

  • تطرح الطريقة startService() الآن العلامة IllegalStateException إذا كان التطبيق عند استهداف إصدار Android 8.0، يحاول استخدام هذه الطريقة في موقف لا يُسمح فيه بإنشاء خدمات في الخلفية.
  • تبدأ طريقة Context.startForegroundService() الجديدة خدمة تعمل في المقدّمة. يسمح النظام بالتطبيقات للاتصال بـ Context.startForegroundService() حتى إذا كان التطبيق في الخلفية. ومع ذلك، يجب أن يطلب التطبيق طريقة startForeground() الخاصة بهذه الخدمة خلال خمس دقائق. بعد ثوانٍ من إنشاء الخدمة.

لمزيد من المعلومات، يُرجى مراجعة الحدود القصوى للتنفيذ في الخلفية:

حدود الموقع الجغرافي في الخلفية على أجهزة Android

من أجل الحفاظ على البطارية وتجربة المستخدم وسلامة النظام، تتلقّى تطبيقات الخلفية تحديثات الموقع الجغرافي بمعدّل أقل عند استخدامها على جهاز. ويعمل بنظام التشغيل Android 8.0. يؤثر تغيير السلوك هذا في جميع التطبيقات التي تتلقّى تحديثات للموقع الجغرافي، بما في ذلك "خدمات Google Play"

تؤثر هذه التغييرات في واجهات برمجة التطبيقات التالية:

  • موفِّر المواقع الجغرافية المدمج (FLP)
  • وضع الحدود الجغرافية
  • قياسات GNSS
  • إدارة المواقع
  • مدير Wi-Fi

لضمان تشغيل تطبيقك على النحو المتوقَّع، أكمِل الخطوات التالية:

  • راجِع منطق تطبيقك وتأكَّد من استخدام أحدث موقع جغرافي. واجهات برمجة التطبيقات.
  • التأكّد من أنّ تطبيقك يعرض السلوك الذي تتوقّعه في كل استخدام الحالة.
  • ننصحك باستخدام مُدمَج مزوّد الموقع الجغرافي (FLP) أو وضع الحدود الجغرافية لمعالجة حالات الاستخدام التي تعتمد على الموقع الجغرافي الحالي للمستخدم

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

اختصارات التطبيقات

يتضمّن الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) التغييرات التالية على اختصارات التطبيقات:

  • رقم بث "com.android.launcher.action.INSTALL_SHORTCUT" أصبح له أي تأثير في تطبيقك، لأنه أصبح ضمنيًا وخاصًا البث. وبدلاً من ذلك، يجب عليك إنشاء اختصار تطبيق باستخدام requestPinShortcut() من الفئة ShortcutManager.
  • ACTION_CREATE_SHORTCUT يمكن لـ intent الآن إنشاء اختصارات للتطبيقات التي تديرها باستخدام صف واحد (ShortcutManager). يمكن أن يؤدي هذا النية أيضًا إلى إنشاء اختصارات مشغّل التطبيقات القديمة التي لا تتفاعل مع ShortcutManager في السابق، كان هذا النية إنشاء اختصارات مشغّل التطبيقات القديمة فقط.
  • الاختصارات التي تم إنشاؤها باستخدام requestPinShortcut() والاختصارات التي تم إنشاؤها في نشاط يعالج ACTION_CREATE_SHORTCUT intent هي اختصارات شاملة للتطبيقات. نتيجةً لذلك، يمكن للتطبيقات الآن تحديثها. باستخدام الطرق الموجودة في ShortcutManager.
  • تحتفظ الاختصارات القديمة بوظائفها من الإصدارات السابقة من Android، ولكن سيكون عليك تحويلها إلى اختصارات التطبيق يدويًا في تطبيقك.

لمزيد من المعلومات عن التغييرات في اختصارات التطبيقات، يمكنك الاطّلاع على تثبيت الاختصارات دليل ميزات Widget.

اللغات والانتشار على نطاق عالمي

قدّم Android 7.0 (مستوى واجهة برمجة التطبيقات 24) مفهوم القدرة على تحديد لغة فئة افتراضية، ولكن استمرت بعض واجهات برمجة التطبيقات في استخدام Locale.getDefault() عامة بدون وسيطات، في حين أنّه يجب استخدام لغة الفئة التلقائية DISPLAY بدلاً من ذلك. في Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، تستخدم الطرق التالية الآن Locale.getDefault(Category.DISPLAY) بدلاً من Locale.getDefault():

Locale.getDisplayScript(Locale) أيضًا إلى Locale.getDefault() عند تم تحديد قيمة displayScript للسمة Locale الوسيطة غير متاحة.

تكون التغييرات الإضافية المتعلقة باللغة والتدويل التالي:

  • يؤدي الاتصال بـ Currency.getDisplayName(null) إلى طرح NullPointerException، لمطابقة السلوك الموثق.
  • تم تغيير تحليل اسم المنطقة الزمنية. في السابق، استخدمت أجهزة Android قيمة ساعة النظام عند التشغيل. وقت التخزين المؤقت لأسماء المناطق الزمنية المستخدمة في تحليل التاريخ أوقات. ونتيجة لذلك، قد يتأثر التحليل سلبًا إذا تم تحديث كانت الساعة خاطئة في وقت التشغيل أو في حالات أخرى نادرة.

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

  • يعمل نظام Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) على تحديث إصدار وحدة المعالجة المركزية (ICU) إلى الإصدار 58.

نوافذ التنبيهات

إذا كان أحد التطبيقات يستخدم SYSTEM_ALERT_WINDOW إذن وتستخدم أحد أنواع النوافذ التالية لمحاولة عرض نوافذ التنبيهات فوق التطبيقات الأخرى ونوافذ النظام:

...ثم تظهر هذه النوافذ دائمًا أسفل النوافذ التي تستخدم نافذة واحدة (TYPE_APPLICATION_OVERLAY) الكتابة. إذا كان التطبيق يستهدف الإصدار 8.0 من نظام التشغيل Android (المستوى 26 من واجهة برمجة التطبيقات)، يستخدم التطبيق TYPE_APPLICATION_OVERLAY نوع النافذة لعرض نوافذ التنبيهات.

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

الإدخال والتنقل

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

وعلى وجه الخصوص، لقد أجرينا التغييرات التالية على تركيز العناصر السلوك:

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

    إذا لم تكن تريد أن يستخدم كائن View هذا الخيار التلقائي إبرازها عندما يتم التركيز عليها، اضبط سمة android:defaultFocusHighlightEnabled إلى false في ملف XML للتنسيق الذي يحتوي على View، أو المرور خلال false إلى setDefaultFocusHighlightEnabled() ضمن منطق واجهة المستخدم لتطبيقك.

  • لاختبار تأثير إدخال لوحة المفاتيح على تركيز عنصر واجهة المستخدم، يمكنك تفعيل رسم > عرض خيار المطوِّر لحدود التصميم في Android 8.0، يعرض هذا الخيار علامة "X". فوق العنصر الذي يحتوي حاليًا على التركيز.

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

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

الملء التلقائي لنموذج الويب

والآن بعد أن تم تفعيل ميزة الملء التلقائي في Android يوفّر إطار العمل دعمًا مضمَّنًا لوظائف الملء التلقائي تم تغيير الطرق التالية المتعلقة بكائنات WebView بالنسبة إلى التطبيقات المثبَّتة على الأجهزة التي تعمل بنظام التشغيل Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات):

WebSettings
  • تشير رسالة الأشكال البيانية getSaveFormData() تُرجع الآن false. في السابق، أعادت هذه الطريقة true بدلاً من ذلك.
  • إجراء المكالمات setSaveFormData() لا يكون له أي تأثير.
WebViewDatabase
  • إجراء المكالمات clearFormData() لا يكون له أي تأثير.
  • تشير رسالة الأشكال البيانية طريقة واحدة (hasFormData()) تُرجع الآن false. في السابق، أعادت هذه الطريقة true عندما يحتوي النموذج على بيانات.

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

يتضمّن الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) التغييرات التالية المتعلّقة بتسهيل الاستخدام:

  • يحوّل الآن إطار عمل تسهيل الاستخدام كل إيماءات النقر المزدوج إلى ACTION_CLICK مناسبة. يسمح هذا التغيير لـ TalkBack بسلوك شبيه بغيره وخدمات تسهيل الاستخدام.

    إذا كانت كائنات View في تطبيقك تستخدِم اللمس المخصّص يجب أن تتأكد من أنها لا تزال تعمل مع TalkBack. قد تريد ما عليك سوى تسجيل معالج النقرات الذي اخترته View التي تستخدمها الكائنات. في حال استمرار عدم تمكّن ميزة TalkBack من التعرّف على الإيماءات التي تم تنفيذها على هذه الإيماءات عنصرَان (View)، تم تجاهلهما performAccessibilityAction()

  • أصبحت خدمات إمكانية الوصول الآن على دراية بجميع ClickableSpan نسخة في تطبيقك TextView عناصر

لمعرفة المزيد من المعلومات عن كيفية تسهيل الوصول إلى تطبيقك، يُرجى الاطّلاع على إمكانية الوصول:

الاتصال بالشبكات واتصال HTTP(S)

يتضمّن الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) التغييرات التالية في السلوك الاتصال بالشبكات واتصال HTTP(S):

  • طلبات OPTIONS بدون نص يحتوي على Content-Length: 0 . في السابق، لم يكن هناك عنوان Content-Length.
  • يعمل HttpURLConnection على تسوية عناوين URL التي تحتوي على مسارات فارغة من خلال إلحاق شرطة مائلة بعد اسم المضيف أو السلطة بشرطة مائلة. على سبيل المثال، يحوِّل http://example.com إلى http://example.com/
  • محدد مخصص للخادم الوكيل تم ضبطه من خلال ProxySelector.setDefault() تستهدف فقط عنوان (المخطط والمضيف والمنفذ) لعنوان URL المطلوب. ونتيجة لذلك، قد يعتمد اختيار الخادم الوكيل على تلك القيم فقط. عنوان URL الذي تم تمريره إلى أداة اختيار الخادم الوكيل المخصصة لا يتضمن عناوين URL المطلوبة أو المسار أو معلمات طلب البحث أو الأجزاء.
  • لا يمكن أن تحتوي معرّفات الموارد المنتظمة (URI) على تصنيفات فارغة.

    في السابق، كانت المنصة تتيح حلاً بديلاً لقبول التصنيفات الفارغة في استخدام غير قانوني لمعرّفات الموارد المنتظمة (URI). تم حل هذا الحل بـ مع إصدارات libcore القديمة. المطوّرون الذين يستخدمون واجهة برمجة التطبيقات بشكل غير صحيح رسالة ADB: "يحتوي URI example..com على تصنيفات فارغة في اسم المضيف. تمت كتابة هذا بطريقة غير صحيحة ولن يتم قبوله في نظام Android في المستقبل. الإصدارات". ويزيل Android 8.0 هذا الحل البديل، يقوم النظام بإرجاع قيمة فارغة لمعرّفات الموارد المنتظمة (URI) التي تمت صياغتها بشكل غير صحيح.

  • تنفيذ HttpsURLConnection في نظام Android 8.0 لا ينفذ الإجراء الاحتياطي غير الآمن لإصدار بروتوكول TLS/SSL.
  • تم تغيير التعامل مع اتصالات HTTP(S) النفقية على النحو التالي:
    • عند إجراء اتصال نفقي عبر HTTPS عبر الاتصال، يبدأ النظام يضع رقم المنفذ (:443) بشكل صحيح في سطر المضيف عند الإرسال هذه المعلومات إلى خادم وسيط. في السابق، كان المنفذ تم تسجيل الرقم في سطر CONNECT فقط.
    • لم يعد النظام يرسل تفويض وكيل المستخدم والخادم الوكيل العناوين من طلب نفقي إلى الخادم الوكيل.

      لم يعد النظام يرسل رأس تفويض الخادم الوكيل في اتصال Http(s)URLConnection بالخادم الوكيل عند إعداد نفق. بدلاً من ذلك، ينشئ النظام رأس تفويض الخادم الوكيل، وترسله إلى الخادم الوكيل عندما يرسل هذا الخادم الوكيل HTTP 407 استجابة للطلب الأولي.

      وبالمثل، لم يعد النظام ينسخ رأس وكيل المستخدم من الطلب النفقي إلى طلب الخادم الوكيل الذي يقوم بإعداد نفق. بدلاً من ذلك، تنشئ المكتبة رأس وكيل مستخدم لذلك. طلبك.

  • send(java.net.DatagramPacket) تطرح الطريقة SocketException إذا كانت القيمة Connect() التي تم تنفيذها سابقًا فشلت العملية.
    • يعيِّن DatagramSocket.connect() على pendingSocketException إذا كان هناك خطأ داخلي. قبل الإصدار 8.0 من Android، كانت إحدى عمليات recv() اللاحقة عرض خطأ SocketException على الرغم من نجاح استدعاء send(). لتحقيق الاتساق، يؤدي كلا الاستدعاءين الآن إلى ظهور SocketException.
  • تحاول InetAddress.isReachable() بروتوكول ICMP قبل الرجوع إلى TCP Echo والبروتوكول.
    • قد تتسبب بعض المضيفات التي تحظر المنفذ 7 (TCP Echo)، مثل google.com، في إذا قبلت بروتوكول ICMP Echo.
    • بالنسبة إلى المضيفين الذين لا يمكن الوصول إليهم حقًا، يعني هذا التغيير أن ضعف مقدار من الوقت الذي يتم قضاؤه قبل عودة المكالمة.

البلوتوث

يجري Android 8.0 (مستوى واجهة برمجة التطبيقات 26) التغييرات التالية على طول البيانات التي تشير إليها ScanRecord.getBytes() استرداد الطريقة:

  • لا تضع طريقة getBytes() افتراضات بشأن عدد وحدات البايت المستلمة. لذلك، لا ينبغي للتطبيقات الاعتماد على الحد الأدنى أو الحد الأقصى لعدد وحدات البايت التي يتم عرضها. بدلاً من ذلك، يجب عليه تقييم طول الصفيفة الناتجة.
  • قد تعرض الأجهزة المتوافقة مع Bluetooth 5 طول بيانات تتجاوز الحد الأقصى السابق هو 60 بايت تقريبًا.
  • إذا لم يقدّم الجهاز البعيد استجابة فحص، يجب أن يكون حجم الملف أقل من 60 بايت. أو إرجاعها أيضًا.

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

يجري Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) عددًا من التحسينات على إعدادات Wi-Fi لتسهيل الاختيار. شبكة Wi-Fi التي تقدم أفضل تجربة للمستخدم. تشمل التغييرات المحددة ما يلي:

  • تحسينات على مستوى الثبات والموثوقية:
  • واجهة مستخدم سهلة القراءة
  • قائمة واحدة موحدة لتفضيلات Wi-Fi.
  • التفعيل التلقائي لشبكة Wi-Fi على الأجهزة المتوافقة عند شبكة محفوظة عالية الجودة قريب.

الأمان

يتضمن Android 8.0 الميزات التالية المتعلقة بالأمان التغييرات:

  • لم يعد النظام الأساسي متوافقًا مع SSLv3.
  • عند إنشاء اتصال HTTPS بخادم لا يحتاج إلى بيانات بتنفيذ التفاوض على إصدار بروتوكول TLS، لم يعد "HttpsURLConnection" يحاول تنفيذ هذا الحل البديل الرجوع إلى الإصدارات السابقة لبروتوكول أمان طبقة النقل (TLS) وإعادة المحاولة
  • يطبِّق Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) نظام الحوسبة الآمنة (SECCOMP). الفلترة لعرض كل التطبيقات. تقتصر قائمة اتصالات النظم المسموح بها على تلك الكشف عنها من خلال البيولوجية. وعلى الرغم من توفير العديد من طلبات syscall الأخرى للتوافق مع الأنظمة القديمة، فإننا نوصي بعدم استخدامها.
  • يتم الآن تشغيل WebView عنصر في تطبيقك بعدة عمليات. الحالي. يتم التعامل مع محتوى الويب من خلال عملية منفصلة ومعزولة عن يحتوي على عملية التطبيق لتعزيز الأمان.
  • لم يعُد بإمكانك افتراض أنّ حِزم APK مضمّنة في الأدلة التي تنتهي أسماؤها. في -1 أو -2. يجب أن تستخدم التطبيقات sourceDir للحصول على الدليل، ولا تعتمد على تنسيق الدليل مباشرةً.
  • للحصول على معلومات عن تحسينات الأمان ذات الصلة باستخدام راجع المكتبات الأصلية.

بالإضافة إلى ذلك، يقدِّم الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) التغييرات التالية المتعلّقة بتثبيت التطبيقات غير المعروفة من مصادر غير معروفة:

  • قيمة الإعداد القديم أصبحت "INSTALL_NON_MARKET_APPS" الآن دائمًا 1. لتحديد ما إذا كان بإمكان مصدر غير معروف تثبيت التطبيقات باستخدام أداة تثبيت الحزمة، فيجب عليك بدلاً من ذلك استخدام القيمة المعروضة canRequestPackageInstalls()
  • إذا حاولت تغيير قيمة يتم استخدام INSTALL_NON_MARKET_APPS setSecureSetting()، UnsupportedOperationException التي تم رميها. لمنع المستخدمين من تثبيت التطبيقات غير المعروفة باستخدام التطبيقات غير المعروفة يجب عليك تطبيق مستخدم واحد (DISALLOW_INSTALL_UNKNOWN_SOURCES) القيد.
  • تتضمن الملفات الشخصية المُدارة التي تم إنشاؤها على الأجهزة التي تعمل بنظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) ما يلي تلقائيًا: مستخدم واحد (DISALLOW_INSTALL_UNKNOWN_SOURCES) تم تفعيل التقييد. بالنسبة إلى الملفات الشخصية المُدارة الحالية على الأجهزة التي الذي تمت ترقيته إلى Android 8.0، مستخدم واحد (DISALLOW_INSTALL_UNKNOWN_SOURCES) يتم تفعيل القيود تلقائيًا ما لم يفعّل مالك الملف الشخصي بشكلٍ صريح إيقاف هذا القيد (قبل الترقية) من خلال ضبط INSTALL_NON_MARKET_APPS إلى 1.

للحصول على تفاصيل إضافية عن تثبيت التطبيقات غير المعروفة، يمكنك الاطّلاع على تطبيق غير معروف دليل تثبيت الأذونات

للحصول على إرشادات إضافية حول تعزيز أمان تطبيقك، يُرجى الاطّلاع على الأمان لمطوّري تطبيقات Android:

الخصوصية

الإصدار Android 8.0 (مستوى واجهة برمجة التطبيقات 26) فيما يلي الميزات التالية المتعلقة بالخصوصية: حدوث تغييرات على المنصة.

  • أصبحت المنصة الآن تتعامل مع المعرّفات بشكل مختلف.
    • بالنسبة إلى التطبيقات التي تم تثبيتها قبل التحديث عبر الهواء إلى إصدار من Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) (مستوى واجهة برمجة التطبيقات 26)، قيمة لم تتغيّر قيمة ANDROID_ID ما لم يتم إلغاء تثبيتها ثم إعادة تثبيتها بعد التحديث عبر الهواء. للحفاظ على القيم عبر عمليات إلغاء التثبيت بعد التحديث عبر الهواء، يمكن للمطوّرين ربط القيم القديمة والجديدة باستخدام النسخ الاحتياطي للمفتاح/القيمة.
    • بالنسبة إلى التطبيقات المثبتة على جهاز يعمل بنظام التشغيل Android 8.0، فإن قيمة تم تحديد نطاق ANDROID_ID الآن. لكل مفتاح توقيع التطبيق وكذلك لكل مستخدم قيمة ANDROID_ID هو اسم فريد. لكل مجموعة من مفتاح توقيع التطبيق والمستخدم والجهاز. ونتيجة لذلك، يتم تشغيل التطبيقات التي تتضمن مفاتيح توقيع مختلفة على الجهاز نفسه لم يعد يظهر معرّف Android نفسه (حتى للمستخدم نفسه).
    • قيمة ANDROID_ID عند إلغاء تثبيت الحزمة أو إعادة تثبيتها، ما دام أن مفتاح التوقيع هو نفسه (ولم يتم تثبيت التطبيق قبل التحديث عبر الهواء إلى الإصدار 8.0 من Android).
    • قيمة ANDROID_ID لا يتغير حتى إذا تسبب تحديث النظام في تغيير مفتاح توقيع الحزمة.
    • على الأجهزة التي يتم شحنها باستخدام "خدمات Google Play" و"المعرّف الإعلاني" يجب استخدام المعرِّف الإعلاني. نظام بسيط وقياسي لتحقيق الربح من التطبيقات المعرِّف الإعلاني هو معرّف فريد يمكن للمستخدم إعادة ضبطه لأغراض الإعلانات. يتم توفيره بواسطة خدمات Google Play.

      من المفترض أن تواصل الشركات المصنِّعة للأجهزة الأخرى لتزويد ANDROID_ID.

  • ينتج عن طلب البحث عن خاصية النظام net.hostname قيمة خالية نتيجته.

تسجيل الاستثناءات غير المرصودة

في حال تثبيت أحد التطبيقات لـ Thread.UncaughtExceptionHandler التي تعمل على عدم الاتصال إلى Thread.UncaughtExceptionHandler التلقائي، يقوم النظام عدم إنهاء التطبيق في حالة حدوث استثناء غير اعترادي. بدءًا من في Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يسجّل النظام تتبُّع تسلسل استدعاء الدوال البرمجية للاستثناء في الحالة؛ في الإصدارات السابقة للنظام الأساسي، لم يكن للنظام قامت بتسجيل تسلسل استدعاء الدوال البرمجية للاستثناء.

ننصحك باستخدام سمة Thread.UncaughtExceptionHandler المخصّصة عمليات التنفيذ دائمًا إلى المعالج الافتراضي؛ لا تتأثر التطبيقات التي تتّبع هذا الاقتراح التغيير في Android 8.0.

تغيير توقيع findViewById()

تعرض جميع مثيلات الطريقة findViewById() الآن <T extends View> T بدلاً من View. هذا التغيير للآثار التالية:

  • وقد ينتج عن ذلك الكود الحالي الذي أصبح من الواضح الآن نوع الإرجاع، على سبيل المثال، إذا كان هناك كل من someMethod(View) someMethod(TextView) الذي يأخذ نتيجة مكالمة إلى findViewById()
  • عند استخدام اللغة المصدر في Java 8، يتطلب ذلك إرسالًا صريحًا إلى View عندما يكون نوع الإرجاع غير مقيّد (على سبيل المثال، assertNotNull(findViewById(...)).someViewMethod())
  • إلغاء طرق findViewById() غير النهائية (لـ مثال، Activity.findViewById()) سيحتاج إلى إرجاعه تم تحديث النوع.

تغيير إحصاءات استخدام مزوِّد جهات الاتصال

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

سيظل بإمكان التطبيقات قراءة هذه البيانات إذا طلبت ذلك. READ_CONTACTS إذن. في Android 8.0 (مستوى واجهة برمجة التطبيقات 26) والإصدارات الأحدث، يتم عرض طلبات بيانات الاستخدام قيم تقريبية بدلاً من قيم دقيقة. يحافظ نظام Android على داخليًا، وبالتالي لا يؤثر هذا التغيير في واجهة برمجة التطبيقات للإكمال التلقائي.

يؤثر هذا التغيير في السلوك في مَعلمات طلب البحث التالية:

معالجة المجموعة

AbstractCollection.removeAll() وAbstractCollection.retainAll() والآن رمي NullPointerException دائمًا؛ في السابق، لم يتم طرح NullPointerException عندما تمت المجموعة فارغ. هذا التغيير يجعل السلوك متسقًا مع التوثيق.

Android Enterprise

Android 8.0 (مستوى واجهة برمجة التطبيقات 26) يغيّر سلوك بعض واجهات برمجة التطبيقات والميزات لتطبيقات المؤسسات، بما في ذلك الأجهزة وحدات التحكم في السياسات (DPC). تشمل التغييرات ما يلي:

  • سلوكيات جديدة لمساعدة التطبيقات في إتاحة الملفات الشخصية للعمل على الأجهزة المُدارة بالكامل
  • تغييرات معالجة تحديثات النظام والتحقق من التطبيقات والمصادقة زيادة سلامة الجهاز والنظام.
  • تحسينات على تجربة المستخدم في توفير المتطلبات اللازمة والإشعارات شاشة الإشعارات الأخيرة وشبكة VPN قيد التشغيل دائمًا

للاطّلاع على كل التغييرات التي أُجريت على الإصدار الخاص بالمؤسسات في Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) ومعرفة كيفية تؤثر في تطبيقك، يُرجى قراءة Android في Enterprise

التطبيقات التي تستهدف الإصدار 8.0 من نظام التشغيل Android

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

نوافذ التنبيهات

التطبيقات التي تستخدم SYSTEM_ALERT_WINDOW لم يعد بإمكان الإذن استخدام أنواع النوافذ التالية لعرض نوافذ التنبيهات فوق التطبيقات الأخرى ونوافذ النظام:

بدلاً من ذلك، يجب أن تستخدم التطبيقات نوع نافذة جديدًا يُسمى TYPE_APPLICATION_OVERLAY

عند استخدام نافذة واحدة (TYPE_APPLICATION_OVERLAY) الكتابة لعرض نوافذ تنبيه لتطبيقك، مع مراعاة الخصائص التالية من نوع النافذة الجديد في الاعتبار:

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

إشعارات تغيير المحتوى

يغيّر Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) الطريقة التي يتم بها ContentResolver.notifyChange() وregisterContentObserver(Uri, boolean, ContentObserver) سلوك أفضل للتطبيقات التي تستهدف الإصدار 8.0 من نظام التشغيل Android.

تتطلّب واجهات برمجة التطبيقات هذه الآن أن تكون قيمة ContentProvider صالحة للسلطة في جميع أنحاء Uris. سيؤدي تحديد ContentProvider صالح يتضمن الأذونات ذات الصلة إلى: المساعدة في حماية تطبيقك من تغييرات المحتوى من التطبيقات الضارة ومنعك بداية من تسرب البيانات التي يحتمل أن تكون خاصة إلى التطبيقات الضارة.

عرض التركيز

العناصر View القابلة للنقر يمكن التركيز عليها الآن أيضًا من خلال الافتراضي. إذا أردت أن يكون الكائن View قابلاً للنقر ولكن لا يمكن النقر عليه التركيز عليه، وضبط السمة android:focusable إلى false في التنسيق ملف XML يحتوي على View، أو بطاقة في false إلى setFocusable() في واجهة مستخدم تطبيقك المنطق.

مطابقة وكيل المستخدم في رصد المتصفِّح

يتضمّن الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) والإصدارات الأحدث سلسلة معرّف الإصدار OPR. قد تؤدي بعض مطابقات الأنماط التسبب في حدوث خطأ في تحديد منطق اكتشاف المتصفح لأي متصفح غير Opera باسم Opera. في ما يلي مثال على مطابقة النمط هذه:

if(p.match(/OPR/)){k="Opera";c=p.match(/OPR\/(\d+.\d+)/);n=new Ext.Version(c[1])}

لتجنّب المشاكل الناتجة عن إساءة تحديد الهوية هذه، استخدِم سلسلة غير OPR كنمط مطابق لمتصفّح Opera.

الأمان

تؤثّر التغييرات التالية في الأمان في الإصدار 8.0 من نظام التشغيل Android (المستوى 26 لواجهة برمجة التطبيقات):

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

للحصول على إرشادات إضافية حول تعزيز أمان تطبيقك، يُرجى الاطّلاع على الأمان لمطوّري تطبيقات Android:

الوصول إلى الحساب وقابلية اكتشافه

في الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، لن يعود بإمكان التطبيقات الوصول إلى البيانات. إلى حسابات مستخدمين ما لم يكن المصادق يمتلك الحسابات أو المستخدم يمنح إذن الوصول هذا. تشير رسالة الأشكال البيانية إذن "GET_ACCOUNTS" لم يعد كافيًا. لكي يتم منح التطبيقات إذن الوصول إلى أحد الحسابات، يجب إما استخدام AccountManager.newChooseAccountIntent() أو برنامج مصادقة خاص . بعد الحصول على إمكانية الوصول إلى الحسابات، يمكن للتطبيق الاتصال AccountManager.getAccounts() الوصول إليها.

إيقاف Android 8.0 نهائيًا LOGIN_ACCOUNTS_CHANGED_ACTION حملة التطبيقات يجب بدلاً من ذلك استخدام addOnAccountsUpdatedListener() للحصول على آخر الأخبار عن الحسابات أثناء وقت التشغيل.

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

الخصوصية

تؤثّر التغييرات التالية في الخصوصية في الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات).

  • خصائص النظام net.dns1، net.dns2، لم يعُد net.dns3 وnet.dns4 وهو تغيير يحسن الخصوصية على المنصة.
  • للحصول على معلومات الشبكات مثل خوادم نظام أسماء النطاقات، فإن التطبيقات التي تحتوي على ACCESS_NETWORK_STATE يمكن للإذن تسجيل NetworkRequest أو كائن NetworkCallback. تتوفّر هذه الفئات في الإصدار Android 5.0 (المستوى 21 من واجهة برمجة التطبيقات) والإصدارات الأحدث.
  • تم إيقاف Build.SERIAL نهائيًا. على التطبيقات التي تحتاج إلى معرفة الرقم التسلسلي للجهاز بدلاً من ذلك استخدام طريقة Build.getSerial() الجديدة التي تتطلب READ_PHONE_STATE إذن.
  • لم تعُد واجهة برمجة التطبيقات "LauncherApps" تسمح باستخدام ملف العمل. التطبيقات للحصول على معلومات حول الملف الشخصي الأساسي. عندما يكون المستخدم في العمل تعمل واجهة برمجة التطبيقات LauncherApps كما لو لم يكن هناك أي تطبيقات يتم تثبيتها في ملفات شخصية أخرى ضمن مجموعة الملفات الشخصية نفسها. كما في السابق، تحاول الوصول إلى الملفات الشخصية غير ذات الصلة إلى أسباب تتعلق بـ SecurityExceptions.

الأذونات

قبل الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، إذا طلب أحد التطبيقات إذنًا تم منح الإذن أثناء التشغيل، غيّر النظام أيضًا منح التطبيق باقي الأذونات التي تنتمي إلى نفس والتي تم تسجيلها في ملف البيان.

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

على سبيل المثال، لنفترض أنّ أحد التطبيقات يعرض كلاً من READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE في ملف البيان الخاص به. يطلب التطبيق READ_EXTERNAL_STORAGE يمنحه المستخدم. وإذا كان التطبيق يستهدف المستوى 25 من واجهة برمجة التطبيقات أو أقل، سيجري النظام أيضًا لمنح WRITE_EXTERNAL_STORAGE بالمقدار نفسه لأنه ينتمي إلى مجموعة الأذونات STORAGE نفسها المسجلة في البيان. إذا كان التطبيق يستهدف الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، سيمنحه النظام READ_EXTERNAL_STORAGE فقط في ذلك الوقت؛ ولكن إذا طلب التطبيق WRITE_EXTERNAL_STORAGE لاحقًا، سيطلب النظام على الفور يمنح هذا الامتياز بدون طلب إذن من المستخدم.

الوسائط

  • يمكن لإطار العمل تنفيذ تجنُّب التداخل مع أصوات أخرى في حد ذاته. في هذه الحالة، عندما يطلب تطبيق آخر التركيز مع AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK، التطبيق التي تحتوي على تركيز يقلل من مستوى الصوت ولكنها لا تتلقى عادةً onAudioFocusChange() معاودة الاتصال ولن وتفقد تركيز الصوت. تتوفر واجهات برمجة تطبيقات جديدة لإلغاء هذا السلوك في التطبيقات التي تحتاج إلى التوقف مؤقتًا بدلاً من تجنب التداخل.
  • عندما يتلقّى المستخدم مكالمة هاتفية، يتم كتم صوت مجموعات بث الوسائط النشطة طوال مدة الاتصال.
  • يجب أن تستخدم جميع واجهات برمجة التطبيقات المتعلقة بالصوت AudioAttributes بدلاً من أنواع البث الصوتي لوصف حالة استخدام تشغيل الصوت. يمكنك مواصلة استخدام أنواع البث الصوتي للتحكّم في مستوى الصوت فقط. ما زالت الاستخدامات الأخرى لأنواع البث صالحة. (على سبيل المثال، وسيطة streamType إلى قيمة متوقفة نهائيًا دالة الإنشاء AudioTrack)، ولكن النظام يسجل هذا كخطأ.
  • عند استخدام AudioTrack، إذا كان التطبيق يطلب مخزنًا مؤقتًا صوتيًا كبيرًا كافيًا، استخدام ناتج المخزن المؤقت العميق إذا كان متاحًا.
  • في الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، تختلف طريقة تعامل أحداث أزرار الوسائط:
    1. التعامل مع أزرار الوسائط عدم حدوث تغيير في نشاط واجهة المستخدم: تظلّ الأنشطة التي تعمل في المقدّمة تحظى بالأولوية في التعامل مع البيانات أحداث زر الوسائط.
    2. إذا كان نشاط المقدّمة لا يعالج حدث زر الوسائط، سيوجِّه النظام الحدث إلى التطبيق الذي شغّل المحتوى الصوتي محليًا حالة النشاط والعلامات والتشغيل عندما لا يتم أخذ حالة جلسة الوسائط في الاعتبار عند تحديد التطبيق الذي يتلقى الوسائط أحداث الأزرار.
    3. إذا تم إصدار جلسة وسائط التطبيق، يرسل النظام حدث زر الوسائط إلى MediaButtonReceiver إذا كان يحتوي على قيمة.
    4. في كل الحالات الأخرى، يتجاهل النظام حدث زر الوسائط.

المكتبات الأصلية

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

لمزيد من المعلومات، يُرجى مراجعة الشرائح القابلة للكتابة والقابلة للتنفيذ:

ترتبط تغييرات الروابط بمستوى واجهة برمجة التطبيقات الذي يستهدفه التطبيق. إذا كان هناك هو تغيير في الربط مستوى واجهة برمجة تطبيقات مستهدَفًا، يتعذّر على التطبيق تحميل المكتبة. إذا كنت تستهدف مستوى واجهة برمجة تطبيقات أقل من مستوى واجهة برمجة التطبيقات الذي يحدث فيه تغيير الرابط، يعرض Logcat تحذيرًا.

معالجة المجموعة

في Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، يتم تنفيذ Collections.sort() في الجزء العلوي من List.sort(). العكس كانت صحيحة في الإصدار 7.x من نظام التشغيل Android (المستوى 24 و25 من واجهة برمجة التطبيقات): التنفيذ التلقائي لـ List.sort() يسمى Collections.sort().

يتيح هذا التغيير لـ "Collections.sort()" للاستفادة من ميزات List.sort() المحسّنة جديدة، ولكن لديها القيود التالية:

  • عمليات تنفيذ List.sort() يجب ألا يتم استدعاء Collections.sort()، لأن ذلك سيؤدي إلى تجاوز سعة التكديس بسبب التكرار اللانهائي. بدلاً من ذلك، إذا كنت تريد أن يكون السلوك التلقائي في عملية تنفيذ List، عليك تجنُّب إلغاء sort()

    إذا نفّذت إحدى الصفوف الرئيسية السمة sort() بشكل غير ملائم، تكون عادةً ما يكون من الجيد تجاوز List.sort() من خلال تنفيذ يعتمد على List.toArray(), Arrays.sort()، ListIterator.set() مثلاً:

    @Override
    public void sort(Comparator<? super E> c) {
      Object[] elements = toArray();
      Arrays.sort(elements, c);
      ListIterator<E> iterator = (ListIterator<Object>) listIterator();
      for (Object element : elements) {
        iterator.next();
        iterator.set((E) element);
      }
    }
    

    في معظم الحالات، يمكنك أيضًا إلغاء List.sort() باستخدام تنفيذ يفوض إلى إعدادات عمليات التنفيذ اعتمادًا على مستوى واجهة برمجة التطبيقات. مثلاً:

    @Override
    public void sort(Comparator<? super E> comparator) {
      if (Build.VERSION.SDK_INT <= 25) {
        Collections.sort(this);
      } else {
        super.sort(comparator);
      }
    }
    

    أمّا إذا كنت تريد استخدام sort()، المتاحة على جميع مستويات واجهة برمجة التطبيقات، ننصحك بوضع اسم فريد لها، مثل sortCompat()، بدلاً من إلغاء sort()

  • يتم الآن احتساب Collections.sort() كـ تعديل هيكلي في سرد عمليات التنفيذ التي تستدعي sort(). على سبيل المثال، في إصدارات بالنظام الأساسي قبل الإصدار Android 8.0 (مستوى واجهة برمجة التطبيقات 26)، بالتكرار ArrayList والاتصال بـ sort() عليه جزئيًا من خلال التكرار كانت لرمي ConcurrentModificationException إذا كان الترتيب قد تم من خلال الاتصال بـ List.sort(). Collections.sort() لم تطرح استثناء.

    يؤدي هذا التغيير إلى جعل سلوك المنصة أكثر اتساقًا: ينتج عنها ConcurrentModificationException.

سلوك تحميل الصف

يتحقّق Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) للتأكّد من عدم وجود كسر افتراضات بيئة التشغيل عند تحميل فئات جديدة. ويتم إجراء عمليات التحقق هذه سواء تمت الإشارة إلى الفئة من Java (من forName())، رمز Dalvik البايت أو JNI. لا يعترض النظام الأساسي المكالمات المباشرة من Java إلى طريقة loadClass()، ولا يتم التحقّق منها نتائج هذه المكالمات. ولا ينبغي أن يؤثر هذا السلوك في أداء أصحاب التصرفات السليمة محملات الفئات.

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

تتحقّق المنصة أيضًا من صلاحية وصف الفئات المطلوبة. هذا النمط تحقّق من التقاط استدعاءات JNI التي تُحمِّل بشكل غير مباشر فئات مثل GetFieldID()، لتمرير كلمات وصفية غير صالحة إلى تلك الفئات. على سبيل المثال، حقل يحتوي على توقيع لم يتم العثور على java/lang/String لأنّ هذا التوقيع غير صالح. من المفترض أن تكون Ljava/lang/String;.

يختلف ذلك عن اتصال JNI بالأرقام FindClass(). حيث يكون java/lang/String اسمًا صالحًا ومؤهلاً بالكامل.

لا يتيح الإصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات) إمكانية محاولة عدة برامج تحميل للفئات تحديد الفئات. باستخدام كائن DexFile نفسه. وتتسبب أي محاولة لإجراء ذلك في طرح وقت تشغيل Android InternalError خطأ في الرسالة "محاولة تسجيل ملف dex <filename> باستخدام محمّلات فئات متعددة".

تم إيقاف واجهة برمجة التطبيقات DexFile API نهائيًا، وننصحك بشدة باستخدام إحدى أدوات تحميل الفئات على النظام الأساسي، بما في ذلك PathClassLoader أو BaseDexClassLoader بدلاً من ذلك.

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

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

تنبيه: في إصدارات المنصة أقل من Android 8.0 (مستوى واجهة برمجة التطبيقات 26)، إلا أن كسر هذه الافتراضات قد يؤدي إلى تحديد الفئة عدة مرات، وتلف في أكوام من الذاكرة بسبب ارتباك الفئات، والآثار غير المرغوب فيها الأخرى.