تنسيق Dalvik القابل للتنفيذ

يصف هذا المستند تنسيق ملفّات .dex ومحتوى هذه الملفات، والتي تُستخدَم لتضمين مجموعة من تعريفات الفئات والبيانات الملحقة المرتبطة بها.

دليل الأنواع

الاسم الوصف
بايت عدد صحيح بترميز ثنائي 8 بت
ubyte عدد صحيح غير موقَّت بسعة 8 بت
فيديو قصير عدد صحيح بترميز ثنائي 16 بت بترتيب الوحدات الأقل أهمية أولاً
ushort عدد صحيح غير موقَّت بسعة 16 بت بترتيب الوحدات الأقل أهمية أولاً
تدخُّل دفاعي عدد صحيح بعلامة 32 بت، ترتيب الوحدات الأقل أهمية أولاً
uint عدد صحيح غير موقَّت بسعة 32 بت بترتيب الوحدات الأقل أهمية أولاً
طويلة عدد صحيح موقَّع 64 بت، ترتيب الوحدات الأقل أهمية أولاً
ulong عدد صحيح غير موقَّت بسعة 64 بت بترتيب الوحدات الأقل أهمية
sleb128 LEB128 موقَّع، بطول متغيّر (راجِع المعلومات أدناه)
uleb128 LEB128 غير الموقعة، ذات الطول المتغيّر (راجِع ما يلي)
uleb128p1 LEB128 غير الموقعة بالإضافة إلى 1، ذات الطول المتغير (راجِع ما يلي)

LEB128

‫LEB128 ("Little-Endian Base 128") هو قاعدة تمثيل برمجي بطول متغير لقياسquantities عدد صحيح عشوائي مع علامة أو بدون علامة. تم اقتباس التنسيق من مواصفات DWARF3. في ملف .dex، لا يتم استخدام LEB128 إلا ل код ترميز القيم التي تبلغ 32 بت.

تتألف كل قيمة مُشفَّرة بترميز LEB128 من واحد إلى خمسة بايت، والتي تمثّل معًا قيمة واحدة بسعة 32 بت. يتم ضبط البت الأكثر أهمية في كل باييت باستثناء البايت الأخير في التسلسل، والذي يكون فيه البت الأكثر أهمية مُلغى. أما البتّان المتبقيان من كل بايت، فهما الحمولة، مع البتّان العميقان الذين يمثّلان الكمية في البايت الأول، والبتّان التاليان في البايت الثاني وما إلى ذلك. في حال استخدام LEB128 (sleb128) الذي يحمل علامة، تتم إضافة علامة إلى البت الأكثر أهمية في الحمولة البرمجية للبايت الأخير في التسلسل لإنشاء القيمة النهائية. في الحالة غير الموقعة (uleb128)، يتم 0تفسير أي بتات غير ممثّلة صراحةً على أنّها 0.

مخطّط بياني على مستوى البت لقيمة LEB128 تبلغ سعتها بايتان
أول بايت البايت الثاني
1 ‫bit6 ‫bit5 ‫bit4 ‫bit3 بت2 بت1 بت0 0 بت13 ‫bit12 بت11 ‫bit10 ‫bit9 ‫bit8 ‫bit7

يُستخدَم الصيغة uleb128p1 لتمثيل قيمة signed ، حيث يكون التمثيل للقيمة بالإضافة إلى واحد مُشفَّرًا على أنّه uleb128. يؤدي ذلك إلى ترميز -1 (أو القيمة غير الموقعة 0xffffffff) باستخدام بايتة واحدة، وليس أي رقم سلبي آخر، وهو مفعّل في الحالات التي يجب فيها أن يكون الرقم المعروض غير سالب أو -1 (أو 0xffffffff)، ولا يُسمح بأي قيم سالبة أخرى (أو حيث من غير المرجّح أن تكون هناك حاجة إلى قيم غير موقعة كبيرة).

في ما يلي بعض الأمثلة على التنسيقات:

التسلسل المشفَّر باسم sleb128 باسم uleb128 باسم uleb128p1
0000-1
01110
7f-1127126
80 7f-1281625616255

تنسيق الملف

الاسم التنسيق الوصف
عنوان header_item العنوان
string_ids string_id_item[] قائمة معرّفات السلاسل هذه هي المعرّفات لجميع السلاسل التي يستخدمها هذا الملف، إما لتسمية داخلية (مثل أوصاف الأنواع) أو كعناصر ثابتة يشير إليها الرمز. يجب ترتيب هذه القائمة حسب محتوى السلسلة، باستخدام قيم نقاط الترميز UTF-16 (وليس بطريقة حساسة للّغة)، ويجب ألا تحتوي على أي إدخالات مكرّرة.
type_ids type_id_item[] نوع قائمة المعرّفات هذه هي المعرّفات لجميع الأنواع (الفئات أو المصفوفات أو الأنواع الأساسية) التي يشير إليها هذا الملف، سواء تم تحديدها في الملف أم لا. يجب ترتيب هذه القائمة حسب فهرس string_id وألّا تحتوي على أي إدخالات مكرّرة.
proto_ids proto_id_item[] قائمة معرّفات النماذج الأولية للطريقة هذه هي المعرّفات لجميع النماذج الأولية التي يشير إليها هذا الملف. يجب ترتيب هذه القائمة بالترتيب الرئيسي لنوع الإرجاع (حسب فهرس type_id)، ثم بالترتيب التالي: حسب قائمة الوسيطات (الترتيب الألفبائي، والوسيطات الفردية مرتبة حسب فهرس type_id). يجب ألا تحتوي القائمة على أي إدخالات مكرّرة.
field_ids field_id_item[] قائمة معرّفات الحقول هذه هي المعرّفات لجميع الحقول التي يشير إليها هذا الملف، سواء تم تحديدها في الملف أم لا. يجب ترتيب هذه القائمة، حيث يكون النوع المحدّد (حسب فهرس type_id) هو الترتيب الرئيسي، ويكون اسم الحقل (حسب فهرس string_id) هو الترتيب الوسيط، ويكون النوع (حسب فهرس type_id) هو الترتيب الثانوي. يجب ألا تحتوي القائمة على أي إدخالات مكرّرة.
method_ids method_id_item[] قائمة معرّفات الطرق هذه هي المعرّفات لجميع الطرق التي يشير إليها هذا الملف، سواء تم تحديدها في الملف أم لا. يجب ترتيب هذه القائمة، حيث يكون النوع المحدّد (حسب الفهرس type_id ) هو الترتيب الرئيسي، ويكون اسم الطريقة (حسب الفهرس string_id ) هو الترتيب المتوسط، ويكون النموذج الأولي للطريقة (حسب الفهرس proto_id) هو الترتيب الثانوي. يجب ألا تحتوي القائمة على أي إدخالات مكرّرة.
class_defs class_def_item[] قائمة تعريفات الفئات يجب ترتيب الفئات بحيث تظهر فئة رئيسية لفئة معيّنة وواجهات تم تنفيذها في قائمة الفئات قبل الفئة المُشار إليها. بالإضافة إلى ذلك، من غير الصالح أن يظهر تعريف للصف بالاسم نفسه أكثر من مرة في القائمة.
call_site_ids call_site_id_item[] قائمة معرّفات مواقع الاتصال هذه هي المعرّفات لجميع مواقع الاتصال التي يشير إليها هذا الملف، سواء تم تحديدها في الملف أم لا. يجب ترتيب هذه القائمة بشكل تصاعدي حسب call_site_off.
method_handles method_handle_item[] قائمة أسماء المعالِجات قائمة بجميع أسماء معالِم الطرق التي يشير إليها هذا الملف، سواء تم تحديدها في الملف أم لا هذه القائمة غير مرتبة وقد تحتوي على نُسخ طبق الأصل التي ستتوافق منطقيًا مع نُسخ مختلفة من معالِم الطرق.
البيانات ubyte[] منطقة البيانات، التي تحتوي على جميع بيانات الدعم للجداول المدرَجة أعلاه تختلف متطلبات المحاذاة باختلاف العناصر، ويتم إدراج وحدات البايت المخصّصة للحشو قبل كل عنصر إذا لزم الأمر لتحقيق المحاذاة المناسبة.
link_data ubyte[] البيانات المستخدَمة في الملفات المرتبطة بشكل ثابت لا يحدّد هذا المستند تنسيق البيانات في هذا القسم. يكون هذا القسم فارغًا في الملفات غير المرتبطة، وقد تستخدم عمليات التنفيذ أثناء التشغيل هذا القسم على النحو الذي تراه مناسبًا.

تنسيق الحاوية

يقدّم الإصدار 41 تنسيق حاوية جديدًا لبيانات DEX بهدف توفير المساحة. يسمح تنسيق الحاوية هذا بدمج عدة ملفات DEX منطقية في ملف مادي واحد. يعتمد التنسيق الجديد في أغلب الأحيان على تسلسل الملفات بتنسيق سابق، مع بعض الاختلافات:

  • يشير file_size إلى حجم الملف المنطقي، وليس الملف الفعلي. ويمكن استخدامه للتنقّل في جميع الملفات المنطقية في الحاوية.
  • يمكن أن تشير ملفات dex المنطقية إلى أي بيانات لاحقة في الحاوية (ولكن ليس البيانات السابقة). ويسمح ذلك لملفات dex بمشاركة البيانات، مثل السلاسل، مع بعضها.
  • تكون جميع العناصر المرجعية نسبية إلى الملف الفعلي. لا يكون أيّ إزاحة نسبيًا للعنوان. يضمن ذلك إمكانية مشاركة الأقسام التي تحتوي على Offsets بين الملفات المنطقية.
  • يضيف العنوان حقلين جديدَين لوصف حدود الحاوية. هذه عملية تحقّق إضافية من الاتساق وتسهّل نقل الرمز إلى التنسيق الجديد.
  • أصبحت data_size وdata_off غير مستخدَمة الآن. يمكن توزيع البيانات على ملفات منطقية متعددة ولا يلزم أن تكون متّصلة.

تعريفات حقل الوحدات وسلسلة الأحرف والثابت

DEX_FILE_MAGIC

مضمّن في header_item

الصفيف/السلسلة الثابتة DEX_FILE_MAGIC هي قائمة بالكلمات الثنائيّة التي يجب أن تظهر في بداية ملف .dex لكي يتم التعرّف عليه على هذا النحو. تحتوي القيمة عمدًا على سطر جديد ("\n" أو 0x0a) وأحد وحدات البايت الفارغة ("\0" أو 0x00) للمساعدة في رصد أشكال معيّنة من التلف. تشفّر القيمة أيضًا رقم إصدار التنسيق على هيئة ثلاثة أرقام عشرية، ومن المتوقّع أن يزداد بشكل منتظم بمرور الوقت مع تطور التنسيق.

ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 }
                        = "dex\n039\0"

