كيفية تجاوز القائمة السوداء لواجهة برمجة التطبيقات المخفية على Android 9+

click fraud protection

أدخلت Google قيودًا في نظام التشغيل Android 9 يمكن من خلالها للمطورين الوصول إلى واجهات برمجة التطبيقات (APIs). فيما يلي كيفية تجاوز قيود واجهة برمجة التطبيقات المخفية.

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

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

واجهات برمجة التطبيقات المخفية هي واجهات برمجة التطبيقات في Android التي لا يستطيع مطورو التطبيقات رؤيتها عادةً. إذا ألقيت نظرة على كود AOSP، فسترى مجموعة كاملة من الفئات والمتغيرات والأساليب التي لها @hide تعليق توضيحي داخل كتلة التعليق فوقها.

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

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

في حين أن Android SDK القياسي يحتوي على كثير فيه، في بعض الأحيان لا يكفي. في بعض الأحيان، يكون هناك شيء تريد القيام به موجود بالفعل في Android، ولكن لا يتم الكشف عنه علنًا.

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

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

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

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

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

هناك في الواقع عدة طرق لتجاوز القائمة السوداء لواجهة برمجة التطبيقات المخفية. بناءً على احتياجاتك، يمكنك اختيار تلك التي تعمل مع جميع إصدارات Android، وتلك التي تعمل مع Android 9 و10 فقط، وتلك التي تستخدم كود C++ الأصلي، وتلك التي تعتمد بالكامل على Java. يوجد أيضًا حل بديل للتطوير فقط باستخدام ADB.

الحل البديل لبنك التنمية الآسيوي

إذا كان جهازك يعمل بنظام Android Pie، فقم بتشغيل أمري ADB التاليين لتمكين الوصول إلى واجهة برمجة التطبيقات المخفية.

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

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

adb shell settings put global hidden_api_policy 1

للعودة إلى السلوك الافتراضي، فقط استبدل put مع delete وإزالة 1.

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

الحل الأصلي/JNI

هناك طريقتان يمكنك من خلالهما تجاوز القائمة السوداء لواجهة برمجة التطبيقات المخفية باستخدام JNI في تطبيق Android الخاص بك. يعمل أحدهما مع نظامي التشغيل Android 9 و10، والآخر يعمل مع نظام التشغيل Android 9 والإصدارات الأحدث.

أندرويد 9 و 10

إذا كان لديك بالفعل جزء أصلي من تطبيقك، فسيكون من السهل تنفيذ ذلك. مجرد استخدام JNI_OnLoad() وظيفة.

الفن الثابت:: Runtime* runtime = nullptr;

extern "C"jint JNI_OnLoad(JavaVM *vm, void *reserved){
...
runtime = reinterpret_cast<: javavmext>(vm)->GetRuntime();
runtime->SetHiddenApiEnforcementPolicy(art:: hiddenapi:: EnforcementPolicy:: kNoChecks);
...
}

انتبه إلى أن هذه الطريقة تعمل فقط على Android 9 و10.

أندرويد 9 والإصدارات الأحدث

بالنسبة لأي إصدار من Android، لديك خيار بين مكتبتين لتجاوز قيود واجهة برمجة التطبيقات المخفية: FreeReflection وRestrictionBypass.

كلاهما سهل التنفيذ والاستخدام.

لتنفيذ FreeReflection، قم بإضافة التبعية إلى build.gradle على مستوى الوحدة النمطية الخاصة بك.

implementation 'me.weishu: free_reflection: 3.0.1'

ثم تجاوز attachBaseContext() في فئة التطبيق الخاص بك.

@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);
Reflection.unseal(base);
}

إذا لم يكن لديك فئة تطبيق، يمكنك إضافتها بسهولة تامة. إنشاء فئة جديدة تمتد Application ثم قم بالإشارة إليه في ملف AndroidManifest.xml الخاص بك.

مثال:

publicclassAppextendsApplication{
...
@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);

Reflection.unseal(base);
}
}

<manifest>
...
...
name=".App">
...
application>
manifest>

لتنفيذ RestrictionBypass، قم بإضافة مستودع JitPack إلى build.gradle على مستوى المشروع.

allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}

ثم قم بإضافة التبعية إلى build.gradle على مستوى الوحدة النمطية الخاصة بك.

implementation 'com.github.ChickenHook: RestrictionBypass: 2.2'

وهذا كل شيء. تقوم هذه المكتبة تلقائيًا بإزالة قيود القائمة السوداء.

الحل جافا

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

أندرويد 9 و 10

في Android 9 و10، يمكنك استخدام ما يمكن تسميته بالانعكاس المزدوج أو الانعكاس التعريفي لتجاوز القائمة السوداء لواجهة برمجة التطبيقات المخفية. نظرًا لأن النظام يتحقق فقط مما تستدعيه تطبيقات الطرف الثالث، فإن الانعكاس المزدوج يخدعه ليعتقد أن النظام يقوم بإجراء استدعاءات واجهة برمجة التطبيقات المخفية.

يمكن استخدام هذه الخدعة لاستدعاء طريقة لمنح تطبيقك استثناءات واجهة برمجة التطبيقات المخفية، والتي تم تسميتها على نحو مناسب setHiddenApiExemptions(). ما عليك سوى إضافة الكود التالي في مكان ما في وقت مبكر من دورة حياة تطبيقك (مثل Application's onCreate() الطريقة)، وسوف تتعامل مع تجاوز القائمة السوداء.

Method forName = Class.class.getDeclaredMethod("forName", String.class);
Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);

Class vmRuntimeClass = (Class) forName.invoke(null, "dalvik.system.VMRuntime");
Method getRuntime = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "getRuntime", null);
Method setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", newClass[] { String[].class} );

Object vmRuntime = getRuntime.invoke(null);
setHiddenApiExemptions.invoke(vmRuntime, newString[][] { newString[] { "L" } });

إذا كان تطبيقك متوافقًا مع إصدارات Android الأقل من 9، فتذكر تضمين ذلك في التحقق من الإصدار.

أندرويد 9 والإصدارات الأحدث

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

لتنفيذه، ما عليك سوى إضافة التبعية إلى build.gradle على مستوى الوحدة النمطية لديك.

implementation 'org.lsposed.hiddenapibypass: hiddenapibypass: 2.0'

ثم استخدمه لتجاوز القائمة السوداء.

HiddenApiBypass.addHiddenApiExemptions("L");

إذا كان تطبيقك متوافقًا مع إصدارات Android الأقل من 9، فتذكر تضمين ذلك في التحقق من الإصدار.

الاستنتاج ومزيد من المعلومات

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

  • سؤال وجواب My Stack Overflow.
  • مكتبة تجاوز API المخفية لـ LSpose على GitHub.
  • مكتبة ChickenHook’s RestrictionBypass على GitHub.
  • مكتبة FreeReflection الخاصة بـ تيان على GitHub.
  • وثائق Google بشأن القائمة السوداء لواجهة برمجة التطبيقات المخفية.