القيود المفروضة على الواجهات غير التابعة لحزمة تطوير البرامج (SDK)

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

التمييز بين واجهات حزمة SDK وواجهات غير حزمة SDK

بشكل عام، واجهات SDK العامة هي تلك التي تم العثور عليها موثقة في Package Index في إطار عمل Android. التعامل مع الواجهات غير المتوفرة في حزمة SDK هي أحد تفاصيل التنفيذ التي تزيلها واجهة برمجة التطبيقات، لذا فإنّ هذه الواجهات عرضة للتغيير بدون إشعار.

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

قوائم واجهة برمجة التطبيقات غير المستنِدة إلى حزمة تطوير البرامج (SDK)

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

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

قائمة علامات التعليمات البرمجية الوصف
القائمة المحظورة
  • blocked
  • تاريخ إنهاء العمل: blacklist
هي الواجهات التي لا تتضمّن حزمة SDK لا يمكنك استخدامها بغض النظر عن مستوى واجهة برمجة التطبيقات المستهدَف في تطبيقك. إذا حاول تطبيقك الوصول إلى إحدى هذه الواجهات، سيعرض النظام خطأً.
تم الحظر بشكل مشروط
  • max-target-x
  • تاريخ إنهاء العمل: greylist-max-x

وبدءًا من نظام التشغيل Android 9 (المستوى 28)، يحتوي كل مستوى من مستويات واجهة برمجة التطبيقات على واجهات غير متوفّرة في حزمة تطوير البرامج (SDK) يتم فرض قيود عليها عندما يستهدف التطبيق هذا المستوى لواجهة برمجة التطبيقات.

يتم تصنيف هذه القوائم حسب الحد الأقصى لمستوى واجهة برمجة التطبيقات (max-target-x) الذي يمكن للتطبيق استهدافه قبل أن يصبح بإمكان التطبيق الوصول إلى الواجهات غير المتوفّرة في حزمة SDK في هذه القائمة. على سبيل المثال، هناك واجهة غير متوفّرة في حزمة SDK لم يتم حظرها في Android Pie، ولكنها محظورة الآن في الإصدار Android 10، هي جزء من قائمة max-target-p (greylist-max-p)، حيث يشير "p" إلى Pie أو Android 9 (المستوى 28 من واجهة برمجة التطبيقات).

في حال محاولة تطبيقك الوصول إلى واجهة محظورة على مستوى واجهة برمجة التطبيقات المستهدَف، سيتصرف النظام كما لو كانت واجهة برمجة التطبيقات جزءًا من القائمة المحظورة.

غير متوافقة
  • unsupported
  • تاريخ إنهاء العمل: greylist
الواجهات غير المشروطة والتي يمكن لتطبيقك استخدامها بدون قيود في حزمة تطوير البرامج (SDK) يُرجى العِلم أنّ هذه الواجهات غير متوافقة وقابلة للتغيير بدون إشعار. توقَّع أن يتم حظر هذه الواجهات بشروط في إصدارات Android المستقبلية في قائمة max-target-x.
SDK
  • كل من public-api وsdk
  • مهملة: كل من public-api وwhitelist
واجهات يمكن استخدامها بحرية ويمكن استخدامها الآن كجزء من مؤشر الحزمة الموثَّق رسميًا على نظام التشغيل Android.
اختبار واجهات برمجة التطبيقات
  • test-api
الواجهات التي تُستخدم لاختبار النظام الداخلي، مثل واجهات برمجة التطبيقات التي تسهّل الاختبار من خلال مجموعة اختبار التوافق (CTS). ليست واجهات برمجة التطبيقات الاختبارية جزءًا من حزمة SDK. بدءًا من نظام التشغيل Android 11 (المستوى 30)، يتم تضمين واجهات برمجة التطبيقات الاختبارية في القائمة المحظورة بحيث لا يُسمح للتطبيقات باستخدامها بغض النظر عن مستوى واجهة برمجة التطبيقات المستهدَف فيها. جميع واجهات برمجة التطبيقات الاختبارية غير متوافقة وتخضع للتغيير بدون إشعار، بغض النظر عن مستوى واجهة برمجة التطبيقات للنظام الأساسي.

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

