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

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

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

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

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

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

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

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

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

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

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

إزالة Apache HTTP Client

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

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

BoringSSL

ينتقل Android من مكتبة OpenSSL إلى مكتبة BoringSSL. إذا كنت تستخدم حزمة Android NDK في تطبيقك، لا تربطها بمكتبات التشفير التي لا تشكّل جزءًا من واجهة برمجة التطبيقات NDK، مثل 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:

ملاحظة: عندما يبدأ جهاز يعمل بالإصدار 6.0 من Android (المستوى 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 الذي تم إرجاعه واضبط مَعلمة input على false. يعيد هذا الاستدعاء التحكّم في كائنات ActionMode إلى إطار العمل. في الأجهزة التي تعمل بالإصدار 6.0 من نظام التشغيل Android (المستوى 23 من واجهة برمجة التطبيقات)، يتيح ذلك للإطار العملي استخدام وضعَي ActionBar أو شريط الأدوات العائم، بينما في الأجهزة التي تعمل بالإصدار 5.1 من نظام التشغيل Android (المستوى 22 من واجهة برمجة التطبيقات) أو الإصدارات الأقدم، لا يمكن استخدام سوى وضعَي ActionBar.

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

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

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