دالفيك تنسيق قابل للتنفيذ

يصف هذا المستند تخطيط ومحتويات ملفات .dex ، والتي يتم استخدامها للاحتفاظ بمجموعة من تعريفات الفئات والبيانات المساعدة المرتبطة بها.

دليل الأنواع

اسم وصف
بايت 8 بت موقعة
ubyte 8 بت غير موقعة كثافة العمليات
قصير 16 بت موقعة، Little-Endian
قصير 16 بت غير موقعة، إنديان الصغير
كثافة العمليات 32 بت موقعة، Little-Endian
uint 32 بت غير موقعة، نهاية صغيرة
طويل 64 بت موقعة، Little-Endian
ulong 64 بت غير موقعة، إنديان الصغير
sleb128 موقعة LEB128، متغيرة الطول (انظر أدناه)
uleb128 LEB128 غير الموقعة، متغيرة الطول (انظر أدناه)
uleb128p1 LEB128 غير الموقعة زائد 1 ، متغيرة الطول (انظر أدناه)

جنيه 128

LEB128 (" L ittle- E ndian B ase 128 ") هو ترميز متغير الطول للكميات الصحيحة الموقعة أو غير الموقعة. تم استعارة التنسيق من مواصفات DWARF3 . في ملف .dex ، يتم استخدام LEB128 فقط لتشفير كميات 32 بت.

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

رسم تخطيطي للبت لقيمة LEB128 ثنائية البايت
البايت الأول البايت الثاني
1 بت 6 بت 5 بت 4 بت 3 بت 2 بت 1 بت 0 0 بت 13 بت 12 بت 11 بت 10 بت 9 بت 8 بت 7

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

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

التسلسل المشفر كما sleb128 كما uleb128 كما uleb128p1
00 0 0 -1
01 1 1 0
-1 127 126
80 7و -128 16256 16255

تخطيط الملف

اسم شكل وصف
header 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 .
way_handles method_handle_item[] قائمة مقابض الطريقة. قائمة بجميع مقابض الأساليب التي يشير إليها هذا الملف، سواء تم تعريفها في الملف أم لا. لم يتم فرز هذه القائمة وقد تحتوي على نسخ مكررة تتوافق منطقيًا مع مثيلات معالجة الأساليب المختلفة.
بيانات أوبايت[] منطقة البيانات، التي تحتوي على كافة بيانات الدعم للجداول المذكورة أعلاه. العناصر المختلفة لها متطلبات محاذاة مختلفة، ويتم إدراج بايتات الحشو قبل كل عنصر إذا لزم الأمر لتحقيق المحاذاة المناسبة.
link_data أوبايت[] البيانات المستخدمة في الملفات المرتبطة بشكل ثابت. تم ترك تنسيق البيانات في هذا القسم غير محدد في هذا المستند. هذا القسم فارغ في الملفات غير المرتبطة، وقد تستخدمه تطبيقات وقت التشغيل كما تراه مناسبًا.

تعريفات Bitfield والسلسلة والثابتة

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"

ملاحظة: تمت إضافة دعم الإصدار 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 من التنسيق في إصدار Android 7.0. قبل الإصدار 037 استخدمت معظم إصدارات Android الإصدار 035 من التنسيق. والفرق الوحيد بين الإصدارين 035 و 037 هو إضافة الطرق الافتراضية وتعديل invoke .

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

ENDIAN_CONSTANT وREVERSE_ENDIAN_CONSTANT

مضمن في header_item

يتم استخدام الثابت ENDIAN_CONSTANT للإشارة إلى نهاية الملف الذي تم العثور عليه فيه. على الرغم من أن تنسيق .dex القياسي قليل النهاية، إلا أن التطبيقات قد تختار إجراء تبديل البايت. إذا صادف التنفيذ رأسًا تكون 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 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_
متزامن
0x20000 أعلن synchronized .