ملاحظة: تمت إضافة التوافق مع الإصدار 040 من التنسيق في الإصدار 10.0 من Android، ما أدى إلى توسيع مجموعة الأحرف المسموح بها في SimpleNames.

ملاحظة: تمّت إضافة التوافق مع الإصدار 039 من التنسيق في الإصدار 9.0 من نظام التشغيل Android، والذي قدّم رمزَي برمجة ثنائيَّين جديدَين، const-method-handle وconst-method-type. (يتم وصف كلٍّ منها في جدول ملخّص لمجموعة الرموز القصيرة.) في Android 10، يُوسّع الإصدار 039 تنسيق ملف DEX ليشمل معلومات API hidden التي لا تنطبق إلا على ملفات DEX في مسار فئة التمهيد.

ملاحظة: تمت إضافة التوافق مع الإصدار 038 من التنسيق في الإصدار 8.0 من نظام التشغيل Android. أضاف الإصدار 038 وحدات ترميز برمجية جديدة (invoke-polymorphic وinvoke-custom) و بيانات لمعرّفات الطرق.

ملاحظة: تمت إضافة التوافق مع الإصدار 037 من التنسيق في الإصدار 7.0 من Android. قبل الإصدار 037، كانت معظم إصدارات Android تستخدم الإصدار 035 من التنسيق. الاختلاف الوحيد بين الإصدارَين 035 و037 هو إضافة الطرق التلقائية وتعديل invoke.

ملاحظة: تم استخدام إصدارَين سابقَين على الأقل من التنسيق في إصدارات البرامج العامة المتاحة على نطاق واسع. على سبيل المثال، تم استخدام الإصدار 009 لإصدارات M3 من منصّة Android (تشرين الثاني/نوفمبر إلى كانون الأول/ديسمبر 2007)، بينما تم استخدام الإصدار 013 لإصدارات M5 من منصّة Android (شباط/فبراير إلى آذار/مارس 2008). تختلف هذه الإصدارات المبكرة من التنسيق اختلافًا كبيرًا عن الإصدار الموضّح في هذا المستند من عدّة جوانب.

ENDIAN_CONSTANT وREVERSE_ENDIAN_CONSTANT

مضمّن في header_item

يتم استخدام الثابت ENDIAN_CONSTANT للإشارة إلى ترتيب البتات في الملف الذي تم العثور عليه فيه. على الرغم من أنّ تنسيق .dex العادي هو تنسيق little-endian، قد تختار عمليات التنفيذ تبديل البايتات. إذا صادفت عملية التنفيذ عنوانًاendian_tag‏=REVERSE_ENDIAN_CONSTANT بدلاً منENDIAN_CONSTANT، ستعرف أنّه تم تبديل البايت في الملف عن النموذج المتوقّع.

uint ENDIAN_CONSTANT = 0x12345678;
uint REVERSE_ENDIAN_CONSTANT = 0x78563412;

NO_INDEX

مضمّنة في class_def_item وdebug_info_item

يُستخدَم الثابت NO_INDEX للإشارة إلى أنّه لا تتوفّر قيمة فهرس.

ملاحظة: لا يتمّ تحديد هذه القيمة لتكون 0، لأنّه عادةً ما يكون هذا فهرسًا صالحًا.

يمكن تمثيل القيمة المحدّدة لـ NO_INDEX كبايت واحد في ترميز uleb128p1.

uint NO_INDEX = 0xffffffff;    // == -1 if treated as a signed int

تعريفات access_flags

مضمّنة في class_def_item وencoded_field وencoded_method و InnerClass

تُستخدَم حقول العناصر الثنائية لهذه العلامات للإشارة إلى تسهيل الاستخدام والسمات العامة للفئات وعناصر الفئات.

الاسم القيمة بالنسبة إلى الصفوف (والتعليقات التوضيحية InnerClass) للحقول بالنسبة إلى الطرق
ACC_PUBLIC 0x1 public: ظاهرة في كل مكان public: ظاهرة في كل مكان public: ظاهرة في كل مكان
ACC_PRIVATE 0x2 * private: تظهر فقط للفئة المحدّدة private: تظهر فقط للفئة المحدّدة private: تظهر فقط للفئة المحدّدة
ACC_PROTECTED 0x4 * protected: ظاهرة لحزمة والطبقات الفرعية protected: مرئية للحزمة والفئات الفرعية protected: مرئية للحزمة والفئات الفرعية
ACC_STATIC 0x8 * static: لم يتم إنشاؤه باستخدام مرجع this خارجي static: عنصر عام للفئة المحدّدة static: لا يقبل وسيطة this
ACC_FINAL 0x10 final: لا يمكن تقسيمها إلى فئات فرعية final: لا يمكن تغييرها بعد إنشائها final: لا يمكن إلغاؤها
ACC_SYNCHRONIZED 0x20     synchronized: القفل المرتبط الذي يتم الحصول عليه تلقائيًا عند استدعاء هذه الطريقة

ملاحظة: لا يمكن ضبط هذا الإعداد إلا عند ضبط ACC_NATIVE أيضًا.

ACC_VOLATILE 0x40   volatile: قواعد وصول خاصة للمساعدة في الحفاظ على أمان المحادثة  
ACC_BRIDGE 0x40     طريقة الجسر التي يضيفها المُجمِّع تلقائيًا كجسر آمن من النوع
ACC_TRANSIENT 0x80   transient: لا يتم حفظها من خلال التسلسل التلقائي  
ACC_VARARGS 0x80     يجب أن يتعامل المُجمِّع مع الوسيطة الأخيرة على أنّها وسيطة "باقية".
ACC_NATIVE 0×100     native: تم تنفيذها في الرموز البرمجية الأصلية
ACC_INTERFACE 0x200 interface: فئة مجردة يمكن تنفيذها بشكل متعدّد    
ACC_ABSTRACT 0x400 abstract: لا يمكن إنشاء مثيل لها مباشرةً   abstract: لم يتم تنفيذها من قِبل هذه الفئة
ACC_STRICT 0x800     strictfp: قواعد صارمة للعمليات الحسابية بنقطة عائمة
ACC_SYNTHETIC 0x1000 غير محدّد مباشرةً في رمز المصدر غير محدّد مباشرةً في رمز المصدر غير محدّد مباشرةً في رمز المصدر
ACC_ANNOTATION 0x2000 تمّت الإشارة إليها على أنّها فئة تعليق توضيحي    
ACC_ENUM 0x4000 تمّ تعريفها كنوع محدّد تمّت الإشارة إليها كقيمة مُدرَجة  
(غير مستخدَم) 0x8000      
ACC_CONSTRUCTOR 0x10000     طريقة المُنشئ (مُنشئ فئة أو مثيل)
ACC_DECLARED_
SYNCHRONIZED
0x20000     تم الإعلان عن synchronized.

ملاحظة: ليس لهذا الإجراء أي تأثير في تنفيذ الإجراء (باستثناء التأثير في هذه العلامة بحد ذاتها).

* يُسمح بتشغيل هذه الميزة فقط مع التعليقات التوضيحية InnerClass، ويجب عدم تفعيلها مطلقًا في class_def_item.

ترميز UTF-8 المعدَّل

لتسهيل استخدام التنسيقات القديمة، يشفر تنسيق .dex بيانات السلاسل بتنسيق UTF-8 معدَّل بشكلٍ تلقائي، ويُشار إليه فيما بعد باسم MUTF-8. هذا التنسيق مطابق لتنسيق UTF-8 العادي، باستثناء:

  • لا يتم استخدام سوى ترميزات البايت الواحد والبايتَين والثلاثة بايت.
  • يتم ترميز نقاط الرمز في النطاق U+10000U+10ffff كزوج بديل، يُمثّل كل من منها قيمة مُشفَّرة من ثلاثة بايت.
  • يتم ترميز النقطة الترميزية U+0000 بتنسيق اثنين من البايتات.
  • يشير البايت غير الصالح العادي (القيمة 0) إلى نهاية السلسلة، كما هو الحال في التفسير العادي للغة C.

يمكن تلخيص أول عنصرَين أعلاه على النحو التالي: MUTF-8 هو تنسيق ترميز لـ UTF-16، بدلاً من أن يكون تنسيق ترميز أكثر مباشرةً لأحرف Unicode.

يتيح العنصران الأخيران أعلاه تضمين نقطة الرمز U+0000 في سلسلة والاستمرار في معالجتها كسلسلة ذات نهاية صفرية على غرار لغة C.

ومع ذلك، فإنّ الترميز الخاص لـ U+0000 يعني أنّه، على عكس UTF-8 العادي، لا تشير نتيجة استدعاء الدالة العادية C strcmp() على زوج من سلاسل MUTF-8 دائمًا إلى النتيجة الموقَّعة بشكل صحيح لمقارنة سلاسل غير متساوية. عندما يكون الترتيب (وليس المساواة فقط) هو مصدر القلق، فإنّ أبسط طريقة لمقارنة سلاسل MUTF-8 هي فك ترميزها حرفًا تلو الآخر، ومطابقة القيم التي تم فك ترميزها. (ومع ذلك، من الممكن أيضًا تنفيذ حلول أكثر ذكاءً).

يُرجى الرجوع إلى معيار الترميز الموحد للغة الأحرف (Unicode) للحصول على مزيد من المعلومات عن ترميز الأحرف. يشبه تنسيق MUTF-8 في الواقع ترميز CESU-8 (المعروف بشكلٍ أقل نسبيًا) أكثر من ترميز UTF-8.

ترميز encoded_value

مضمّنة في annotation_element وencoded_array_item

encoded_value هو جزء مشفَّر من بيانات (تقريبًا) غير منتظمة بشكل هرمي. من المفترض أن يكون ترميز البيانات مكثفًا وسهل التحليل.

الاسم التنسيق الوصف
(value_arg << 5) | value_type ubyte بايت يشير إلى نوع العنصر التالي مباشرةً value مع وسيطة توضيحية اختيارية في البتات الثلاثة ذات الترتيب الأعلى يمكنك الاطّلاع أدناه على تعريفات value المختلفة. في معظم الحالات، يُشفِّر value_arg طول value التالي مباشرةً بالكيلوبايت، كما هو الحال في (size - 1)، على سبيل المثال: يشير الرمز 0 إلى أنّ القيمة تتطلّب بايتًا واحدًا، ويشير الرمز 7 إلى أنّها تتطلّب ثمانية بايت، ولكن هناك استثناءات كما هو موضّح أدناه.
القيمة ubyte[] بايت يمثّل القيمة، وطول متغيّر ويتم تفسيره بشكلٍ مختلف لبايت value_type مختلف، مع أنّه يتم ترتيبه دائمًا من الأصغر إلى الأكبر. اطّلِع على تعريفات القيم المختلفة أدناه للحصول على التفاصيل.

