الحصول على نظام iOS من Square جاهزًا لـ Apple Silicon مع Bazel

مقدمة لنظام iOS في Square

في Square ، نستخدم Bazel لبناء تطبيقات iOS الخاصة بنا. Bazel هي أداة بناء مع التركيز على الأداء والصحة. يعيش معظم كود تطبيق iOS الخاص بنا في مستودع git واحد. يتضمن المستودع أكثر من ألف وحدة نمطية، ويحتوي على Objective-C و Swift ، ويتضمن تبعيات ثنائية داخلية وخارجية. اعتمد Square Bazel لتحسين الأداء، وجعل IDE أكثر استجابة، والتحكم في البنيات. خفضت Bazel أوقات البناء بما يصل إلى 4x في بعض الحالات. تمنحنا لغة بناء Bazel ونموذج أساسي قوي مفتوح المصدر وقابلية للتوسعة تحكمًا كاملاً في النظام بأكمله بما في ذلك الرسم البياني للبناء والتنفيذ. مكّن ذلك من إدخال تحسينات رئيسية مثل طرح بنية دقيقة واختبار التخزين المؤقت مدعومًا بشبكة CDN، وتحسين استدعاءات المترجم، وتصميم CI بشكل أفضل، والتشغيل بسهولة على محاكي Apple Silicon. مجتمعية ومفتوحة المصدر في rules_ios . شكراً جزيلاً لأوسكار بونيلا وسام جيدينز على قواعد الشراء المفتوحة.

Apple Silicon لمطوري iOS

في يونيو 2020، أعلنت شركة Apple أن جهاز Mac ينتقل إلى وحدة المعالجة المركزية القائمة على الذراع والمعروفة باسم Apple Silicon. بينما نحن متحمسون لفوائد أداء Apple Silicon ، يركز هذا المنشور على iOS Simulator. المحاكي هو الأداة الأساسية التي يستخدمها مطورو iOS لتكرار وبناء وتشغيل التعليمات البرمجية. مثل تطبيقات macOS االأخرى،يتم تنفيذه محليًا على نظام التشغيل ووحدة المعالجة المركزية الخاصة بالمطور. باستخدام Apple silicon ، يمكنك أيضًا تشغيل تطبيقات Arm iOS مباشرة على جهاز المحاكاة! تلعب بنية مجموعة تعليمات Arm (ISA) دورًا رئيسيًا في تمكين هذا:

على مدى العقد الماضي، استخدم جهاز Mac وحدات المعالجة المركزية Intel ونفذ المحاكي بناء x86_64 ISA لتطبيقات iOS. يعني انتقال Apple Silicon أن تطبيقات المحاكاة المبنية من Intel ستعمل تحت طبقة انتقالية، Rosetta 2.

أقصر طريق إلى M1 Simulator

تشمل المسارات الثلاثة الممكنة لاستخدام M1 من أجل التطوير عمليات إنشاء الأجهزة، واستخدام بناءات x86_64 في إطار Rosetta 2، وبناء جهاز محاكاة M1. نظرًا لأن جزءًا كبيرًا من مصدر التطبيق يعمل بشكل مختلف عند تصميمه للجهاز، فقد تم استبعاد استخدام تصميمات الجهاز فقط. تم استبعاد طبقة الانتقال Rosetta 2 بسبب مشكلات وقت التشغيل وفترة الانتقال التي تبلغ عامين إلى Apple Silicon . كان البناء والتشغيل على جهاز محاكاة M1 هو النهج الذي هبطنا عليه. يعني الانتقال إلى M1 تحديث تبعيات iOS لدعم تصميمات Arm simulator.

لتقديم تبعيات الجهاز والمحاكاة في ملف واحد، غالبًا ما يتم حزم التبعيات الثنائية لنظام التشغيل iOS كثنائي سمين. ثنائي الدهون هو قطعة أثرية للبناء مقسمة حسب العمارة. يمكن للروابط تحديد الشريحة الصحيحة من ثنائي سمين لبنية معينة. تقليديًا، استخدمت الأنظمة شريحة arm64 للجهاز وشريحة x86_64 للمحاكي. لم يعد هذا يعمل عندما يكون كل من جهاز المحاكاة والجهاز أيضًا arm64. قدمت Apple هيكل xcframework الذي يوحد تغليف التبعية ويساعد في دعم Apple Silicon. يتضمن xcframework النموذجي Info.plist الذي يشير إلى الثنائي الصحيح.

فرز تحديث الشركة على نطاق واسع باستخدام Bazel

من أجل الدعم الكامل لمحاكاة M1، كانت هناك ترقية جماعية للتبعيات الثنائية بالترتيب. كانت هذه خطوة ضرورية لأن بعض التبعيات لها سلوكيات مختلفة تحت المحاكاة. استعلام Bazel هو أحد أدوات Bazel القوية التي ساعدت في الفرز. استعلام Bazel هو أداة تتضمن لغة استعلام وواجهة سطر أوامر لطباعة معلومات حول الإنشاء. للعثور على التحديثات وترتيبها بسرعة، قمنا بالاستفادة منها للعثور على جميع التبعيات الثنائية ثم قمنا بترتيب تذاكر JIRA للمالكين. في Square ، تحتوي المستودعات على ملف OWNERS؛ هذا جعل من السهل تعيين التبعيات للفرق المناسبة.

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

حل مؤقت لاستخدام جهاز محاكاة M1