ملاحظة: ليس لهذا أي تأثير على التنفيذ (بخلاف انعكاس هذه العلامة في حد ذاتها).

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

تعديل ترميز UTF-8

كامتياز لتسهيل الدعم القديم، يقوم تنسيق .dex بتشفير بيانات السلسلة الخاصة به في نموذج UTF-8 المعدل فعليًا، والمشار إليه فيما يلي باسم MUTF-8. هذا النموذج مطابق لمعيار UTF-8، باستثناء:

  • يتم استخدام الترميزات ذات البايت الواحد والثنائي والثلاثي فقط.
  • يتم ترميز نقاط الكود في النطاق U+10000 ... U+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 في حد ذاته.

ترميز_القيمة_المشفرة

مضمن في annotation_element وencoded_array_item

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

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

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

أكتب اسم value_type تنسيق value_arg تنسيق value وصف
VALUE_BYTE 0x00 (لا شيء؛ يجب أن يكون 0 ) أوبايت[1] وقعت قيمة عدد صحيح بايت واحد
VALUE_SHORT 0x02 الحجم - 1 (0…1) أوبايت [الحجم] موقعة قيمة عدد صحيح ثنائي البايت، التوقيع الموسعة
VALUE_CHAR 0x03 الحجم - 1 (0…1) أوبايت [الحجم] قيمة عدد صحيح ثنائي البايت غير موقعة، ممتدة صفر
VALUE_INT 0x04 الحجم - 1 (0…3) أوبايت [الحجم] موقعة قيمة عدد صحيح أربعة بايت، التوقيع الموسعة
VALUE_LONG 0x06 الحجم - 1 (0…7) أوبايت [الحجم] موقعة بقيمة عددية ثمانية بايت، علامة ممتدة
VALUE_FLOAT 0x10 الحجم - 1 (0…3) أوبايت [الحجم] نمط بتات رباعي البايتات، ممتد صفرًا إلى اليمين ، ويتم تفسيره كقيمة فاصلة عائمة IEEE754 32 بت
VALUE_DOUBLE 0x11 الحجم - 1 (0…7) أوبايت [الحجم] نمط بت مكون من ثمانية بايت، ممتد صفرًا إلى اليمين ، ويتم تفسيره كقيمة فاصلة عائمة IEEE754 64 بت
VALUE_METHOD_TYPE 0x15 الحجم - 1 (0…3) أوبايت [الحجم] قيمة عدد صحيح بأربعة بايت غير موقعة (ممتدة صفرًا)، يتم تفسيرها على أنها فهرس في قسم proto_ids وتمثل قيمة نوع الطريقة
VALUE_METHOD_HANDLE 0x16 الحجم - 1 (0…3) أوبايت [الحجم] قيمة عدد صحيح بأربعة بايت غير موقعة (ممتدة صفرًا)، يتم تفسيرها على أنها فهرس في قسم method_handles وتمثل قيمة مقبض الطريقة
VALUE_STRING 0x17 الحجم - 1 (0…3) أوبايت [الحجم] قيمة عدد صحيح مكونة من أربعة بايت غير موقعة (ممتدة صفرًا)، يتم تفسيرها على أنها فهرس في قسم string_ids وتمثل قيمة سلسلة
VALUE_TYPE 0x18 الحجم - 1 (0…3) أوبايت [الحجم] قيمة عدد صحيح مكونة من أربعة بايت غير موقعة (ممتدة صفرًا)، يتم تفسيرها على أنها فهرس في قسم type_ids وتمثل قيمة نوع/فئة عاكسة
VALUE_FIELD 0x19 الحجم - 1 (0…3) أوبايت [الحجم] قيمة عدد صحيح بأربعة بايت غير موقعة (ممتدة صفرًا)، يتم تفسيرها على أنها فهرس في قسم field_ids وتمثل قيمة حقل عاكسة
VALUE_METHOD 0x1a الحجم - 1 (0…3) أوبايت [الحجم] قيمة عدد صحيح بأربعة بايت غير موقعة (ممتدة صفرًا)، يتم تفسيرها على أنها فهرس في قسم method_ids وتمثل قيمة طريقة عاكسة
VALUE_ENUM 0x1b الحجم - 1 (0…3) أوبايت [الحجم] قيمة عدد صحيح مكونة من أربعة بايت غير موقعة (ممتدة صفرًا)، يتم تفسيرها على أنها فهرس في قسم field_ids وتمثل قيمة ثابت النوع المُعدَّد
VALUE_ARRAY 0x1c (لا شيء؛ يجب أن يكون 0 ) encoded_array مجموعة من القيم، بالتنسيق المحدد بواسطة "تنسيق encoded_array " أدناه. حجم 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 المحدد في هذا القسم، متسلسلة بشكل تسلسلي.