تنسيقات القيم

اكتب الاسم value_type value_arg التنسيق value التنسيق الوصف
VALUE_BYTE 0x00 (none؛ يجب أن تكون 0) ubyte[1] قيمة عدد صحيح موقَّع بسعة بايت واحد
VALUE_SHORT 0x02 الحجم: 1 (0…1) ubyte[size] قيمة عدد صحيح موقَّع مكوّنة من بايتين، تم تمديد علامتها
VALUE_CHAR 0x03 الحجم: 1 (0…1) ubyte[size] قيمة عدد صحيح غير موقّعة بحجم بايتين تم تمديدها بصفر
VALUE_INT 0x04 الحجم - 1 (0…3) ubyte[size] قيمة عدد صحيح موقَّع بأربعة بايت، تم تمديد العلامة
VALUE_LONG 0x06 الحجم - 1 (0…7) ubyte[size] قيمة عدد صحيح موقَّع ثمانية بايت، تم تمديد العلامة
VALUE_FLOAT 0x10 الحجم - 1 (0…3) ubyte[size] نمط بتات من أربعة بايت، تم تمديده بصفر على اليسار، ويتم تفسيره كقيمة IEEE754 بنقطة عائمة 32 بت
VALUE_DOUBLE 0x11 الحجم - 1 (0…7) ubyte[size] نمط بت من ثمانية بايت، تم تمديده بصفر على اليسار، ويتم تفسيره على أنّه قيمة IEEE754 بنقطة عائمة 64 بت
VALUE_METHOD_TYPE 0x15 الحجم - 1 (0…3) ubyte[size] قيمة عدد صحيح من أربعة بايت غير موقَّت (ممتد بصفر)، يتم تفسيرها على أنّها فهرس في قسم proto_ids وتمثّل قيمة نوع الأسلوب
VALUE_METHOD_HANDLE 0x16 الحجم - 1 (0…3) ubyte[size] قيمة عدد صحيح من أربعة بايت غير موقَّت (ممتد إلى الصفر)، يتم تفسيرها على أنّها فهرس في القسم method_handles وتمثّل قيمة معالِج
VALUE_STRING 0x17 الحجم: 1 (0…3) ubyte[size] قيمة عدد صحيح من أربعة بايت (تم تمديدها إلى الصفر)، يتم تفسيرها على أنّها فهرس في القسم string_ids وتمثّل قيمة سلسلة
VALUE_TYPE 0x18 الحجم - 1 (0…3) ubyte[size] قيمة عددية غير موقَّعة (ممدودة بصفر) من أربعة بايت، يتم تفسيرها على أنّها فهرس في قسم type_ids وتمثّل قيمة نوع/صف
VALUE_FIELD 0x19 الحجم - 1 (0…3) ubyte[size] قيمة عددية غير موقَّعة (ممتدة إلى الصفر) من أربعة بايت، يتم تفسيرها على أنّها فهرس في قسم field_ids وتمثّل قيمة حقل عاكس
VALUE_METHOD 0x1a الحجم - 1 (0…3) ubyte[size] قيمة عددية غير موقَّتة (ممتدة إلى الصفر) من أربعة بايت، يتم تفسيرها على أنّها فهرس في قسم method_ids وتمثّل قيمة أسلوب عاكس
VALUE_ENUM 0x1b الحجم - 1 (0…3) ubyte[size] قيمة عدد صحيح بلا علامة (ممتدة إلى الصفر) من أربعة بايت، يتم تفسيرها على أنّها فهرس في قسم field_ids وتمثّل قيمة ثابت نوع محدّد
VALUE_ARRAY 0x1c (none؛ يجب أن تكون 0) encoded_array صفيف من القيم بالتنسيق المحدّد من قِبل "تنسيق encoded_array" أدناه يكون حجمvalue ضمنيًا في عملية الترميز.
VALUE_ANNOTATION 0x1d (none؛ يجب أن تكون 0) encoded_annotation تعليق توضيحي فرعي بالتنسيق المحدّد من قِبل "تنسيق encoded_annotation" أدناه يكون حجمvalue ضمنيًا في عملية الترميز.
VALUE_NULL 0x1e (none؛ يجب أن تكون 0) (بدون) القيمة المرجعية null
VALUE_BOOLEAN 0x1f منطقي (0…1) (بدون) قيمة بت واحد: 0 لـ false و 1 لـ true. يتم تمثيل النقطة في الرمز value_arg.

تنسيق مصفوفة_مُشفَّرة

الاسم التنسيق الوصف
الحجم uleb128 عدد العناصر في الصفيف
values encoded_value[size] سلسلة من تسلسلات size encoded_value بايت بالشكل المحدّد في هذا القسم، متسلسلة معًا

تنسيق encoded_annotation

الاسم التنسيق الوصف
type_idx uleb128 نوع التعليق التوضيحي يجب أن يكون هذا النوع من النوع فئة (وليس صفيفًا أو عنصرًا أساسيًا).
الحجم uleb128 عدد عمليات الربط بين الاسم والقيمة في التعليق التوضيحي هذا
العناصر annotation_element[size] عناصر التعليق التوضيحي، يتم تمثيلها مباشرةً في النص (وليس كشدَّة الانحراف). يجب ترتيب العناصر تصاعديًا حسب فهرس string_id.

تنسيق annotation_element

الاسم التنسيق الوصف
name_idx uleb128 اسم العنصر، الذي يتم تمثيله كفهرس في القسم string_ids يجب أن تتوافق السلسلة مع بنية MemberName المحدّدة أعلاه.
القيمة encoded_value قيمة العنصر

بنية السلسلة

هناك عدة أنواع من العناصر في ملف .dex والتي تشير في النهاية إلى سلسلة. تشير التعريفات التالية بأسلوب BNF إلى البنية المقبولة لهذه السلاسل.

SimpleName

SimpleName هو الأساس لبنية أسماء العناصر الأخرى. يسمح تنسيق .dex بقدر كبير من المرونة هنا (أكثر بكثير من معظم اللغات المصدر الشائعة). باختصار، يتكون اسم بسيط من أي حرف أبجدي أو رقم من ASCII المنخفض، وبعض الرموز المحدّدة من ASCII المنخفض، ومعظم نقاط الترميز غير ASCII التي ليست رموز تحكّم أو مسافات أو أحرف خاصة. بدءًا من الإصدار 040 ، يسمح التنسيق أيضًا بأحرف المسافات (فئة Zs يونيكود). يُرجى العِلم أنّ نقاط الترميز البديلة (في النطاق U+d800U+dfff) لا تُعدّ أحرف أسماء صالحة بحد ذاتها، ولكن تكون أحرف يونيكود تكميلية صالحة (التي يتم تمثيلها من خلال البديل النهائي لقاعدة SimpleNameChar)، ويجب أن يتم تمثيلها في ملف كأزواج من نقاط الترميز البديلة في ترميز MUTF-8.

SimpleName
SimpleNameChar (SimpleNameChar)*
SimpleNameChar
'A''Z'
| 'a''z'
| '0''9'
| ' ' منذ الإصدار 040 من DEX
| '$'
| '-'
| '_'
| U+00a0 منذ الإصدار 040 من DEX
| U+00a1U+1fff
| U+2000U+200a منذ الإصدار 040 من DEX
| U+2010U+2027
| U+202f منذ الإصدار 040 من DEX
| U+2030U+d7ff
| U+e000U+ffef
| U+10000U+10ffff

MemberName

المستخدَمة في field_id_item وmethod_id_item

MemberName هو اسم عضو في فئة، والأعضاء هم الحقول والطُرق والفئات الداخلية.

MemberName
SimpleName
| '<' SimpleName '>'

FullClassName

FullClassName هو اسم فئة مؤهَّل بالكامل، بما في ذلك محدِّد حزمة اختياري متبوعًا باسم مطلوب.

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(SimpleName '/')*

TypeDescriptor

المستخدَم من type_id_item

TypeDescriptor هو تمثيل لأي نوع، بما في ذلك العناصر الأساسية والفئات والمصفوفات وvoid. يمكنك الاطّلاع أدناه على معنى الإصدارات المختلفة.

TypeDescriptor
'V'
| FieldTypeDescriptor
FieldTypeDescriptor
NonArrayFieldTypeDescriptor
| ('[' * 1…255) NonArrayFieldTypeDescriptor
NonArrayFieldTypeDescriptor
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L' FullClassName ';'

ShortyDescriptor

يستخدِمه proto_id_item

ShortyDescriptor هو تمثيل قصير لنموذج ملف برمجي ، بما في ذلك أنواع الإرجاع والمَعلمات، باستثناء عدم التمييز بين أنواع المراجع المختلفة (الفئة أو الصفيف). بدلاً من ذلك، يتم تمثيل جميع أنواع المراجع بحرف 'L' واحد.

ShortyDescriptor
ShortyReturnType (ShortyFieldType)*
ShortyReturnType
'V'
| ShortyFieldType
ShortyFieldType
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L'

الدلالات المتعلّقة بـ TypeDescriptor

في ما يلي معنى كلّ من الصيغ المختلفة TypeDescriptor.

