التغييرات في سلوك الإصدار 7.0 من نظام التشغيل Android

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

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

البطارية والذاكرة

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

القيلولة

تم طرح ميزة "القيلولة" في إصدار Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات) لتحسين عمر البطارية من خلال تأجيل أنشطة وحدة المعالجة المركزية (CPU) والشبكة عندما يترك المستخدم الجهاز غير متصل بمصدر طاقة، ثابتة، وعند إطفاء الشاشة. يوفّر Android 7.0 ميزات إضافية تحسينات على ميزة Doze من خلال تطبيق مجموعة فرعية من قيود وحدة المعالجة المركزية (CPU) والشبكة عندما يكون الجهاز غير متصل مع إيقاف تشغيل الشاشة، ولكن ليس بالضرورة ثابتة، على سبيل المثال، عند وضع الهاتف في جيب المستخدم.

صورة توضيحية لكيفية تطبيق ميزة "القيلولة" على المستوى الأول من
  القيود المفروضة على أنشطة النظام لتحسين عمر البطارية

الشكل 1. صورة توضيحية لكيفية تطبيق ميزة "القيلولة" على المستوى الأول من القيود المفروضة على أنشطة النظام لتحسين عمر البطارية.

عندما يعمل الجهاز على طاقة البطارية، ويتم إيقاف الشاشة لفترة محددة يدخل الجهاز في وضع القيلولة ويطبّق المجموعة الفرعية الأولى من القيود: ويوقف الوصول إلى شبكة التطبيقات ويؤجل المهام والمزامنة. إذا كان الجهاز ثابتًا لفترة معينة بعد الدخول إلى "قيلولة"، يطبق النظام باقي قيود "القيلولة" على PowerManager.WakeLock، AlarmManager تنبيهات وعمليات البحث عن نظام تحديد المواقع العالمي (GPS) وشبكة Wi-Fi بغض النظر عن سواء تم تطبيق بعض قيود "القيلولة" أو جميعها، يوقظ النظام الجهاز لفترات الصيانة القصيرة، والتي يتم خلالها السماح بالتطبيقات الوصول إلى الشبكة ويمكنه تنفيذ أي مهام/عمليات مزامنة مؤجلة.

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

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

لاحظ أن تنشيط الشاشة على الجهاز أو توصيله يخرج من القيلولة إزالة قيود المعالجة هذه. ولا يؤدي السلوك الإضافي إلى سيؤثر في الاقتراحات وأفضل الممارسات المتمثلة في تكييف تطبيقك مع تم طرح إصدار Doze في Android 6.0 (المستوى 23 من واجهة برمجة التطبيقات)، كما هو موضَّح في التحسين لاستخدام ميزة "القيلولة" و"وضع الاستعداد للتطبيقات" لا يزال يتعين عليك اتّبِع هذه الاقتراحات، مثل استخدام خدمة "المراسلة عبر السحابة الإلكترونية من Firebase" (FCM) وإرسال الرسائل وتلقيها، وبدء التخطيط للتحديثات لاستيعاب السلوك الإضافي للقيلولة.

Project Svelte: تحسينات في الخلفية

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

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

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

للحدّ من هذه المشاكل، يطبّق Android 7.0 ما يلي: التحسينات:

  • لن يتم تلقّي التطبيقات التي تستهدف الإصدار 7.0 من نظام التشغيل Android (المستوى 24 لواجهة برمجة التطبيقات) والإصدارات الأحدث CONNECTIVITY_ACTION عمليات بث إذا كانت الإشارة إلى مستقبِل البث في البيان. وستظل التطبيقات تلقّي CONNECTIVITY_ACTION إعلان على جميع الأجهزة في حال التسجيل BroadcastReceiver مع Context.registerReceiver() وهذا السياق لا يزال صالحًا.
  • لم يعُد النظام يرسل ACTION_NEW_PICTURE أو ACTION_NEW_VIDEO رسائل بث. هذا التحسين يؤثر في جميع التطبيقات، وليس فقط في التطبيقات التي تستهدف الإصدار 7.0 من نظام التشغيل Android.

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

لمزيد من المعلومات حول تحسينات الخلفية في Android 7.0 (مستوى واجهة برمجة التطبيقات 24) وكيفية تعديل تطبيقك، راجِع الخلفية التحسينات:

تغييرات الأذونات

يشمل الإصدار Android 7.0 تغييرات على الأذونات التي قد تؤثر في تطبيقك.

التغييرات في أذونات نظام الملفات

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

  • يجب ألا يعمل المالك على تخفيف أذونات الملفات الخاصة، ومحاولة إجراء ذلك باستخدام MODE_WORLD_READABLE و/أو MODE_WORLD_WRITEABLE، سيؤدي إلى تشغيل SecurityException

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

  • قد يؤدي تمرير file:// معرف موارد منتظم (URI) خارج نطاق الحزمة إلى ترك مستلم مسار لا يمكن الوصول إليه. لذلك، يحاول تمرير يشغّل معرّف الموارد المنتظم (URI) file:// FileUriExposedException تتمثل الطريقة الموصى بها لمشاركة استخدام محتوى ملف خاص بـ FileProvider.
  • لم يعد بإمكان DownloadManager المشاركة بشكل خاص الملفات المخزنة حسب اسم الملف. قد ينتهي الأمر بالتطبيقات القديمة مسار لا يمكن الوصول إليه عند الدخول إلى COLUMN_LOCAL_FILENAME. استهداف التطبيقات يشغّل الإصدار 7.0 من نظام Android أو الإصدارات الأحدث SecurityException عند محاولة الوصول COLUMN_LOCAL_FILENAME التطبيقات القديمة التي تضبط موقع التنزيل على موقع عام من خلال استخدام DownloadManager.Request.setDestinationInExternalFilesDir() أو DownloadManager.Request.setDestinationInExternalPublicDir() لا يزال بإمكانهم الوصول إلى المسار في ومع ذلك، فإن COLUMN_LOCAL_FILENAME لا يُنصح باستخدامها أبدًا. الطريقة المفضلة للوصول إلى ملف التي تم الكشف عنها بواسطة DownloadManager تستخدم ContentResolver.openFileDescriptor()

مشاركة الملفات بين التطبيقات

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

لمشاركة الملفات بين التطبيقات، يجب إرسال معرّف موارد منتظم (URI) للسمة content:// ومنح إذن وصول مؤقت إلى عنوان URI. وتتمثل أسهل طريقة لمنح هذا الإذن في باستخدام الفئة FileProvider. لمزيد من المعلومات على الأذونات ومشاركة الملفات، راجِع مشاركة الملفات.

تحسينات تسهّل الاستخدام

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

تكبير/تصغير الشاشة

يتيح Android 7.0 للمستخدمين ضبط حجم شاشة العرض الذي يتم تكبيره أو تقليص جميع العناصر على الشاشة، وبالتالي تحسين إمكانية الوصول إلى الجهاز للمستخدمين الذين يعانون من ضعف البصر. لا يمكن للمستخدمين تكبير/تصغير الشاشة بما يتجاوز الحد الأدنى للشاشة عرض sw320dp، وهو عرض جهاز Nexus 4، وهو هاتف شائع متوسط الحجم.

شاشة تعرض حجم عرض غير تكبير لجهاز يعمل بصورة نظام Android 7.0
شاشة تعرض تأثير زيادة حجم عرض جهاز يعمل بصورة نظام التشغيل Android 7.0

الشكل 3. تعرض الشاشة الموجودة على اليمين تأثير زيادة حجم العرض على جهاز يعمل بصورة نظام التشغيل Android 7.0.

عندما تتغير كثافة الجهاز، يرسل النظام إشعارًا إلى التطبيقات قيد التشغيل في الطرق التالية:

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

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

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

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

  • تجنَّب تحديد الأبعاد بوحدات بكسل، لأنّها لا تتيح المقياس وكثافة الشاشة. بدلاً من ذلك، يمكنك تحديد سمات باستخدام طريقة مستقلة عن الكثافة. بكسل (dp).

إعدادات الرؤية في معالِج الإعداد

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

ربط تطبيقات NDK بمكتبات النظام الأساسي

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