تنسيق encoded_annotation

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

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

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

بناء جملة السلسلة

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

اسم بسيط

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

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

اسم عضو

يستخدم بواسطة field_id_item وmethod_id_item

اسم العضو هو اسم عضو في الفصل الدراسي، والأعضاء عبارة عن حقول وأساليب وفئات داخلية.

اسم العضو
اسم بسيط
| '<' الاسم البسيط '>'

اسم الفئة الكاملة

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

اسم الفئة الكاملة
اختياريPackagePrefix SimpleName
اختياريحزمةبادئة
( الاسم البسيط '/' )*

نوع واصف

يستخدم بواسطة type_id_item

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

واصف النوع
'V'
| FieldTypeDescriptor
واصف نوع الحقل
NonArrayFieldTypeDescriptor
| ( '[' * 1...255) NonArrayFieldTypeDescriptor
NonArrayFieldTypeDescriptor
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L' FullClassName ';'

وصف قصير

يستخدم بواسطة proto_id_item

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

واصف قصير
ShortyReturnType ( ShortyFieldType )*
نوع الإرجاع القصير
'V'
| ShortyFieldType
نوع الحقل القصير
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L'

دلالات واصف النوع

هذا هو معنى كل متغير من متغيرات TypeDescriptor .

بناء الجملة معنى
الخامس void ؛ صالحة فقط لأنواع العودة
ز boolean
ب byte
س short
ج char
أنا int
ج long
F float
د double
L بالكامل/مؤهل/الاسم ؛ الفئة fully.qualified.Name
[ واصف array من descriptor ، يمكن استخدامها بشكل متكرر لمصفوفات المصفوفات، على الرغم من أنه من غير الصحيح أن يكون لها أكثر من 255 بُعدًا.

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

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

header_item

يظهر في قسم الرأس

المحاذاة: 4 بايت

اسم شكل وصف
سحر ubyte[8] = DEX_FILE_MAGIC القيمة السحرية. راجع المناقشة أعلاه ضمن " DEX_FILE_MAGIC " لمزيد من التفاصيل.
المجموع الاختباري uint المجموع الاختباري adler32 لبقية الملف (كل شيء ما عدا magic وهذا الحقل)؛ يستخدم للكشف عن تلف الملفات
إمضاء أوبايت[20] توقيع SHA-1 (تجزئة) لبقية الملف (كل شيء ما عدا magic checksum وهذا الحقل)؛ تستخدم لتحديد الملفات بشكل فريد
حجم الملف uint حجم الملف بأكمله (بما في ذلك الرأس)، بالبايت
header_size يونت = 0x70 حجم الرأس (هذا القسم بأكمله)، بالبايت. يسمح هذا بقدر محدود على الأقل من التوافق مع الإصدارات السابقة/الأمامية دون إبطال التنسيق.
endian_tag uint = ENDIAN_CONSTANT علامة endianness. راجع المناقشة أعلاه ضمن " 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 بالبايت. يجب أن يكون مضاعفًا لحجم (uint).
data_off uint الإزاحة من بداية الملف إلى بداية قسم data .

Map_list

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

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

المحاذاة: 4 بايت

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

اسم شكل وصف
مقاس uint حجم القائمة، في الإدخالات
قائمة خريطة_العنصر[الحجم] عناصر القائمة

تنسيق Map_item

اسم شكل وصف
يكتب قصير نوع العناصر؛ انظر الجدول أدناه
غير مستعمل قصير (غير مستعمل)
مقاس uint حساب عدد العناصر التي يمكن العثور عليها في الإزاحة المشار إليها
عوض 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 + (حجم السلعة * 12)
type_list TYPE_TYPE_LIST 0x1001 4 + (حجم السلعة * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (حجم السلعة * 4)
annotation_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (حجم السلعة * 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 )
بيانات أوبايت[] سلسلة من وحدات الكود 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 لنوع الإرجاع لهذا النموذج الأولي
بارامترات_off uint إزاحة من بداية الملف إلى قائمة أنواع المعلمات لهذا النموذج الأولي، أو 0 إذا كان هذا النموذج الأولي لا يحتوي على معلمات. يجب أن تكون هذه الإزاحة، إذا لم تكن صفرًا، في قسم data ، ويجب أن تكون البيانات هناك بالتنسيق المحدد بواسطة "type_list" أدناه. بالإضافة إلى ذلك، يجب ألا يكون هناك أي مرجع إلى النوع void في القائمة.

field_id_item

يظهر في قسم field_ids

المحاذاة: 4 بايت

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

method_id_item

يظهر في قسمmethod_ids

المحاذاة: 4 بايت

اسم شكل وصف
class_idx قصير قم بالفهرس في قائمة type_ids لمعرف هذه الطريقة. يجب أن يكون هذا فئة أو نوع صفيف، وليس نوعًا بدائيًا.
proto_idx قصير قم بالفهرسة في قائمة 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 ). إذا كان موجودًا، فيجب أن يكون هذا نوع فئة، وليس مصفوفة أو نوعًا بدائيًا.
واجهات_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).

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