تحديد القائمة التي تنتمي إليها الواجهة

يتم إنشاء قوائم الواجهات غير المتوفّرة في حزمة SDK كجزء من النظام الأساسي. راجع الأقسام التالية للحصول على معلومات حول كل إصدار من إصدارات Android.

Android 15 (معاينة المطوِّر)

بالنسبة إلى نظام التشغيل Android 15، يمكنك تنزيل الملف التالي الذي يصف جميع الواجهات غير المتوفرة في حزمة SDK والقوائم المقابلة لها:

الملف: hiddenapi-flags.csv

المجموع الاختباري لخوارزمية SHA-256: 7aa0987aea4b25f5371b7e377c9f37375ada3b7e30465c0e2d910a5b646c10c1

لمزيد من المعلومات عن التغييرات في قائمة واجهات برمجة التطبيقات غير المتوفّرة في حزمة SDK في نظام التشغيل Android 15، يمكنك الاطّلاع على تعديلات على قيود الواجهة غير المتوفّرة في حزمة SDK في نظام التشغيل Android 15.

Android 14

بالنسبة إلى نظام التشغيل Android 14 (المستوى 34)، يمكنك تنزيل الملف التالي الذي يصف جميع الواجهات غير المتوفرة في حزمة SDK والقوائم المقابلة لها:

الملف: hiddenapi-flags.csv

المجموع الاختباري لخوارزمية SHA-256: 7e00db074cbe51c51ff4b411f7b48e98692951395c5c17d069c822cc1d0eae0f

لمزيد من المعلومات عن التغييرات في قائمة واجهات برمجة التطبيقات غير المتوفّرة في حزمة SDK في نظام التشغيل Android 14، يمكنك الاطّلاع على تعديلات على قيود الواجهة غير المتوفّرة في حزمة SDK في نظام التشغيل Android 14.

Android 13

بالنسبة إلى نظام التشغيل Android 13 (المستوى 33)، يمكنك تنزيل الملف التالي الذي يصف جميع الواجهات غير المتوفرة في حزمة SDK والقوائم المقابلة لها:

الملف: hiddenapi-flags.csv

المجموع الاختباري لخوارزمية SHA-256: 233a277aa8ac475b6df61bffd95665d86aac6eb2ad187b90bf42a98f5f2a11a3

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

Android 12

بالنسبة إلى نظام التشغيل Android 12 (المستوى 31)، يمكنك تنزيل الملف التالي الذي يصف جميع الواجهات غير المتوفرة في حزمة SDK والقوائم المقابلة لها:

الملف: hiddenapi-flags.csv

المجموع الاختباري لخوارزمية SHA-256: 40674ff4291eb268f86561bf687e69dbd013df9ec9531a460404532a4ac9a761

لمزيد من المعلومات حول التغييرات التي تطرأ على قائمة واجهات برمجة التطبيقات غير المستندة إلى SDK في نظام التشغيل Android 12، بما في ذلك البدائل المتاحة للجميع والمقترَحة لواجهات برمجة التطبيقات التي يتم حظرها في الإصدار Android 12، يمكنك الاطّلاع على قائمة التغييرات لنظام التشغيل Android 12.

Android 11

بالنسبة إلى نظام التشغيل Android 11 (المستوى 30)، يمكنك تنزيل الملف التالي الذي يصف جميع الواجهات غير المتوفرة في حزمة SDK والقوائم المقابلة لها:

الملف: hiddenapi-flags.csv

المجموع الاختباري لخوارزمية SHA-256: a19d839f4f61dc9c94960ae977b2e0f3eb30f880ba1ffe5108e790010b477a56