هناك ثلاث طرق قد يحاول بها تطبيقك الوصول إلى النظام الأساسي الخاص واجهات برمجة التطبيقات:

  • يصل تطبيقك مباشرةً إلى مكتبات المنصات الخاصة. يجب تحديث تطبيقك لتضمين نسخته الخاصة من هذه المكتبات أو استخدام واجهات برمجة تطبيقات NDK العامة.
  • يستخدم تطبيقك مكتبة تابعة لجهة خارجية يمكنها الوصول إلى منصة خاصة. المكتبات. حتى في حال التأكّد من أنّ تطبيقك لا يمكنه الوصول إلى المكتبات الخاصة مباشرةً، يظل عليك اختبار تطبيقك لمعرفة ذلك السيناريو.
  • يشير تطبيقك إلى مكتبة غير مضمّنة في حزمة APK الخاصة به. بالنسبة مثلاً، قد يحدث هذا إذا حاولت استخدام نسختك الخاصة من OpenSSL ولكن نسيت إرفاقه مع حزمة APK لتطبيقك. قد يعمل التطبيق بشكل طبيعي على الإصدارات. من نظام Android الأساسي الذي يشمل libcrypto.so. ومع ذلك، فإن التطبيق قد يحدث عطل في الإصدارات الأحدث من Android التي لا تتضمن هذه المكتبة (مثل الإصدار 6.0 من Android والإصدارات الأحدث). لإصلاح هذه المشكلة، تأكد من تجميع جميع المكتبات غير NDK التابعة لك باستخدام حزمة APK.

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

للحدّ من تأثير هذا الحظر في الوقت الحالي التطبيقات التي تم إصدارها، وهي مجموعة من المكتبات التي تشهد استخدامًا كبيرًا، مثل libandroid_runtime.so، libcutils.so، libcrypto.so وlibssl.so — مؤقتًا متاحة على الإصدار 7.0 من نظام التشغيل Android (المستوى 24 من واجهة برمجة التطبيقات) للتطبيقات التي تستهدف المستوى 23 من واجهة برمجة التطبيقات أو أَقَل إذا كان تطبيقك يحمِّل إحدى هذه المكتبات، يُنشئ Logcat تحذيرًا. وسيظهر إشعار على الجهاز المستهدف لإشعارك. إذا رأيت هذه يجب تحديث تطبيقك إما لتضمين نسخته الخاصة من تلك أو تستخدم فقط واجهات برمجة تطبيقات NDK العامة. الإصدارات المستقبلية من Android تقييد استخدام المكتبات الخاصة بشكل تام وقد يتسبب في تعطُّل التطبيق.

تعرض جميع التطبيقات خطأ في بيئة التشغيل عند استدعاء واجهة برمجة تطبيقات ليست ذات صلة للجمهور أو الوصول إليها بشكل مؤقت. والنتيجة هي يعود كل من "System.loadLibrary" و"dlopen(3)" NULL، وقد يتسبب في تعطُّل تطبيقك. ينبغي لك مراجعة رمز تطبيق برمجي لإزالة استخدام واجهات برمجة التطبيقات الخاصة بالنظام الأساسي الخاص واختبار تطبيقاتك بدقة باستخدام جهاز أو محاكي يعمل بالإصدار 7.0 من نظام التشغيل Android (المستوى 24 من واجهة برمجة التطبيقات). إذا كنت إذا لم تكن متأكدًا مما إذا كان تطبيقك يستخدم مكتبات خاصة، يمكنك التحقّق من سجلّ Logcat لتحديد الخطأ في بيئة التشغيل.

يصف الجدول التالي السلوك الذي ينبغي أن تتوقع رؤيته من بناءً على استخدامه للمكتبات الخاصة الأصلية وواجهة برمجة التطبيقات المستهدَفة المستوى (android:targetSdkVersion).

المكتبات مستوى واجهة برمجة التطبيقات المستهدف الوصول إلى بيئة التشغيل من خلال الرابط الديناميكي سلوك الإصدار Android 7.0 (مستوى واجهة برمجة التطبيقات 24) سلوك نظام Android الأساسي في المستقبل
عامة NDK هل لديك تسهيل الاستخدام يعمل على النحو المتوقع يعمل على النحو المتوقع
خاصة (مكتبات خاصة يمكن الوصول إليها مؤقتًا) 23 أو أقل يمكن الوصول إليها مؤقتًا يعمل كما هو متوقع، ولكن تتلقى تحذير Logcat. خطأ في بيئة التشغيل
خاصة (مكتبات خاصة يمكن الوصول إليها مؤقتًا) 24 أو أعلى محظور خطأ في بيئة التشغيل خطأ في بيئة التشغيل
خاص (غير ذلك) هل لديك محظور خطأ في بيئة التشغيل خطأ في بيئة التشغيل