يجب أن يكون لمقبض الأسلوب الذي يمثل أسلوب رابط bootstrap نوع الإرجاع 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 قصير نوع مقبض الطريقة؛ انظر الجدول أدناه
غير مستعمل قصير (غير مستعمل)
field_or_method_id قصير يعتمد معرف الحقل أو الأسلوب على ما إذا كان نوع مؤشر الأسلوب هو موصل أو مستحضر أسلوب
غير مستعمل قصير (غير مستعمل)

طريقة التعامل مع رموز النوع

ثابت قيمة وصف
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 مقبض الطريقة هو أداة ضبط حقل ثابتة (ملحق)
METHOD_HANDLE_TYPE_STATIC_GET 0x01 Method Method Handle هو getter حقل ثابت (ملحق)
method_handle_type_instance_put 0x02 Method Method Handle هو جهاز حقل مثيل (ملحق)
method_handle_type_instance_get 0x03 Method Method Handle هو Getter حقل مثيل (ملحق)
method_handle_type_invoke_static 0x04 تعامل الأسلوب هو طريقة invoker طريقة ثابتة
method_handle_type_invoke_instance 0x05 تعامل الأسلوب هو طريقة مثيل invoker
method_handle_type_invoke_constructor 0x06 تعامل الأسلوب هو طريقة مُنشئ invoker
method_handle_type_invoke_direct 0x07 تعامل الأسلوب هو طريقة مباشرة invoker
method_handle_type_invoke_interface 0x08 تعامل الأسلوب هو طريقة واجهة invoker

class_data_item

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

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

المحاذاة: لا شيء (محاذاة بايت)

