فهم بنية وحدة المعالجة المركزية لنظام Android (ABI): لماذا أهمية Arm64-v8a وarmeabi-v7a وx86

Diagram showing one app bundle splitting into arm64-v8a, armeabi-v7a, and x86 architecture-specific APKs

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

ما هو ABI

ABI لتقف علي واجهة التطبيق الثنائية. من الناحية العملية، إنها مجموعة التعليمات التي تفهمها الشريحة - تنسيق كود الجهاز الخام الذي يمكن للمعالج تنفيذه مباشرة. يتم تجميع معظم تطبيقات Android، والأجزاء المكتوبة بلغة Java أو Kotlin، في كود ثانوي يتم تشغيله داخل Android Runtime (ART)، ولا يهتم ART بشكل خاص بالشريحة التي يتواجد عليها. هذه الطبقة لا تعتمد على الهندسة المعمارية من حيث التصميم، وهو جزء كبير من سبب "عمل تطبيقات Android" بشكل عام عبر مجموعة واسعة من الأجهزة.

الكود الأصلي قصة مختلفة. تقوم الكثير من التطبيقات، وخاصة الألعاب وتطبيقات الكاميرا وأدوات التعلم الآلي وأي شيء يقوم بمعالجة الصوت أو الفيديو بكثافة، بشحن المكتبات الأصلية المكتوبة بلغة C أو C++ من خلال Android NDK. يتم تجميع هذه المكتبات مسبقًا في كود الآلة لمجموعة تعليمات محددة، ولا يمكن للرقاقة المصممة لمجموعة تعليمات واحدة بشكل عام تنفيذ كود الآلة المكتوب لمجموعة مختلفة. هذا هو السبب الكامل وراء وجود واجهات برمجة التطبيقات (ABIs) كشيء يستحق الفهم: في اللحظة التي يتضمن فيها التطبيق مكتبة .so أصلية واحدة، يصبح توافقه مرتبطًا بالبنيات التي تم إنشاء المكتبة من أجلها.

البنى التي ستواجهها

كان هناك تنوع أكبر في هذا المجال (تذكر armeabi أو MIPS؟)، ولكن بحلول عام 2026، تقلص المجال إلى أربع واجهات ABI تستحق المعرفة:

أبيعرض البتالأجهزة النموذجيةملاحظات
arm64-v8aذراع 64 بتتم بيع كل الهواتف تقريبًا منذ عام 2019 تقريبًاالهدف الافتراضي للتطبيقات الجديدة؛ طلبت Google دعم 64 بت لعمليات الإرسال الجديدة في متجر Play لعدة سنوات حتى الآن.
armeabi-v7aذراع 32 بتالأجهزة القديمة أو ذات الميزانية المحدودة، لا تزال بعض الهواتف منخفضة التكلفة تُباع في الأسواق الناشئةلا يزال يتم شحنه بواسطة العديد من التطبيقات للتوافق مع الإصدارات السابقة، على الرغم من أن معظم الأجهزة النشطة لم تعد بحاجة إليها.
x86إنتل 32 بتالأجهزة اللوحية القديمة المستندة إلى Intel والمحاكيات القديمةعفا عليها الزمن في الغالب. نادرًا ما تصادف هاتفًا حقيقيًا 32 بت x86 اليوم.
x86_64إنتل 64 بتبعض أجهزة Chromebook، ومحاكيات Android لسطح المكتب، وعدد قليل من الأجهزة اللوحية x86مهم إذا قمت باختبار التطبيقات في محاكي مثل Android Studio AVD المستند إلى x86 أو بعض إصدارات BlueStacks.

إذا كنت تحمل هاتفًا اشتريته في أي وقت خلال السنوات الخمس أو الست الماضية، فمن المؤكد تقريبًا أنه Arm64-v8a. الاستثناءات التي تستحق التذكر هي المحاكيات وأجهزة Chromebook، والتي تعمل بشكل متكرر على x86_64 بدلاً من ذلك، نظرًا لأن ذلك يتطابق مع وحدة المعالجة المركزية للكمبيوتر المحمول أو سطح المكتب الأساسي.

لماذا تهتم التطبيقات بشحن إصدارات متعددة على الإطلاق

أحد الأسئلة الواضحة هو لماذا لا يقوم المطورون بحشر المكتبات الأصلية لكل بنية في ملف APK واحد والانتهاء منها. تقوم بعض التطبيقات بذلك بالضبط، ويطلق عليها APK العالمي أو "الدهون". الجانب السلبي هو الحجم. يمكن للعبة التي تحتوي على مكتبات أصلية لـarm64-v8a وarmeabi-v7a وx86 وx86_64 المجمعة معًا أن تتضاعف بسهولة أو تضاعف حجمها ثلاث مرات مقارنة بالإصدار الذي يحتوي فقط على البنية الوحيدة التي يحتاجها جهازك. قم بضرب ذلك عبر الملايين من عمليات التثبيت، وستجد قدرًا كبيرًا حقًا من النطاق الترددي والتخزين الضائعين، للتعليمات البرمجية التي لن تعمل أبدًا على هذا الجهاز.

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

كيف تستخدم ملفات APK وحزم التطبيقات المنقسمة هذا

إذا سبق لك أن فتحت حزمة .apks أو .xapk ولاحظت وجود أسماء ملفات مثل split_config.arm64_v8a.apk وsplit_config.armeabi_v7a.apk وsplit_config.xxhdpi.apk وsplit_config.en.apk بجوار base.apk، فهذا هو بالضبط هذا النظام قيد التنفيذ، حيث تم تصديره كمجموعة من الملفات بدلاً من تسليمها بصمت بواسطة متجر Play. عادةً ما تكون تقسيمات الكثافة واللغة آمنة للتثبيت بشكل عشوائي نظرًا لأن الهاتف سيتجاهل ببساطة الموارد التي لا يحتاج إليها. يختلف تقسيم البنية: قم بتثبيت الإصدار الخاطئ، أو تفشل في تثبيت الإصدار المطابق، وستواجه مشكلة حقيقية.

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

