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

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

دليل الأنواع

الاسم الوصف
بايت عدد صحيح 8 بت موقّع
ubyte عدد صحيح غير موقّع 8 بت
فيديو قصير عدد صحيح ذو 16 بت موقّع، ترتيب صغير
ushort عدد صحيح غير موقّع 16 بت، ترتيب صغير
تدخُّل دفاعي عدد صحيح 32 بت يحمل علامة، ترتيب البايتات الصغير أولاً
uint عدد صحيح غير موقّع 32 بت، ترتيب صغير
طويلة عدد صحيح موقّع 64 بت، ترتيب صغير
أولونغ عدد صحيح غير موقّع 64 بت، ترتيب صغير
sleb128 توقيع LEB128، طول متغيّر (راجِع أدناه)
uleb128 LEB128 غير موقّع، طول متغيّر (انظر أدناه)
uleb128p1 unsigned LEB128 plus 1، طول متغيّر (راجِع ما يلي)

LEB128

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

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

مخطط على مستوى البت لقيمة LEB128 من بايتَين
أول بايت وحدة البايت الثانية
1 bit6 bit5 bit4 bit3 bit2 بت1 bit0 0 bit13 ‫12 بت bit11 ‫bit10 bit9 bit8 bit7

يُستخدَم النوع المتغير uleb128p1 لتمثيل قيمة موقّعة، حيث يكون التمثيل للقيمة زائد واحد مرمّزًا كـ 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 مشاركة البيانات، مثل السلاسل، بينها.
  • جميع الإزاحات مرتبطة بالملف الفعلي. ما مِن إزاحة مرتبطة بالعنوان. يضمن ذلك إمكانية مشاركة الأقسام التي تتضمّن إزاحات بين الملفات المنطقية.
  • يضيف العنوان حقلَين جديدَين لوصف حدود الحاوية. هذا هو فحص الاتساق الإضافي الذي يسهّل نقل الرمز إلى التنسيق الجديد.
  • لم يعُد يتم استخدام 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"

ملاحظة: تمت إضافة إمكانية استخدام الإصدار 041 من التنسيق في إصدار Android 16، ما يتيح استخدام تنسيق الحاوية.

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

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

ملاحظة: تمت إضافة إمكانية استخدام الإصدار 038 من التنسيق في إصدار Android 8.0. أضاف الإصدار 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

تعريفات علامات الوصول

مضمّنة في 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: is not constructed with an outer this reference static: عام إلى فئة التعريف static: لا تقبل الوسيطة this
ACC_FINAL 0x10 final: غير قابل للتصنيف الفرعي final: غير قابل للتغيير بعد الإنشاء final: لا يمكن تجاهله
ACC_SYNCHRONIZED 0x20     synchronized: يتم تلقائيًا الحصول على قفل مرتبط عند استدعاء هذه الطريقة.

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

ACC_VOLATILE 0x40   volatile: قواعد وصول خاصة للمساعدة في الحفاظ على أمان سلسلة المحادثات  
ACC_BRIDGE 0x40     bridge method, added automatically by compiler as a type-safe bridge
ACC_TRANSIENT 0x80   transient: عدم الحفظ من خلال التسلسل التلقائي  
ACC_VARARGS 0x80     يجب أن يتعامل المترجم مع الوسيطة الأخيرة على أنّها وسيطة "باقية"
ACC_NATIVE 0x100     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 (لا شيء؛ يجب أن تكون القيمة 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] نمط بت من أربعة بايت، يتم تمديده بأصفار إلى اليمين، ويتم تفسيره كقيمة نقطة عائمة من 32 بت وفقًا لمعيار IEEE754
VALUE_DOUBLE 0x11 المقاس - 1 (0…7) ubyte[size] نمط بت من ثمانية بايتات، يتم تمديده بالأصفار إلى اليمين، ويتم تفسيره كقيمة نقطة عائمة 64 بت وفقًا لمعيار IEEE754
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 (لا شيء؛ يجب أن تكون القيمة 0) encoded_array مصفوفة من القيم بالتنسيق المحدّد في "encoded_array format" أدناه يتم تحديد حجم value ضمنيًا في الترميز.
VALUE_ANNOTATION 0x1d (لا شيء؛ يجب أن تكون القيمة 0) encoded_annotation تعليق توضيحي فرعي بالتنسيق المحدّد في "تنسيق encoded_annotation" أدناه يتم تحديد حجم value ضمنيًا في الترميز.
VALUE_NULL 0x1e (لا شيء؛ يجب أن تكون القيمة 0) (بلا) null القيمة المرجعية
VALUE_BOOLEAN 0x1f قيمة منطقية (0…1) (بلا) قيمة بت واحد؛ 0 لـ false و1 لـ true يتم تمثيل البت في value_arg.

