يصف هذا المستند تنسيق ملفّات .dex
ومحتوى هذه الملفات، والتي تُستخدَم لتضمين مجموعة من تعريفات الفئات والبيانات الملحقة المرتبطة بها.
دليل الأنواع
الاسم | الوصف |
---|---|
بايت | عدد صحيح بترميز ثنائي 8 بت |
ubyte | عدد صحيح غير موقَّت بسعة 8 بت |
فيديو قصير | عدد صحيح بترميز ثنائي 16 بت بترتيب الوحدات الأقل أهمية أولاً |
ushort | عدد صحيح غير موقَّت بسعة 16 بت بترتيب الوحدات الأقل أهمية أولاً |
تدخُّل دفاعي | عدد صحيح بعلامة 32 بت، ترتيب الوحدات الأقل أهمية أولاً |
uint | عدد صحيح غير موقَّت بسعة 32 بت بترتيب الوحدات الأقل أهمية أولاً |
طويلة | عدد صحيح موقَّع 64 بت، ترتيب الوحدات الأقل أهمية أولاً |
ulong | عدد صحيح غير موقَّت بسعة 64 بت بترتيب الوحدات الأقل أهمية |
sleb128 | LEB128 موقَّع، بطول متغيّر (راجِع المعلومات أدناه) |
uleb128 | LEB128 غير الموقعة، ذات الطول المتغيّر (راجِع ما يلي) |
uleb128p1 | LEB128 غير الموقعة بالإضافة إلى 1 ، ذات الطول المتغير (راجِع ما يلي) |
LEB128
LEB128 ("Little-Endian Base 128") هو قاعدة تمثيل برمجي
بطول متغير لقياسquantities عدد صحيح عشوائي مع علامة أو بدون علامة. تم اقتباس التنسيق
من مواصفات DWARF3. في ملف .dex
، لا يتم استخدام LEB128 إلا ل код ترميز القيم التي تبلغ 32 بت.
تتألف كل قيمة مُشفَّرة بترميز LEB128 من واحد إلى خمسة
بايت، والتي تمثّل معًا قيمة واحدة بسعة 32 بت. يتم ضبط البت الأكثر أهمية في كل باييت باستثناء البايت الأخير في التسلسل، والذي يكون فيه البت الأكثر أهمية مُلغى. أما البتّان المتبقيان
من كل بايت، فهما الحمولة، مع البتّان العميقان
الذين يمثّلان الكمية في البايت الأول، والبتّان التاليان في البايت
الثاني وما إلى ذلك. في حال استخدام LEB128 (sleb128
) الذي يحمل علامة، تتم إضافة علامة إلى البت الأكثر أهمية في الحمولة البرمجية للبايت الأخير في التسلسل لإنشاء القيمة النهائية. في الحالة غير الموقعة
(uleb128
)، يتم 0
تفسير أي بتات غير ممثّلة صراحةً على أنّها 0
.
مخطّط بياني على مستوى البت لقيمة LEB128 تبلغ سعتها بايتان | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
أول بايت | البايت الثاني | ||||||||||||||
1 |
bit6 | bit5 | bit4 | bit3 | بت2 | بت1 | بت0 | 0 |
بت13 | bit12 | بت11 | bit10 | bit9 | bit8 | bit7 |
يُستخدَم الصيغة uleb128p1
لتمثيل قيمة
signed
، حيث يكون التمثيل للقيمة بالإضافة إلى واحد مُشفَّرًا
على أنّه uleb128
. يؤدي ذلك إلى ترميز -1
(أو القيمة غير الموقعة 0xffffffff
)
باستخدام بايتة واحدة، وليس أي رقم سلبي آخر، وهو مفعّل في الحالات التي يجب فيها أن يكون الرقم المعروض
غير سالب أو -1
(أو 0xffffffff
)،
ولا يُسمح بأي قيم سالبة أخرى (أو حيث من غير المرجّح أن تكون هناك حاجة إلى قيم غير موقعة
كبيرة).
في ما يلي بعض الأمثلة على التنسيقات:
التسلسل المشفَّر | باسم sleb128 |
باسم uleb128 |
باسم uleb128p1 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
تنسيق الملف
الاسم | التنسيق | الوصف |
---|---|---|
عنوان | header_item | العنوان |
string_ids | string_id_item[] | قائمة معرّفات السلاسل هذه هي المعرّفات لجميع السلاسل التي يستخدمها هذا الملف، إما لتسمية داخلية (مثل أوصاف الأنواع) أو كعناصر ثابتة يشير إليها الرمز. يجب ترتيب هذه القائمة حسب محتوى السلسلة، باستخدام قيم نقاط الترميز UTF-16 (وليس بطريقة حساسة للّغة)، ويجب ألا تحتوي على أي إدخالات مكرّرة. |
type_ids | type_id_item[] | نوع قائمة المعرّفات هذه هي المعرّفات لجميع الأنواع (الفئات أو
المصفوفات أو الأنواع الأساسية) التي يشير إليها هذا الملف، سواء تم تحديدها
في الملف أم لا. يجب ترتيب هذه القائمة حسب فهرس string_id
وألّا تحتوي على أي إدخالات مكرّرة.
|
proto_ids | proto_id_item[] | قائمة معرّفات النماذج الأولية للطريقة هذه هي المعرّفات لجميع
النماذج الأولية التي يشير إليها هذا الملف. يجب ترتيب هذه القائمة بالترتيب الرئيسي لنوع الإرجاع (حسب فهرس type_id )، ثم بالترتيب التالي:
حسب قائمة الوسيطات (الترتيب الألفبائي، والوسيطات الفردية مرتبة حسب فهرس type_id ). يجب ألا تحتوي القائمة
على أي إدخالات مكرّرة.
|
field_ids | field_id_item[] | قائمة معرّفات الحقول هذه هي المعرّفات لجميع الحقول
التي يشير إليها هذا الملف، سواء تم تحديدها في الملف أم لا. يجب ترتيب هذه القائمة، حيث يكون النوع المحدّد (حسب فهرس type_id ) هو الترتيب الرئيسي، ويكون اسم الحقل (حسب فهرس string_id ) هو الترتيب الوسيط، ويكون النوع (حسب فهرس type_id ) هو الترتيب الثانوي. يجب ألا تحتوي القائمة على أي إدخالات مكرّرة.
|
method_ids | method_id_item[] | قائمة معرّفات الطرق هذه هي المعرّفات لجميع الطرق
التي يشير إليها هذا الملف، سواء تم تحديدها في الملف أم لا. يجب ترتيب هذه القائمة، حيث يكون النوع المحدّد (حسب الفهرس type_id
) هو الترتيب الرئيسي، ويكون اسم الطريقة (حسب الفهرس string_id
) هو الترتيب المتوسط، ويكون النموذج الأولي للطريقة (حسب الفهرس
proto_id ) هو الترتيب الثانوي. يجب ألا تحتوي القائمة
على أي إدخالات مكرّرة.
|
class_defs | class_def_item[] | قائمة تعريفات الفئات يجب ترتيب الفئات بحيث تظهر فئة رئيسية لفئة معيّنة وواجهات تم تنفيذها في قائمة الفئات قبل الفئة المُشار إليها. بالإضافة إلى ذلك، من غير الصالح أن يظهر تعريف للصف بالاسم نفسه أكثر من مرة في القائمة. |
call_site_ids | call_site_id_item[] | قائمة معرّفات مواقع الاتصال هذه هي المعرّفات لجميع مواقع الاتصال
التي يشير إليها هذا الملف، سواء تم تحديدها في الملف أم لا. يجب ترتيب هذه القائمة
بشكل تصاعدي حسب call_site_off .
|
method_handles | method_handle_item[] | قائمة أسماء المعالِجات قائمة بجميع أسماء معالِم الطرق التي يشير إليها هذا الملف، سواء تم تحديدها في الملف أم لا هذه القائمة غير مرتبة وقد تحتوي على نُسخ طبق الأصل التي ستتوافق منطقيًا مع نُسخ مختلفة من معالِم الطرق. |
البيانات | ubyte[] | منطقة البيانات، التي تحتوي على جميع بيانات الدعم للجداول المدرَجة أعلاه تختلف متطلبات المحاذاة باختلاف العناصر، ويتم إدراج وحدات البايت المخصّصة للحشو قبل كل عنصر إذا لزم الأمر لتحقيق المحاذاة المناسبة. |
link_data | ubyte[] | البيانات المستخدَمة في الملفات المرتبطة بشكل ثابت لا يحدّد هذا المستند تنسيق البيانات في هذا القسم. يكون هذا القسم فارغًا في الملفات غير المرتبطة، وقد تستخدم عمليات التنفيذ أثناء التشغيل هذا القسم على النحو الذي تراه مناسبًا. |
تنسيق الحاوية
يقدّم الإصدار 41 تنسيق حاوية جديدًا لبيانات DEX بهدف توفير المساحة. يسمح تنسيق الحاوية هذا بدمج عدة ملفات DEX منطقية في ملف مادي واحد. يعتمد التنسيق الجديد في أغلب الأحيان على تسلسل الملفات بتنسيق سابق، مع بعض الاختلافات:
- يشير
file_size
إلى حجم الملف المنطقي، وليس الملف الفعلي. ويمكن استخدامه للتنقّل في جميع الملفات المنطقية في الحاوية. - يمكن أن تشير ملفات dex المنطقية إلى أي بيانات لاحقة في الحاوية (ولكن ليس البيانات السابقة). ويسمح ذلك لملفات dex بمشاركة البيانات، مثل السلاسل، مع بعضها.
- تكون جميع العناصر المرجعية نسبية إلى الملف الفعلي. لا يكون أيّ إزاحة نسبيًا للعنوان. يضمن ذلك إمكانية مشاركة الأقسام التي تحتوي على Offsets بين الملفات المنطقية.
- يضيف العنوان حقلين جديدَين لوصف حدود الحاوية. هذه عملية تحقّق إضافية من الاتساق وتسهّل نقل الرمز إلى التنسيق الجديد.
- أصبحت
data_size
وdata_off
غير مستخدَمة الآن. يمكن توزيع البيانات على ملفات منطقية متعددة ولا يلزم أن تكون متّصلة.
تعريفات حقل الوحدات وسلسلة الأحرف والثابت
DEX_FILE_MAGIC
مضمّن في header_item
الصفيف/السلسلة الثابتة DEX_FILE_MAGIC
هي قائمة بالكلمات الثنائيّة التي يجب أن تظهر في بداية ملف .dex
لكي يتم التعرّف عليه على هذا النحو. تحتوي القيمة عمدًا
على سطر جديد ("\n"
أو 0x0a
) وأحد وحدات البايت الفارغة ("\0"
أو 0x00
) للمساعدة في
رصد أشكال معيّنة من التلف. تشفّر القيمة أيضًا
رقم إصدار التنسيق على هيئة ثلاثة أرقام عشرية، ومن المتوقّع أن يزداد
بشكل منتظم بمرور الوقت مع تطور التنسيق.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
ملاحظة: تمت إضافة التوافق مع الإصدار 040
من التنسيق في الإصدار 10.0 من Android، ما أدى إلى توسيع مجموعة الأحرف المسموح بها في SimpleNames.
ملاحظة: تمّت إضافة التوافق مع الإصدار 039
من التنسيق في الإصدار 9.0 من نظام التشغيل Android، والذي قدّم رمزَي برمجة ثنائيَّين جديدَين، const-method-handle
وconst-method-type
. (يتم وصف كلٍّ منها في جدول
ملخّص لمجموعة الرموز القصيرة.) في Android 10، يُوسّع الإصدار 039
تنسيق ملف DEX ليشمل معلومات API hidden
التي لا تنطبق إلا على ملفات DEX في مسار فئة التمهيد.
ملاحظة: تمت إضافة التوافق مع الإصدار
038
من التنسيق في الإصدار
8.0 من نظام التشغيل Android. أضاف الإصدار 038
وحدات ترميز برمجية جديدة
(invoke-polymorphic
وinvoke-custom
) و
بيانات لمعرّفات الطرق.
ملاحظة: تمت إضافة التوافق مع الإصدار 037
من
التنسيق في الإصدار 7.0 من Android. قبل الإصدار 037
، كانت معظم
إصدارات Android تستخدم الإصدار 035
من التنسيق. الاختلاف الوحيد بين الإصدارَين 035
و037
هو
إضافة الطرق التلقائية وتعديل invoke
.
ملاحظة: تم استخدام إصدارَين سابقَين على الأقل من التنسيق في إصدارات البرامج العامة المتاحة على نطاق واسع. على سبيل المثال،
تم استخدام الإصدار 009
لإصدارات M3 من منصّة
Android (تشرين الثاني/نوفمبر إلى كانون الأول/ديسمبر 2007)،
بينما تم استخدام الإصدار 013
لإصدارات M5 من منصّة
Android (شباط/فبراير إلى آذار/مارس 2008). تختلف هذه الإصدارات المبكرة
من التنسيق اختلافًا كبيرًا عن الإصدار الموضّح في
هذا المستند من عدّة جوانب.
ENDIAN_CONSTANT وREVERSE_ENDIAN_CONSTANT
مضمّن في header_item
يتم استخدام الثابت ENDIAN_CONSTANT
للإشارة إلى
ترتيب البتات في الملف الذي تم العثور عليه فيه. على الرغم من أنّ تنسيق
.dex
العادي هو تنسيق little-endian، قد تختار عمليات التنفيذ
تبديل البايتات. إذا صادفت عملية التنفيذ عنوانًاendian_tag
=REVERSE_ENDIAN_CONSTANT
بدلاً منENDIAN_CONSTANT
، ستعرف أنّه تم تبديل البايت في الملف عن النموذج المتوقّع.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
NO_INDEX
مضمّنة في class_def_item وdebug_info_item
يُستخدَم الثابت NO_INDEX
للإشارة إلى أنّه
لا تتوفّر قيمة فهرس.
ملاحظة: لا يتمّ تحديد هذه القيمة لتكون
0
، لأنّه عادةً ما يكون هذا فهرسًا صالحًا.
يمكن تمثيل القيمة المحدّدة لـ NO_INDEX
كبايت واحد في ترميز uleb128p1
.
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
تعريفات access_flags
مضمّنة في class_def_item وencoded_field وencoded_method و InnerClass
تُستخدَم حقول العناصر الثنائية لهذه العلامات للإشارة إلى تسهيل الاستخدام والسمات العامة للفئات وعناصر الفئات.
الاسم | القيمة | بالنسبة إلى الصفوف (والتعليقات التوضيحية InnerClass ) |
للحقول | بالنسبة إلى الطرق |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : ظاهرة في كل مكان |
public : ظاهرة في كل مكان |
public : ظاهرة في كل مكان |
ACC_PRIVATE | 0x2 | private : تظهر فقط للفئة المحدّدة
|
private : تظهر فقط للفئة المحدّدة |
private : تظهر فقط للفئة المحدّدة |
ACC_PROTECTED | 0x4 | protected : ظاهرة لحزمة والطبقات الفرعية
|
protected : مرئية للحزمة والفئات الفرعية |
protected : مرئية للحزمة والفئات الفرعية |
ACC_STATIC | 0x8 | static : لم يتم إنشاؤه باستخدام مرجع
this خارجي |
static : عنصر عام للفئة المحدّدة |
static : لا يقبل وسيطة this |
ACC_FINAL | 0x10 | final : لا يمكن تقسيمها إلى فئات فرعية |
final : لا يمكن تغييرها بعد إنشائها |
final : لا يمكن إلغاؤها |
ACC_SYNCHRONIZED | 0x20 | synchronized : القفل المرتبط الذي يتم الحصول عليه تلقائيًا
عند استدعاء هذه الطريقة ملاحظة: لا يمكن ضبط هذا الإعداد إلا عند ضبط
|
||
ACC_VOLATILE | 0x40 | volatile : قواعد وصول خاصة للمساعدة في
الحفاظ على أمان المحادثة |
||
ACC_BRIDGE | 0x40 | طريقة الجسر التي يضيفها المُجمِّع تلقائيًا كجسر آمن من النوع | ||
ACC_TRANSIENT | 0x80 | transient : لا يتم حفظها من خلال التسلسل التلقائي |
||
ACC_VARARGS | 0x80 | يجب أن يتعامل المُجمِّع مع الوسيطة الأخيرة على أنّها وسيطة "باقية". | ||
ACC_NATIVE | 0×100 | native : تم تنفيذها في الرموز البرمجية الأصلية |
||
ACC_INTERFACE | 0x200 | interface : فئة مجردة يمكن تنفيذها بشكل متعدّد |
||
ACC_ABSTRACT | 0x400 | abstract : لا يمكن إنشاء مثيل لها مباشرةً |
abstract : لم يتم تنفيذها من قِبل هذه الفئة |
|
ACC_STRICT | 0x800 | strictfp : قواعد صارمة للعمليات الحسابية بنقطة عائمة |
||
ACC_SYNTHETIC | 0x1000 | غير محدّد مباشرةً في رمز المصدر | غير محدّد مباشرةً في رمز المصدر | غير محدّد مباشرةً في رمز المصدر |
ACC_ANNOTATION | 0x2000 | تمّت الإشارة إليها على أنّها فئة تعليق توضيحي | ||
ACC_ENUM | 0x4000 | تمّ تعريفها كنوع محدّد | تمّت الإشارة إليها كقيمة مُدرَجة | |
(غير مستخدَم) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | طريقة المُنشئ (مُنشئ فئة أو مثيل) | ||
ACC_DECLARED_ SYNCHRONIZED |
0x20000 | تم الإعلان عن synchronized . ملاحظة: ليس لهذا الإجراء أي تأثير في تنفيذ الإجراء (باستثناء التأثير في هذه العلامة بحد ذاتها). |
InnerClass
،
ويجب عدم تفعيلها مطلقًا في class_def_item
.
ترميز UTF-8 المعدَّل
لتسهيل استخدام التنسيقات القديمة، يشفر تنسيق .dex
بيانات السلاسل بتنسيق UTF-8 معدَّل بشكلٍ تلقائي، ويُشار إليه فيما بعد باسم MUTF-8. هذا التنسيق مطابق لتنسيق UTF-8 العادي، باستثناء:
- لا يتم استخدام سوى ترميزات البايت الواحد والبايتَين والثلاثة بايت.
- يتم ترميز نقاط الرمز في النطاق
U+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.
ترميز encoded_value
مضمّنة في annotation_element وencoded_array_item
encoded_value
هو جزء مشفَّر من بيانات (تقريبًا)
غير منتظمة بشكل هرمي. من المفترض أن يكون ترميز البيانات
مكثفًا وسهل التحليل.
الاسم | التنسيق | الوصف |
---|---|---|
(value_arg << 5) | value_type | ubyte | بايت يشير إلى نوع العنصر التالي مباشرةً
value مع
وسيطة توضيحية اختيارية في البتات الثلاثة ذات الترتيب الأعلى
يمكنك الاطّلاع أدناه على تعريفات value المختلفة.
في معظم الحالات، يُشفِّر value_arg طول
value التالي مباشرةً بالكيلوبايت، كما هو الحال في
(size - 1) ، على سبيل المثال: يشير الرمز 0 إلى أنّ
القيمة تتطلّب بايتًا واحدًا، ويشير الرمز 7 إلى أنّها تتطلّب
ثمانية بايت، ولكن هناك استثناءات كما هو موضّح أدناه.
|
القيمة | ubyte[] | بايت يمثّل القيمة، وطول متغيّر ويتم تفسيره
بشكلٍ مختلف لبايت value_type مختلف، مع أنّه
يتم ترتيبه دائمًا من الأصغر إلى الأكبر. اطّلِع على تعريفات القيم المختلفة أدناه للحصول على
التفاصيل.
|
تنسيقات القيم
اكتب الاسم | value_type |
value_arg التنسيق |
value التنسيق |
الوصف |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (none؛ يجب أن تكون 0 ) |
ubyte[1] | قيمة عدد صحيح موقَّع بسعة بايت واحد |
VALUE_SHORT | 0x02 | الحجم: 1 (0…1) | ubyte[size] | قيمة عدد صحيح موقَّع مكوّنة من بايتين، تم تمديد علامتها |
VALUE_CHAR | 0x03 | الحجم: 1 (0…1) | ubyte[size] | قيمة عدد صحيح غير موقّعة بحجم بايتين تم تمديدها بصفر |
VALUE_INT | 0x04 | الحجم - 1 (0…3) | ubyte[size] | قيمة عدد صحيح موقَّع بأربعة بايت، تم تمديد العلامة |
VALUE_LONG | 0x06 | الحجم - 1 (0…7) | ubyte[size] | قيمة عدد صحيح موقَّع ثمانية بايت، تم تمديد العلامة |
VALUE_FLOAT | 0x10 | الحجم - 1 (0…3) | ubyte[size] | نمط بتات من أربعة بايت، تم تمديده بصفر على اليسار، ويتم تفسيره كقيمة IEEE754 بنقطة عائمة 32 بت |
VALUE_DOUBLE | 0x11 | الحجم - 1 (0…7) | ubyte[size] | نمط بت من ثمانية بايت، تم تمديده بصفر على اليسار، ويتم تفسيره على أنّه قيمة IEEE754 بنقطة عائمة 64 بت |
VALUE_METHOD_TYPE | 0x15 | الحجم - 1 (0…3) | ubyte[size] | قيمة عدد صحيح من أربعة بايت غير موقَّت (ممتد بصفر)،
يتم تفسيرها على أنّها فهرس في
قسم proto_ids وتمثّل قيمة نوع الأسلوب
|
VALUE_METHOD_HANDLE | 0x16 | الحجم - 1 (0…3) | ubyte[size] | قيمة عدد صحيح من أربعة بايت غير موقَّت (ممتد إلى الصفر)،
يتم تفسيرها على أنّها فهرس في
القسم method_handles وتمثّل قيمة معالِج
|
VALUE_STRING | 0x17 | الحجم: 1 (0…3) | ubyte[size] | قيمة عدد صحيح من أربعة بايت (تم تمديدها إلى الصفر)،
يتم تفسيرها على أنّها فهرس في
القسم string_ids وتمثّل قيمة سلسلة
|
VALUE_TYPE | 0x18 | الحجم - 1 (0…3) | ubyte[size] | قيمة عددية غير موقَّعة (ممدودة بصفر) من أربعة بايت،
يتم تفسيرها على أنّها فهرس في
قسم type_ids وتمثّل قيمة نوع/صف
|
VALUE_FIELD | 0x19 | الحجم - 1 (0…3) | ubyte[size] | قيمة عددية غير موقَّعة (ممتدة إلى الصفر) من أربعة بايت،
يتم تفسيرها على أنّها فهرس في
قسم field_ids وتمثّل قيمة حقل
عاكس
|
VALUE_METHOD | 0x1a | الحجم - 1 (0…3) | ubyte[size] | قيمة عددية غير موقَّتة (ممتدة إلى الصفر) من أربعة بايت،
يتم تفسيرها على أنّها فهرس في
قسم method_ids وتمثّل قيمة أسلوب
عاكس
|
VALUE_ENUM | 0x1b | الحجم - 1 (0…3) | ubyte[size] | قيمة عدد صحيح بلا علامة (ممتدة إلى الصفر) من أربعة بايت،
يتم تفسيرها على أنّها فهرس في
قسم field_ids وتمثّل قيمة
ثابت نوع محدّد
|
VALUE_ARRAY | 0x1c | (none؛ يجب أن تكون 0 ) |
encoded_array | صفيف من القيم بالتنسيق المحدّد من قِبل
"تنسيق encoded_array " أدناه يكون حجمvalue ضمنيًا في عملية الترميز.
|
VALUE_ANNOTATION | 0x1d | (none؛ يجب أن تكون 0 ) |
encoded_annotation | تعليق توضيحي فرعي بالتنسيق المحدّد من قِبل
"تنسيق encoded_annotation " أدناه يكون حجمvalue ضمنيًا في عملية الترميز.
|
VALUE_NULL | 0x1e | (none؛ يجب أن تكون 0 ) |
(بدون) | القيمة المرجعية null |
VALUE_BOOLEAN | 0x1f | منطقي (0…1) | (بدون) | قيمة بت واحد: 0 لـ false و
1 لـ true . يتم تمثيل النقطة في الرمز
value_arg .
|
تنسيق مصفوفة_مُشفَّرة
الاسم | التنسيق | الوصف |
---|---|---|
الحجم | uleb128 | عدد العناصر في الصفيف |
values | encoded_value[size] | سلسلة من تسلسلات size encoded_value بايت
بالشكل المحدّد في هذا القسم، متسلسلة
معًا
|
تنسيق encoded_annotation
الاسم | التنسيق | الوصف |
---|---|---|
type_idx | uleb128 | نوع التعليق التوضيحي يجب أن يكون هذا النوع من النوع فئة (وليس صفيفًا أو عنصرًا أساسيًا). |
الحجم | uleb128 | عدد عمليات الربط بين الاسم والقيمة في التعليق التوضيحي هذا |
العناصر | annotation_element[size] | عناصر التعليق التوضيحي، يتم تمثيلها مباشرةً في النص (وليس كشدَّة
الانحراف). يجب ترتيب العناصر تصاعديًا حسب فهرس
string_id .
|
تنسيق annotation_element
الاسم | التنسيق | الوصف |
---|---|---|
name_idx | uleb128 | اسم العنصر، الذي يتم تمثيله كفهرس في القسم
string_ids يجب أن تتوافق السلسلة مع بنية
MemberName المحدّدة أعلاه.
|
القيمة | encoded_value | قيمة العنصر |
بنية السلسلة
هناك عدة أنواع من العناصر في ملف .dex
والتي تشير في النهاية إلى سلسلة. تشير التعريفات التالية بأسلوب BNF
إلى البنية المقبولة لهذه السلاسل.
SimpleName
SimpleName هو الأساس لبنية أسماء
العناصر الأخرى. يسمح تنسيق .dex
بقدر كبير من المرونة
هنا (أكثر بكثير من معظم اللغات المصدر الشائعة). باختصار، يتكون اسم بسيط
من أي حرف أبجدي أو رقم من ASCII المنخفض، وبعض
الرموز المحدّدة من ASCII المنخفض، ومعظم نقاط الترميز غير ASCII التي ليست
رموز تحكّم أو مسافات أو أحرف خاصة. بدءًا من الإصدار 040
، يسمح التنسيق أيضًا بأحرف المسافات (فئة Zs
يونيكود). يُرجى العِلم أنّ نقاط الترميز البديلة
(في النطاق U+d800
… U+dfff
) لا تُعدّ
أحرف أسماء صالحة بحد ذاتها، ولكن تكون أحرف يونيكود تكميلية
صالحة (التي يتم تمثيلها من خلال البديل
النهائي لقاعدة SimpleNameChar)، ويجب أن يتم
تمثيلها في ملف كأزواج من نقاط الترميز البديلة في ترميز MUTF-8.
SimpleName → | ||
SimpleNameChar (SimpleNameChar)* | ||
SimpleNameChar → | ||
'A' … 'Z' |
||
| | 'a' … 'z' |
|
| | '0' … '9' |
|
| | ' ' |
منذ الإصدار 040 من DEX |
| | '$' |
|
| | '-' |
|
| | '_' |
|
| | U+00a0 |
منذ الإصدار 040 من DEX |
| | U+00a1 … U+1fff |
|
| | U+2000 … U+200a |
منذ الإصدار 040 من DEX |
| | U+2010 … U+2027 |
|
| | U+202f |
منذ الإصدار 040 من DEX |
| | U+2030 … U+d7ff |
|
| | U+e000 … U+ffef |
|
| | U+10000 … U+10ffff |
MemberName
المستخدَمة في field_id_item وmethod_id_item
MemberName هو اسم عضو في فئة، والأعضاء هم الحقول والطُرق والفئات الداخلية.
MemberName → | |
SimpleName | |
| | '<' SimpleName '>' |
FullClassName
FullClassName هو اسم فئة مؤهَّل بالكامل، بما في ذلك محدِّد حزمة اختياري متبوعًا باسم مطلوب.
FullClassName → | |
OptionalPackagePrefix SimpleName | |
OptionalPackagePrefix → | |
(SimpleName '/' )* |
TypeDescriptor
المستخدَم من type_id_item
TypeDescriptor هو تمثيل لأي نوع، بما في ذلك
العناصر الأساسية والفئات والمصفوفات وvoid
. يمكنك الاطّلاع أدناه على
معنى الإصدارات المختلفة.
TypeDescriptor → | |
'V' |
|
| | FieldTypeDescriptor |
FieldTypeDescriptor → | |
NonArrayFieldTypeDescriptor | |
| | ('[' * 1…255)
NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor→ | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' FullClassName ';' |
ShortyDescriptor
يستخدِمه proto_id_item
ShortyDescriptor هو تمثيل قصير لنموذج ملف برمجي
، بما في ذلك أنواع الإرجاع والمَعلمات، باستثناء عدم
التمييز بين أنواع المراجع المختلفة (الفئة أو الصفيف). بدلاً من ذلك، يتم تمثيل
جميع أنواع المراجع بحرف 'L'
واحد.
ShortyDescriptor → | |
ShortyReturnType (ShortyFieldType)* | |
ShortyReturnType → | |
'V' |
|
| | ShortyFieldType |
ShortyFieldType → | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
الدلالات المتعلّقة بـ TypeDescriptor
في ما يلي معنى كلّ من الصيغ المختلفة TypeDescriptor.
بناء الجملة | المعنى |
---|---|
V | void ؛ صالحة لأنواع الإرجاع فقط |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long |
F | float |
D | double |
Lfully/qualified/Name; | الصف fully.qualified.Name |
[descriptor | صفيف من descriptor ، يمكن استخدامه بشكل متكرّر لصفائف الصفائف، على الرغم من أنّه غير صالح أن يتضمّن أكثر من 255 سمة
|
العناصر والهياكل ذات الصلة
يتضمّن هذا القسم تعريفات لكل عنصر من عناصر المستوى الأعلى التي
قد تظهر في ملف .dex
.
header_item
تظهر في قسم العنوان
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
سحر | ubyte[8] = DEX_FILE_MAGIC | قيمة سحرية. يُرجى الاطّلاع على المناقشة أعلاه ضمن "DEX_FILE_MAGIC "
للحصول على مزيد من التفاصيل.
|
المجموع الاختباري | uint | تحقّق adler32 لباقي الملف (كل شيء باستثناء
magic وهذا الحقل)؛ يُستخدَم لرصد تلف الملف
|
التوقيع | ubyte[20] | توقيع SHA-1 (التجزئة) لبقية الملف (كل شيء باستثناء
magic وchecksum وهذا الحقل)؛ يُستخدَم
لتحديد الملفات بشكل فريد
|
file_size | uint |
حجم الملف بالكامل (بما في ذلك الرأس)، بالبايت (الإصدار 40 أو الإصدارات الأقدم) المسافة بالكيلوبايت من بداية هذا العنوان إلى العنوان التالي أو إلى نهاية الملف بأكمله (الحاوية). (الإصدار 41 أو الإصدارات الأحدث) |
header_size | uint |
حجم العنوان (هذا القسم بأكمله)، بالبايت ويسمح ذلك بحد أدنى من التوافق مع الإصدارات السابقة أو اللاحقة بدون إبطال التنسيق. يجب أن يكون 0x70 (112) بايت (الإصدار 40 أو الإصدارات الأقدم) يجب أن يكون 0x78 (120) بايت (الإصدار 41 أو الإصدارات الأحدث) |
endian_tag | uint = ENDIAN_CONSTANT | علامة ترتيب البتات راجِع المناقشة أعلاه ضمن "ENDIAN_CONSTANT
وREVERSE_ENDIAN_CONSTANT " للحصول على مزيد من التفاصيل.
|
link_size | uint | حجم قسم الرابط، أو 0 إذا لم يكن هذا الملف مرتبطًا
بشكل ثابت |
link_off | uint | من بداية الملف إلى قسم الرابط، أو
0 إذا كان link_size == 0 يجب أن يكون البادئة، إذا لم تكن صفرًا،
في قسم link_data . لا يحدِّد هذا المستند تنسيق البيانات التي يتم الإشارة إليها، ويُترك حقل العنوان هذا (والحقل السابق) كعناصر ربط لاستخدامها في عمليات التنفيذ أثناء التشغيل.
|
map_off | uint | القيمة المضافة إلى بداية الملف لتحديد موضع عنصر الخريطة يجب أن يكون الموضع المرجعي، الذي يجب
أن يكون غير صفري، في قسم data ،
ويجب أن تكون البيانات بالتنسيق المحدّد في "map_list "
أدناه.
|
string_ids_size | uint | عدد السلاسل في قائمة معرّفات السلاسل |
string_ids_off | uint | القيمة المُعدَّلة من بداية الملف إلى قائمة معرّفات السلاسل، أو
0 إذا كان string_ids_size == 0 (يُعتبَر
حالة استثنائية غريبة). يجب أن يكون البدء، إذا لم يكن صفرًا،
في بداية القسم string_ids .
|
type_ids_size | uint | عدد العناصر في قائمة معرّفات الأنواع، بحد أقصى 65535 |
type_ids_off | uint | من بداية الملف إلى قائمة معرّفات الأنواع، أو
0 إذا كان type_ids_size == 0 (يُعتبَر
هذا سيناريو غير مألوف). يجب أن يكون البدء، إذا لم يكن صفرًا،
في بداية القسم type_ids .
|
proto_ids_size | uint | عدد العناصر في قائمة معرّفات النماذج الأولية، بحد أقصى 65535 |
proto_ids_off | uint | من بداية الملف إلى قائمة معرّفات النماذج الأولية، أو
0 إذا proto_ids_size == 0 (حالة هامشية
غير معتادة). يجب أن يكون البدء، إذا لم يكن صفرًا،
في بداية القسم proto_ids .
|
field_ids_size | uint | عدد العناصر في قائمة معرّفات الحقول |
field_ids_off | uint | القيمة المُعدَّلة من بداية الملف إلى قائمة معرّفات الحقول، أو
0 إذا كان field_ids_size == 0 يجب أن يكون البادئة، إذا كانت
غير صفرية، في بداية القسم field_ids . |
method_ids_size | uint | عدد العناصر في قائمة معرّفات الطرق |
method_ids_off | uint | القيمة المُعدَّلة من بداية الملف إلى قائمة معرّفات الطرق، أو
0 إذا كان method_ids_size == 0 يجب أن يكون البادئة، إذا كانت
غير صفرية، في بداية القسم method_ids . |
class_defs_size | uint | عدد العناصر في قائمة تعريفات الفئات |
class_defs_off | uint | من بداية الملف إلى قائمة تعريفات الفئات، أو
0 إذا كان class_defs_size == 0 (يُعتبَر
ذلك حالة استثنائية غريبة). يجب أن يكون البدء، إذا لم يكن صفرًا،
في بداية القسم class_defs .
|
data_size | uint |
حجم قسم غير مستخدَمة (الإصدار 41 أو الإصدارات الأحدث) |
data_off | uint |
القيمة المضافة إلى بداية الملف لتحديد بداية القسم غير مستخدَمة (الإصدار 41 أو الإصدارات الأحدث) |
container_size | uint |
هذا الحقل غير متوفّر. يمكن الافتراض أنّه يساوي حجم الملف بأكمله (بما في ذلك رؤوس dex الأخرى وبياناتها) (الإصدار 41 أو الإصدارات الأحدث) |
header_offset | uint |
هذا الحقل غير متوفّر. يمكن الافتراض أنّه يساوي من بداية الملف إلى بداية هذا العنوان. (الإصدار 41 أو الإصدارات الأحدث) |
map_list
تظهر في قسم البيانات
تمت الإشارة إليه من header_item
المطابقة: 4 بايت
هذه قائمة بمحتوى الملف بالكامل، مرتبة حسب الترتيب. ويحتوي
على بعض التكرارات في ما يتعلق بـ header_item
، ولكن يُقصد به أن يكون نموذجًا سهل الاستخدام للتكرار على ملف
بأكمله. يجب أن يظهر نوع معيّن مرة واحدة فقط في الخريطة، ولكن لا يوجد
قيود على أنواع الطلبات التي يمكن أن تظهر فيها، باستثناء
القيود التي تفرضها بقية التنسيقات (على سبيل المثال، يجب أن يظهر قسم
header
أولاً، ثم قسم
string_ids
، وما إلى ذلك). بالإضافة إلى ذلك، يجب ترتيب إدخالات الخريطة
حسب القيمة المرجعية الأولية وألا تتداخل.
الاسم | التنسيق | الوصف |
---|---|---|
الحجم | uint | حجم القائمة، بالعناصر |
قائمة | map_item[size] | عناصر القائمة |
تنسيق map_item
الاسم | التنسيق | الوصف |
---|---|---|
كتابة | ushort | نوع العناصر، راجِع الجدول أدناه |
غير مستخدَمة | ushort | (غير مستخدَم) |
الحجم | uint | عدد العناصر التي سيتم العثور عليها في العنصر المحدَّد |
offset | uint | البدء من بداية الملف إلى العناصر المعنيّة |
رموز النوع
نوع العنصر | ثابت | القيمة | حجم العنصر بالبايت |
---|---|---|---|
header_item | TYPE_HEADER_ITEM | 0x0000 | 0x70 |
string_id_item | TYPE_STRING_ID_ITEM | 0x0001 | 0x04 |
type_id_item | TYPE_TYPE_ID_ITEM | 0x0002 | 0x04 |
proto_id_item | TYPE_PROTO_ID_ITEM | 0x0003 | 0x0c |
field_id_item | TYPE_FIELD_ID_ITEM | 0x0004 | 0x08 |
method_id_item | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
class_def_item | TYPE_CLASS_DEF_ITEM | 0x0006 | 0x20 |
call_site_id_item | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x04 |
method_handle_item | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
map_list | TYPE_MAP_LIST | 0x1000 | 4 + (item.size * 12) |
type_list | TYPE_TYPE_LIST | 0x1001 | 4 + (item.size * 2) |
annotation_set_ref_list | TYPE_ANNOTATION_SET_REF_LIST | 0x1002 | 4 + (item.size * 4) |
annotation_set_item | TYPE_ANNOTATION_SET_ITEM | 0x1003 | 4 + (item.size * 4) |
class_data_item | TYPE_CLASS_DATA_ITEM | 0x2000 | قيمة ضمنية، يجب تحليلها |
code_item | TYPE_CODE_ITEM | 0x2001 | قيمة ضمنية، يجب تحليلها |
عنصر_بيانات_السلسلة | TYPE_STRING_DATA_ITEM | 0x2002 | قيمة ضمنية، يجب تحليلها |
debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | قيمة ضمنية، يجب تحليلها |
annotation_item | TYPE_ANNOTATION_ITEM | 0x2004 | قيمة ضمنية، يجب تحليلها |
encoded_array_item | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | قيمة ضمنية، يجب تحليلها |
annotations_directory_item | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | قيمة ضمنية، يجب تحليلها |
hiddenapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | قيمة ضمنية، يجب تحليلها |
string_id_item
تظهر في قسم string_ids
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
string_data_off | uint | بدءًا من بداية الملف إلى بيانات السلسلة لهذا
العنصر. يجب أن يشير الموضع المرجعي إلى موقع جغرافي
في قسم data ، ويجب أن تكون البيانات بالتنسيق
الذي يحدّده "string_data_item " أدناه.
ما مِن متطلبات للتنسيق في القيمة المُعدَّلة.
|
عنصر_بيانات_السلسلة
تظهر في قسم البيانات
المحاذاة: بدون (محاذاة حسب البايت)
الاسم | التنسيق | الوصف |
---|---|---|
utf16_size | uleb128 | حجم هذه السلسلة، بوحدات ترميز UTF-16 (وهو "طول السلسلة" في العديد من الأنظمة). وهذا هو الطول غير المشفَّر
للسلسلة. (يُستخدَم موضع البايت 0 للإشارة إلى الطول المشفَّر.) |
البيانات | ubyte[] | سلسلة من وحدات ترميز MUTF-8 (المعروفة أيضًا باسم الثُمانيات أو البايتات)
متبوعة ببايت قيمته 0 اطّلِع على
"ترميز MUTF-8 (UTF-8 المعدَّل)" أعلاه للاطّلاع على التفاصيل والمناقشة بشأن تنسيق البيانات.
ملاحظة: يُسمح بوجود سلسلة تتضمّن
وحدات الرموز البديلة UTF-16 (أي
|
type_id_item
يظهر في قسم type_ids
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
descriptor_idx | uint | فهرس في قائمة string_ids لسلاسل الوصف
من هذا النوع يجب أن تكون السلسلة متوافقة مع بنية
TypeDescriptor المحدّدة أعلاه.
|
proto_id_item
يظهر في قسم proto_ids
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
shorty_idx | uint | فهرس في قائمة string_ids لسلاسل وصف
التنسيق القصير لهذا النموذج الأوّلي يجب أن تكون السلسلة متوافقة مع نحو ShortyDescriptor المحدّد أعلاه، ويجب أن تتطابق مع نوع الإرجاع ومَعلمات هذا العنصر.
|
return_type_idx | uint | الفهرس في قائمة type_ids لنوع الإرجاع
لهذا النموذج الأولي
|
parameters_off | uint | من بداية الملف إلى قائمة أنواع المَعلمات
لهذا النموذج الأولي، أو 0 إذا لم يكن لهذا النموذج الأولي
أي مَعلمات. يجب أن يكون هذا العنصر المُعدِّل، إذا لم يكن صفرًا، في القسم
data ، ويجب أن تكون البيانات الواردة فيه بالتنسيق
الذي تحدّده السمة "type_list" أدناه. بالإضافة إلى ذلك،
يجب عدم الإشارة إلى النوع void في القائمة.
|
field_id_item
تظهر في قسم field_ids
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
class_idx | ushort | فهرس في قائمة type_ids لمحدد
هذا الحقل يجب أن يكون هذا النوع من فئة، وليس صفيفًا أو نوعًا أساسيًا.
|
type_idx | ushort | الفهرس في قائمة type_ids لنوع
هذا الحقل
|
name_idx | uint | فهرس في قائمة string_ids لاسم هذا الحقل
يجب أن تتوافق السلسلة مع بنية MemberName،
المحدّدة أعلاه.
|
method_id_item
يظهر في قسم method_ids
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
class_idx | ushort | فهرس في قائمة type_ids لمحدد
هذه الطريقة يجب أن يكون هذا النوع من النوعين: فئة أو صفيف، وليس نوعًا أساسيًا.
|
proto_idx | ushort | الفهرسة في قائمة proto_ids للنموذج الأوّلي
لهذه الطريقة
|
name_idx | uint | فهرس في قائمة string_ids لاسم
هذه الطريقة. يجب أن تتوافق السلسلة مع بنية MemberName،
المحدّدة أعلاه.
|
class_def_item
يظهر في قسم class_defs
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
class_idx | uint | فهرس في قائمة type_ids لهذا الصف
يجب أن يكون هذا النوع من فئة، وليس صفيفًا أو نوعًا أساسيًا.
|
access_flags | uint | علامات الوصول إلى الصف (public وfinal وغيرها) اطّلِع على "access_flags التعريفات" للاطّلاع على التفاصيل.
|
superclass_idx | uint | فهرس في قائمة type_ids للفئة الفائقة، أو
القيمة الثابتة NO_INDEX إذا لم تكن هذه الفئة تحتوي على
فئة فائقة (أي أنّها فئة جذرية مثل Object ).
يجب أن يكون هذا النوع من فئة، وليس صفيفًا أو نوعًا أساسيًا.
|
interfaces_off | uint | من بداية الملف إلى قائمة الواجهات، أو
0 إذا لم تكن هناك أي واجهات يجب أن يكون هذا ال offset
في قسم data ، ويجب أن تكون البيانات
فيه بالتنسيق المحدّد من قِبل
"type_list " أدناه. يجب أن يكون كل عنصر من عناصر القائمة
من النوع "فئة" (وليس مصفوفة أو نوعًا أساسيًا)، ويجب ألا
يكون هناك أي عناصر مكرّرة.
|
source_file_idx | uint | فهرس في قائمة string_ids لاسم
ملف يحتوي على المصدر الأصلي لهذه الفئة (على الأقل معظمها)،
أو القيمة الخاصة NO_INDEX للإشارة إلى عدم توفّر
هذه المعلومات قد تلغي debug_info_item لأي طريقة معيّنة
هذا الملف المصدر، ولكن من المتوقّع أن تأتي معظم الفئات
من ملف مصدر واحد فقط.
|
annotations_off | uint | بدءًا من بداية الملف إلى بنية التعليقات التوضيحية
لهذه الفئة، أو 0 إذا لم تكن هناك تعليقات توضيحية في
هذه الفئة. يجب أن يكون هذا العنصر المرجعي، إذا لم يكن صفرًا، في
قسم data ، ويجب أن تكون البيانات الواردة فيه بالتنسيق الذي تحدّده "annotations_directory_item " أدناه،
مع الإشارة إلى أنّ جميع العناصر تشير إلى هذه الفئة باعتبارها المحدّد.
|
class_data_off | uint | القيمة المُعدَّلة من بداية الملف إلى بيانات الصف المقترنة
بهذا العنصر، أو 0 إذا لم تكن هناك بيانات صف
لهذا الصف (قد يحدث ذلك، على سبيل المثال، إذا كانت هذه الفئة
هي واجهة علامة). يجب أن يكون الإزاحة، إذا لم تكن صفرًا، في القسم
data ، ويجب أن تكون البيانات الواردة فيه بالتنسيق
الذي تحدّده "class_data_item " أدناه، مع الإشارة إلى أنّ كل
العناصر تشير إلى هذه الفئة باعتبارها المحدّد.
|
static_values_off | uint | القيمة المتغيّرة من بداية الملف إلى قائمة القيم الأولية
لحقول static ، أو 0 إذا لم يكن هناك
قيم (ويجب بدء جميع حقول static باستخدام
0 أو null ). يجب أن تكون هذه القيمة المتغيّرة في القسم
data ، ويجب أن تكون البيانات الواردة فيه بالتنسيق
الذي يحدّده "encoded_array_item " أدناه. يجب ألا يكون حجم السلسلة
أكبر من عدد حقول static
التي أعلنت عنها هذه الفئة، ويجب أن تتطابق العناصر مع حقول
static بالترتيب نفسه الذي تم الإعلان عنه في
field_list المقابلة. يجب أن يتطابق نوع كل عنصر
في الصفيف مع النوع المُعلَن للحقل المقابل له.
إذا كان عدد العناصر في الصفيف أقل من عدد
حقول static ، تتمّ بدء حقول
المتبقية باستخدام 0 أو null مناسبَين للنوع.
|
call_site_id_item
تظهر في قسم call_site_ids
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
call_site_off | uint | البدء من بداية الملف للاتّصال بتعريف الموقع الإلكتروني يجب أن يكون الموضع المرجعي في قسم البيانات، ويجب أن تكون البيانات الواردة فيه بالتنسيق المحدّد من قِبل "call_site_item" أدناه. |
call_site_item
تظهر في قسم البيانات
المحاذاة: بدون (محاذاة بايت)
عنصر call_site_item هو عنصر مصفوفة_مشفّرة تتطابق عناصره مع الوسيطات المقدَّمة لطريقة رابط التمهيد. الوسائط الثلاث الأولى هي:
- معرّف طريقة يمثّل طريقة رابط التشغيل المبدئي (VALUE_METHOD_HANDLE).
- اسم طريقة يجب أن يحلّها رابط Bootstrap (VALUE_STRING).
- نوع طريقة يتوافق مع نوع اسم الطريقة المطلوب حلّه (VALUE_METHOD_TYPE).
أيّ وسيطات إضافية هي قيم ثابتة يتم تمريرها إلى طريقة رابط التمهيد. يتم تمرير هذه الوسيطات بالترتيب وبدون أي عمليات تحويل للأنواع.
يجب أن يكون نوع الإرجاع لعنوان الطريقة الذي يمثّل طريقة رابط التمهيد هو java.lang.invoke.CallSite
. في ما يلي الأنواع الثلاثة الأولى للمَعلمات:
java.lang.invoke.Lookup
java.lang.String
java.lang.invoke.MethodType
يتم تحديد أنواع مَعلمات أيّ وسيطات إضافية من قيمها الثابتة.
method_handle_item
يظهر في قسم method_handles
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
method_handle_type | ushort | نوع معرّف الطريقة، راجِع الجدول أدناه |
غير مستخدَمة | ushort | (غير مستخدَم) |
field_or_method_id | ushort | رقم تعريف الحقل أو الطريقة، وذلك حسب ما إذا كان نوع معرّف الطريقة هو وسيط وصول أو أداة استدعاء طريقة |
غير مستخدَمة | ushort | (غير مستخدَم) |
رموز أنواع معالِج الطريقة
ثابت | القيمة | الوصف |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0x00 | معالِج الطريقة هو أداة ضبط حقل ثابت (أداة وصول). |
METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | معالِج الطريقة هو وسيلة للحصول على حقل ثابت (ملحق). |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | معالِج الطريقة هو طريقة ضبط حقل مثيل (طريقة استرجاع البيانات) |
METHOD_HANDLE_TYPE_INSTANCE_GET | 0x03 | معالِج الطريقة هو وسيلة للحصول على حقل مثيل (طريقة وصول). |
METHOD_HANDLE_TYPE_INVOKE_STATIC | 0x04 | معالِج الطريقة هو أداة استدعاء طريقة ثابتة. |
METHOD_HANDLE_TYPE_INVOKE_INSTANCE | 0x05 | معالِج الطريقة هو أداة استدعاء طريقة مثيل |
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR | 0x06 | معالِج الطريقة هو أداة استدعاء طريقة المنشئ. |
METHOD_HANDLE_TYPE_INVOKE_DIRECT | 0x07 | معرّف الطريقة هو أداة مباشرة لطلب تنفيذ الطريقة |
METHOD_HANDLE_TYPE_INVOKE_INTERFACE | 0x08 | معرّف الطريقة هو أداة استدعاء طريقة واجهة |
class_data_item
تمت الإشارة إليه من class_def_item
تظهر في قسم البيانات
المحاذاة: بدون (محاذاة حسب البايت)
الاسم | التنسيق | الوصف |
---|---|---|
static_fields_size | uleb128 | عدد الحقول الثابتة المحدّدة في هذا العنصر |
instance_fields_size | uleb128 | عدد حقول العناصر المحدّدة في هذا العنصر |
direct_methods_size | uleb128 | عدد الطرق المباشرة المحدّدة في هذا العنصر |
virtual_methods_size | uleb128 | عدد الطرق الافتراضية المحدّدة في هذا العنصر |
static_fields | encoded_field[static_fields_size] | الحقول الثابتة المحدّدة، والتي يتم تمثيلها على شكل تسلسل من
عناصر مُشفَّرة يجب ترتيب الحقول حسب
field_idx تصاعديًا.
|
instance_fields | encoded_field[instance_fields_size] | حقول العناصر المحدّدة، والتي يتم تمثيلها على شكل تسلسل من
عناصر مُشفَّرة يجب ترتيب الحقول حسب
field_idx تصاعديًا.
|
direct_methods | encoded_method[direct_methods_size] | الطرق المباشرة المحدّدة (أي static أو private أو
أو طريقة الإنشاء)، والتي يتم تمثيلها على هيئة تسلسل من
العناصر المشفّرة يجب ترتيب الطرق حسب
method_idx تصاعديًا.
|
virtual_methods | encoded_method[virtual_methods_size] | الطرق الافتراضية المحدّدة (غير static أو private أو
أو طريقة الإنشاء) التي يتم تمثيلها على هيئة تسلسل من
العناصر المُرمّزة يجب عدم تضمين هذه القائمة لطرق
مكتسَبة ما لم يتم استبدالها من خلال الفئة التي يمثّلها هذا العنصر. يجب ترتيب methods تصاعديًا حسب method_idx .
يجب أن لا يكون method_idx للطريقة الافتراضية مماثلاً
لأي طريقة مباشرة.
|
ملاحظة: يجب أن تشير جميع نُسخ field_id
و
method_id
للعناصر إلى الفئة المحدّدة نفسها.
تنسيق الحقل encoded_field
الاسم | التنسيق | الوصف |
---|---|---|
field_idx_diff | uleb128 | فهرس في قائمة field_ids لتحديد هوية هذا الحقل (يتضمّن الاسم والوصف)، يتم تمثيله كاختلاف عن فهرس العنصر السابق في القائمة يتم تمثيل فهرس
العنصر الأول في القائمة مباشرةً.
|
access_flags | uleb128 | علامات الوصول إلى الحقل (public وfinal
وما إلى ذلك) اطّلِع على "access_flags التعريفات" للاطّلاع على التفاصيل.
|
تنسيق encoded_method
الاسم | التنسيق | الوصف |
---|---|---|
method_idx_diff | uleb128 | فهرس في قائمة method_ids لتحديد هوية هذه المحاولة (يتضمّن الاسم والوصف)، يتم تمثيله كفرق
عن فهرس العنصر السابق في القائمة يتم تمثيل فهرس
العنصر الأول في القائمة مباشرةً.
|
access_flags | uleb128 | علامات الوصول إلى الطريقة (public وfinal
وما إلى ذلك) اطّلِع على "access_flags التعريفات" للاطّلاع على التفاصيل.
|
code_off | uleb128 | من بداية الملف إلى بنية الرمز البرمجي لهذه المحاولة، أو 0 إذا كانت هذه المحاولة هي abstract
أو native . يجب أن يشير العنصر المُعوض إلى موقع في القسم
data . يتم تحديد تنسيق البيانات باستخدام
"code_item " أدناه.
|
type_list
تمت الإشارة إليها من class_def_item وproto_id_item
تظهر في قسم البيانات
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
الحجم | uint | حجم القائمة، بالعناصر |
قائمة | type_item[size] | عناصر القائمة |
تنسيق type_item
الاسم | التنسيق | الوصف |
---|---|---|
type_idx | ushort | الفهرس في قائمة type_ids |
code_item
تمت الإشارة إليها من encoded_method
تظهر في قسم البيانات
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
registers_size | ushort | عدد السجلات المستخدَمة في هذا الرمز |
ins_size | ushort | عدد كلمات الوسيطات الواردة إلى الطريقة التي يخصّها هذا الرمز |
outs_size | ushort | عدد الكلمات لمساحة الوسيطة الصادرة التي يتطلبها هذا رمز لاستدعاء الطريقة |
عدد_المحاولات | ushort | عدد try_item لهذه النسخة إذا لم تكن صفرية،
تظهر هذه القيم كصفيف tries بعد العنصر
insns مباشرةً في هذه الحالة.
|
debug_info_off | uint | من بداية الملف إلى تسلسل معلومات تصحيح الأخطاء (أرقام الأسطر +
معلومات المتغيّرات المحلية) لهذا الرمز، أو 0 إذا
لم تكن هناك معلومات. يجب أن يكون الموضع التعويضي، إذا لم يكن صفرًا،
في قسم data . يتم تحديد تنسيق
البيانات باستخدام "debug_info_item " أدناه.
|
insns_size | uint | حجم قائمة التعليمات، بوحدات رمز 16 بت |
insns | ushort[insns_size] | صفيف رمز البايت الفعلي يتم تحديد تنسيق الرمز في صفيف insns
من خلال المستند المصاحب
رمز Dalvik البرمجي. يُرجى ملاحظة
أنّه على الرغم من أنّ هذا العنصر محدّد كصفيف من ushort ، هناك
بعض البنى الداخلية التي تفضّل محاذاة أربعة بايت. بالإضافة إلى ذلك،
إذا كان هذا الإجراء في ملف تم تبديل ترتيب نهايته، يتم التبديل
فقط في نُسخ ushort الفردية وليس في
البنى الداخلية الأكبر حجمًا.
|
padding | ushort (اختياري) = 0 | بايتان من الحشو لجعل tries محاذاة بأربعة بايت
لا يظهر هذا العنصر إلا إذا كان tries_size غير صفري
وكان insns_size عددًا فرديًا.
|
محاولات | try_item[tries_size] (اختيارية) | مصفوفة تشير إلى مكان رصد الاستثناءات في الرمز البرمجي
وكيفية معالجتها يجب أن تكون عناصر الصفيف غير متداخلة في
النطاق ويجب ترتيبها من العنوان الأدنى إلى الأعلى. لا يظهر
هذا العنصر إلا إذا كان tries_size غير صفري.
|
المعالجات | encoded_catch_handler_list (اختياري) | وحدات بايت تمثّل قائمة بقوائم أنواع الأخطاء وعناوين معالِجيها المرتبطِين
يحتوي كل try_item على إزاحة بثمانية بت
في هذه البنية. لا يظهر هذا العنصر إلا إذا كانت قيمة
tries_size غير صفرية.
|
تنسيق try_item
الاسم | التنسيق | الوصف |
---|---|---|
start_addr | uint | عنوان بدء مجموعة الرموز البرمجية التي يشملها هذا الإدخال العنوان هو عدد وحدات الرمز التي تبلغ 16 بت حتى بداية أول تعليمات مشمولة. |
insn_count | ushort | عدد وحدات الرموز التي تبلغ 16 بتًا والتي يشملها هذا الإدخال آخر رمز
وحدة مضمّنة هو start_addr + insn_count - 1 .
|
handler_off | ushort | القيمة المُعدَّلة بوحدات البايت من بداية
encoded_catch_hander_list المرتبط بها إلى
encoded_catch_handler لهذا الإدخال يجب أن يكون هذا العنصر
مُعدّلاً لبداية encoded_catch_handler .
|
تنسيق encoded_catch_handler_list
الاسم | التنسيق | الوصف |
---|---|---|
الحجم | uleb128 | حجم هذه القائمة، بالإدخالات |
قائمة | encoded_catch_handler[handlers_size] | القائمة الفعلية لقوائم المعالِجين، يتم تمثيلها مباشرةً (وليس كموضعات) ويتم تسلسلها |
تنسيق encoded_catch_handler
الاسم | التنسيق | الوصف |
---|---|---|
الحجم | sleb128 | عدد أنواع الصيد في هذه القائمة إذا لم يكن موجبًا، هذا يعني أنّه
العدد السالب لأنواع عمليات المعالجة، ويتبع عمليات المعالجة
معالج معالجة جميع الأخطاء. على سبيل المثال: size من 0
يعني أنّ هناك عنوانًا شاملاً ولكن لا تتوفّر عناوين اصطياد مكتوبة بشكل صريح.
تعني size من 2 أنّ هناك نوعَين من الالتقاطات المكتوبة صراحةً
وليس هناك ميزة "التقاط الكل". ويعني size من -1
أنّ هناك عنوانًا واحدًا مكتوبًا لتلقّي الرسائل الإلكترونية بالإضافة إلى عنوان صيد عام.
|
المعالجات | encoded_type_addr_pair[abs(size)] | بثّ abs(size) عنصر مُشفَّر، واحد لكل نوع
تم رصده، بالترتيب الذي يجب اختبار الأنواع به
|
catch_all_addr | uleb128 (اختياري) | عنوان الرمز الثنائي لمعالج عنوان استقبال الرسائل الخاطئة لا يظهر هذا العنصر إلا
إذا كانت قيمة size غير موجبة.
|
تنسيق encoded_type_addr_pair
الاسم | التنسيق | الوصف |
---|---|---|
type_idx | uleb128 | الفهرس في قائمة type_ids لنوع
الاستثناء الذي تريد التعامل معه
|
addr | uleb128 | عنوان رمز الآلة لمعالج الاستثناء المرتبط |
debug_info_item
تمت الإشارة إليه من code_item
تظهر في قسم البيانات
المحاذاة: بدون (محاذاة حسب البايت)
وتحدد كل debug_info_item
جهازًا حالة مرمّزًا بترميز بايت مستوحى من DWARF3، وعند تفسيره، يصدر جدول المواضع و (يحتمل) معلومات المتغير المحلي الخاصة بـ code_item
. يبدأ التسلسل برأس
بطول متغيّر (يعتمد طوله على عدد معلمات
الطريقة)، ويليه رمز الآلة البرمجي لآلية الحالة، وينتهي
بوحدة DBG_END_SEQUENCE
بايت.
تتألف آلة الحالات من خمسة سجلّات. يمثّل السجلّ
address
إزاحة التعليمات في
insns_item
المرتبط به في وحدات الرمز البرمجي التي تبلغ 16 بت. يبدأ سجلّ
address
بالرقم 0
في بداية كل تسلسل
debug_info
ويجب أن يزداد بشكلٍ أحادي فقط.
يمثّل السجلّ line
رقم سطر المصدر الذي
يجب ربطه بإدخال جدول المواضع التالي الذي تنشئه
آلة الحالات. ويتمّ إعداده في عنوان التسلسل، وقد
يتغيّر في الاتجاهات الموجبة أو السالبة، ولكن يجب ألّا تقلّ قيمته عن
1
. يمثّل سجلّ source_file
الملف المصدر الذي تشير إليه إدخالات أرقام السطور. يتم إعداده على
قيمة source_file_idx
في class_def_item
.
المتغيّران الآخران، prologue_end
و
epilogue_begin
، هما علامتان منطقيتان (تمّت بدءهما على
false
) تشيران إلى ما إذا كان يجب اعتبار الموضع التالي الذي يتمّ بثّه
هو مقدّمة أو خاتمة للطريقة. يجب أن يتتبّع أسلوب التحكّم في الحالات
أيضًا اسم المتغيّر المحلي الأخير ونوعه في
كل سجلّ لرمز DBG_RESTART_LOCAL
.
العنوان على النحو التالي:
الاسم | التنسيق | الوصف |
---|---|---|
line_start | uleb128 | القيمة الأولية لسجلّ line الخاص بآلة الحالة
لا يمثّل إدخالًا فعليًا للوظائف.
|
parameters_size | uleb128 | عدد أسماء المَعلمات التي يتم ترميزها يجب أن يكون هناك
مَعلمة واحدة لكل مَعلمة طريقة، باستثناء this لطريقة العنصر الفردي،
إن توفّرت.
|
parameter_names | uleb128p1[parameters_size] | فهرس السلسلة لاسم مَعلمة الطريقة تشير القيمة المشفَّرة
NO_INDEX إلى أنّه لا يتوفّر اسم
للمَعلمة المرتبطة. يُستخدَم وصف النوع
والتوقيع بشكل ضمني من وصف الطريقة وتوقيعها.
|
في ما يلي قيم رمز الوحدات الثنائية:
الاسم | القيمة | التنسيق | الوسيطات | الوصف |
---|---|---|---|---|
DBG_END_SEQUENCE | 0x00 | (بدون) | تُنهي تسلسل معلومات تصحيح الأخطاء لـ code_item |
|
DBG_ADVANCE_PC | 0x01 | uleb128 addr_diff | addr_diff : المبلغ المطلوب إضافته إلى سجل العناوين |
تنقل سجلّ العناوين إلى الأمام بدون إدخال موضع |
DBG_ADVANCE_LINE | 0x02 | sleb128 line_diff | line_diff : المبلغ الذي سيتم تغيير سجلّ السطر به |
تُقدّم سجلّ السطر بدون إخراج إدخال مواضع |
DBG_START_LOCAL | 0x03 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx |
register_num : السجلّ الذي سيحتوي على القيمة المحليةname_idx : فهرس السلسلة للاسمtype_idx : فهرس النوع
|
يُعرِض متغيّرًا محليًا في العنوان الحالي. يمكن أن يكون إما
name_idx أو type_idx
NO_INDEX للإشارة إلى أنّ هذه القيمة غير معروفة.
|
DBG_START_LOCAL_EXTENDED | 0x04 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx uleb128p1 sig_idx |
register_num : السجلّ الذي سيحتوي على القيمة المحليةname_idx : فهرس السلسلة للاسمtype_idx : فهرس النوع للنوعsig_idx : فهرس السلسلة لتوقيع النوع
|
يعرِض عنصرًا محليًا بتوقيع نوع في العنوان الحالي.
يمكن أن تكون أي من القيم name_idx أو type_idx أو
sig_idx هي NO_INDEX
للإشارة إلى أنّ هذه القيمة غير معروفة. (إذا كان sig_idx هو
-1 ، يمكن تمثيل البيانات نفسها بفعالية أكبر باستخدام رمز التشغيل DBG_START_LOCAL ).
ملاحظة: اطّلِع على المناقشة ضمن
" |
DBG_END_LOCAL | 0x05 | uleb128 register_num | register_num : السجلّ الذي يتضمّن التوقيت المحلي |
يضع علامة على متغيّر محلي نشط حاليًا على أنّه خارج النطاق في الموقع الحالي |
DBG_RESTART_LOCAL | 0x06 | uleb128 register_num | register_num : تسجيل لإعادة التشغيل |
إعادة إدخال متغيّر محلي في العنوان الحالي يكون الاسم والنوع مطابقَين لاسم ونوع آخر سجلّ محلي كان نشطًا في السجلّ المحدّد. |
DBG_SET_PROLOGUE_END | 0x07 | (بدون) | تُعدِّل السجلّ prologue_end الخاص بآلة الحالة،
ما يشير إلى أنّ إدخال الموضع التالي الذي تتم إضافته يجب
اعتباره نهاية مقدمة الأسلوب (مكان مناسب
لنقطة توقُّف الأسلوب). يتم
محو السجلّ prologue_end بواسطة أيّ رمز تشغيل خاص (>= 0x0a ).
|
|
DBG_SET_EPILOGUE_BEGIN | 0x08 | (بدون) | تُعدِّل سجلّ آلة الحالة epilogue_begin ،
ما يشير إلى أنّ إدخال الموضع التالي الذي تتم إضافته يجب
اعتباره بداية خاتمة الطريقة (مكان مناسب
لتعليق التنفيذ قبل الخروج من الطريقة).
يتم محو السجلّ epilogue_begin باستخدام أيّ رمز برمجي خاص
(>= 0x0a ).
|
|
DBG_SET_FILE | 0x09 | uleb128p1 name_idx | name_idx : فهرس السلسلة لاسم الملف المصدر
NO_INDEX إذا كان غير معروف
|
تشير إلى أنّ جميع إدخالات أرقام الأسطر اللاحقة تشير إلى اسم
ملف المصدر هذا، بدلاً من الاسم التلقائي المحدّد في
code_item .
|
رموز التشغيل الخاصة | 0x0a…0xff | (بدون) | تُقدّم سجلّي line وaddress ،
وتُنشئ إدخال موضع، وتُمحو prologue_end و
epilogue_begin . يُرجى الاطّلاع أدناه على الوصف.
|
رموز التشغيل الخاصة
تنقل أوامر التشغيل التي لها قيم تتراوح بين 0x0a
و0xff
(شاملة) كلاً من السجلَّين line
وaddress
بمقدار صغير، ثم تُنشئ إدخالًا جديدًا في جدول المواضع.
في ما يلي صيغة الزيادة:
DBG_FIRST_SPECIAL = 0x0a // the smallest special opcode DBG_LINE_BASE = -4 // the smallest line number increment DBG_LINE_RANGE = 15 // the number of line increments represented adjusted_opcode = opcode - DBG_FIRST_SPECIAL line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE) address += (adjusted_opcode / DBG_LINE_RANGE)
annotations_directory_item
تمت الإشارة إليه من class_def_item
تظهر في قسم البيانات
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
class_annotations_off | uint | بدءًا من بداية الملف إلى التعليقات التوضيحية التي تم إجراؤها مباشرةً
على الصف، أو 0 إذا لم يكن الصف يتضمّن تعليقات توضيحية مباشرةً.
يجب أن يشير العنصر offset، إذا لم يكن صفرًا، إلى موقع في القسم
data . يتم تحديد تنسيق البيانات
باستخدام "annotation_set_item " أدناه.
|
fields_size | uint | عدد الحقول التي تمت إضافة تعليقات توضيحية إليها من خلال هذا العنصر |
annotated_methods_size | uint | عدد الطرق التي تمت إضافة تعليقات توضيحية لها من خلال هذا العنصر |
annotated_parameters_size | uint | عدد قوائم مَعلمات الطُرق التي تمت إضافة تعليقات توضيحية إليها من خلال هذا العنصر |
field_annotations | field_annotation[fields_size] (اختيارية) | قائمة التعليقات التوضيحية المرتبطة بالحقول يجب
ترتيب عناصر القائمة تصاعديًا حسب field_idx .
|
method_annotations | method_annotation[methods_size] (اختيارية) | قائمة التعليقات التوضيحية المرتبطة بالطريقة يجب
ترتيب عناصر القائمة تصاعديًا حسب method_idx .
|
parameter_annotations | parameter_annotation[parameters_size] (اختيارية) | قائمة التعليقات التوضيحية لمَعلمات الطريقة المرتبطة يجب ترتيب عناصر قائمة
تصاعديًا حسب method_idx .
|
ملاحظة: يجب أن تشير جميع نُسخ field_id
و
method_id
للعناصر إلى الفئة المحدّدة نفسها.
تنسيق field_annotation
الاسم | التنسيق | الوصف |
---|---|---|
field_idx | uint | الفهرس في قائمة field_ids لتحديد هوية الحقل
الذي تتم إضافة تعليقات توضيحية إليه
|
annotations_off | uint | من بداية الملف إلى قائمة التعليقات التوضيحية
للحقل. يجب أن يشير ال offset إلى موقع في قسم data . يتم تحديد تنسيق البيانات باستخدام
"annotation_set_item " أدناه.
|
تنسيق method_annotation
الاسم | التنسيق | الوصف |
---|---|---|
method_idx | uint | الفهرس في قائمة method_ids لتحديد هوية
الطريقة التي تتم عليها إضافة تعليقات توضيحية
|
annotations_off | uint | من بداية الملف إلى قائمة التعليقات التوضيحية
للطريقة. يجب أن يشير ال offset إلى موقع في القسم
data . يتم تحديد تنسيق البيانات باستخدام
"annotation_set_item " أدناه.
|
تنسيق parameter_annotation
الاسم | التنسيق | الوصف |
---|---|---|
method_idx | uint | الفهرسة في قائمة method_ids لتحديد هوية
الطريقة التي تتم إضافة تعليقات توضيحية إلى مَعلماتها
|
annotations_off | uint | من بداية الملف إلى قائمة التعليقات التوضيحية
لمَعلمات الطريقة. يجب أن يشير ال offset إلى موقع في القسم
data . يتم تحديد تنسيق البيانات باستخدام
"annotation_set_ref_list " أدناه.
|
annotation_set_ref_list
تمت الإشارة إليها من parameter_annotations_item
تظهر في قسم البيانات
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
الحجم | uint | حجم القائمة، بالعناصر |
قائمة | annotation_set_ref_item[size] | عناصر القائمة |
تنسيق annotation_set_ref_item
الاسم | التنسيق | الوصف |
---|---|---|
annotations_off | uint | القيمة المرجعية من بداية الملف إلى مجموعة التعليقات التوضيحية المُشار إليها
أو 0 إذا لم تكن هناك تعليقات توضيحية لهذا العنصر
يجب أن يشير العنصر offset، إذا لم يكن صفرًا، إلى موقع في القسم data . يتم تحديد تنسيق البيانات باستخدام
"annotation_set_item " أدناه.
|
annotation_set_item
تتم الإشارة إليها من annotations_directory_item وfield_annotations_item وmethod_annotations_item وannotation_set_ref_item
تظهر في قسم البيانات
المطابقة: 4 بايت
الاسم | التنسيق | الوصف |
---|---|---|
الحجم | uint | حجم المجموعة، بالعناصر |
الإدخالات | annotation_off_item[size] | عناصر المجموعة. يجب ترتيب العناصر تصاعديًا،
حسب type_idx .
|
تنسيق annotation_off_item
الاسم | التنسيق | الوصف |
---|---|---|
annotation_off | uint | بدءًا من بداية الملف إلى تعليق توضيحي
يجب أن يشير العنصر offset إلى موقع في قسم data ،
ويتم تحديد تنسيق البيانات في هذا الموقع باستخدام
"annotation_item " أدناه.
|
annotation_item
تمت الإشارة إليها من annotation_set_item
تظهر في قسم البيانات
المحاذاة: بدون (محاذاة حسب البايت)
الاسم | التنسيق | الوصف |
---|---|---|
الظهور | ubyte | مستوى الظهور المقصود لهذا التعليق التوضيحي (راجِع المعلومات أدناه) |
تعليق توضيحي | encoded_annotation | محتوى التعليق التوضيحي المشفَّر، بالتنسيق الموضّح في
"تنسيق encoded_annotation " ضمن
"ترميز encoded_value " أعلاه
|
قيم مستوى الرؤية
في ما يلي خيارات حقل visibility
في
annotation_item
:
الاسم | القيمة | الوصف |
---|---|---|
VISIBILITY_BUILD | 0x00 | مخصّصة للظهور فقط في وقت الإنشاء (مثلاً، أثناء تجميع رمز آخر) |
VISIBILITY_RUNTIME | 0x01 | المقصود أن تكون مرئية أثناء التشغيل |
VISIBILITY_SYSTEM | 0x02 | مخصّصة للظهور أثناء التشغيل، ولكن للنظام الأساسي فقط (وليس لرمز المستخدم العادي) |
encoded_array_item
تمت الإشارة إليه من class_def_item
تظهر في قسم البيانات
المحاذاة: بدون (محاذاة حسب البايت)
الاسم | التنسيق | الوصف |
---|---|---|
القيمة | encoded_array | وحدات بايت تمثّل قيمة الصفيف المشفَّر، بالتنسيق المحدَّد
من خلال "encoded_array التنسيق" ضمن "encoded_value
التشفير" أعلاه.
|
hiddenapi_class_data_item
يحتوي هذا القسم على بيانات عن الواجهات المحظورة التي يستخدمها كل فئة.
ملاحظة: تمّ تقديم ميزة واجهة برمجة التطبيقات المخفية في الإصدار 10.0 من نظام التشغيل Android ولا تنطبق إلا على ملفات DEX للفئات في مسار فئة التمهيد. قد يتم توسيع قائمة الإشارات الموضّحة أدناه في الإصدارات المستقبلية من Android. لمزيد من المعلومات، يُرجى الاطّلاع على القيود المفروضة على واجهات غير حِزم تطوير البرامج (SDK).
الاسم | التنسيق | الوصف |
---|---|---|
الحجم | uint | الحجم الإجمالي للقسم |
الاعتمادات الكربونية | uint[] | صفيف للإزاحات مفهرَسًا حسب class_idx
يعني إدخال صفيف صفري في الفهرس class_idx أنّه إما
ما مِن بيانات لهذا class_idx ، أو أنّ جميع علامات واجهة برمجة التطبيقات
الخفية هي صفر.
بخلاف ذلك، يكون إدخال الصفيف غير صفري ويحتوي على إزاحة من
بداية القسم إلى صفيف من علامات واجهة برمجة التطبيقات المخفية
لهذا class_idx .
|
الإبلاغ | uleb128[] | صفائف متسلسلة من علامات واجهة برمجة التطبيقات المخفية لكل فئة يتم وصف قيم العلامة المحتملة في الجدول أدناه. يتم ترميز العلامات بالترتيب نفسه الذي يتم به ترميز الحقول والطُرق في بيانات الفئة. |
أنواع علامات القيود:
الاسم | القيمة | الوصف |
---|---|---|
القائمة البيضاء | 0 | الواجهات التي يمكن استخدامها بحرية وتكون متوافقة كجزء من إطار عمل Android المُوثَّق رسميًا فهرس الحِزم |
القائمة الرمادية | 1 | الواجهات غير المتوفّرة في حزمة SDK والتي يمكن استخدامها بغض النظر عن مستوى واجهة برمجة التطبيقات المستهدَف للتطبيق |
وضع في القائمة السوداء | 2 | الواجهات غير المتوفّرة في حزمة SDK والتي لا يمكن استخدامها بغض النظر عن مستوى واجهة برمجة التطبيقات المستهدَف للتطبيق يؤدي الوصول إلى إحدى هذه الواجهات إلى خطأ في وقت التشغيل. |
greylist‑max‑o | 3 | الواجهات غير المتوفّرة في حزمة SDK والتي يمكن استخدامها مع الإصدار 8.x من نظام التشغيل Android والإصدارات الأقدم ما لم تكن محظورة |
greylist‑max‑p | 4 | الواجهات غير المتوفرة في حزمة SDK والتي يمكن استخدامها مع الإصدار 9.x من نظام التشغيل Android ما لم تكن محظورة |
greylist‑max‑q | 5 | الواجهات غير المتوفرة في حزمة SDK التي يمكن استخدامها مع الإصدار 10.x من Android ما لم تكن محظورة |
greylist‑max‑r | 6 | الواجهات غير المتوفرة في حزمة SDK التي يمكن استخدامها مع الإصدار 11.x من Android ما لم تكن محظورة |
التعليقات التوضيحية للنظام
تُستخدَم التعليقات التوضيحية للنظام لتمثيل أجزاء مختلفة من المعلومات التأملية حول الفئات (والطُرق والحقول). ولا يمكن الوصول إلى هذه المعلومات بشكل عام إلا بشكل غير مباشر من خلال رمز العميل (غير النظام).
يتم تمثيل التعليقات التوضيحية للنظام في ملفات .dex
على هيئة
تعليقات توضيحية تم ضبط مستوى ظهورها على VISIBILITY_SYSTEM
.
dalvik.annotation.AnnotationDefault
يظهر في الواجهات التي تعرض التعليقات التوضيحية.
يتم إرفاق تعليق توضيحي AnnotationDefault
بكل واجهة
تعليق توضيحي تريد الإشارة إلى عمليات الربط التلقائية.
الاسم | التنسيق | الوصف |
---|---|---|
القيمة | تعليق توضيحي | عمليات الربط التلقائية لهذا التعليق التوضيحي، والتي يتم تمثيلها كتعليق توضيحي من هذا النوع. ولا يلزم أن يتضمّن التعليق التوضيحي جميع الأسماء المحدّدة من قِبل التعليق التوضيحي، لأنّ الأسماء غير المتوفّرة لا تتضمّن قيمًا تلقائية. |
dalvik.annotation.EnclosingClass
يظهر في الصفوف
يتم إرفاق تعليق توضيحي EnclosingClass
بكل فئة
التي يتم تحديدها إما كعضو في فئة أخرى بحد ذاتها، أو كعضو
مجهول ولكن لم يتم تحديده ضمن نص الأسلوب (مثل فئة داخلية
اصطناعية). يجب أن يحتوي كل صف يتضمّن هذا التعليق التوضيحي أيضًا على تعليق توضيحي
InnerClass
. بالإضافة إلى ذلك، يجب ألا يتضمّن الصف
تعليقًا توضيحيًا من النوع EnclosingClass
وEnclosingMethod
معًا.
الاسم | التنسيق | الوصف |
---|---|---|
القيمة | الفئة | الفئة التي تحدد نطاقًا لغويًا لهذا الصف بشكلٍ أدق |
dalvik.annotation.EnclosingMethod
يظهر في الصفوف
يتم إرفاق تعليق توضيحي EnclosingMethod
بكل فئة
يتم تحديده داخل نص الأسلوب. يجب أن يحتوي كل صف يتضمّن هذا التعليق التوضيحي
على تعليق توضيحي InnerClass
أيضًا.
بالإضافة إلى ذلك، يجب ألا يحتوي الصف على تعليق توضيحي EnclosingClass
وEnclosingMethod
في آنٍ واحد.
الاسم | التنسيق | الوصف |
---|---|---|
القيمة | الطريقة | الطريقة التي تحدد نطاق هذه الفئة بشكل لغوي بشكل أدق |
dalvik.annotation.InnerClass
يظهر في الصفوف
يتم إرفاق تعليق توضيحي InnerClass
بكل فئة
يتم تحديده في النطاق المعجمي لتعريف فئة أخرى.
يجب أن تتضمّن أيّ فئة تتضمّن علامة التعليق التوضيحي هذه أيضًا إما علامة التعليق التوضيحي
EnclosingClass
أو علامة التعليق التوضيحي
EnclosingMethod
.
الاسم | التنسيق | الوصف |
---|---|---|
اسم | سلسلة | الاسم البسيط الذي تم الإعلان عنه في الأصل لهذه الفئة (باستثناء أي علامة بدء
للحزمة) إذا كانت هذه الفئة مجهولة الهوية، يكون الاسم هو
null .
|
accessFlags | تدخُّل دفاعي | علامات الوصول المعلَن عنها في الأصل للصف (التي قد تختلف عن العلامات الفعّالة بسبب عدم التطابق بين نماذج التنفيذ للغة المصدر والجهاز الافتراضي المستهدَف) |
dalvik.annotation.MemberClasses
يظهر في الصفوف
يتم إرفاق تعليق توضيحي MemberClasses
بكل صف
يُعرِض صفوف الأعضاء. (فئة العضو هي فئة داخلية مباشرة
لها اسم).
الاسم | التنسيق | الوصف |
---|---|---|
القيمة | Class[] | مصفوفة لفئات الأعضاء |
dalvik.annotation.MethodParameters
يظهر في الأساليب
ملاحظة: تمت إضافة هذا التعليق التوضيحي بعد الإصدار 7.1 من Android. وسيتم تجاهل وجودها على إصدارات Android الأقدم.
التعليق التوضيحي MethodParameters
اختياري ويمكن استخدامه لتوفير بيانات وصفية للمَعلمة، مثل أسماء المَعلمات والمُعدِّلات.
يمكن حذف التعليق التوضيحي من طريقة أو طريقة وضع تصميم بأمان عندما لا تكون بيانات وصفية المَعلمة مطلوبة أثناء التشغيل.
يمكن استخدام java.lang.reflect.Parameter.isNamePresent()
للتحقّق مما إذا كانت البيانات الوصفية متوفّرة لمَعلمة معيّنة، وستعود طرق java.lang.reflect.Parameter.getName()
وغيرها من طرق java.lang.reflect.Parameter.getName()
المرتبط بها إلى السلوك التلقائي أثناء التشغيل في حال عدم توفّر المعلومات.
عند تضمين البيانات الوصفية للمَعلمات، يجب أن تتضمّن برامج التحويل معلومات للصفوف التي تم إنشاؤها، مثل القوائم المحدَّدة، لأنّ البيانات الوصفية للمَعلمات تتضمّن ما إذا كانت المَعلمة اصطناعية أو إلزامية.
لا يصف التعليق التوضيحي MethodParameters
سوى مَعلمات الأسلوب الفردية. لذلك، قد يحذف المُجمِّع التعليق التوضيحي بالكامل
لإنشاء الدوالّ والطرق التي لا تحتوي على مَعلمات، وذلك من أجل حجم الرمز البرمجي
وكفاءة وقت التشغيل.
يجب أن تكون المصفوفات المُوثَّقة أدناه بالحجم نفسه لبنية method_id_item
dex المرتبطة بالطريقة، وإلا سيتم طرح java.lang.reflect.MalformedParametersException
أثناء وقت التشغيل.
وهذا يعني أنّ method_id_item.proto_idx
->
proto_id_item.parameters_off
->
type_list.size
يجب أن يكونا مطابقَين لnames().length
و
accessFlags().length
.
بما أنّ MethodParameters
تصف جميع مَعلمات الأسلوب الرسمية، حتى تلك التي لم يتمّ تعريفها صراحةً أو ضمنيًا في رمز المصدر،
قد يختلف حجم الصفائف عن معلومات التوقيع أو البيانات الوصفية الأخرى
التي تستند فقط إلى المَعلمات الصريحة التي تمّ تعريفها في رمز المصدر. لن تتضمّن MethodParameters
أيضًا أي معلومات عن
مَعلمات مستلِم التعليق التوضيحي من النوع التي لا تظهر في توقيع الأسلوب
الحقيقي.
الاسم | التنسيق | الوصف |
---|---|---|
الأسماء | String[] | أسماء المَعلمات الرسمية للطريقة المرتبطة يجب ألا يكون المصفوفة
فارغة، ولكن يجب أن تكون فارغة إذا لم تكن هناك مَعلمات رسمية. يجب أن تكون قيمة في
المصفوفة فارغة إذا لم يكن للمَعلمة الرسمية التي تحمل هذا الفهرس اسم. إذا كانت سلاسل أسماء المَعلمات فارغة أو تحتوي على "." أو "'" أو "[" أو "/"، سيتم طرح سوى java.lang.reflect.MalformedParametersException عند
وقت التشغيل.
|
accessFlags | int[] | علامات الوصول للمَعلمات الرسمية للطريقة المرتبطة يجب ألا يكون الجدول
فارغًا ولكن يجب أن يكون فارغًا إذا لم تكن هناك مَعلمات رسمية. القيمة هي قناع بت يتضمّن القيم التالية:
java.lang.reflect.MalformedParametersException أثناء التشغيل.
|
dalvik.annotation.Signature
تظهر في الفئات والحقول والطُرق
يتم إرفاق تعليق توضيحي Signature
بكل فئة أو
حقل أو طريقة يتم تعريفها من حيث نوع أكثر تعقيدًا
من النوع الذي يمكن تمثيله باستخدام type_id_item
. لا يحدِّد تنسيق
.dex
تنسيق التوقيعات، بل يهدف
فقط إلى أن يكون قادرًا على تمثيل أي توقيعات تتطلّبها لغة المصدر
لتطبيق دلالتها
بنجاح. ولذلك، لا يتم عادةً تحليل (أو التحقّق من) التوقيعات
من خلال عمليات تنفيذ الآلات الافتراضية. ويتم تصعيد التوقيعات ببساطة
إلى أدوات وواجهات برمجة تطبيقات ذات مستوى أعلى (مثل مصحّحات الأخطاء). لذلك، يجب كتابة أي استخدام
للتوقيع بطريقة لا تجعلك تفترض أنّك ستتلقّى فقط توقيعات صالحة، مع الحذر بشكل صريح
من احتمالية العثور على توقيع ليس صالحًا من الناحية النحوية.
بما أنّ سلاسل التوقيعات غالبًا ما تحتوي على الكثير من المحتوى المكرّر، يتم تعريف التعليق التوضيحي Signature
على أنّه مصفوفة من سلاسل البيانات، حيث تشير العناصر المكرّرة بشكل طبيعي إلى البيانات الأساسية نفسها، ويتم اعتبار التوقيع على أنّه تسلسل كل سلاسل البيانات في المصفوفة. لا تتوفّر قواعد حول كيفية فصل توقيع إلى سلاسل منفصلة، ويعود ذلك بالكامل إلى الأدوات التي تنشئ ملفات .dex
.
الاسم | التنسيق | الوصف |
---|---|---|
القيمة | String[] | توقيع هذه الفئة أو العنصر، بصفته صفيفًا من السلاسل التي يجب تسلسلها معًا |
dalvik.annotation.Throws
يظهر في الأساليب
يتم إرفاق تعليق توضيحي Throws
بكل طريقة يتم
إعلانها لرمي نوع استثناء واحد أو أكثر.
الاسم | التنسيق | الوصف |
---|---|---|
القيمة | Class[] | مصفوفة أنواع الاستثناءات التي تمّ طرحها |