التحقّق ممّا إذا كان تطبيقك يستخدم مكتبات خاصة

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

03-21 17:07:51.502 31234 31234 W linker  : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120

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

java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"
("/system/lib/libcutils.so") needed or dlopened by
"/system/lib/libnativeloader.so" is not accessible for the namespace
"classloader-namespace"
  at java.lang.Runtime.loadLibrary0(Runtime.java:977)
  at java.lang.System.loadLibrary(System.java:1602)

قد تظهر لك أيضًا مخرجات Logcat هذه إذا كان تطبيقك يستخدم مكتبات تابعة لجهات خارجية. ترتبط ديناميكيًا بواجهات برمجة تطبيقات النظام الأساسي الخاص. تتيح لك أداة readelf في يسمح لك Android 7.0DK بإنشاء قائمة بجميع الروابط المشتركة المرتبطة ديناميكيًا المكتبات لملف .so معيّن من خلال تنفيذ الأمر التالي:

aarch64-linux-android-readelf -dW libMyLibrary.so

تحديث تطبيقك

فيما يلي بعض الخطوات التي يمكنك اتخاذها لإصلاح هذه الأنواع من الأخطاء للتأكّد من عدم تعطُّل تطبيقك عند تحديثات النظام الأساسي المستقبلية:

  • إذا كان تطبيقك يستخدم مكتبات للأنظمة الأساسية الخاصة، يجب تحديثه لتضمين نسخته الخاصة من هذه المكتبات أو تستخدم واجهات برمجة تطبيقات NDK العامة.
  • إذا كان تطبيقك يستخدم مكتبة تابعة لجهة خارجية يمكنها الوصول إلى الرموز الخاصة، يُرجى التواصل مع مؤلف المكتبة لتحديث المكتبة.
  • احرِص على جمع جميع المكتبات التي لا تتبع NDK باستخدام حزمة APK.
  • استخدام دوال JNI العادية بدلاً من getJavaVM getJNIEnv من libandroid_runtime.so:
    AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
    AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
    JavaVM::AttachCurrentThread from <jni.h>.
    
  • استخدام __system_property_get بدلاً من property_get الخاص من libcutils.so. لإجراء ذلك، استخدِم __system_property_get. تشمل ما يلي:
    #include <sys/system_properties.h>
    

    ملاحظة: يكون مدى توفُّر خصائص النظام ومحتواها متاحًا لم يتم اختبارها من خلال CTS. الحل الأفضل هو تجنب استخدام هذه الخصائص تمامًا.

  • استخدِم نسخة محلية من الرمز SSL_ctrl من libcrypto.so. على سبيل المثال، يجب ربط libcyrpto.a بشكل ثابت في ملف .so أو تضمين إصدار مرتبط ديناميكيًا من libcrypto.so من BoingSSL/OpenSSL وحزمه في حزمة APK.

