يصف هذا المستند تخطيط ومحتويات ملفات .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 |
7و | -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 ليشمل معلومات واجهة برمجة التطبيقات المخفية التي تنطبق فقط على ملفات 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_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
.
ترميز MUTF-8 (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+d800
… U+dfff
) لا تعتبر أحرف اسم صالحة، في حد ذاتها، ولكن أحرف Unicode التكميلية صالحة (والتي يتم تمثيلها بالبديل النهائي لقاعدة SimpleNameChar )، وهي يجب أن يتم تمثيله في ملف كأزواج من نقاط الكود البديلة في تشفير MUTF-8.
الاسم البسيط → | ||
SimpleNameChar ( SimpleNameChar )* | ||
SimpleNameChar → | ||
'A' ... 'Z' | ||
| | 'a' ... 'z' | |
| | '0' ... '9' | |
| | ' ' | منذ إصدار DEX 040 |
| | '$' | |
| | '-' | |
| | '_' | |
| | U+00a0 | منذ إصدار DEX 040 |
| | U+00a1 … U+1fff | |
| | U+2000 … U+200a | منذ إصدار DEX 040 |
| | U+2010 … U+2027 | |
| | U+202f | منذ إصدار DEX 040 |
| | U+2030 … U+d7ff | |
| | U+e000 … U+ffef | |
| | U+10000 … U+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 (أي |
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 الذي تتوافق عناصره مع الوسائط المتوفرة لأسلوب رابط التمهيد. الحجج الثلاث الأولى هي:
- مؤشر أسلوب يمثل أسلوب رابط التمهيد (VALUE_METHOD_HANDLE).
- اسم الأسلوب الذي يجب أن يحله رابط التمهيد (VALUE_STRING).
- نوع الطريقة المطابق لنوع اسم الطريقة المراد حلها (VALUE_METHOD_TYPE).
أي وسيطات إضافية هي قيم ثابتة تم تمريرها إلى طريقة رابط bootstrap. يتم تمرير هذه الوسائط بالترتيب وبدون أي تحويلات للنوع.
يجب أن يكون لمقبض الأسلوب الذي يمثل أسلوب رابط bootstrap نوع الإرجاع java.lang.invoke.CallSite
. أنواع المعلمات الثلاثة الأولى هي:
-
java.lang.invoke.Lookup
-
java.lang.String
-
java.lang.invoke.MethodType
يتم تحديد أنواع المعلمات لأي وسيطات إضافية من قيمها الثابتة.
method_handle_item
يظهر في قسمmethod_handles
المحاذاة: 4 بايت
اسم | شكل | وصف |
---|---|---|
method_handle_type | قصير | نوع مقبض الطريقة؛ انظر الجدول أدناه |
غير مستعمل | قصير | (غير مستعمل) |
field_or_method_id | قصير | معرف الحقل أو الطريقة اعتمادًا على ما إذا كان نوع مقبض الأسلوب هو ملحق أو طريقة Invoker |
غير مستعمل | Ushort | (غير مستعمل) |
طريقة مقبض رموز نوع الرموز
ثابت | قيمة | وصف |
---|---|---|
method_handle_type_static_put | 0x00 | Method Method Handle هو Setter Field Setter (Accessor) |
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
S و method_id
s إلى نفس الفئة المحددة.
تنسيق 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 | Ushort | فهرس في قائمة type_ids |
Code_Item
المشار إليها من encoded_method
يظهر في قسم البيانات
المحاذاة: 4 بايت
اسم | شكل | وصف |
---|---|---|
سجلات | Ushort | عدد السجلات المستخدمة في هذا الرمز |
ins_size | Ushort | عدد كلمات الوسيطات الواردة إلى الطريقة التي يكون هذا الرمز لها |
outs_size | Ushort | عدد كلمات مساحة الوسيطة الصادرة المطلوبة في هذا الرمز لاستدعاء الطريقة |
tries_size | Ushort | عدد 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 S الفردية وليس على الهياكل الداخلية الأكبر. |
حشوة | 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 | Ushort | عدد وحدات رمز 16 بت التي يغطيها هذا الإدخال. وحدة التعليمات البرمجية الأخيرة المغطاة (شاملة) هي start_addr + insn_count - 1 . |
معالج | 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 (اختياري) | عنوان 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 .) ملاحظة: راجع المناقشة تحت " |
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
S و method_id
s إلى نفس الفئة المحددة.
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
يظهر في قسم البيانات
المحاذاة: لا شيء (محاذاة بايت)
اسم | شكل | وصف |
---|---|---|
الرؤية | ubyte | الرؤية المقصودة لهذا التعليق التوضيحي (انظر أدناه) |
حاشية. ملاحظة | 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 | int [] | أعلام الوصول للمعلمات الرسمية للطريقة المرتبطة بها. يجب ألا تكون الصفيف لاغية ولكن يجب أن تكون فارغة إذا لم تكن هناك معلمات رسمية. القيمة هي قناع قليلا مع القيم التالية:
java.lang.reflect.MalformedParametersException في وقت التشغيل. |
dalvik.annotation.Signature
يظهر على الفصول والحقول والأساليب
يتم إرفاق التعليق Signature
بكل فئة أو حقل أو طريقة يتم تعريفها من حيث النوع الأكثر تعقيدًا من تمثيلها بواسطة type_id_item
. لا يحدد تنسيق .dex
تنسيق التوقيعات ؛ من المفترض فقط أن تكون قادرًا على تمثيل أي توقيعات تتطلب لغة المصدر للتنفيذ الناجح لدلالات تلك اللغة. على هذا النحو ، لا يتم تحليل التوقيعات عمومًا (أو التحقق منها) بواسطة تطبيقات الجهاز الظاهري. يتم تسليم التوقيعات ببساطة إلى واجهات برمجة التطبيقات والأدوات ذات المستوى الأعلى (مثل التصحيحات). لذلك ، يجب كتابة أي استخدام للتوقيع حتى لا يضع أي افتراضات حول تلقي توقيعات صالحة فقط ، ويحرسان نفسه بشكل صريح من إمكانية التواصل مع توقيع غير صالح بشكل نحلي.
نظرًا لأن سلاسل Signature
تميل إلى الحصول على الكثير من المحتوى المكررة ، يتم تعريف شرح توقيع على أنه مجموعة من الأوتار ، حيث تشير العناصر المكررة بشكل طبيعي إلى نفس البيانات الأساسية ، ويتم اعتبار التوقيع هو تسلسل جميع الأوتار في المصفوفة . لا توجد قواعد حول كيفية تفكيك التوقيع في سلاسل منفصلة ؛ هذا متروك بالكامل للأدوات التي تنشئ ملفات .dex
.
اسم | شكل | وصف |
---|---|---|
قيمة | خيط[] | توقيع هذه الفئة أو العضو ، كمجموعة من الأوتار التي يجب تسلسلها معًا |
dalvik.annotation.throws
يظهر على الأساليب
يتم إرفاق تعليق توضيحي Throws
بكل طريقة يُعلن أنها ترمي نوعًا أو أكثر من أنواع الاستثناءات.
اسم | شكل | وصف |
---|---|---|
قيمة | فصل[] | مجموعة من أنواع الاستثناءات التي ألقيت |