تنسيق encoded_array

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

تنسيق encoded_annotation

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

تنسيق عنصر التعليق التوضيحي

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

بنية السلسلة

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

SimpleName

SimpleName هو أساس بنية أسماء العناصر الأخرى. يتيح تنسيق .dex قدرًا كبيرًا من المرونة هنا (أكثر بكثير من معظم اللغات المصدر الشائعة). باختصار، يتألف الاسم البسيط من أي حرف أبجدي أو رقمي منخفض ASCII، وبعض الرموز المحددة المنخفضة ASCII، ومعظم نقاط الرموز غير ASCII التي ليست رموز تحكّم أو مسافات أو رموز خاصة. بدءًا من الإصدار 040، يسمح التنسيق أيضًا بأحرف المسافة (فئة Unicode Zs). يُرجى العِلم أنّ نقاط الرموز البديلة (في النطاق U+d800U+dfff) لا تُعتبر أحرفًا صالحة للاستخدام في الأسماء، ولكن أحرف Unicode الإضافية صالحة (وهي ممثّلة بالبديل الأخير لقاعدة 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.
حجم_البيانات 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 أو إصدار أحدث)

قائمة_الخرائط

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

يتم الرجوع إليه من 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
قائمة_الخرائط 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 ضمني، يجب تحليله
string_data_item 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 أدناه. ما مِن متطلبات محاذاة للإزاحة.

string_data_item

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

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

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

ملاحظة: من المقبول أن يتضمّن السلسلة (النموذج المرمّز) وحدات رمز بديل UTF-16 (أي U+d800U+dfff) إما بشكل منفصل أو بترتيب غير صحيح مقارنةً بالترميز المعتاد لـ Unicode إلى 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 إذا لم تكن هناك أي واجهات يجب أن يكون هذا الإزاحة في القسم 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 هو encoded_array_item تتوافق عناصره مع الوسيطات المقدَّمة إلى طريقة ربط تمهيدية. الوسيطات الثلاث الأولى هي:

  1. معرّف طريقة يمثّل طريقة ربط التشغيل الأوّلي (VALUE_METHOD_HANDLE).
  2. اسم طريقة يجب أن يحلّها رابط التمهيد (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 أو الدالة الإنشائية)، والتي يتم تمثيلها كسلسلة من العناصر المرمّزة يجب ألا تتضمّن هذه القائمة الطرق الموروثة ما لم يتم استبدالها بالفئة التي يمثّلها هذا العنصر. يجب ترتيب طرق الدفع حسب 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 عدد الكلمات المطلوبة لمساحة وسيطة صادرة من هذا الرمز عند استدعاء الطريقة
tries_size ushort عدد try_item لهذا المثال. إذا كانت القيمة غير صفرية، ستظهر هذه القيم كمصفوفة tries بعد insns مباشرةً في هذا المثال.
debug_info_off uint إزاحة من بداية الملف إلى تسلسل معلومات تصحيح الأخطاء (أرقام الأسطر + معلومات المتغيرات المحلية) لهذا الرمز، أو 0 إذا لم تتوفر أي معلومات. يجب أن يكون الإزاحة، إذا كانت قيمة غير صفرية، إلى موقع جغرافي في القسم data. يتم تحديد تنسيق البيانات من خلال "debug_info_item" أدناه.
insns_size uint حجم قائمة التعليمات، بوحدات الرموز المكوّنة من 16 بت
insns ushort[insns_size] مصفوفة رمز البايت الفعلية يتم تحديد تنسيق الرمز في مصفوفة insns من خلال المستند المرافق Dalvik bytecode. يُرجى العِلم أنّه على الرغم من أنّ هذا النوع معرَّف على أنّه مصفوفة من 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 أنّ هناك عبارة catch واحدة مكتوبة بالإضافة إلى عبارة catch-all.
المعالجات 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 إذا لم تتضمّن الفئة أي تعليقات توضيحية مباشرة يجب أن يكون الإزاحة، إذا كانت قيمة غير صفرية، إلى موقع جغرافي في القسم 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 إزاحة من بداية الملف إلى قائمة التعليقات التوضيحية للحقل. يجب أن يكون الإزاحة إلى موقع جغرافي في القسم data. يتم تحديد تنسيق البيانات من خلال "annotation_set_item" أدناه.

