في عالم Android، وراء التشغيل البسيط لكل تطبيق، تكمن بنية معقدة من الملفات والعمليات. وهو ما لا يلاحظه معظم المستخدمين في كثير من الأحيان. أحد العناصر الأساسية، وخاصة بالنسبة لأولئك الذين يتعمقون في أعماق نظام التشغيل أو يقومون بتطوير التطبيقات، هي ملفات .art المرتبطة بوقت تشغيل Android (ART). على الرغم من أنها قد تبدو للوهلة الأولى وكأنها جانب فني وبعيد، إن فهم وظيفتها وسبب وجودها أمر ضروري لفهم كيفية عمل Android داخليًا وكيف تطور ليصبح أسرع وأكثر كفاءة وأمانًا..
من هواتف Android الأولى إلى الإصدارات الأحدث، تغير نظام التنفيذ وتنسيق الملفات التي تديرها التطبيقات كثيرًا.. إذا كنت تريد معرفة ما هي ملفات .art، وكيف تختلف عن ملفات ODEX القديمة، وما هو الدور الذي يلعبه ما يسمى ELF، أو ببساطة فهم ما يحدث في كل مرة تقوم فيها بتثبيت تطبيق أو فتحه، في هذه المقالة سنخبرك بكل شيء، دون أي تفاصيل تقنية غير ضرورية وبكل وضوح.. حتى لو كنت مستخدمًا فضوليًا ليس لديك خبرة في التطوير، فستكتشف الكثير من التفاصيل التي من المؤكد أنها ستفاجئك!
ما هو Android Runtime (ART) وكيف ظهر؟

حتى إصدار Android 4.4 KitKat تقريبًا، كان نظام التشغيل الخاص بشركة Google يستخدم Dalvik كآلة افتراضية رئيسية، مسؤولة عن تفسير وتنفيذ التطبيقات التي تم تطويرها بلغة Java. ومع ذلك، كان لدى Dalvik بعض القيود في الأداء والكفاءة، وخاصة في تجميع كود كل تطبيق في الوقت المناسب (JIT) في كل مرة يتم فتحه. Android Runtime، المعروف باسم اختصاره ART، هو بيئة التنفيذ التي جاءت لتجديد واستبدال Dalvik بدءًا من Android 5.0 Lollipop، على الرغم من أنه كان اختياريًا بالفعل في المرحلة الأخيرة من KitKat.
تعمل تقنية ART على إحداث ثورة في طريقة تجميع وتشغيل تطبيقات Android: حيث ينتقل النظام من التجميع في الوقت المناسب (JIT) إلى التجميع المسبق (AOT)، مما يؤدي إلى إنشاء ملفات كود الجهاز الخاصة بالجهاز أثناء تثبيت التطبيق.. بهذه الطريقة، عندما تفتح تطبيقًا ضمن ART، يكون النظام قد أنشأ بالفعل الكود الأصلي ولا يتعين عليه تجميع الأجزاء المهمة أثناء التنقل، مما يعني استهلاك أقل للمعالج، وتنفيذ أسرع بكثير وتوفير كبير في البطارية.
وبالإضافة إلى ذلك، ART متوافق مع تنسيق البايت كود Dalvik .dexلذلك فإن التطبيقات المجمعة في ملفات APK والمصممة للآلة الافتراضية القديمة لا تزال تعمل، ولكن عملية التحويل الداخلي والتنفيذ والتحسين تتغير بشكل جذري.
ما هو ملف .art وكيف يتناسب مع هذا الهيكل؟