اسم شكل وصف
static_fields_size ULEB128 عدد الحقول الثابتة المحددة في هذا العنصر
مثيل_fields_size ULEB128 عدد حقول المثيلات المحددة في هذا العنصر
direct_methods_size ULEB128 عدد الطرق المباشرة المحددة في هذا العنصر
virtual_methods_size ULEB128 عدد الطرق الافتراضية المحددة في هذا العنصر
static_fields encoded_field [static_fields_size] الحقول الثابتة المحددة ، ممثلة كتسلسل للعناصر المشفرة. يجب فرز الحقول بواسطة field_idx بترتيب متزايد.
مثيل _fields encoded_field [evaly_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 [الحجم] عناصر القائمة

تنسيق type_item

اسم شكل وصف
type_idx قصير فهرس في قائمة type_ids

Code_Item

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

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

المحاذاة: 4 بايت

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

Try_Item تنسيق

اسم شكل وصف
start_addr uint ابدأ عنوان كتلة التعليمات البرمجية التي يغطيها هذا الإدخال. العنوان هو عدد وحدات رمز 16 بت لبدء التعليمات الأولى المغطاة.
insn_count قصير عدد وحدات رمز 16 بت التي يغطيها هذا الإدخال. وحدة التعليمات البرمجية الأخيرة المغطاة (شاملة) هي start_addr + insn_count - 1 .
معالج قصير الإزاحة في بايت من بداية 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 (اختياري) عنوان BYTECODE من معالج الكل. هذا العنصر موجود فقط إذا كان size غير إيجابي.

encoded_type_addr_pair تنسيق

اسم شكل وصف
type_idx ULEB128 فهرس في قائمة type_ids لنوع الاستثناء للقبض
عنوان ULEB128 عنوان Bytecode من معالج الاستثناء المرتبط به

debug_info_item

المشار إليها من Code_Item

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

المحاذاة: لا شيء (محاذاة بايت)

يحدد كل debug_info_item آلة حالة بايت مستوحاة من قزم 3 والتي ، عند تفسيرها ، تنبعث من جدول المواضع و (يحتمل) المعلومات المتغيرة المحلية لـ 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 جهاز الحالة. لا يمثل إدخال المواقف الفعلية.
المعلمات 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 ، على الرغم من ذلك ، يمكن تمثيل نفس البيانات بشكل أكثر كفاءة باستخدام OPCODE 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)

التعليقات التوضيحية_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 [MOTES_SIZE] (اختياري) قائمة التعليقات التوضيحية الطريقة المرتبطة بها. يجب فرز عناصر القائمة بترتيب متزايد ، بواسطة method_idx .
المعلمة parameter_annotation [parameters_size] (اختياري) قائمة التعليقات التوضيحية للمعلمة الطريقة المرتبطة. يجب فرز عناصر القائمة بترتيب متزايد ، بواسطة method_idx .

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

field_annotation تنسيق

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

تنسيق method_annotation

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

Parameter_annotation تنسيق

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

antation_set_ref_list

المشار إليها من المعلمة _annotations_item

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

المحاذاة: 4 بايت

اسم شكل وصف
مقاس uint حجم القائمة ، في الإدخالات
قائمة antation_set_ref_item [الحجم] عناصر القائمة

Entation_Set_Ref_Item Format

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

antation_set_item

المشار إليها من التعليقات التوضيحية_directory_item ، field_annotations_item ، method_annotations_item ، و enrotation_set_ref_item

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

المحاذاة: 4 بايت

اسم شكل وصف
مقاس uint حجم المجموعة ، في الإدخالات
إدخالات anotation_off_item [الحجم] عناصر المجموعة. يجب أن يتم فرز العناصر بترتيب متزايد ، حسب type_idx .

Estation_off_Item Format

اسم شكل وصف
التعليق التوضيحي uint تعويض من بداية الملف إلى تعليق توضيحي. يجب أن يكون الإزاحة إلى موقع في قسم data ، ويتم تحديد تنسيق البيانات في هذا الموقع بواسطة " annotation_item " أدناه.

التعليق التوضيحي

المشار إليها من التعليق التوضيحي_set_item

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

المحاذاة: لا شيء (محاذاة بايت)