لمزيد من المعلومات حول التغييرات التي تطرأ على قائمة واجهات برمجة التطبيقات غير المستندة إلى SDK في نظام التشغيل Android 11، بما في ذلك البدائل المتاحة للجميع المقترَحة لواجهات برمجة التطبيقات (API) التي تم حظرها بشروط في Android 11، يمكنك الاطّلاع على قائمة التغييرات لنظام التشغيل Android 11.

Android 10

بالنسبة إلى نظام التشغيل Android 10 (المستوى 29)، يمكنك تنزيل الملف التالي الذي يصف جميع الواجهات غير المتوفرة في حزمة SDK والقوائم المقابلة لها:

الملف: hiddenapi-flags.csv

المجموع الاختباري لخوارزمية SHA-256: f22a59c215e752777a114bd9b07b0b6b4aedfc8e49e6efca0f99681771c5bfeb

لمعرفة المزيد من المعلومات عن التغييرات في قائمة واجهات برمجة التطبيقات غير التابعة لحزمة SDK في Android 10، بما في ذلك البدائل العامة لواجهة برمجة التطبيقات المقترحة لواجهات برمجة التطبيقات المحظورة بشروط في Android 10، يمكنك الاطّلاع على إدراج التغييرات في نظام التشغيل Android 10.

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

بالنسبة إلى نظام التشغيل Android 9 (المستوى 28 من واجهة برمجة التطبيقات)، يحتوي الملف النصي التالي على قائمة بواجهات برمجة التطبيقات غير المحظورة في القائمة الرمادية (القائمة الرمادية): hiddenapi-light-greylist.txt.

يتم استخراج القائمة المحظورة (blacklist) وقائمة واجهات برمجة التطبيقات المحظورة بشروط (القائمة الرمادية) في وقت الإنشاء.

إنشاء قوائم من AOSP

عند العمل باستخدام AOSP، يمكنك إنشاء ملف hiddenapi-flags.csv يحتوي على جميع الواجهات غير المتوفرة في حزمة SDK والقوائم المقابلة لها. ولإجراء ذلك، نزِّل مصدر AOSP ثم شغِّل الأمر التالي:

m out/soong/hiddenapi/hiddenapi-flags.csv

يمكنك بعد ذلك العثور على الملف في الموقع التالي:

out/soong/hiddenapi/hiddenapi-flags.csv

السلوك المتوقع عند الوصول إلى واجهات محظورة غير مدرَجة في حزمة تطوير البرامج (SDK)

يوضِّح الجدول التالي السلوك الذي يمكنك توقُّعه إذا حاول تطبيقك الوصول إلى واجهة غير تابعة لحزمة SDK تكون جزءًا من القائمة المحظورة.

وسائل الوصول النتيجة
تعليمات Dalvik تشير إلى أحد الحقول تم رمي "NoSuchFieldError"
تعليمات Dalvik تشير إلى إحدى الطرق تم رمي "NoSuchMethodError"
الانعكاس باستخدام Class.getDeclaredField() أو Class.getField() تم رمي "NoSuchFieldException"
التأمّل باستخدام Class.getDeclaredMethod() وClass.getMethod() تم رمي "NoSuchMethodException"
التأمّل باستخدام Class.getDeclaredFields() وClass.getFields() عدم ظهور أعضاء غير مضمّنين في حِزم SDK في النتائج
التأمّل باستخدام Class.getDeclaredMethods() وClass.getMethods() عدم ظهور أعضاء غير مضمّنين في حِزم SDK في النتائج
JNI باستخدام env->GetFieldID() أعاد "NULL"، ورميت "NoSuchFieldError"
JNI باستخدام env->GetMethodID() أعاد "NULL"، ورميت "NoSuchMethodError"

اختبار تطبيقك بحثًا عن الواجهات غير المتوفّرة في حزمة تطوير البرامج (SDK)

هناك العديد من الطرق التي يمكنك استخدامها لاختبار الواجهات غير المتوفرة في حزمة SDK في تطبيقك.

الاختبار باستخدام تطبيق قابل للتصحيح