ماذا يحدث عندما لا تتطابق الهندسة المعمارية

هناك وضعان مختلفان للفشل يستحقان التعرف عليهما، لأنهما يبدوان مختلفين عن المستخدم العادي.

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

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

Diagram comparing a matching arm64 APK that installs and runs successfully against an x86-only APK that fails to install on an arm64 phone with error INSTALL_FAILED_NO_MATCHING_ABIS

كيفية التحقق من بنية هاتفك الخاص

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

كيفية التحقق من البنيات التي يدعمها APK

قبل تثبيت ملف من خارج متجر Play، من المفيد التأكد مما بداخله بدلاً من التخمين. توجد مكتبات APK الأصلية في مجلدات تحمل اسم بنيتها داخل دليل lib/، مثل lib/arm64-v8a/ أو lib/armeabi-v7a/. يمكن لأي أداة يمكنها فحص البنية الداخلية لـ APK أن تخبرك بالضبط عن أي من هذه المجلدات موجودة، مما يخبرك بالضبط عن الأجهزة التي سيتم تشغيل الملف عليها.

تحقق قبل التثبيت

يقرأ أداة معلومات APK مجلد lib/ الداخلي لـ APK ويسرد كل بنية تم تصميمه من أجلها، حتى تتمكن من تأكيد التوافق قبل تحميل أي شيء. عندما تقوم بتحويل حزمة مقسمة باستخدام محول XAPK إلى APK، فإننا نعرض ذلك أيضًا تلقائيًا بعد كل تحويل، مع إدراج البنيات الموجودة في الملف المدمج ووضع علامة عليها عندما يبدو أن البناء يفتقد شريحة قد تحتاجها الأجهزة الشائعة.

Universal APK مقابل Single-ABI APK: ما الذي يجب أن تستخدمه؟

المعيارعالمي / الدهون APKAPK واحد-ABI
حجم الملفأكبر، وأحيانًا 2-4xصغير الحجم، يحتوي فقط على ما يحتاجه جهازك
التوافقيعمل على أي جهاز تقريبايعمل فقط على بنية مطابقة
الأفضل لمشاركة ملف واحد يجب أن يعمل في كل مكان، مع مستلمين غير متأكدينجهازك الخاص، عندما تكون على دراية ببنيته بالفعل
خطرخطر منخفض جدًا لعدم تطابق ABIسوف تفشل أو تتعطل إذا اخترت الخيار الخطأ

الأخطاء الشائعة التي يرتكبها الأشخاص مع الحزم المقسمة

الوجبات السريعة الرئيسية

  • واجهة برمجة التطبيقات (ABI) هي مجموعة التعليمات التي تفهمها الشريحة؛ إنه مهم فقط للتطبيقات التي تتضمن كودًا أصليًا (C/C++).
  • يغطي Arm64-v8a كل الهواتف الحديثة تقريبًا؛ Armeabi-v7a مخصص للأجهزة القديمة؛ يظهر الإصدار x86/x86_64 غالبًا في المحاكيات وأجهزة Chromebook.
  • يتم عادةً تقسيم التطبيقات حسب البنية لتجنب إرسال تعليمات برمجية أصلية غير ضرورية إلى كل جهاز.
  • تعمل البنية غير المتطابقة على حظر التثبيت تمامًا أو تتسبب في حدوث عطل فوري بعد التثبيت الذي يبدو ناجحًا.
  • يمكنك التحقق من بنية جهازك والبنيات المدعومة لـ APK قبل تثبيت أي شيء، وتجنب التخمين تمامًا.

الأسئلة الشائعة (FAQ)

هل أحتاج إلى معرفة بنية هاتفي لتثبيت تطبيق متجر Play العادي؟

لا. يكتشف متجر Play تلقائيًا جهازك ويقدم فقط تقسيم البنية المطابقة، لذلك يصبح هذا ذا صلة فقط عندما تقوم بتحميل ملفات APK من خارج متجر Play.

هل يمكن لملف APK واحد أن يدعم بنيات متعددة في وقت واحد؟

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

لماذا تم تثبيت APK المحول الخاص بي ثم تعطل على الفور؟

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

هل Arm64-v8a متوافق مع الإصدارات السابقة مع تطبيقات Armeabi-v7a؟

عموما نعم. يمكن لمعظم شرائح Arm64-v8a أيضًا تنفيذ تعليمات ARM 32 بت، لذلك عادةً ما يستمر تشغيل ملف APK الخاص بـarmeabi-v7a-only على هاتف Arm64 الحديث، ولكن ليس العكس.

هل ستظل أجهزة Android x86 موجودة في عام 2026؟

إنها نادرة في الهواتف اليوم، ولكنك لا تزال تجد x86 أو x86_64 في بعض الأجهزة اللوحية القديمة المستندة إلى Intel، وعدد قليل من أجهزة Chromebook التي تعمل بتطبيقات Android، ومعظم محاكيات Android لسطح المكتب.

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

تم تصميمها وتوثيقها بواسطة Mst Shaefale المطور الرئيسي ومهندس حزم Android • تم التحقق منه على Android 12–15

يحتفظ Mst Shaefale بدمج XAPK/APKS من جانب العميل، ومحلل البيانات الثنائية، وأدوات توقيع APK v1+v2 في xapktoapk.com. اكتشاف أمر قديم أو تغيير نظام التشغيل؟ أرسل مذكرة تحريرية.