ترحيل تطبيقات iOS (ARM) تلقائيًا إلى macOS (x86) باستخدام Bitcode

عندما قدمت شركة Apple تقنية Bitcode وجعلتها إلزامية لـ watchOS و tvOS ، بدا أن الشركة تتجاهل الأسئلة حول سبب الحاجة إليها على الإطلاق. وقالت غامضة فقط أنه يساعد على تخصيص الملفات الثنائية ويستخدم أحدث التحسينات مترجم.

منذ ذلك الحين ، لعبت Bitcode دورًا مهمًا في الانتقال السلس لـ watchOS إلى 64 بت ، حيث لم يكن على المطورين إعادة ترجمة تطبيقاتهم في الدليل. قامت Apple نفسها بذلك تلقائيًا: بدأت جميع التطبيقات تعمل على Apple Watch Series 4. ربما لم تلاحظ حتى حدوث الترحيل.

ما هو البيكود؟ حسنًا ، يمثل bitcode with small b هو التمثيل الوسيط الخاص بالعمارة الذي تستخدمه LLVM ، ويشير Bitcode مع كبير B إلى مجموعة من الوظائف التي تتيح لك تضمين هذا العرض في ثنائي Mach-O الخاص بك ، والآليات التي يمكنك من خلالها تقديم هذا الملف في متجر التطبيقات.

لا يكون رمز Bitcode مرنًا مثل الشفرة المصدرية ، لكنه أكثر مرونة من الثنائي المضمن ، مع بيانات التعريف والشروح للمترجم. في الممارسة العملية ، يمكنك (أو Apple) أخذ مقاطع Bitcode بسهولة من التطبيق وإعادة ترجمتها إلى نسخة كاملة التطبيق من التطبيق. يعد التبديل من armv7 إلى armv7s أو من arm64 إلى arm64e رائعًا ويوفر الوقت للمطورين الذين اضطروا إلى إعادة ترجمة الثنائي في كل مرة تقوم Apple بتغيير رقائق ARM. منذ فترة طويلة تستخدم Apple رمز Bitcode في برامج تشغيل OpenGL ، بحيث يمكن تحسين برنامج التشغيل سريعًا لمختلف هياكل GPU.

لقد رأينا كيف تعزّز Microsoft بفعالية إعادة التجميع الثابت على Xbox One ، مما يوفر الوصول إلى مكتبة كاملة من الألعاب المكتوبة في الأصل لـ Xbox 360 (تحت PowerPC) ، تمامًا دون المطورين أو الوصول إلى التعليمات البرمجية المصدر. وبدون وسيط مثل Bitcode ، مما يبسط العملية.

بطبيعة الحال ، فإن شبح macOS على ARM كان يتسكع لسنوات عديدة. تساءل الكثيرون عما إذا كان ذلك سيجعل من الأسهل نقل تطبيقات باستخدام Bitcode. نتيجة لذلك ، توصلوا إلى توافق في الآراء على أن Bitcode غير مناسب للنقل بين أبنية مختلفة جذريًا مثل Intel و ARM.

هذا لم يقنعني ، لذلك قررت أن تحقق!

للبدء ، نحتاج إلى تطبيق اختبار بسيط على Objective-C مع Bitcode ؛ يتم تضمينه عادةً فقط عند إنشاء أرشيف لمتجر التطبيقات ، لذلك تحتاج إلى فرضه ليتم تضمينه في التجميع العادي. يمكنك استخدام خيار -fembed-bitcode أو خيار -fembed-bitcode المخصص:

 BITCODE_GENERATION_MODE = bitcode 

قم بإنشاء ثنائي لجهاز iOS العام أو الجهاز المتصل ، كالمعتاد. يبدو أن Bitcode ليس مضمنًا في تجميعات arm64e (على سبيل المثال ، إذا كان لديك جهاز A12) ، لذلك يمكنك إيقاف تشغيل إعداد Xcode "التحويل البرمجي فقط للمعماريات النشطة" وتجميعه مباشرة لـ arm64.

باستخدام أداة ebcutil ، يمكن استرداد جميع كائنات Bitcode بسهولة من ملف ثنائي مترجم .

 ebcutil -a arm64 -e path/to/MyApp.app/MyApp 

ثم إعادة ترجمة كل كائن Bitcode لشركة Intel.

 for f in *; do clang -arch x86_64 -c -Xclang -disable-llvm-passes -emit-llvm -x ir -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk $f -o $fo; done 

سنقوم الآن بربط النقط المترجمة مرة أخرى بالملف الثنائي.

 clang -arch x86_64 -mios-version-min=12.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk *.o -o path/to/MyApp.app/MyApp 

إذا كان يعمل ، الآن لدينا الإصدار x86 من التطبيق arm64 الأصلي! من الناحية النظرية ، يمكن وضعها مباشرة في نافذة محاكاة iOS ، يتم تثبيتها وإطلاقها.

هذه حقيقة مهمة للغاية: يمكنك نقل الملفات الثنائية بشكل ثابت بين منصات Intel و ARM إذا كانت تتضمن Bitcode . انها حقا تعمل!


مطبات لمشاريع أكثر تعقيدا


يبدو أن ARC يستخدم أداة التجميع المدمجة ، لذا للنقل من arm64 إلى x86 في الوقت الحالي يجب عليك تعطيل ARC.

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

لماذا هو الهدف جيم؟ حسنًا ، تم تصميم Swift مع مراعاة ARC. لا أعتقد أن هناك طريقة لتجنب المجمّع المضمّن المذكور أعلاه ، وبالتالي فإن إعادة التجميع ستفشل الآن.
لنأخذ خطوة أخرى: سنستخدم marzipanify لتحويل تطبيق Intel iOS هذا إلى برنامج Mac يعمل مع Marzipan.



كان من السهل!

من الناحية النظرية ، هذا يعني أن Apple لديها طريقة لتشغيل أي تطبيق iOS من App Store على Mac ، دون مطالبة المطورين بتحديث تطبيقاتهم أو إعادة ترجمتها.


ماذا لو تحول Mac من Intel إلى شرائح ARM؟ حسنًا ، كما ترى ، باستخدام Bitcode ، يمكنه نقل جميع التطبيقات التي تدعم Bitcode إلى Mac App Store دون مساعدة من المطورين ، لذلك سيكون جاهزًا لتغيير المعالج من اليوم الأول. وهذا يعطي أبل المزيد من الحرية. الآن لست بحاجة إلى الإعلان مقدمًا عن الانتقال إلى معالجات جديدة قبل عام ، ولم تعد هناك حاجة إلى تكنولوجيا مثل Rosetta.

من الواضح أننا لم نصل إلى هذه النقطة: اليوم Apple لا تتضمن Bitcode للتطبيقات في Mac App Store ، واليوم قد لا يكون Bitcode مثاليًا لمثل هذا النقل المعماري. بدلاً من Apple ، أود التركيز على هذين العاملين ، وبالطبع ، تمكين Bitcode لجميع تطبيقات Marzipan على macOS 10.15.

Source: https://habr.com/ru/post/ar452734/


All Articles