تنسيق method_annotation

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

تنسيق parameter_annotation

الاسم التنسيق الوصف
method_idx uint فهرس في قائمة method_ids لتحديد هوية الطريقة التي يتم إضافة تعليقات توضيحية إلى مَعلماتها
annotations_off uint الإزاحة من بداية الملف إلى قائمة التعليقات التوضيحية الخاصة بمعلمات الطريقة يجب أن يكون الإزاحة إلى موقع جغرافي في القسم 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 إذا لم تكن هناك تعليقات توضيحية لهذا العنصر. يجب أن يكون الإزاحة، إذا كانت قيمة غير صفرية، إلى موقع جغرافي في القسم 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 إزاحة من بداية الملف إلى تعليق توضيحي يجب أن يكون الإزاحة إلى موقع جغرافي في القسم 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 إجمالي حجم القسم
offsets uint[] مصفوفة الإزاحات المفهرسة حسب class_idx. يشير إدخال مصفوفة بقيمة صفر في الفهرس class_idx إلى أنّه إما لا تتوفّر بيانات لهذا class_idx، أو أنّ جميع علامات واجهة برمجة التطبيقات المخفية هي صفر. بخلاف ذلك، يكون إدخال المصفوفة غير صفري ويحتوي على إزاحة من بداية القسم إلى مصفوفة علامات واجهة برمجة التطبيقات المخفية لهذا class_idx.
العلامات uleb128[] مصفوفات متسلسلة من علامات واجهة برمجة التطبيقات المخفية لكل فئة تم توضيح قيم العلامات المحتملة في الجدول أدناه. يتم ترميز العلامات بالترتيب نفسه الذي يتم به ترميز الحقول والطرق في بيانات الفئة.

أنواع علامات الحظر:

الاسم القيمة الوصف
القائمة البيضاء 0 واجهات يمكن استخدامها بحرية ويتم توفيرها كجزء من فهرس الحِزم في إطار عمل Android الموثّق رسميًا.
قائمة رمادية 1 واجهات غير متوفرة في حزمة SDK ويمكن استخدامها بغض النظر عن مستوى واجهة برمجة التطبيقات المستهدَف للتطبيق
وضع في القائمة السوداء 2 واجهات غير متوفرة في حزمة SDK ولا يمكن استخدامها بغض النظر عن مستوى واجهة برمجة التطبيقات المستهدَف للتطبيق يؤدي الوصول إلى إحدى هذه الواجهات إلى حدوث خطأ في وقت التشغيل.
greylist‑max‑o 3 واجهات غير متوفرة في حزمة SDK يمكن استخدامها على نظام التشغيل Android 8.x والإصدارات الأقدم ما لم يتم حظرها
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()، إلى السلوك التلقائي في وقت التشغيل إذا لم تكن المعلومات متوفّرة.

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

يصف التعليق التوضيحي 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 : final، تم تعريف المَعلمة على أنّها نهائية
  • ‫0x1000 : اصطناعي، تم تقديم المَعلمة بواسطة المترجم
  • 0x8000 : إلزامي، المَعلمة اصطناعية ولكنها مضمّنة أيضًا في مواصفات اللغة
إذا تم ضبط أي وحدات بت خارج هذه المجموعة، سيتم عرض الخطأ java.lang.reflect.MalformedParametersException في وقت التشغيل.

dalvik.annotation.Signature

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

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

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

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

dalvik.annotation.Throws

تظهر في الطرق

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

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