Android for Work

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

  • يجب تثبيت أداة تثبيت شهادات مفوَّضة قبل أن تتمكّن وحدة التحكّم بسياسة الجهاز (DPC) من ضبط بها. لكل من تطبيقات مالك الجهاز والملفات الشخصية التي تستهدف الإصدار 7.0 من نظام التشغيل Android (المستوى 24 من واجهة برمجة التطبيقات)، عليك تثبيت أداة تثبيت الشهادات المفوَّضة قبل سياسة الجهاز. طلبات وحدة التحكّم (DPC) DevicePolicyManager.setCertInstallerPackage() إذا كانت أداة التثبيت لم يتم تثبيته بالفعل، يطرح النظام رسالة IllegalArgumentException
  • إعادة ضبط قيود كلمات المرور لمشرفي الأجهزة تنطبق الآن على الملف الشخصي مالكين. لم يعُد بإمكان مشرفي الجهاز استخدام DevicePolicyManager.resetPassword() لمحو كلمات المرور أو تغييرها تلك التي تم تعيينها بالفعل. لا يزال بإمكان مشرفي الجهاز ضبط كلمة مرور، ولكن فقط عندما لا يتضمن الجهاز كلمة مرور أو رقم تعريف شخصي أو نقش
  • يمكن لمالكي الأجهزة والملفات الشخصية إدارة الحسابات حتى في حال فرض قيود. تعيين. يمكن لمالكي الأجهزة ومالكي الملفات الشخصية طلب واجهات برمجة التطبيقات لإدارة الحسابات. حتى في حال فرض قيود على مستخدمي DISALLOW_MODIFY_ACCOUNTS.
  • يمكن لمالكي الأجهزة إدارة المستخدمين الثانويين بسهولة أكبر. عندما يكون الجهاز قيد التشغيل في وضع مالك الجهاز، فإن القيد DISALLOW_ADD_USER يتم تعيينها تلقائيًا. يمنع هذا الإجراء المستخدمين من إنشاء حسابات ثانوية غير مُدارة. المستخدمين. بالإضافة إلى ذلك، إنّ CreateUser() تم إيقاف createAndInitializeUser() طريقة نهائيًا. الجديد ويتم استبدالها بطريقة DevicePolicyManager.createAndManageUser().
  • يمكن لمالكي الأجهزة الوصول إلى معرّفات الأجهزة. يمكن لمالك الجهاز الوصول إلى عنوان MAC لشبكة Wi-Fi لجهاز، باستخدام DevicePolicyManager.getWifiMacAddress() إذا لم تكن شبكة Wi-Fi تم تفعيل على الجهاز، فإن هذه الطريقة تُرجع القيمة null.
  • يتحكّم إعداد "وضع العمل" في الوصول إلى تطبيقات العمل. عندما يكون وضع العمل غير مفعّل يشير مشغّل النظام إلى أن تطبيقات العمل غير متاحة من خلال إيقافها. جارٍ التفعيل فإن وضع العمل يستعيد السلوك الطبيعي مرة أخرى.
  • عند تثبيت ملف PKCS #12 يحتوي على سلسلة شهادات العميل المفتاح الخاص المقابل من واجهة مستخدم الإعدادات، وشهادة CA في سلسلة إلغاء التثبيت في وحدة تخزين بيانات الاعتماد الموثوق بها. يؤدي هذا إلى لا تؤثر في نتيجة KeyChain.getCertificateChain() عند محاولة التطبيقات استرداد البرنامج سلسلة الشهادات لاحقًا. إذا لزم الأمر، يجب تثبيت شهادة CA إلى وحدة تخزين بيانات الاعتماد الموثوق بها عبر واجهة مستخدم الإعدادات بشكل منفصل، من خلال بامتداد DER .أو بامتداد الملف crt .أو cer.
  • بدءًا من الإصدار Android 7.0، تتم إدارة ميزة تسجيل بصمة الإصبع والتخزين. لكل مستخدم. في حال استهدف برنامج Device Policy (DPC) لمالك الملف الشخصي مستوى واجهة برمجة التطبيقات 23 (أو أقل) على جهاز يعمل بنظام التشغيل Android 7.0 (مستوى واجهة برمجة التطبيقات 24)، فإن المستخدم سيظل بإمكان المستخدم ضبط بصمة الإصبع على الجهاز، ولكن لا يمكن لتطبيقات العمل الوصول إلى بصمة الإصبع للجهاز عندما تستهدف وحدة التحكّم بسياسة الجهاز المستوى 24 من واجهة برمجة التطبيقات أو المستويات الأحدث، يمكن للمستخدم ضبط بصمة الإصبع المخصصة لملف العمل من خلال الانتقال إلى الإعدادات > الأمان > أمان ملف العمل.
  • حالة التشفير الجديدة ENCRYPTION_STATUS_ACTIVE_PER_USER هي تم إرجاعه بواسطة DevicePolicyManager.getStorageEncryptionStatus()، إلى أن التشفير نشط وأن مفتاح التشفير مرتبط المستخدم. لا يتم عرض الحالة الجديدة إلا إذا كانت وحدة التحكّم بسياسة الجهاز تستهدف المستوى 24 من واجهة برمجة التطبيقات أو المستويات الأحدث. بالنسبة إلى التطبيقات التي تستهدف مستويات سابقة لواجهة برمجة التطبيقات، ENCRYPTION_STATUS_ACTIVE حتى إذا كان مفتاح التشفير خاصًا بالمستخدم أو الملف الشخصي.
  • في نظام Android 7.0، هناك العديد من الطرق التي من شأنها أن تؤثر عادةً في عملية يعمل جهازك بشكل مختلف إذا كان الجهاز يحتوي على ملف شخصي للعمل تم تثبيته لتحدي العمل المنفصل. بدلاً من التأثير في الجهاز بأكمله، تطبيق الطرق على ملف العمل فقط. (القائمة الكاملة لهذه الطرق هي في مستندات DevicePolicyManager.getParentProfileInstance()). على سبيل المثال: يقفل DevicePolicyManager.lockNow() ملف العمل فقط، بدلاً من إقفال الجهاز بالكامل. لكل طريقة من هذه الطرق، يمكنك الحصول على باستدعاء الطريقة على المثيل الأصلي DevicePolicyManager؛ فيمكنك الحصول على هذا الوالد عن طريق يَتِمُّ الْآنَ الِاتِّصَالْ بِـ DevicePolicyManager.getParentProfileInstance(). لذلك على سبيل المثال، إذا قمت باستدعاء lockNow() للمثيل الرئيسي فإن الجهاز بالكامل مغلق.