نظرًا لأن نظام iOS الأساسي يستخدم أيضًا Arm ISA، يمكن تشغيل رمز الجهاز محليًا على جهاز Mac. يمكننا الاستفادة من حقيقة أن العديد من التبعيات ستعمل بشكل متشابه بما يكفي لمعظم المطورين لاستخدام المحاكي. جزء كبير من كود مطور iOS هو نفسه وظيفيًا عند تصميمه للمحاكي. تتضمن أمثلة الاستثناءات إشارات برنامج التحويل البرمجي الخاصة بالنظام الأساسي مثل TARGET_IS_SIMULATOR التبعيات الخاصة بالنظام الأساسي. نحتاج فقط إلى إصلاح أخطاء وقت الإنشاء ووقت التشغيل.

التبعيات المرتبطة بشكل ثابت

في إصدار iOS ، يتم ربط الأطر الثابتة والمكتبات الثابتة بحزمة تطبيقات في وقت الإنشاء. عندما يواجه الرابط تبعية ثابتة تم إنشاؤها للجهاز، فإنه يثير خطأ:

في رابط Apple ld64، يعد هذا خطأ عدم تطابق النظام الأساسي ومصدر قلق للرابط. من أجل الحصول على بناء التطبيق، يجب منع خطأ الرابط هذا. هناك خياران: بناء رابط يتجاهله، يمكنه تحديث الرؤوس في موضع ملفات كائنات مستقلة، ويوفر arm64-to-simرابط Apple علامة غير موثقة لتعيين الخطأ في تحذير. لقد صممنا في الأصل نموذجًا أوليًا للإصدار الأول من هذا الحل باستخدامldarm64-to-simالنهج والتشبث به لتجنب واجهة برمجة التطبيقات غير الموثقة، وتجنب إيقاف تشغيلها على مستوى العالم، وتجنب إضافة التحذيرات. بالإضافة إلى ذلك، احتجنا إلى إعادة كتابة رؤوس مفتول العضلات لـ dylibs والتي أضافت مطلب تصحيح الثنائيات. تعد علامة ld غير الموثقة بمثابة حل سريع إذا كان البناء الذي يحتوي فقط على تبعيات ثابتة، فلا تمانع في تعطيله على مستوى العالم.

التبعيات المرتبطة ديناميكيًا

في تطبيق iOS ، يتم تجميع المكتبات الديناميكية والأطر الديناميكية في دليل .app حتى يتمكن النظام من تحميلها في وقت التشغيل. يؤدي تشغيل تطبيق في جهاز المحاكاة باستخدام تبعيات جهاز ديناميكية إلى حدوث خطأ:

للتغلب على هذا، يمكننا ببساطة تحديث رؤوس مفتول العضلات لتعكس محاكاة ثنائية مبنية. توفر Apple vtoolالبرنامج الذي يمكنه تحقيق ذلك. يُنسب الفضل إلى Hacking الأصلية للثنائيات Arm64 للتشغيل على iOS Simulator – منشور إصدار الإطار الديناميكي الذي يوثق مساحة المشكلة والاستفادة vtoolمن الإصلاح.

التحويل التلقائي للتبعية M1 مع Bazel

بفضل قوة Bazel ، يمكننا البدء والتشغيل بسهولة عن طريق تحويل تبعيات الجهاز للعمل مع M1. يوفر Bazel أفكارًا مجردة مثل القواعد والجوانب التي تسمح لنا بإنجاز المهمة بشكل صحيح والاندماج مع قواعد البناء الحالية لدينا.

يتمثل جوهر الفكرة في العثور على جميع التبعيات في الرسم البياني للبناء التي تم تجميعها مسبقًا وتصحيحها للعمل مع محاكي M1. يجعل Bazel هذا الأمر سهلاً مع العناصر الأولية مثل القواعد والجوانب والأفعال. في Bazel ، القاعدة هي وظيفة لتحديد منطق البناء الذي يعمل على المدخلات وينتج المخرجات. يسمح الجانب بزيادة الرسم البياني للبناء بمعلومات أو إجراءات إضافية. عادةً ما rules_ios,يتم تنفيذ تطبيق iOS كقاعدة ios_applicationتعتمد على apple_frameworkقاعدة تعتمد على كود المصدر و dylibs المترجمة مسبقًا.

تمثيل مبسط لرسم بياني تبعية لتطبيق iOS

بالنسبة لدعم Apple Silicon ، قدمنا ​​تجريدًا “وسيطًا” لتوفير التبعيات لاستدعاء ios_application'sرابط قابل للتنفيذ. بموجب هذا المخطط، ios_applicationيعتمد a على import_middlemanالذي يطبق find_importsالجانب على التبعيات. تقوم الأبعاد find_importsبتجميع التبعيات في مجموعة، ويتم إنشاء إجراء للتحديث لكل عنصر من العناصر. بالنسبة للمكتبات الديناميكية، يتم تشغيل الإجراء vtoolولأرشيفات ثابتة arm64-to-sim.

تمثيل مبسط لرسم بياني تبعية لتطبيق iOS بالإضافة إلى تجريد الوسيط

خاتمة

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

إذا كنت مهتمًا بتحسين إصدارات iOS مع Bazel ، تعال وانضم إلى فريقناابحث عن وظائف في Block.

المصدر: developer

شاهد المزيد:

ربح المال من الانترنت

ما هي استضافة المواقع الإلكترونية

متخصص سيو

ترجمة هولندي عربي

افضل شركات الاستضافة

تحسين محركات البحث SEO 2023

قوالب ووردبريس عربية

أفضل اضافات ووردبريس

أنت تستخدم إضافة Adblock

يعتمد موقع انشاء على الاعلانات كمصدر لدعم الموقع، يجب عليك ايقاف تشغيل حاجب الاعلانات لمشاهدة المحتوي