اسم شكل وصف
الرؤية أوبي الرؤية المقصودة لهذا التعليق التوضيحي (انظر أدناه)
حاشية. ملاحظة encoded_annotation محتويات التعليقات التوضيحية المشفرة ، بالتنسيق الموصوف بواسطة "تنسيق encoded_annotation " ضمن "تشفير encoded_value " أعلاه.

قيم الرؤية

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

اسم قيمة وصف
الرؤية _build 0x00 المقصود أن يكون مرئيًا فقط في وقت البناء (على سبيل المثال ، أثناء تجميع الكود الآخر)
الرؤية _runtime 0x01 تهدف إلى مرئي في وقت التشغيل
الرؤية _system 0x02 تهدف إلى مرئي في وقت التشغيل ، ولكن فقط للنظام الأساسي (وليس إلى رمز المستخدم العادي)

encoded_array_item

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

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

المحاذاة: لا شيء (محاذاة بايت)

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

hiddenapi_class_data_item

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

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

اسم شكل وصف
مقاس uint الحجم الكلي للقسم
تعويضات uint [] مجموعة من الإزاحة المفهرسة بواسطة class_idx . يعني إدخال صفر صفر في index class_idx أنه لا توجد بيانات لهذا class_idx ، أو جميع أعلام API المخفية هي صفر. وإلا فإن إدخال الصفيف غير صفري ويحتوي على إزاحة من بداية القسم إلى مجموعة من أعلام API المخفية لهذا class_idx .
أعلام ULEB128 [] صفائف متسلسلة من أعلام API المخفية لكل فصل. يتم وصف قيم العلم المحتملة في الجدول أدناه. يتم تشفير الأعلام بنفس ترتيب الحقول والأساليب مشفرة في بيانات الفصل.

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

اسم قيمة وصف
القائمة البيضاء 0 الواجهات التي يمكن استخدامها بحرية ودعمها كجزء من فهرس حزمة الإطارات الموثق رسميًا.
الرمادي 1 واجهات غير SDK التي يمكن استخدامها بغض النظر عن مستوى API المستهدف للتطبيق.
القائمة السوداء 2 واجهات غير SDK التي لا يمكن استخدامها بغض النظر عن مستوى واجهة برمجة التطبيقات المستهدفة للتطبيق. يؤدي الوصول إلى أحد هذه الواجهات إلى خطأ في وقت التشغيل .
Greylist - Max - O. 3 واجهات غير SDK التي يمكن استخدامها لنظام Android 8.x وأقل ما لم يتم تقييدها.
Greylist - Max - P. 4 واجهات غير SDK التي يمكن استخدامها لنظام Android 9.x ما لم يتم تقييدها.
Greylist - Max - Q. 5 واجهات غير SDK التي يمكن استخدامها لنظام Android 10.x ما لم يتم تقييدها.
Greylist - Max - R. 6 واجهات غير SDK التي يمكن استخدامها لنظام Android 11.x ما لم يتم تقييدها.

تعليقات النظام

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

يتم تمثيل تعليقات النظام في ملفات .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 لكل فصل يعلن فصول الأعضاء. (فئة الأعضاء هي فئة داخلية مباشرة لها اسم.)

اسم شكل وصف
قيمة فصل[] مجموعة من فصول الأعضاء

dalvik.annotation.methodparameters

يظهر على الأساليب

ملاحظة: تمت إضافة هذا التعليق بعد Android 7.1. سيتم تجاهل وجودها في إصدارات 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 أيضًا أي معلومات حول معلمات مستقبل التعليقات التوضيحية نوعًا غير موجودة في توقيع الطريقة الفعلية.

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

dalvik.annotation.Signature

يظهر على الفصول والحقول والأساليب

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

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

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

dalvik.annotation.throws

يظهر على الأساليب

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

اسم شكل وصف
قيمة فصل[] مجموعة من أنواع الاستثناءات التي ألقيت