الاحتفاظ بالتعليقات التوضيحية

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

  • VISIBILITY_BUILD: يكون مطلوبًا أن يكون مرئيًا فقط في وقت الإصدار.
  • VISIBILITY_SYSTEM: مخصصة للظهور في وقت التشغيل، ولكن لمستخدمي الأساسي.

إذا اعتمد تطبيقك على هذا السلوك، يُرجى إضافة سياسة احتفاظ إلى التعليقات التوضيحية التي يجب أن تكون متاحة في وقت التشغيل ويمكنك إجراء ذلك باستخدام "@Retention(RetentionPolicy.RUNTIME)".

تغييرات الإعدادات التلقائية لطبقة النقل الآمنة/طبقة المقابس الآمنة

يُجري Android 7.0 التغييرات التالية على إعدادات بروتوكول أمان طبقة النقل (TLS)/طبقة المقابس الآمنة التلقائية تستخدمها التطبيقات لبروتوكول HTTPS وغيرها من زيارات بروتوكول أمان طبقة النقل (TLS)/طبقة المقابس الآمنة (SSL):

  • تم إيقاف مجموعات تشفير RC4 الآن.
  • تم الآن تفعيل مجموعات رموز CHACHA20-POLY1305.

قد يؤدي إيقاف RC4 تلقائيًا إلى حدوث أعطال في HTTPS أو طبقة النقل الآمنة/طبقة المقابس الآمنة. الاتصال عندما لا يتفاوض الخادم مع مجموعات الرموز الحديثة. الحل المفضّل هو تحسين إعدادات الخادم لتفعيل ميزات ومجموعات تشفير وبروتوكولات أحدث. يُفضَّل استخدام TLSv1.2 وAES-GCM تفعيل، كما ينبغي أن تُفتَح مجموعات رموز السرية (ECDHE) وغيرها ممكَّنًا ومُفضَّلاً.

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

ملاحظة: لا تتعلّق هذه التغييرات بـ WebView.

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

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

التغييرات في التسلسل

أصلح نظام Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات) خطأً في عملية احتساب القيمة التلقائية رقم تعريف تسلسلي لم تتمّ مطابقته مع المواصفات.

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

local class incompatible: stream classdesc serialVersionUID = 1234, local class serialVersionUID = 4567

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

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

للتوضيح، لا يؤثر هذا التغيير في التطبيقات التي تستهدف المستوى 23 من واجهة برمجة التطبيقات أو أقل، فئات تحتوي على حقل أو فئات serialVersionUID التي تحتوي على طريقة ثابتة للإعداد.

