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

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

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

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

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

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

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

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

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

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

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

إزالة عميل Apache HTTP

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

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

قناة BuringSSL

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

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

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

التغييرات التي طرأت على ملف تخزين مفاتيح Android

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

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

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

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

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

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

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

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

وقت التشغيل

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

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

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

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

التحقق من حِزم APK

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

اتصال USB

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

التغييرات في Android for Work

يتضمن هذا الإصدار تغييرات السلوك التالية لنظام Android for Work:

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