لفهم ما هي ملفات Android Runtime .art حقًا، يتعين عليك أولًا وضعها في سياق بنية كل تطبيق Android:
- يتم تجميع الكود المصدر للتطبيقات (Java أو Kotlin) إلى كود Java الثانوي، مما يؤدي إلى إنشاء ملفات .class.
- يتم تحويل كل هذا الكود الثانوي وضغطه إلى تنسيق .dex (Dalvik Executable)، وهو ملف "classes.dex" المضمن في كل APK (مثبت التطبيق القياسي لنظام Android).
- لذلك، فإن APK عبارة عن حزمة مضغوطة تتضمن .dex والموارد والصور والبيان والمكونات الأخرى.
- اعتمادًا على كيفية عمل النظام، مع Dalvik، يتم إعادة تجميع .dex بشكل مستمر من خلال عملية JIT وإنشاء ملفات .odex لتخزين الكود "المُحسَّن".
- ومع ذلك، يستخدم ART استراتيجية مختلفة: أثناء تثبيت التطبيق، يقوم النظام بتجميع ملف .dex إلى كود الجهاز الأصلي وإنشاء ملفات بتنسيق .oat و/أو .art (اعتمادًا على إصدار Android).، والتي تحتوي على الكود المحسن وهياكل البيانات اللازمة لتشغيل التطبيق مباشرة، دون الحاجة إلى مزيد من التجميع في الوقت الفعلي.
على وجه التحديد، ملفات .art (Android Runtime) هي الملفات الناتجة عن هذا التجميع السابق، والتي تم إنشاؤها بواسطة الأداة ديكس2شوفان، ويمكن أن يحتوي على كل من الكود القابل للتنفيذ بتنسيق ELF (تنسيق قابل للتنفيذ والربط)، بالإضافة إلى معلومات إضافية حول صورة الآلة الافتراضية والبيانات من الفئات المترجمة مسبقًا.
ما هي استخدامات ملفات .art وكيف يستفيد منها كل من المستخدم والمطور؟
إن وجود ملفات .art له العديد من العواقب والمزايا المباشرة لمستخدمي Android والمطورين.:
- أداء أفضل للتطبيقبفضل تجميع AOT الذي يحدث أثناء تثبيت كل تطبيق، يصبح بدء تشغيل جميع الوظائف وتنفيذها أسرع بكثير، حيث يكون الكود جاهزًا بالفعل للتشغيل على بنية جهازك (ARM، x86، إلخ.).
- انخفاض استهلاك الموارد والبطارية:من خلال القضاء على الحاجة إلى تجميع التعليمات البرمجية باستمرار أثناء الاستخدام، كما فعل Dalvik، يعمل المعالج بشكل أقل، مما يؤدي إلى توليد حرارة أقل واستخدام طاقة أقل.
- تقليل زمن الوصول عند فتح التطبيقات أو التبديل بينها:لا يتعين على نظام التشغيل الانتظار حتى يتم إعادة تجميع أجزاء من الكود الثنائي، مما يحسن التجربة والسلاسة.
- قدر أكبر من الأمن والسيطرة:ينفذ ART عملية تحقق أكواد أكثر صرامة من Dalvik، مما يقلل من احتمالية تنفيذ أكواد ضارة أو غير صالحة.
- تحسين تصحيح الأخطاء وتتبعها:نظرًا لأن الكود تم تحليله وتجميعه بالفعل، يمكن لـ Android Runtime توفير تتبعات ورسائل خطأ أكثر وضوحًا وتفصيلاً.
بالطبع، كنظير، تشغل ملفات .art و.oat مساحة أكبر على وحدة التخزين الداخلية لأنها تحتوي بالفعل على جميع أكواد الآلة، و قد تستغرق عملية تثبيت التطبيق وقتًا أطول قليلاً من الإصدارات القديمة من أندرويد، على الرغم من أنه اليوم أصبح شيئًا غير محسوس لجميع المستخدمين تقريبًا.
الفرق بين ملفات .art، و.oat، و.odex، و.dex، وELF: ماذا يعني كل منها؟
ربما يكون أحد الأسئلة الأكثر شيوعًا عند التحقيق في Android Runtime هو التمييز بين تنسيقات الملفات المتعددة التي يمكن أن تظهر في النظام. دعونا نجعل الأمر واضحًا بطريقة بسيطة:
- .dex (ملف Dalvik القابل للتنفيذ): هو التنسيق الوسيط الذي يحتوي على الكود الثنائي لتطبيقات Java/Kotlin. يحتوي كل APK على ملف .dex واحد على الأقل (عادةً 'classes.dex').
- .odex (ملف Dalvik التنفيذي المحسن): الملفات التي تم إنشاؤها بواسطة Dalvik أثناء تحسين التطبيق وتنفيذه، وتخزين أجزاء التعليمات البرمجية المترجمة بالفعل لتسريع بدء التشغيل في عمليات التنفيذ اللاحقة. كانت هذه الأنظمة ذات أهمية خاصة في أنظمة ما قبل المصاصة، وتم إزالتها مع وصول تقنية المساعدة على الإنجاب.
- .oat (فن Android المُحسَّن): التنسيق الذي قدمه ART، وهو المعادل الحديث لـ .odex، والذي يمكنه أن يحتوي على كل من الكود الأصلي بتنسيق ELF وهياكل الفئات المحسنة والبيانات الوصفية. يمكن العثور عليها في الإصدارات الحديثة من النظام، وخاصة في مجلدات /data/dalvik-cache أو مجلدات التطبيقات.
- .فن: هو ملف الصورة للآلة الافتراضية لـ Android Runtime. يمكن العثور عليه عادةً في أدلة النظام مثل /system/framework ويحتوي على صورة للفئات والهياكل المترجمة مسبقًا اللازمة لتشغيل الآلة الافتراضية وبدء تشغيلها بشكل أسرع.
- ELF (تنسيق قابل للتنفيذ وقابل للربط): هو تنسيق قياسي للملفات القابلة للتنفيذ على أنظمة Linux/Android. في ART، يتم تخزين الكود الآلي الذي تم إنشاؤه أثناء تثبيت التطبيق في ملفات ELF المضمنة في .oat أو ملفات أخرى.
بينما يختفي ODEX في ART، تصبح ملفات OAT وART (الصورة) ضرورية لبدء التشغيل الفعال وتنفيذ أي تطبيق على Android Lollipop والإصدارات الأحدث..
كيف تتم العملية منذ برمجة التطبيق حتى تشغيله على نظام أندرويد؟
دعونا نرى الخطوات الدقيقة التي يتبعها تطبيق Android من لحظة كتابته حتى تتمكن من فتحه على هاتفك المحمول، مع التمييز بين ما يحدث في Dalvik وفي ART:
- الكود مكتوب في جافا أو كوتلين، عادةً في Android Studio.
- يقوم مُجمِّع Java بإنشاء ملفات .صف دراسي مع بايت كود جافا القياسي.
- يقوم نظام بناء Android (Gradle وأدوات البناء) بتحويل جميع ملفات .class إلى ملف .dex المقابلة.
- تجمع حزمة aapt (أداة تغليف أصول Android) ملفات .dex والموارد والبيان والملفات الأخرى في APK موقعة ومرتبة.
- عند تثبيت ملف APK هذا على جهازك:
- اذا ركضت في Dalvik (Android 4.4 أو إصدار سابق)، يقوم النظام بفك ضغط ملف .dex، وفي كل مرة تفتح فيها التطبيق، يقوم بتجميعه جزئيًا إلى كود الجهاز، مما يؤدي إلى إنشاء ملف .odex (ملف Dalvik Executable محسن) للتخزين المؤقت.
- اذا ركضت فن(ART) (Android 5.0 أو أعلى)، أثناء تثبيت الأداة ديكس2شوفان يقوم بإنشاء ملفات .oat و.art، ويقوم بتجميع كل التعليمات البرمجية الثنائية إلى التعليمات البرمجية الأصلية للمعالج الخاص بك ويخزنها بتنسيق ELF داخل .oat، إلى جانب الهياكل اللازمة للتنفيذ. بهذه الطريقة، في المرة التالية التي تفتح فيها التطبيق، سيبدأ هذا على الفور تقريبًا وسيكون جاهزًا للاستخدام..
يسمح هذا التغيير في سير العمل أداء مُحسَّن بشكل أكبر، واستخدام أكثر ذكاءً للذاكرة، والقدرة على ترقيم الصفحات (نقلها إلى القرص) للأجزاء الأقل استخدامًا من الكود، وهو ما لم يكن Dalvik قادرًا على القيام به بكفاءة..
أين توجد ملفات .art و.oat على الجهاز؟
إذا سبق لك تصفح محتويات Android الداخلية (باستخدام أذونات الجذر أو على المحاكيات)، فمن المحتمل أنك رأيت أدلة مثل /data/dalvik-cache أو /system/framework. هذا هو المكان الذي توجد فيه معظم ملفات .art و.oat التي تم إنشاؤها بواسطة النظام.. يحتوي كل تطبيق على ملف ذاكرة تخزين مؤقت خاص به، مع أسماء ومسارات مستمدة من ملف APK الأصلي.
في أنظمة Android الأحدث، تتضمن ملفات .art عادةً صورة وقت التشغيل، بينما تحتوي ملفات .oat على كود الجهاز المُحسَّن، وكلاهما بتنسيق ELF. تُعد هذه الملفات ضرورية لتمكين الآلة الافتراضية ART من التشغيل بسرعة وتمكين التطبيقات من العمل دون أي اختناقات..
المزايا والعيوب الرئيسية لـ ART مقارنةً بـ Dalvik و ODEX
كان التحول من Dalvik إلى ART بمثابة نقطة تحول في تاريخ Android. دعونا نرى بوضوح ما هي الفوائد والتحديات التي أضافها هذا التغيير.:
- الأداء والكفاءة:يعمل ART على تقليل وقت بدء تشغيل التطبيق بشكل كبير ويحقق تنفيذًا أكثر استقرارًا وسلاسة. باستخدام تجميع JIT، قام Dalvik بمعاقبة السرعة في كل مرة يتعين فيها تشغيل تطبيق، خاصةً إذا كان يحتوي على العديد من الوظائف أو الفئات.
- استهلاك الطاقة:إن الحاجة المنخفضة للتجميع أثناء التنقل توفر عمر البطارية وتولد حرارة أقل على الجهاز، على عكس Dalvik.
- مساحة قرص أكبر:من خلال تخزين الكود الأصلي الذي تم إنشاؤه بالفعل، تنتهي التطبيقات إلى احتلال مساحة داخلية أكبر على هاتفك المحمول أو جهازك اللوحي. ومن المتوقع أن يكون هناك زيادة متوسطة تصل إلى 20% مقارنة بالأنظمة القديمة.
- التثبيت أبطأ- قد تستغرق عملية التحليل والتجميع الكاملة أثناء تثبيت التطبيق بضع ثوانٍ أطول من ذي قبل، وهو أمر أكثر وضوحًا على الأجهزة القديمة. ومع ذلك، فهو وقت يتم استثماره مرة واحدة فقط ثم يتم استرداده مع كل استخدام.
- تعزيز التحقق والأمان:لا يسمح ART ببعض ممارسات البرمجة التي يتسامح معها Dalvik، مما يحسن من قوة النظام بشكل عام. على سبيل المثال، فإنه يرفض الكود الثنائي غير الصالح الذي تم إنشاؤه بواسطة أدوات التعتيم غير المتوافقة أو الممارسات الخطرة، مما يجبر المطورين على اتباع الممارسات الجيدة.