نقاط مهمة أخرى

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

    يجب اختبار تطبيقك للتأكد عدم حدوث هذا السلوك. يمكنك إجراء ذلك من خلال التسبب في عطل مماثل عند إنهاء التطبيق يدويًا عبر إدارة خدمات السائقين (DDMS).

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

  • من المفترض أن تتمكّن التطبيقات على الإصدار 7.0 من نظام التشغيل Android من التعامل مع تغييرات الضبط بسلاسة. وينبغي ألا يتعطل عند بدء تشغيله لاحقًا. يمكنك التحقّق من سلوك التطبيق عن طريق تغيير حجم الخط (الإعدادات > الشاشة > حجم الخط)، ثم استعادة التطبيق من "الأخيرة".
  • بسبب خطأ في إصدارات سابقة من Android، لم يبلّغ النظام عن كتابة إلى مقبس بروتوكول التحكم بالنقل في سلسلة التعليمات الرئيسية كانتهاك للوضع الصارم. يصلح هذا الخطأ في نظام Android 7.0. تعرض التطبيقات التي تعرض هذا السلوك الآن android.os.NetworkOnMainThreadException. بشكل عام، يُعدّ إجراء عمليات على الشبكة على سلسلة التعليمات الرئيسية فكرة سيئة لأنّ هذه العمليات وقت الاستجابة طويل في العادة، ما يتسبب في حدوث أخطاء ANR وأخطاء بالإرهاق.
  • يتم ضبط مجموعة الطرق Debug.startMethodTracing() تلقائيًا على وتخزين المخرجات في الدليل الخاص بالحزمة على مساحة التخزين المشتركة، بدلاً من عرضه في المستوى الأعلى بطاقة SD. يعني ذلك أنّ التطبيقات لم تعد بحاجة إلى طلب إذن WRITE_EXTERNAL_STORAGE لاستخدام واجهات برمجة التطبيقات هذه.
  • بدأت العديد من واجهات برمجة التطبيقات للنظام الأساسي في التحقّق من الحمولات الكبيرة التي يتم إرسالها. على مستوى Binder معاملة يعيد النظام الآن عرض TransactionTooLargeExceptions مثل RuntimeExceptions، بدلاً من تسجيلها أو إيقافها بدون تنبيه. وَاحِدْ والمثال الشائع هو تخزين الكثير من البيانات في Activity.onSaveInstanceState(), وهو ما يتسبب في رمي ActivityThread.StopInfo RuntimeException عندما يستهدف تطبيقك الإصدار 7.0 من نظام التشغيل Android.
  • إذا نشر أحد التطبيقات Runnable مهمة في View، View غير متصل بنافذة، فإن النظام إضافة مهمة Runnable إلى قائمة الانتظار مع View لا يتم تنفيذ مهمة Runnable حتى تم إرفاق "View" إلى نافذة. يؤدي هذا الإجراء إلى إصلاح الأخطاء التالية:
    • في حال نشر تطبيق على View من سلسلة محادثات غير مؤشر ترابط واجهة مستخدم النافذة، قد يتم تشغيل Runnable على سلسلة محادثات غير صحيحة نتيجةً لذلك.
    • إذا تم نشر مهمة Runnable من سلسلة محادثات غير سلسلة محادثات تكرار الحلقة، قد يعرض التطبيق المهمة Runnable.
  • إذا كان هناك تطبيق على Android 7.0 يحتوي على DELETE_PACKAGES يحاول إذن حذف حزمة، لكنّ تطبيقًا آخر ثبّت هذه الحزمة، يتطلب النظام تأكيد المستخدم. في هذا السيناريو، من المفترض أن تتوقع التطبيقات STATUS_PENDING_USER_ACTION كحالة الإرجاع عند استدعاء PackageInstaller.uninstall()
  • تم إيقاف موفّر JCA المسمى Crypto نهائيًا، لأنه SHA1PRNG ضعيفة من ناحية التشفير. لم يعد بإمكان التطبيقات استخدام SHA1PRNG لاستنباط المفاتيح (بشكل غير آمن)، لأن هذا المزود لم يعد المتوفرة. لمزيد من المعلومات، راجع المدونة مشاركة الأمان "التشفير" موفّر الخدمة متوقف نهائيًا في Android ن.