يمكنك اختبار الواجهات التي لا تتضمّن حزمة SDK من خلال إنشاء تطبيق قابل للتصحيح الأخطاء وتشغيله على جهاز أو محاكي يعمل بنظام التشغيل Android 9 (المستوى 28 من واجهة برمجة التطبيقات) أو إصدارات أحدث. تأكَّد من أنّ الجهاز أو المحاكي الذي تستخدمه يطابق مستوى واجهة برمجة التطبيقات المستهدَف في تطبيقك.

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

  • الفئة والاسم والنوع المحدّدَين (بالتنسيق المستخدَم في "وقت تشغيل Android")
  • وسائل الوصول: إما الربط أو استخدام الانعكاس أو استخدام JNI.
  • القائمة التي تنتمي إليها الواجهة غير المتوفّرة في حزمة SDK.

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

Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)

الاختبار باستخدام واجهة برمجة التطبيقات StrictMode

يمكنك أيضًا اختبار الواجهات غير المتوفّرة في حزمة SDK باستخدام StrictMode API. يمكنك استخدام طريقة detectNonSdkApiUsage لتفعيل هذه الميزة. بعد تفعيل StrictMode API، يمكنك تلقّي طلب معاودة الاتصال لكل استخدام لواجهة غير متوفّرة في حزمة SDK، وذلك باستخدام واجهة penaltyListener حيث يمكنك تنفيذ معالجة مخصّصة. يُستمَد عنصر Violation المقدَّم في معاودة الاتصال من Throwable، ويوفّر تتبُّع تسلسل استدعاء الدوال البرمجية المضمّن سياق الاستخدام.

الاختبار باستخدام أداة veridex

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

تشمل قيود أداة veridex ما يلي:

  • لا يمكنه رصد الاستدعاءات من خلال JNI.
  • ويمكنها اكتشاف مجموعة فرعية فقط من الاستدعاءات من خلال الانعكاس.
  • ويقتصر تحليلها لمسارات الرموز غير النشطة على عمليات التحقّق من مستوى واجهة برمجة التطبيقات.
  • ولا يمكن تشغيله إلا على الأجهزة التي تتوافق مع تعليمات SSE4.2 وPOPCNT.

أجهزة Windows

لا يتم توفير برامج ثنائية أصلية لنظام التشغيل Windows، ولكن يمكنك تشغيل أداة veridex على Windows عن طريق تنفيذ البرامج الثنائية Linux باستخدام النظام الفرعي لنظام التشغيل Linux (WSL). قبل اتّباع الخطوات الواردة في هذا القسم، عليك تثبيت WSL واختيار Ubuntu كتوزيعة Linux.

بعد تثبيت نظام التشغيل Ubuntu، شغِّل الوحدة الطرفية لنظام التشغيل Ubuntu ثم اتبع الخطوات التالية:

  1. نزِّل أداة veridex من مستودع وقت تشغيل Android المسبَق الإنشاء.
  2. استخرِج محتوى ملف appcompat.tar.gz.
  3. في المجلد المستخرَج، حدِّد موقع ملف veridex-linux.zip واستخرِجه.
  4. انتقِل إلى المجلد "تم فك ضغطه" ثم نفِّذ الأمر التالي حيث تمثل your-app.apk حزمة APK التي تريد اختبارها:

    ./appcompat.sh --dex-file=your-app.apk
    

macOS

لتشغيل أداة veridex على نظام التشغيل macOS، اتّبِع الخطوات التالية:

  1. نزِّل أداة veridex من مستودع وقت تشغيل Android المسبَق الإنشاء.
  2. استخرِج محتوى ملف appcompat.tar.gz.
  3. في المجلد المستخرَج، حدِّد موقع ملف veridex-mac.zip واستخرِجه.
  4. انتقِل إلى المجلد غير المضغوط ثم شغِّل الأمر التالي حيث يمثّل /path-from-root/your-app.apk مسار حزمة APK التي تريد اختبارها، بدءًا من الدليل الجذري للنظام:

    ./appcompat.sh --dex-file=/path-from-root/your-app.apk
    

نظام التشغيل Linux