بناء الجملة المعنى
V void؛ صالحة لأنواع الإرجاع فقط
Z boolean
B byte
S short
C char
I int
J long
F float
D double
Lfully/qualified/Name; الصف fully.qualified.Name
[descriptor صفيف من descriptor، يمكن استخدامه بشكل متكرّر لصفائف الصفائف، على الرغم من أنّه غير صالح أن يتضمّن أكثر من 255 سمة

العناصر والهياكل ذات الصلة

يتضمّن هذا القسم تعريفات لكل عنصر من عناصر المستوى الأعلى التي قد تظهر في ملف .dex.

header_item

تظهر في قسم العنوان

المطابقة: 4 بايت

الاسم التنسيق الوصف
سحر ubyte[8] = DEX_FILE_MAGIC قيمة سحرية. يُرجى الاطّلاع على المناقشة أعلاه ضمن "DEX_FILE_MAGIC" للحصول على مزيد من التفاصيل.
المجموع الاختباري uint تحقّق adler32 لباقي الملف (كل شيء باستثناء magic وهذا الحقل)؛ يُستخدَم لرصد تلف الملف
التوقيع ubyte[20] توقيع SHA-1 (التجزئة) لبقية الملف (كل شيء باستثناء magic وchecksum وهذا الحقل)؛ يُستخدَم لتحديد الملفات بشكل فريد
file_size uint

حجم الملف بالكامل (بما في ذلك الرأس)، بالبايت (الإصدار 40 أو الإصدارات الأقدم)

المسافة بالكيلوبايت من بداية هذا العنوان إلى العنوان التالي أو إلى نهاية الملف بأكمله (الحاوية). (الإصدار 41 أو الإصدارات الأحدث)

header_size uint

حجم العنوان (هذا القسم بأكمله)، بالبايت ويسمح ذلك بحد أدنى من التوافق مع الإصدارات السابقة أو اللاحقة بدون إبطال التنسيق.

يجب أن يكون 0x70 (112) بايت (الإصدار 40 أو الإصدارات الأقدم)

يجب أن يكون 0x78 (120) بايت (الإصدار 41 أو الإصدارات الأحدث)

endian_tag uint = ENDIAN_CONSTANT علامة ترتيب البتات راجِع المناقشة أعلاه ضمن "ENDIAN_CONSTANT وREVERSE_ENDIAN_CONSTANT" للحصول على مزيد من التفاصيل.
link_size uint حجم قسم الرابط، أو 0 إذا لم يكن هذا الملف مرتبطًا بشكل ثابت
link_off uint من بداية الملف إلى قسم الرابط، أو 0 إذا كان link_size == 0 يجب أن يكون البادئة، إذا لم تكن صفرًا، في قسم link_data. لا يحدِّد هذا المستند تنسيق البيانات التي يتم الإشارة إليها، ويُترك حقل العنوان هذا (والحقل السابق) كعناصر ربط لاستخدامها في عمليات التنفيذ أثناء التشغيل.
map_off uint القيمة المضافة إلى بداية الملف لتحديد موضع عنصر الخريطة يجب أن يكون الموضع المرجعي، الذي يجب أن يكون غير صفري، في قسم data، ويجب أن تكون البيانات بالتنسيق المحدّد في "map_list" أدناه.
string_ids_size uint عدد السلاسل في قائمة معرّفات السلاسل
string_ids_off uint القيمة المُعدَّلة من بداية الملف إلى قائمة معرّفات السلاسل، أو 0 إذا كان string_ids_size == 0 (يُعتبَر حالة استثنائية غريبة). يجب أن يكون البدء، إذا لم يكن صفرًا، في بداية القسم string_ids.
type_ids_size uint عدد العناصر في قائمة معرّفات الأنواع، بحد أقصى 65535
type_ids_off uint من بداية الملف إلى قائمة معرّفات الأنواع، أو 0 إذا كان type_ids_size == 0 (يُعتبَر هذا سيناريو غير مألوف). يجب أن يكون البدء، إذا لم يكن صفرًا، في بداية القسم type_ids.
proto_ids_size uint عدد العناصر في قائمة معرّفات النماذج الأولية، بحد أقصى 65535
proto_ids_off uint من بداية الملف إلى قائمة معرّفات النماذج الأولية، أو 0 إذا proto_ids_size == 0 (حالة هامشية غير معتادة). يجب أن يكون البدء، إذا لم يكن صفرًا، في بداية القسم proto_ids.
field_ids_size uint عدد العناصر في قائمة معرّفات الحقول
field_ids_off uint القيمة المُعدَّلة من بداية الملف إلى قائمة معرّفات الحقول، أو 0 إذا كان field_ids_size == 0 يجب أن يكون البادئة، إذا كانت غير صفرية، في بداية القسم field_ids.
method_ids_size uint عدد العناصر في قائمة معرّفات الطرق
method_ids_off uint القيمة المُعدَّلة من بداية الملف إلى قائمة معرّفات الطرق، أو 0 إذا كان method_ids_size == 0 يجب أن يكون البادئة، إذا كانت غير صفرية، في بداية القسم method_ids.
class_defs_size uint عدد العناصر في قائمة تعريفات الفئات
class_defs_off uint من بداية الملف إلى قائمة تعريفات الفئات، أو 0 إذا كان class_defs_size == 0 (يُعتبَر ذلك حالة استثنائية غريبة). يجب أن يكون البدء، إذا لم يكن صفرًا، في بداية القسم class_defs.
data_size uint

حجم قسم data بالبايت يجب أن يكون عددًا زوجيًا من sizeof(uint). (الإصدار 40 أو الإصدارات الأقدم)

غير مستخدَمة (الإصدار 41 أو الإصدارات الأحدث)

data_off uint

القيمة المضافة إلى بداية الملف لتحديد بداية القسم data (الإصدار 40 أو الإصدارات الأقدم)

غير مستخدَمة (الإصدار 41 أو الإصدارات الأحدث)

container_size uint

هذا الحقل غير متوفّر. يمكن الافتراض أنّه يساوي file_size. (الإصدار 40 أو الإصدارات الأقدم)

حجم الملف بأكمله (بما في ذلك رؤوس dex الأخرى وبياناتها) (الإصدار 41 أو الإصدارات الأحدث)

header_offset uint

هذا الحقل غير متوفّر. يمكن الافتراض أنّه يساوي 0. (الإصدار 40 أو الإصدارات الأقدم)

من بداية الملف إلى بداية هذا العنوان. (الإصدار 41 أو الإصدارات الأحدث)

map_list

تظهر في قسم البيانات

تمت الإشارة إليه من header_item

المطابقة: 4 بايت

هذه قائمة بمحتوى الملف بالكامل، مرتبة حسب الترتيب. ويحتوي على بعض التكرارات في ما يتعلق بـ header_item ، ولكن يُقصد به أن يكون نموذجًا سهل الاستخدام للتكرار على ملف بأكمله. يجب أن يظهر نوع معيّن مرة واحدة فقط في الخريطة، ولكن لا يوجد قيود على أنواع الطلبات التي يمكن أن تظهر فيها، باستثناء القيود التي تفرضها بقية التنسيقات (على سبيل المثال، يجب أن يظهر قسم header أولاً، ثم قسم string_ids، وما إلى ذلك). بالإضافة إلى ذلك، يجب ترتيب إدخالات الخريطة حسب القيمة المرجعية الأولية وألا تتداخل.

الاسم التنسيق الوصف
الحجم uint حجم القائمة، بالعناصر
قائمة map_item[size] عناصر القائمة

تنسيق map_item

الاسم التنسيق الوصف
كتابة ushort نوع العناصر، راجِع الجدول أدناه
غير مستخدَمة ushort (غير مستخدَم)
الحجم uint عدد العناصر التي سيتم العثور عليها في العنصر المحدَّد
offset uint البدء من بداية الملف إلى العناصر المعنيّة

رموز النوع

نوع العنصر ثابت القيمة حجم العنصر بالبايت
header_item TYPE_HEADER_ITEM 0x0000 0x70
string_id_item TYPE_STRING_ID_ITEM 0x0001 0x04
type_id_item TYPE_TYPE_ID_ITEM 0x0002 0x04
proto_id_item TYPE_PROTO_ID_ITEM 0x0003 0x0c
field_id_item TYPE_FIELD_ID_ITEM 0x0004 0x08
method_id_item TYPE_METHOD_ID_ITEM 0x0005 0x08
class_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
call_site_id_item TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
method_handle_item TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
map_list TYPE_MAP_LIST 0x1000 4 + (item.size * 12)
type_list TYPE_TYPE_LIST 0x1001 4 + (item.size * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (item.size * 4)
annotation_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (item.size * 4)
class_data_item TYPE_CLASS_DATA_ITEM 0x2000 قيمة ضمنية، يجب تحليلها
code_item TYPE_CODE_ITEM 0x2001 قيمة ضمنية، يجب تحليلها
عنصر_بيانات_السلسلة TYPE_STRING_DATA_ITEM 0x2002 قيمة ضمنية، يجب تحليلها
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 قيمة ضمنية، يجب تحليلها
annotation_item TYPE_ANNOTATION_ITEM 0x2004 قيمة ضمنية، يجب تحليلها
encoded_array_item TYPE_ENCODED_ARRAY_ITEM 0x2005 قيمة ضمنية، يجب تحليلها
annotations_directory_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 قيمة ضمنية، يجب تحليلها
hiddenapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 قيمة ضمنية، يجب تحليلها

string_id_item

تظهر في قسم string_ids

المطابقة: 4 بايت

الاسم التنسيق الوصف
string_data_off uint بدءًا من بداية الملف إلى بيانات السلسلة لهذا العنصر. يجب أن يشير الموضع المرجعي إلى موقع جغرافي في قسم data، ويجب أن تكون البيانات بالتنسيق الذي يحدّده "string_data_item" أدناه. ما مِن متطلبات للتنسيق في القيمة المُعدَّلة.

عنصر_بيانات_السلسلة

تظهر في قسم البيانات

المحاذاة: بدون (محاذاة حسب البايت)

الاسم التنسيق الوصف
utf16_size uleb128 حجم هذه السلسلة، بوحدات ترميز UTF-16 (وهو "طول السلسلة" في العديد من الأنظمة). وهذا هو الطول غير المشفَّر للسلسلة. (يُستخدَم موضع البايت 0 للإشارة إلى الطول المشفَّر.)
البيانات ubyte[] سلسلة من وحدات ترميز MUTF-8 (المعروفة أيضًا باسم الثُمانيات أو البايتات) متبوعة ببايت قيمته 0 اطّلِع على "ترميز MUTF-8 (UTF-8 المعدَّل)" أعلاه للاطّلاع على التفاصيل والمناقشة بشأن تنسيق البيانات.

ملاحظة: يُسمح بوجود سلسلة تتضمّن وحدات الرموز البديلة UTF-16 (أي U+d800U+dfff) إما بشكل منفصل أو بترتيب غير عادي مقارنةً بالترميز المعتاد ليونيكود إلى UTF-16. إنّه متروك للاستخدامات ذات المستوى الأعلى من السلاسل لرفض عمليات الترميز غير الصالحة هذه، إذا كان ذلك مناسبًا.

type_id_item

يظهر في قسم type_ids

المطابقة: 4 بايت

الاسم التنسيق الوصف
descriptor_idx uint فهرس في قائمة string_ids لسلاسل الوصف من هذا النوع يجب أن تكون السلسلة متوافقة مع بنية TypeDescriptor المحدّدة أعلاه.

proto_id_item

يظهر في قسم proto_ids

المطابقة: 4 بايت

الاسم التنسيق الوصف
shorty_idx uint فهرس في قائمة string_ids لسلاسل وصف التنسيق القصير لهذا النموذج الأوّلي يجب أن تكون السلسلة متوافقة مع نحو ShortyDescriptor المحدّد أعلاه، ويجب أن تتطابق مع نوع الإرجاع ومَعلمات هذا العنصر.
return_type_idx uint الفهرس في قائمة type_ids لنوع الإرجاع لهذا النموذج الأولي
parameters_off uint من بداية الملف إلى قائمة أنواع المَعلمات لهذا النموذج الأولي، أو 0 إذا لم يكن لهذا النموذج الأولي أي مَعلمات. يجب أن يكون هذا العنصر المُعدِّل، إذا لم يكن صفرًا، في القسم data، ويجب أن تكون البيانات الواردة فيه بالتنسيق الذي تحدّده السمة "type_list" أدناه. بالإضافة إلى ذلك، يجب عدم الإشارة إلى النوع void في القائمة.

field_id_item

تظهر في قسم field_ids

المطابقة: 4 بايت

الاسم التنسيق الوصف
class_idx ushort فهرس في قائمة type_ids لمحدد هذا الحقل يجب أن يكون هذا النوع من فئة، وليس صفيفًا أو نوعًا أساسيًا.
type_idx ushort الفهرس في قائمة type_ids لنوع هذا الحقل
name_idx uint فهرس في قائمة string_ids لاسم هذا الحقل يجب أن تتوافق السلسلة مع بنية MemberName، المحدّدة أعلاه.

method_id_item

يظهر في قسم method_ids

المطابقة: 4 بايت

الاسم التنسيق الوصف
class_idx ushort فهرس في قائمة type_ids لمحدد هذه الطريقة يجب أن يكون هذا النوع من النوعين: فئة أو صفيف، وليس نوعًا أساسيًا.
proto_idx ushort الفهرسة في قائمة proto_ids للنموذج الأوّلي لهذه الطريقة
name_idx uint فهرس في قائمة string_ids لاسم هذه الطريقة. يجب أن تتوافق السلسلة مع بنية MemberName، المحدّدة أعلاه.

class_def_item

يظهر في قسم class_defs

المطابقة: 4 بايت

الاسم التنسيق الوصف
class_idx uint فهرس في قائمة type_ids لهذا الصف يجب أن يكون هذا النوع من فئة، وليس صفيفًا أو نوعًا أساسيًا.
access_flags uint علامات الوصول إلى الصف (public وfinal وغيرها) اطّلِع على "access_flags التعريفات" للاطّلاع على التفاصيل.
superclass_idx uint فهرس في قائمة type_ids للفئة الفائقة، أو القيمة الثابتة NO_INDEX إذا لم تكن هذه الفئة تحتوي على فئة فائقة (أي أنّها فئة جذرية مثل Object). يجب أن يكون هذا النوع من فئة، وليس صفيفًا أو نوعًا أساسيًا.
interfaces_off uint من بداية الملف إلى قائمة الواجهات، أو 0 إذا لم تكن هناك أي واجهات يجب أن يكون هذا ال offset في قسم data، ويجب أن تكون البيانات فيه بالتنسيق المحدّد من قِبل "type_list" أدناه. يجب أن يكون كل عنصر من عناصر القائمة من النوع "فئة" (وليس مصفوفة أو نوعًا أساسيًا)، ويجب ألا يكون هناك أي عناصر مكرّرة.
source_file_idx uint فهرس في قائمة string_ids لاسم ملف يحتوي على المصدر الأصلي لهذه الفئة (على الأقل معظمها)، أو القيمة الخاصة NO_INDEX للإشارة إلى عدم توفّر هذه المعلومات قد تلغي debug_info_item لأي طريقة معيّنة هذا الملف المصدر، ولكن من المتوقّع أن تأتي معظم الفئات من ملف مصدر واحد فقط.
annotations_off uint بدءًا من بداية الملف إلى بنية التعليقات التوضيحية لهذه الفئة، أو 0 إذا لم تكن هناك تعليقات توضيحية في هذه الفئة. يجب أن يكون هذا العنصر المرجعي، إذا لم يكن صفرًا، في قسم data، ويجب أن تكون البيانات الواردة فيه بالتنسيق الذي تحدّده "annotations_directory_item" أدناه، مع الإشارة إلى أنّ جميع العناصر تشير إلى هذه الفئة باعتبارها المحدّد.
class_data_off uint القيمة المُعدَّلة من بداية الملف إلى بيانات الصف المقترنة بهذا العنصر، أو 0 إذا لم تكن هناك بيانات صف لهذا الصف (قد يحدث ذلك، على سبيل المثال، إذا كانت هذه الفئة هي واجهة علامة). يجب أن يكون الإزاحة، إذا لم تكن صفرًا، في القسم data، ويجب أن تكون البيانات الواردة فيه بالتنسيق الذي تحدّده "class_data_item" أدناه، مع الإشارة إلى أنّ كل العناصر تشير إلى هذه الفئة باعتبارها المحدّد.
static_values_off uint القيمة المتغيّرة من بداية الملف إلى قائمة القيم الأولية لحقول static، أو 0 إذا لم يكن هناك قيم (ويجب بدء جميع حقول static باستخدام 0 أو null). يجب أن تكون هذه القيمة المتغيّرة في القسم data، ويجب أن تكون البيانات الواردة فيه بالتنسيق الذي يحدّده "encoded_array_item" أدناه. يجب ألا يكون حجم السلسلة أكبر من عدد حقول static التي أعلنت عنها هذه الفئة، ويجب أن تتطابق العناصر مع حقول static بالترتيب نفسه الذي تم الإعلان عنه في field_list المقابلة. يجب أن يتطابق نوع كل عنصر في الصفيف مع النوع المُعلَن للحقل المقابل له. إذا كان عدد العناصر في الصفيف أقل من عدد حقول static، تتمّ بدء حقول المتبقية باستخدام 0 أو null مناسبَين للنوع.

call_site_id_item

تظهر في قسم call_site_ids

المطابقة: 4 بايت

الاسم التنسيق الوصف
call_site_off uint البدء من بداية الملف للاتّصال بتعريف الموقع الإلكتروني يجب أن يكون الموضع المرجعي في قسم البيانات، ويجب أن تكون البيانات الواردة فيه بالتنسيق المحدّد من قِبل "call_site_item" أدناه.

call_site_item

تظهر في قسم البيانات

المحاذاة: بدون (محاذاة بايت)

عنصر call_site_item هو عنصر مصفوفة_مشفّرة تتطابق عناصره مع الوسيطات المقدَّمة لطريقة رابط التمهيد. الوسائط الثلاث الأولى هي:

  1. معرّف طريقة يمثّل طريقة رابط التشغيل المبدئي (VALUE_METHOD_HANDLE).
  2. اسم طريقة يجب أن يحلّها رابط Bootstrap (VALUE_STRING).
  3. نوع طريقة يتوافق مع نوع اسم الطريقة المطلوب حلّه (VALUE_METHOD_TYPE).

أيّ وسيطات إضافية هي قيم ثابتة يتم تمريرها إلى طريقة رابط التمهيد. يتم تمرير هذه الوسيطات بالترتيب وبدون أي عمليات تحويل للأنواع.

يجب أن يكون نوع الإرجاع لعنوان الطريقة الذي يمثّل طريقة رابط التمهيد هو java.lang.invoke.CallSite. في ما يلي الأنواع الثلاثة الأولى للمَعلمات:

  1. java.lang.invoke.Lookup
  2. java.lang.String
  3. java.lang.invoke.MethodType

يتم تحديد أنواع مَعلمات أيّ وسيطات إضافية من قيمها الثابتة.

method_handle_item

يظهر في قسم method_handles

المطابقة: 4 بايت

الاسم التنسيق الوصف
method_handle_type ushort نوع معرّف الطريقة، راجِع الجدول أدناه
غير مستخدَمة ushort (غير مستخدَم)
field_or_method_id ushort رقم تعريف الحقل أو الطريقة، وذلك حسب ما إذا كان نوع معرّف الطريقة هو وسيط وصول أو أداة استدعاء طريقة
غير مستخدَمة ushort (غير مستخدَم)

رموز أنواع معالِج الطريقة

ثابت القيمة الوصف
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 معالِج الطريقة هو أداة ضبط حقل ثابت (أداة وصول).
METHOD_HANDLE_TYPE_STATIC_GET 0x01 معالِج الطريقة هو وسيلة للحصول على حقل ثابت (ملحق).
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 معالِج الطريقة هو طريقة ضبط حقل مثيل (طريقة استرجاع البيانات)
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 معالِج الطريقة هو وسيلة للحصول على حقل مثيل (طريقة وصول).
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 معالِج الطريقة هو أداة استدعاء طريقة ثابتة.
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 معالِج الطريقة هو أداة استدعاء طريقة مثيل
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 معالِج الطريقة هو أداة استدعاء طريقة المنشئ.
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 معرّف الطريقة هو أداة مباشرة لطلب تنفيذ الطريقة
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 معرّف الطريقة هو أداة استدعاء طريقة واجهة

class_data_item

تمت الإشارة إليه من class_def_item

تظهر في قسم البيانات

المحاذاة: بدون (محاذاة حسب البايت)

الاسم التنسيق الوصف
static_fields_size uleb128 عدد الحقول الثابتة المحدّدة في هذا العنصر
instance_fields_size uleb128 عدد حقول العناصر المحدّدة في هذا العنصر
direct_methods_size uleb128 عدد الطرق المباشرة المحدّدة في هذا العنصر
virtual_methods_size uleb128 عدد الطرق الافتراضية المحدّدة في هذا العنصر
static_fields encoded_field[static_fields_size] الحقول الثابتة المحدّدة، والتي يتم تمثيلها على شكل تسلسل من عناصر مُشفَّرة يجب ترتيب الحقول حسب field_idx تصاعديًا.
instance_fields encoded_field[instance_fields_size] حقول العناصر المحدّدة، والتي يتم تمثيلها على شكل تسلسل من عناصر مُشفَّرة يجب ترتيب الحقول حسب field_idx تصاعديًا.
direct_methods encoded_method[direct_methods_size] الطرق المباشرة المحدّدة (أي static أو private أو أو طريقة الإنشاء)، والتي يتم تمثيلها على هيئة تسلسل من العناصر المشفّرة يجب ترتيب الطرق حسب method_idx تصاعديًا.
virtual_methods encoded_method[virtual_methods_size] الطرق الافتراضية المحدّدة (غير static أو private أو أو طريقة الإنشاء) التي يتم تمثيلها على هيئة تسلسل من العناصر المُرمّزة يجب عدم تضمين هذه القائمة لطرق مكتسَبة ما لم يتم استبدالها من خلال الفئة التي يمثّلها هذا العنصر. يجب ترتيب methods تصاعديًا حسب method_idx. يجب أن لا يكون method_idx للطريقة الافتراضية مماثلاً لأي طريقة مباشرة.

ملاحظة: يجب أن تشير جميع نُسخ field_id و method_id للعناصر إلى الفئة المحدّدة نفسها.

تنسيق الحقل encoded_field

الاسم التنسيق الوصف
field_idx_diff uleb128 فهرس في قائمة field_ids لتحديد هوية هذا الحقل (يتضمّن الاسم والوصف)، يتم تمثيله كاختلاف عن فهرس العنصر السابق في القائمة يتم تمثيل فهرس العنصر الأول في القائمة مباشرةً.
access_flags uleb128 علامات الوصول إلى الحقل (public وfinal وما إلى ذلك) اطّلِع على "access_flags التعريفات" للاطّلاع على التفاصيل.

تنسيق encoded_method

الاسم التنسيق الوصف
method_idx_diff uleb128 فهرس في قائمة method_ids لتحديد هوية هذه المحاولة (يتضمّن الاسم والوصف)، يتم تمثيله كفرق عن فهرس العنصر السابق في القائمة يتم تمثيل فهرس العنصر الأول في القائمة مباشرةً.
access_flags uleb128 علامات الوصول إلى الطريقة (public وfinal وما إلى ذلك) اطّلِع على "access_flags التعريفات" للاطّلاع على التفاصيل.
code_off uleb128 من بداية الملف إلى بنية الرمز البرمجي لهذه المحاولة، أو 0 إذا كانت هذه المحاولة هي abstract أو native. يجب أن يشير العنصر المُعوض إلى موقع في القسم data. يتم تحديد تنسيق البيانات باستخدام "code_item" أدناه.

type_list

تمت الإشارة إليها من class_def_item وproto_id_item

تظهر في قسم البيانات

المطابقة: 4 بايت

الاسم التنسيق الوصف
الحجم uint حجم القائمة، بالعناصر
قائمة type_item[size] عناصر القائمة

تنسيق type_item

الاسم التنسيق الوصف
type_idx ushort الفهرس في قائمة type_ids

code_item

تمت الإشارة إليها من encoded_method

تظهر في قسم البيانات

المطابقة: 4 بايت

الاسم التنسيق الوصف
registers_size ushort عدد السجلات المستخدَمة في هذا الرمز
ins_size ushort عدد كلمات الوسيطات الواردة إلى الطريقة التي يخصّها هذا الرمز
outs_size ushort عدد الكلمات لمساحة الوسيطة الصادرة التي يتطلبها هذا رمز لاستدعاء الطريقة
عدد_المحاولات ushort عدد try_item لهذه النسخة إذا لم تكن صفرية، تظهر هذه القيم كصفيف tries بعد العنصر insns مباشرةً في هذه الحالة.
debug_info_off uint من بداية الملف إلى تسلسل معلومات تصحيح الأخطاء (أرقام الأسطر + معلومات المتغيّرات المحلية) لهذا الرمز، أو 0 إذا لم تكن هناك معلومات. يجب أن يكون الموضع التعويضي، إذا لم يكن صفرًا، في قسم data. يتم تحديد تنسيق البيانات باستخدام "debug_info_item" أدناه.
insns_size uint حجم قائمة التعليمات، بوحدات رمز 16 بت
insns ushort[insns_size] صفيف رمز البايت الفعلي يتم تحديد تنسيق الرمز في صفيف insns من خلال المستند المصاحب رمز Dalvik البرمجي. يُرجى ملاحظة أنّه على الرغم من أنّ هذا العنصر محدّد كصفيف من ushort، هناك بعض البنى الداخلية التي تفضّل محاذاة أربعة بايت. بالإضافة إلى ذلك، إذا كان هذا الإجراء في ملف تم تبديل ترتيب نهايته، يتم التبديل فقط في نُسخ ushort الفردية وليس في البنى الداخلية الأكبر حجمًا.
padding ushort (اختياري) = 0 بايتان من الحشو لجعل tries محاذاة بأربعة بايت لا يظهر هذا العنصر إلا إذا كان tries_size غير صفري وكان insns_size عددًا فرديًا.
محاولات try_item[tries_size] (اختيارية) مصفوفة تشير إلى مكان رصد الاستثناءات في الرمز البرمجي وكيفية معالجتها يجب أن تكون عناصر الصفيف غير متداخلة في النطاق ويجب ترتيبها من العنوان الأدنى إلى الأعلى. لا يظهر هذا العنصر إلا إذا كان tries_size غير صفري.
المعالجات encoded_catch_handler_list (اختياري) وحدات بايت تمثّل قائمة بقوائم أنواع الأخطاء وعناوين معالِجيها المرتبطِين يحتوي كل try_item على إزاحة بثمانية بت في هذه البنية. لا يظهر هذا العنصر إلا إذا كانت قيمة tries_size غير صفرية.

تنسيق try_item

الاسم التنسيق الوصف
start_addr uint عنوان بدء مجموعة الرموز البرمجية التي يشملها هذا الإدخال العنوان هو عدد وحدات الرمز التي تبلغ 16 بت حتى بداية أول تعليمات مشمولة.
insn_count ushort عدد وحدات الرموز التي تبلغ 16 بتًا والتي يشملها هذا الإدخال آخر رمز وحدة مضمّنة هو start_addr + insn_count - 1.
handler_off ushort القيمة المُعدَّلة بوحدات البايت من بداية encoded_catch_hander_list المرتبط بها إلى encoded_catch_handler لهذا الإدخال يجب أن يكون هذا العنصر مُعدّلاً لبداية encoded_catch_handler.

تنسيق encoded_catch_handler_list

الاسم التنسيق الوصف
الحجم uleb128 حجم هذه القائمة، بالإدخالات
قائمة encoded_catch_handler[handlers_size] القائمة الفعلية لقوائم المعالِجين، يتم تمثيلها مباشرةً (وليس كموضعات) ويتم تسلسلها

تنسيق encoded_catch_handler

الاسم التنسيق الوصف
الحجم sleb128 عدد أنواع الصيد في هذه القائمة إذا لم يكن موجبًا، هذا يعني أنّه العدد السالب لأنواع عمليات المعالجة، ويتبع عمليات المعالجة معالج معالجة جميع الأخطاء. على سبيل المثال: size من 0 يعني أنّ هناك عنوانًا شاملاً ولكن لا تتوفّر عناوين اصطياد مكتوبة بشكل صريح. تعني size من 2 أنّ هناك نوعَين من الالتقاطات المكتوبة صراحةً وليس هناك ميزة "التقاط الكل". ويعني size من -1 أنّ هناك عنوانًا واحدًا مكتوبًا لتلقّي الرسائل الإلكترونية بالإضافة إلى عنوان صيد عام.
المعالجات encoded_type_addr_pair[abs(size)] بثّ abs(size) عنصر مُشفَّر، واحد لكل نوع تم رصده، بالترتيب الذي يجب اختبار الأنواع به
catch_all_addr uleb128 (اختياري) عنوان الرمز الثنائي لمعالج عنوان استقبال الرسائل الخاطئة لا يظهر هذا العنصر إلا إذا كانت قيمة size غير موجبة.

تنسيق encoded_type_addr_pair

الاسم التنسيق الوصف
type_idx uleb128 الفهرس في قائمة type_ids لنوع الاستثناء الذي تريد التعامل معه
addr uleb128 عنوان رمز الآلة لمعالج الاستثناء المرتبط

debug_info_item

تمت الإشارة إليه من code_item

تظهر في قسم البيانات

المحاذاة: بدون (محاذاة حسب البايت)

وتحدد كل debug_info_item جهازًا حالة مرمّزًا بترميز بايت مستوحى من DWARF3، وعند تفسيره، يصدر جدول المواضع و (يحتمل) معلومات المتغير المحلي الخاصة بـ code_item. يبدأ التسلسل برأس بطول متغيّر (يعتمد طوله على عدد معلمات الطريقة)، ويليه رمز الآلة البرمجي لآلية الحالة، وينتهي بوحدة DBG_END_SEQUENCE بايت.

تتألف آلة الحالات من خمسة سجلّات. يمثّل السجلّ address إزاحة التعليمات في insns_item المرتبط به في وحدات الرمز البرمجي التي تبلغ 16 بت. يبدأ سجلّ address بالرقم 0 في بداية كل تسلسل debug_info ويجب أن يزداد بشكلٍ أحادي فقط. يمثّل السجلّ line رقم سطر المصدر الذي يجب ربطه بإدخال جدول المواضع التالي الذي تنشئه آلة الحالات. ويتمّ إعداده في عنوان التسلسل، وقد يتغيّر في الاتجاهات الموجبة أو السالبة، ولكن يجب ألّا تقلّ قيمته عن 1. يمثّل سجلّ source_file الملف المصدر الذي تشير إليه إدخالات أرقام السطور. يتم إعداده على قيمة source_file_idx في class_def_item. المتغيّران الآخران، prologue_end و epilogue_begin، هما علامتان منطقيتان (تمّت بدءهما على false) تشيران إلى ما إذا كان يجب اعتبار الموضع التالي الذي يتمّ بثّه هو مقدّمة أو خاتمة للطريقة. يجب أن يتتبّع أسلوب التحكّم في الحالات أيضًا اسم المتغيّر المحلي الأخير ونوعه في كل سجلّ لرمز DBG_RESTART_LOCAL.

العنوان على النحو التالي:

الاسم التنسيق الوصف
line_start uleb128 القيمة الأولية لسجلّ line الخاص بآلة الحالة لا يمثّل إدخالًا فعليًا للوظائف.
parameters_size uleb128 عدد أسماء المَعلمات التي يتم ترميزها يجب أن يكون هناك مَعلمة واحدة لكل مَعلمة طريقة، باستثناء this لطريقة العنصر الفردي، إن توفّرت.
parameter_names uleb128p1[parameters_size] فهرس السلسلة لاسم مَعلمة الطريقة تشير القيمة المشفَّرة NO_INDEX إلى أنّه لا يتوفّر اسم للمَعلمة المرتبطة. يُستخدَم وصف النوع والتوقيع بشكل ضمني من وصف الطريقة وتوقيعها.

في ما يلي قيم رمز الوحدات الثنائية:

الاسم القيمة التنسيق الوسيطات الوصف
DBG_END_SEQUENCE 0x00 (بدون) تُنهي تسلسل معلومات تصحيح الأخطاء لـ code_item
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff: المبلغ المطلوب إضافته إلى سجل العناوين تنقل سجلّ العناوين إلى الأمام بدون إدخال موضع
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: المبلغ الذي سيتم تغيير سجلّ السطر به تُقدّم سجلّ السطر بدون إخراج إدخال مواضع
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: السجلّ الذي سيحتوي على القيمة المحلية
name_idx: فهرس السلسلة للاسم
type_idx: فهرس النوع
يُعرِض متغيّرًا محليًا في العنوان الحالي. يمكن أن يكون إما name_idx أو type_idx NO_INDEX للإشارة إلى أنّ هذه القيمة غير معروفة.
DBG_START_LOCAL_EXTENDED 0x04 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
uleb128p1 sig_idx
register_num: السجلّ الذي سيحتوي على القيمة المحلية
name_idx: فهرس السلسلة للاسم
type_idx: فهرس النوع للنوع
sig_idx: فهرس السلسلة لتوقيع النوع
يعرِض عنصرًا محليًا بتوقيع نوع في العنوان الحالي. يمكن أن تكون أي من القيم name_idx أو type_idx أو sig_idx هي NO_INDEX للإشارة إلى أنّ هذه القيمة غير معروفة. (إذا كان sig_idx هو -1، يمكن تمثيل البيانات نفسها بفعالية أكبر باستخدام رمز التشغيل DBG_START_LOCAL).

ملاحظة: اطّلِع على المناقشة ضمن "dalvik.annotation.Signature" أدناه لمعرفة التحذيرات حول التعامل مع التوقيعات.

DBG_END_LOCAL 0x05 uleb128 register_num register_num: السجلّ الذي يتضمّن التوقيت المحلي يضع علامة على متغيّر محلي نشط حاليًا على أنّه خارج النطاق في الموقع الحالي
DBG_RESTART_LOCAL 0x06 uleb128 register_num register_num: تسجيل لإعادة التشغيل إعادة إدخال متغيّر محلي في العنوان الحالي يكون الاسم والنوع مطابقَين لاسم ونوع آخر سجلّ محلي كان نشطًا في السجلّ المحدّد.
DBG_SET_PROLOGUE_END 0x07 (بدون) تُعدِّل السجلّ prologue_end الخاص بآلة الحالة، ما يشير إلى أنّ إدخال الموضع التالي الذي تتم إضافته يجب اعتباره نهاية مقدمة الأسلوب (مكان مناسب لنقطة توقُّف الأسلوب). يتم محو السجلّ prologue_end بواسطة أيّ رمز تشغيل خاص (>= 0x0a).
DBG_SET_EPILOGUE_BEGIN 0x08 (بدون) تُعدِّل سجلّ آلة الحالة epilogue_begin، ما يشير إلى أنّ إدخال الموضع التالي الذي تتم إضافته يجب اعتباره بداية خاتمة الطريقة (مكان مناسب لتعليق التنفيذ قبل الخروج من الطريقة). يتم محو السجلّ epilogue_begin باستخدام أيّ رمز برمجي خاص (>= 0x0a).
DBG_SET_FILE 0x09 uleb128p1 name_idx name_idx: فهرس السلسلة لاسم الملف المصدر NO_INDEX إذا كان غير معروف تشير إلى أنّ جميع إدخالات أرقام الأسطر اللاحقة تشير إلى اسم ملف المصدر هذا، بدلاً من الاسم التلقائي المحدّد في code_item.
رموز التشغيل الخاصة ‎0x0a…0xff (بدون) تُقدّم سجلّي line وaddress، وتُنشئ إدخال موضع، وتُمحو prologue_end و epilogue_begin. يُرجى الاطّلاع أدناه على الوصف.

رموز التشغيل الخاصة

تنقل أوامر التشغيل التي لها قيم تتراوح بين 0x0a و0xff (شاملة) كلاً من السجلَّين line وaddress بمقدار صغير، ثم تُنشئ إدخالًا جديدًا في جدول المواضع. في ما يلي صيغة الزيادة:

DBG_FIRST_SPECIAL = 0x0a  // the smallest special opcode
DBG_LINE_BASE   = -4      // the smallest line number increment
DBG_LINE_RANGE  = 15      // the number of line increments represented

adjusted_opcode = opcode - DBG_FIRST_SPECIAL

line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE)
address += (adjusted_opcode / DBG_LINE_RANGE)

annotations_directory_item

تمت الإشارة إليه من class_def_item

تظهر في قسم البيانات

المطابقة: 4 بايت

الاسم التنسيق الوصف
class_annotations_off uint بدءًا من بداية الملف إلى التعليقات التوضيحية التي تم إجراؤها مباشرةً على الصف، أو 0 إذا لم يكن الصف يتضمّن تعليقات توضيحية مباشرةً. يجب أن يشير العنصر offset، إذا لم يكن صفرًا، إلى موقع في القسم data. يتم تحديد تنسيق البيانات باستخدام "annotation_set_item" أدناه.
fields_size uint عدد الحقول التي تمت إضافة تعليقات توضيحية إليها من خلال هذا العنصر
annotated_methods_size uint عدد الطرق التي تمت إضافة تعليقات توضيحية لها من خلال هذا العنصر
annotated_parameters_size uint عدد قوائم مَعلمات الطُرق التي تمت إضافة تعليقات توضيحية إليها من خلال هذا العنصر
field_annotations ‫field_annotation[fields_size] (اختيارية) قائمة التعليقات التوضيحية المرتبطة بالحقول يجب ترتيب عناصر القائمة تصاعديًا حسب field_idx.
method_annotations method_annotation[methods_size] (اختيارية) قائمة التعليقات التوضيحية المرتبطة بالطريقة يجب ترتيب عناصر القائمة تصاعديًا حسب method_idx.
parameter_annotations parameter_annotation[parameters_size] (اختيارية) قائمة التعليقات التوضيحية لمَعلمات الطريقة المرتبطة يجب ترتيب عناصر قائمة تصاعديًا حسب method_idx.

ملاحظة: يجب أن تشير جميع نُسخ field_id و method_id للعناصر إلى الفئة المحدّدة نفسها.

تنسيق field_annotation

الاسم التنسيق الوصف
field_idx uint الفهرس في قائمة field_ids لتحديد هوية الحقل الذي تتم إضافة تعليقات توضيحية إليه
annotations_off uint من بداية الملف إلى قائمة التعليقات التوضيحية للحقل. يجب أن يشير ال offset إلى موقع في قسم data. يتم تحديد تنسيق البيانات باستخدام "annotation_set_item" أدناه.

تنسيق method_annotation

الاسم التنسيق الوصف
method_idx uint الفهرس في قائمة method_ids لتحديد هوية الطريقة التي تتم عليها إضافة تعليقات توضيحية
annotations_off uint من بداية الملف إلى قائمة التعليقات التوضيحية للطريقة. يجب أن يشير ال offset إلى موقع في القسم data. يتم تحديد تنسيق البيانات باستخدام "annotation_set_item" أدناه.

تنسيق parameter_annotation

الاسم التنسيق الوصف
method_idx uint الفهرسة في قائمة method_ids لتحديد هوية الطريقة التي تتم إضافة تعليقات توضيحية إلى مَعلماتها
annotations_off uint من بداية الملف إلى قائمة التعليقات التوضيحية لمَعلمات الطريقة. يجب أن يشير ال offset إلى موقع في القسم data. يتم تحديد تنسيق البيانات باستخدام "annotation_set_ref_list" أدناه.

annotation_set_ref_list

تمت الإشارة إليها من parameter_annotations_item

تظهر في قسم البيانات

المطابقة: 4 بايت

الاسم التنسيق الوصف
الحجم uint حجم القائمة، بالعناصر
قائمة annotation_set_ref_item[size] عناصر القائمة

تنسيق annotation_set_ref_item

الاسم التنسيق الوصف
annotations_off uint القيمة المرجعية من بداية الملف إلى مجموعة التعليقات التوضيحية المُشار إليها أو 0 إذا لم تكن هناك تعليقات توضيحية لهذا العنصر يجب أن يشير العنصر offset، إذا لم يكن صفرًا، إلى موقع في القسم data. يتم تحديد تنسيق البيانات باستخدام "annotation_set_item" أدناه.

annotation_set_item

تتم الإشارة إليها من annotations_directory_item وfield_annotations_item وmethod_annotations_item وannotation_set_ref_item

تظهر في قسم البيانات

المطابقة: 4 بايت

الاسم التنسيق الوصف
الحجم uint حجم المجموعة، بالعناصر
الإدخالات annotation_off_item[size] عناصر المجموعة. يجب ترتيب العناصر تصاعديًا، حسب type_idx.

تنسيق annotation_off_item

الاسم التنسيق الوصف
annotation_off uint بدءًا من بداية الملف إلى تعليق توضيحي يجب أن يشير العنصر offset إلى موقع في قسم data، ويتم تحديد تنسيق البيانات في هذا الموقع باستخدام "annotation_item" أدناه.

annotation_item

تمت الإشارة إليها من annotation_set_item

تظهر في قسم البيانات

المحاذاة: بدون (محاذاة حسب البايت)

الاسم التنسيق الوصف
الظهور ubyte مستوى الظهور المقصود لهذا التعليق التوضيحي (راجِع المعلومات أدناه)
تعليق توضيحي encoded_annotation محتوى التعليق التوضيحي المشفَّر، بالتنسيق الموضّح في "تنسيق encoded_annotation" ضمن "ترميز encoded_value" أعلاه

قيم مستوى الرؤية

في ما يلي خيارات حقل visibility في annotation_item:

الاسم القيمة الوصف
VISIBILITY_BUILD 0x00 مخصّصة للظهور فقط في وقت الإنشاء (مثلاً، أثناء تجميع رمز آخر)
VISIBILITY_RUNTIME 0x01 المقصود أن تكون مرئية أثناء التشغيل
VISIBILITY_SYSTEM 0x02 مخصّصة للظهور أثناء التشغيل، ولكن للنظام الأساسي فقط (وليس لرمز المستخدم العادي)

encoded_array_item

تمت الإشارة إليه من class_def_item

تظهر في قسم البيانات

المحاذاة: بدون (محاذاة حسب البايت)

الاسم التنسيق الوصف
القيمة encoded_array وحدات بايت تمثّل قيمة الصفيف المشفَّر، بالتنسيق المحدَّد من خلال "encoded_array التنسيق" ضمن "encoded_value التشفير" أعلاه.

hiddenapi_class_data_item

يحتوي هذا القسم على بيانات عن الواجهات المحظورة التي يستخدمها كل فئة.

ملاحظة: تمّ تقديم ميزة واجهة برمجة التطبيقات المخفية في الإصدار 10.0 من نظام التشغيل Android ولا تنطبق إلا على ملفات DEX للفئات في مسار فئة التمهيد. قد يتم توسيع قائمة الإشارات الموضّحة أدناه في الإصدارات المستقبلية من Android. لمزيد من المعلومات، يُرجى الاطّلاع على القيود المفروضة على واجهات غير حِزم تطوير البرامج (SDK).

الاسم التنسيق الوصف
الحجم uint الحجم الإجمالي للقسم
الاعتمادات الكربونية uint[] صفيف للإزاحات مفهرَسًا حسب class_idx يعني إدخال صفيف صفري في الفهرس class_idx أنّه إما ما مِن بيانات لهذا class_idx، أو أنّ جميع علامات واجهة برمجة التطبيقات الخفية هي صفر. بخلاف ذلك، يكون إدخال الصفيف غير صفري ويحتوي على إزاحة من بداية القسم إلى صفيف من علامات واجهة برمجة التطبيقات المخفية لهذا class_idx.
الإبلاغ uleb128[] صفائف متسلسلة من علامات واجهة برمجة التطبيقات المخفية لكل فئة يتم وصف قيم العلامة المحتملة في الجدول أدناه. يتم ترميز العلامات بالترتيب نفسه الذي يتم به ترميز الحقول والطُرق في بيانات الفئة.

أنواع علامات القيود:

الاسم القيمة الوصف
القائمة البيضاء 0 الواجهات التي يمكن استخدامها بحرية وتكون متوافقة كجزء من إطار عمل Android المُوثَّق رسميًا فهرس الحِزم
القائمة الرمادية 1 الواجهات غير المتوفّرة في حزمة SDK والتي يمكن استخدامها بغض النظر عن مستوى واجهة برمجة التطبيقات المستهدَف للتطبيق
وضع في القائمة السوداء 2 الواجهات غير المتوفّرة في حزمة SDK والتي لا يمكن استخدامها بغض النظر عن مستوى واجهة برمجة التطبيقات المستهدَف للتطبيق يؤدي الوصول إلى إحدى هذه الواجهات إلى خطأ في وقت التشغيل.
greylist‑max‑o 3 الواجهات غير المتوفّرة في حزمة SDK والتي يمكن استخدامها مع الإصدار 8.x من نظام التشغيل Android والإصدارات الأقدم ما لم تكن محظورة
greylist‑max‑p 4 الواجهات غير المتوفرة في حزمة SDK والتي يمكن استخدامها مع الإصدار 9.x من نظام التشغيل Android ما لم تكن محظورة
greylist‑max‑q 5 الواجهات غير المتوفرة في حزمة SDK التي يمكن استخدامها مع الإصدار 10.x من Android ما لم تكن محظورة
greylist‑max‑r 6 الواجهات غير المتوفرة في حزمة SDK التي يمكن استخدامها مع الإصدار 11.x من Android ما لم تكن محظورة

التعليقات التوضيحية للنظام

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

يتم تمثيل التعليقات التوضيحية للنظام في ملفات .dex على هيئة تعليقات توضيحية تم ضبط مستوى ظهورها على VISIBILITY_SYSTEM.

dalvik.annotation.AnnotationDefault

يظهر في الواجهات التي تعرض التعليقات التوضيحية.

يتم إرفاق تعليق توضيحي AnnotationDefault بكل واجهة تعليق توضيحي تريد الإشارة إلى عمليات الربط التلقائية.

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

dalvik.annotation.EnclosingClass

يظهر في الصفوف

يتم إرفاق تعليق توضيحي EnclosingClass بكل فئة التي يتم تحديدها إما كعضو في فئة أخرى بحد ذاتها، أو كعضو مجهول ولكن لم يتم تحديده ضمن نص الأسلوب (مثل فئة داخلية اصطناعية). يجب أن يحتوي كل صف يتضمّن هذا التعليق التوضيحي أيضًا على تعليق توضيحي InnerClass. بالإضافة إلى ذلك، يجب ألا يتضمّن الصف تعليقًا توضيحيًا من النوع EnclosingClass وEnclosingMethod معًا.

الاسم التنسيق الوصف
القيمة الفئة الفئة التي تحدد نطاقًا لغويًا لهذا الصف بشكلٍ أدق

dalvik.annotation.EnclosingMethod

يظهر في الصفوف

يتم إرفاق تعليق توضيحي EnclosingMethod بكل فئة يتم تحديده داخل نص الأسلوب. يجب أن يحتوي كل صف يتضمّن هذا التعليق التوضيحي على تعليق توضيحي InnerClass أيضًا. بالإضافة إلى ذلك، يجب ألا يحتوي الصف على تعليق توضيحي EnclosingClass وEnclosingMethod في آنٍ واحد.

الاسم التنسيق الوصف
القيمة الطريقة الطريقة التي تحدد نطاق هذه الفئة بشكل لغوي بشكل أدق

dalvik.annotation.InnerClass

يظهر في الصفوف

يتم إرفاق تعليق توضيحي InnerClass بكل فئة يتم تحديده في النطاق المعجمي لتعريف فئة أخرى. يجب أن تتضمّن أيّ فئة تتضمّن علامة التعليق التوضيحي هذه أيضًا إما علامة التعليق التوضيحي EnclosingClass أو علامة التعليق التوضيحي EnclosingMethod.

الاسم التنسيق الوصف
اسم سلسلة الاسم البسيط الذي تم الإعلان عنه في الأصل لهذه الفئة (باستثناء أي علامة بدء للحزمة) إذا كانت هذه الفئة مجهولة الهوية، يكون الاسم هو null.
accessFlags تدخُّل دفاعي علامات الوصول المعلَن عنها في الأصل للصف (التي قد تختلف عن العلامات الفعّالة بسبب عدم التطابق بين نماذج التنفيذ للغة المصدر والجهاز الافتراضي المستهدَف)

dalvik.annotation.MemberClasses

يظهر في الصفوف

يتم إرفاق تعليق توضيحي MemberClasses بكل صف يُعرِض صفوف الأعضاء. (فئة العضو هي فئة داخلية مباشرة لها اسم).

الاسم التنسيق الوصف
القيمة Class[] مصفوفة لفئات الأعضاء

dalvik.annotation.MethodParameters

يظهر في الأساليب

ملاحظة: تمت إضافة هذا التعليق التوضيحي بعد الإصدار 7.1 من Android. وسيتم تجاهل وجودها على إصدارات Android الأقدم.

التعليق التوضيحي MethodParameters اختياري ويمكن استخدامه لتوفير بيانات وصفية للمَعلمة، مثل أسماء المَعلمات والمُعدِّلات.

يمكن حذف التعليق التوضيحي من طريقة أو طريقة وضع تصميم بأمان عندما لا تكون بيانات وصفية المَعلمة مطلوبة أثناء التشغيل. يمكن استخدام java.lang.reflect.Parameter.isNamePresent() للتحقّق مما إذا كانت البيانات الوصفية متوفّرة لمَعلمة معيّنة، وستعود طرق java.lang.reflect.Parameter.getName() وغيرها من طرق java.lang.reflect.Parameter.getName() المرتبط بها إلى السلوك التلقائي أثناء التشغيل في حال عدم توفّر المعلومات.

عند تضمين البيانات الوصفية للمَعلمات، يجب أن تتضمّن برامج التحويل معلومات للصفوف التي تم إنشاؤها، مثل القوائم المحدَّدة، لأنّ البيانات الوصفية للمَعلمات تتضمّن ما إذا كانت المَعلمة اصطناعية أو إلزامية.

لا يصف التعليق التوضيحي MethodParameters سوى مَعلمات الأسلوب الفردية. لذلك، قد يحذف المُجمِّع التعليق التوضيحي بالكامل لإنشاء الدوالّ والطرق التي لا تحتوي على مَعلمات، وذلك من أجل حجم الرمز البرمجي وكفاءة وقت التشغيل.

يجب أن تكون المصفوفات المُوثَّقة أدناه بالحجم نفسه لبنية method_id_item dex المرتبطة بالطريقة، وإلا سيتم طرح java.lang.reflect.MalformedParametersException أثناء وقت التشغيل.

وهذا يعني أنّ method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size يجب أن يكونا مطابقَين لnames().length و accessFlags().length.

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

الاسم التنسيق الوصف
الأسماء String[] أسماء المَعلمات الرسمية للطريقة المرتبطة يجب ألا يكون المصفوفة فارغة، ولكن يجب أن تكون فارغة إذا لم تكن هناك مَعلمات رسمية. يجب أن تكون قيمة في المصفوفة فارغة إذا لم يكن للمَعلمة الرسمية التي تحمل هذا الفهرس اسم.
إذا كانت سلاسل أسماء المَعلمات فارغة أو تحتوي على "." أو "'" أو "[" أو "/"، سيتم طرح سوى java.lang.reflect.MalformedParametersException عند وقت التشغيل.
accessFlags int[] علامات الوصول للمَعلمات الرسمية للطريقة المرتبطة يجب ألا يكون الجدول فارغًا ولكن يجب أن يكون فارغًا إذا لم تكن هناك مَعلمات رسمية.
القيمة هي قناع بت يتضمّن القيم التالية:
  • ‫0x0010 : نهائي، تمّ الإعلان عن المَعلمة على أنّها نهائية
  • 0x1000 : اصطناعية، تم إدخال المَعلمة بواسطة المُجمِّع
  • ‫0x8000 : مطلوب، المَعلمة اصطناعية ولكن يُشار إليها أيضًا في مواصفات language
في حال ضبط أي بتات خارج هذه المجموعة، سيتم طرح java.lang.reflect.MalformedParametersException أثناء التشغيل.

dalvik.annotation.Signature

تظهر في الفئات والحقول والطُرق

يتم إرفاق تعليق توضيحي Signature بكل فئة أو حقل أو طريقة يتم تعريفها من حيث نوع أكثر تعقيدًا من النوع الذي يمكن تمثيله باستخدام type_id_item. لا يحدِّد تنسيق .dex تنسيق التوقيعات، بل يهدف فقط إلى أن يكون قادرًا على تمثيل أي توقيعات تتطلّبها لغة المصدر لتطبيق دلالتها بنجاح. ولذلك، لا يتم عادةً تحليل (أو التحقّق من) التوقيعات من خلال عمليات تنفيذ الآلات الافتراضية. ويتم تصعيد التوقيعات ببساطة إلى أدوات وواجهات برمجة تطبيقات ذات مستوى أعلى (مثل مصحّحات الأخطاء). لذلك، يجب كتابة أي استخدام للتوقيع بطريقة لا تجعلك تفترض أنّك ستتلقّى فقط توقيعات صالحة، مع الحذر بشكل صريح من احتمالية العثور على توقيع ليس صالحًا من الناحية النحوية.

بما أنّ سلاسل التوقيعات غالبًا ما تحتوي على الكثير من المحتوى المكرّر، يتم تعريف التعليق التوضيحي Signature على أنّه مصفوفة من سلاسل البيانات، حيث تشير العناصر المكرّرة بشكل طبيعي إلى البيانات الأساسية نفسها، ويتم اعتبار التوقيع على أنّه تسلسل كل سلاسل البيانات في المصفوفة. لا تتوفّر قواعد حول كيفية فصل توقيع إلى سلاسل منفصلة، ويعود ذلك بالكامل إلى الأدوات التي تنشئ ملفات .dex.

الاسم التنسيق الوصف
القيمة String[] توقيع هذه الفئة أو العنصر، بصفته صفيفًا من السلاسل التي يجب تسلسلها معًا

dalvik.annotation.Throws

يظهر في الأساليب

يتم إرفاق تعليق توضيحي Throws بكل طريقة يتم إعلانها لرمي نوع استثناء واحد أو أكثر.

الاسم التنسيق الوصف
القيمة Class[] مصفوفة أنواع الاستثناءات التي تمّ طرحها