لتشغيل أداة veridex على نظام التشغيل Linux، اتبع الخطوات التالية:

  1. نزِّل أداة veridex من مستودع وقت تشغيل Android المسبَق الإنشاء.
  2. استخرِج محتوى ملف appcompat.tar.gz.
  3. في المجلد المستخرَج، حدِّد موقع ملف veridex-linux.zip واستخرِجه.
  4. انتقِل إلى المجلد "تم فك ضغطه" ثم نفِّذ الأمر التالي حيث تمثل your-app.apk حزمة APK التي تريد اختبارها:

    ./appcompat.sh --dex-file=your-app.apk
    

الاختبار باستخدام أداة Android Studio lint

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

يمكنك أيضًا تشغيل أداة Lint من سطر الأوامر أو إجراء عمليات الفحص يدويًا في مشروع أو مجلد أو ملف محدّد.

الاختبار باستخدام Play Console

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

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

طلب واجهة برمجة تطبيقات عامة جديدة

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

عند إنشاء طلب ميزة، يُرجى تقديم المعلومات التالية:

  • واجهة برمجة التطبيقات غير المتوافقة التي تستخدمها، بما في ذلك أداة الوصف الكاملة التي تظهر في رسالة أداة Logcat Accessing hidden ...
  • لماذا تحتاج إلى استخدام واجهات برمجة التطبيقات هذه، بما في ذلك تفاصيل حول الميزة عالية المستوى التي تكون واجهة برمجة التطبيقات ضرورية لها، وليس فقط التفاصيل المنخفضة المستوى.
  • لماذا تكون أيّ واجهات برمجة تطبيقات عامة لحزمة تطوير البرامج (SDK) ذات صلة غير كافية لأغراضك؟
  • أي بدائل أخرى جربتها وسبب عدم نجاحها.

عندما تقدّم هذه التفاصيل في طلب الميزة، تزيد احتمالية منح واجهة برمجة تطبيقات عامة جديدة.

أسئلة أخرى

يتضمّن هذا القسم بعض الإجابات عن أسئلة أخرى يطرحها المطوّرون بشكل متكرر:

أسئلة عامة

كيف يمكن لشركة Google التأكّد من إمكانية معرفة احتياجات جميع التطبيقات من خلال أداة تتبّع المشاكل؟

أنشأنا القوائم الأولية لنظام التشغيل Android 9 (المستوى 28 من واجهة برمجة التطبيقات) من خلال التحليل الثابت للتطبيقات التي تم استكمالها باستخدام الطرق التالية:

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

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

كيف يمكنني تفعيل الوصول إلى واجهات غير متوفّرة في حزمة SDK؟

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

Android 10 (المستوى 29 لواجهة برمجة التطبيقات) أو إصدار أحدث

لتفعيل الوصول، استخدِم واجهة برمجة التطبيقات Adb التالية

Command:

adb shell settings put global hidden_api_policy  1

لإعادة ضبط سياسة فرض واجهة برمجة التطبيقات على الإعدادات التلقائية، استخدِم الأمر التالي:

adb shell settings delete global hidden_api_policy
Android 9 (المستوى 28)

لتفعيل إمكانية الوصول، استخدِم أوامر adb التالية:

adb shell settings put global hidden_api_policy_pre_p_apps  1
adb shell settings put global hidden_api_policy_p_apps 1

لإعادة ضبط سياسة فرض واجهة برمجة التطبيقات على الإعدادات التلقائية، استخدِم الأوامر التالية:

adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps

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

  • 0: إيقاف كل عمليات الرصد للواجهات غير المتوفّرة في حزمة SDK يؤدي استخدام هذا الإعداد إلى إيقاف جميع رسائل السجلّ عند استخدام واجهة غير متوفّرة في حزمة SDK، ومنع اختبار تطبيقك باستخدام StrictMode API. لا ننصح بهذا الإعداد.
  • 1: إتاحة الوصول إلى جميع الواجهات غير المتوفرة في حزمة SDK، ولكن رسائل سجل الطباعة التي تتضمن تحذيرات بخصوص أي استخدام للواجهة غير المتوفرة في حزمة SDK. يتيح لك استخدام هذا الإعداد أيضًا اختبار تطبيقك باستخدام StrictMode API.
  • 2: عدم السماح باستخدام الواجهات غير المتوفّرة في حزمة SDK التي تنتمي إلى القائمة المحظورة أو إذا تم حظرها مشروطًا بسبب مستوى واجهة برمجة التطبيقات المستهدَف

أسئلة حول قوائم الواجهة غير المتوفّرة في حزمة تطوير البرامج (SDK)

أين يمكنني العثور على قوائم واجهة برمجة التطبيقات غير المتوفرة في حزمة SDK في صورة النظام؟

ويتم ترميزها في الحقل وبت علامة الوصول إلى الطريقة في ملفات dex للنظام الأساسي. لا يوجد ملف منفصل في صورة النظام يحتوي على هذه القوائم.

هل تُظهر واجهة برمجة التطبيقات غير المستنِدة إلى حزمة SDK نفسها على أجهزة المصنّعين الأصليين المختلفة التي تعمل بإصدارات Android نفسها؟

يمكن للمصنّعين الأصليين للأجهزة إضافة واجهاتهم الخاصة إلى القائمة المحظورة (القائمة السوداء)، ولكن لا يمكنهم إزالة الواجهات من قوائم AOSP التي لا تستخدم حزمة SDK. يمنع CDD هذه التغييرات وتضمن اختبارات CTS أن يفرض "وقت تشغيل Android" القائمة.

هل هناك أي قيود على الواجهات التي لا تستخدم NDK في الرموز البرمجية الأصلية؟

تتضمن حزمة تطوير البرامج (SDK) لنظام التشغيل Android واجهات جافا. بدأ النظام الأساسي بحظر الوصول إلى الواجهات غير NDK بالنسبة إلى رموز C/C++ الأصلية في Android 7 (المستوى 26 من واجهة برمجة التطبيقات). للحصول على مزيد من المعلومات، يمكنك الاطّلاع على المقالة تحسين الثبات من خلال قيود رموز C/C++ الخاصة في نظام التشغيل Android N.

هل هناك أي خطة لحظر التلاعب بملفات dex2oat أو DEX؟

وليس لدينا خطط نشطة لحظر الوصول إلى برنامج dex2oat الثنائي، ولكننا لا نهدف إلى أن يكون تنسيق ملف DEX مستقرًا أو أن يكون واجهة عامة بخلاف الأجزاء المحدّدة بشكل علني في تنسيق Dalvik القابل للتنفيذ. ونحتفظ بالحق في تعديل أو إزالة برنامج dex2oat وأجزاء أخرى غير محدّدة من تنسيق DEX في أي وقت. لاحظ أيضًا أن الملفات المشتقة التي تم إنتاجها بواسطة dex2oat مثل ODEX (المعروفة أيضًا باسم OAT) وVDEX وCDEX كلها تنسيقات غير محددة.

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

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

هل تنطبق قيود الواجهة غير المتوفّرة في حزمة تطوير البرامج (SDK) على جميع التطبيقات، بما في ذلك تطبيقات النظام وتطبيقات الطرف الأول، وليس فقط تطبيقات الجهات الخارجية؟

نعم، ومع ذلك، نستثني التطبيقات الموقَّعة باستخدام مفتاح النظام الأساسي وبعض تطبيقات صور النظام. يُرجى العلم أنّ هذه الإعفاءات لا تنطبق إلا على التطبيقات التي تشكّل جزءًا من صورة النظام (أو التطبيقات المعدّلة لصور النظام). وهذه القائمة مخصّصة فقط للتطبيقات التي يتم إنشاؤها استنادًا إلى واجهات برمجة تطبيقات النظام الأساسي الخاص، وليس واجهات برمجة تطبيقات SDK (حيث LOCAL_PRIVATE_PLATFORM_APIS := true).