قالب اجرایی Dalvik

این سند طرح‌بندی و محتوای فایل‌های .dex را شرح می‌دهد که برای نگهداری مجموعه‌ای از تعاریف کلاس و داده‌های الحاقی مرتبط با آن‌ها استفاده می‌شود.

راهنمای انواع

نام شرح
بایت عدد صحیح علامت‌دار ۸ بیتی
بایت بدون علامت عدد صحیح بدون علامت ۸ بیتی
فیلم کوتاه عدد صحیح علامت‌دار ۱۶ بیتی، ترتیب کوچک
ushort عدد صحیح بدون علامت ۱۶ بیتی، لیتل اندین
قطع توپ عدد صحیح علامت‌دار ۳۲ بیتی، ترتیب کوچک به بزرگ
uint عدد صحیح بدون علامت ۳۲ بیتی، لیتل اندین
طولانی عدد صحیح علامت‌دار ۶۴ بیتی، لیتل اندین
اولونگ عدد صحیح بدون علامت ۶۴ بیتی، ترتیب کوچک
sleb128 LEB128 علامت‌دار، طول متغیر (به زیر مراجعه کنید)
uleb128 ‫LEB128 امضاشده، طول متغیر (به زیر مراجعه کنید)
uleb128p1 ‫LEB128 بدون علامت به‌علاوه 1، طول متغیر (به زیر مراجعه کنید)

LEB128

‫LEB128 («Little-Endian Base 128») یک کدبندی با طول متغیر برای مقادیر صحیح علامت‌دار یا بدون علامت دلخواه است. قالب از مشخصات DWARF3 اقتباس شده است. در فایل .dex، از LEB128 فقط برای کدبندی مقادیر ۳۲ بیتی استفاده می‌شود.

هر مقدار کدگذاری‌شده LEB128 از یک تا پنج بایت تشکیل شده است که باهم یک مقدار ۳۲ بیتی را نشان می‌دهند. هر بایت به‌جز بایت آخر در توالی، بیت باارزش خود را تنظیم می‌کند، درحالی‌که بایت آخر بیت باارزش خود را پاک می‌کند. هفت بیت باقی‌مانده از هر بایت بار مفید هستند، با کمترین هفت بیت معنی‌دار مقدار در بایت اول، هفت بیت بعدی در بایت دوم و غیره. در مورد LEB128 امضادار (sleb128)، مهم‌ترین بیت بار نهایی در توالی به‌صورت امضادار گسترش می‌یابد تا مقدار نهایی تولید شود. در حالت بدون علامت (uleb128)، هر بیت که به‌طور صریح نشان داده نشده باشد به‌صورت 0 تفسیر می‌شود.

نمودار بیتی مقدار LEB128 دو بایتی
اولین بایت بایت دوم
1 ‫bit۶ ‫bit۵ ‫bit۴ بیت۳ ‫bit۲ بیت۱ ‫bit۰ 0 بیت۱۳ ‫۱۲ بیت ‫bit۱۱ ‫bit۱۰ بیت۹ بیت۸ بیت۷

از متغیر uleb128p1 برای نمایش مقدار علامت‌دار استفاده می‌شود، که در آن نمایش مقدار به‌علاوه یک است که به‌صورت uleb128 کدبندی شده است. This makes the encoding of -1 (alternatively thought of as the unsigned value 0xffffffff) — but no other negative number — a single byte, and is useful in exactly those cases where the represented number must either be non-negative or -1 (or 0xffffffff), and where no other negative values are allowed (or where large unsigned values are unlikely to be needed).

در اینجا چند نمونه از قالب‌ها آورده شده است:

توالی کدبندی‌شده به‌عنوان sleb128 به‌عنوان uleb128 به‌عنوان uleb128p1
0000۱-
۰۱110
۷f۱-127126
۸۰ ۷f-1281625616255

چیدمان فایل

نام قالب شرح
سرایند header_item سرایند
string_ids string_id_item[] فهرست شناسه‌های رشته‌ای. این‌ها شناسه‌هایی برای همه رشته‌های استفاده‌شده توسط این فایل هستند، چه برای نام‌گذاری داخلی (مثلاً توصیف‌کننده‌های نوع) یا به‌عنوان اشیای ثابت ارجاع‌شده توسط کد. این فهرست باید براساس محتوای رشته بااستفاده از مقادیر نقطه کد UTF-16 (نه به روش حساس به زبان) مرتب شود و نباید حاوی هیچ ورودی تکراری باشد.
type_ids type_id_item[] فهرست شناسه‌های نوع. این‌ها شناسه‌های همه انواع (کلاس‌ها، آرایه‌ها، یا انواع ابتدایی) هستند که این فایل به آن‌ها ارجاع می‌دهد، چه در فایل تعریف شده باشند چه نه. این فهرست باید براساس نمایه string_id مرتب شود و نباید حاوی ورودی‌های تکراری باشد.
proto_ids proto_id_item[] فهرست شناسه‌های نمونه اولیه روش. این‌ها شناسه‌های همه نمونه‌های اولیه‌ای هستند که این فایل به آن‌ها ارجاع می‌دهد. این فهرست باید براساس نوع برگشتی (با ترتیب اصلی type_id) مرتب شود، و سپس براساس فهرست آرگومان (ترتیب واژگانی، آرگومان‌های جداگانه براساس ترتیب type_id) مرتب شود. فهرست نباید هیچ ورودی تکراری داشته باشد.
field_ids field_id_item[] فهرست شناسه‌های فیلد. این‌ها شناسه‌های همه فیلدهایی هستند که این فایل به آن‌ها ارجاع می‌دهد، چه در فایل تعریف شده باشند چه نشده باشند. این فهرست باید مرتب شود، که در آن نوع تعریف‌کننده (براساس type_id نمایه) ترتیب اصلی، نام فیلد (براساس string_id نمایه) ترتیب میانی، و نوع (براساس type_id نمایه) ترتیب فرعی است. فهرست نباید حاوی ورودی‌های تکراری باشد.
method_ids method_id_item[] فهرست شناسه‌های روش. این‌ها شناسه‌های همه روش‌هایی هستند که این فایل به آن‌ها ارجاع می‌دهد، چه در فایل تعریف شده باشند چه نشده باشند. این فهرست باید مرتب شود، به‌طوری‌که نوع تعریف‌کننده (براساس type_id نمایه) ترتیب اصلی، نام روش (براساس string_id نمایه) ترتیب میانی، و پیش‌نمونه روش (براساس نمایه proto_id) ترتیب فرعی باشد. فهرست نباید هیچ ورودی تکراری داشته باشد.
class_defs class_def_item[] فهرست تعریف‌های کلاس. کلاس‌ها باید به‌ترتیبی مرتب شوند که ابرکلاس و واسط‌های پیاده‌سازی‌شده کلاس معین در فهرست زودتر از کلاس ارجاع‌دهنده ظاهر شوند. علاوه‌براین، اگر تعریف کلاسی با نام یکسان بیش‌از یک‌بار در فهرست ظاهر شود، نامعتبر است.
call_site_ids call_site_id_item[] فهرست شناسه‌های سایت تماس. این‌ها شناسه‌های همه سایت‌های تماسی هستند که این فایل به آن‌ها ارجاع می‌دهد، چه در فایل تعریف شده باشند چه نشده باشند. این فهرست باید براساس call_site_off به‌ترتیب صعودی مرتب شود.
method_handles method_handle_item[] فهرست روش‌ها را مدیریت می‌کند. فهرستی از همه دسته‌های روش که این فایل به آن‌ها ارجاع داده است، چه در فایل تعریف شده باشند چه نه. این فهرست مرتب نشده است و ممکن است حاوی موارد تکراری باشد که ازنظر منطقی با نمونه‌های مختلف دسته روش مطابقت دارد.
داده ubyte[] ناحیه داده، حاوی همه داده‌های پشتیبانی برای جدول‌های فهرست‌شده در بالا. موارد مختلف الزامات تراز مختلفی دارند و اگر لازم باشد، بایت‌های حاشیه‌ای قبل‌از هر مورد درج می‌شوند تا تراز مناسب به‌دست آید.
link_data ubyte[] داده‌های استفاده‌شده در فایل‌های پیوندشده به‌صورت ایستا. قالب داده‌ها در این بخش در این سند مشخص نشده است. این بخش در فایل‌های پیوندنشده خالی است و پیاده‌سازی‌های زمان اجرا ممکن است از آن به صلاحدید خود استفاده کنند.

قالب محتوی

نسخه ۴۱ قالب جدیدی برای داده‌های DEX معرفی می‌کند که هدف آن صرفه‌جویی در فضا است. این قالب محفظه امکان می‌دهد چندین فایل DEX منطقی در یک فایل فیزیکی واحد ترکیب شوند. قالب جدید عمدتاً فقط الحاق ساده فایل‌ها در قالب قبلی است، با برخی تفاوت‌ها:

  • ‫file_size اندازه فایل منطقی است، نه فایل فیزیکی. از آن می‌توان برای تکرار کردن همه فایل‌های منطقی در محتوا استفاده کرد.
  • فایل‌های dex منطقی ممکن است به هر داده بعدی در محتوی ارجاع دهند (اما نه به داده‌های قبلی). این کار به فایل‌های dex اجازه می‌دهد داده‌هایی مثل رشته‌ها را بین خودشان هم‌رسانی کنند.
  • همه جبران‌ها نسبت به فایل فیزیکی هستند. هیچ جابه‌جایی‌ای نسبت‌به سرایند وجود ندارد. این کار تضمین می‌کند که بخش‌های دارای انحراف را می‌توان بین فایل‌های منطقی هم‌رسانی کرد.
  • سرصفحه دو فیلد جدید برای توصیف حدود محتوی اضافه می‌کند. این یک بررسی سازگاری اضافی است و انتقال کد به قالب جدید را آسان‌تر می‌کند.
  • ‫data_size و data_off اکنون استفاده نشده‌اند. داده‌ها می‌توانند در چندین فایل منطقی پخش شوند و لازم نیست پیوسته باشند.

تعاریف رشته، فیلد بیت، و ثابت

DEX_FILE_MAGIC

جاسازی‌شده در header_item

آرایه/رشته ثابت DEX_FILE_MAGIC فهرست بایت‌هایی است که باید در ابتدای فایل .dex قرار داشته باشد تا به‌عنوان فایل شناخته شود. این مقدار به‌طور عمدی حاوی خط جدید ("\n" یا 0x0a) و بایت تهی ("\0" یا 0x00) است تا به تشخیص انواع خاصی از خرابی کمک کند. این مقدار همچنین شماره نسخه قالب را به‌صورت سه رقم اعشاری کدبندی می‌کند که با تکامل قالب، انتظار می‌رود به‌صورت یکنواخت در طول زمان افزایش یابد.

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

توجه: پشتیبانی از نسخه 041 قالب در نسخه Android 16 برای آزمایش قالب محفظه آزمایشی است. بااین‌حال، نباید از نسخه 041 برای کد تولید استفاده شود.

توجه: پشتیبانی از نسخه 040 قالب در نسخه Android 10.0 اضافه شد که مجموعه نویسه‌های مجاز در SimpleNames را گسترش داد.

توجه: پشتیبانی از نسخه 039 قالب در نسخه Android 9.0 اضافه شد که دو کدبایت جدید، const-method-handle و const-method-type، را معرفی کرد. (هریک از این موارد در جدول خلاصه مجموعه بایت‌کد توضیح داده شده است.) در Android 10، نسخه 039 قالب فایل DEX را گسترش می‌دهد تا اطلاعات API پنهان را که فقط برای فایل‌های DEX در مسیر کلاس راه‌اندازی قابل‌اعمال است دربرگیرد.

توجه: پشتیبانی از نسخه 038 این قالب در نسخه Android 8.0 اضافه شد. نسخه 038 کدهای بایت جدیدی (invoke-polymorphic و invoke-custom) و داده‌هایی برای مدیریت روش اضافه کرد.

توجه: پشتیبانی از نسخه 037 این قالب در نسخه Android 7.0 اضافه شد. قبل‌از نسخه 037، اکثر نسخه‌های Android از نسخه 035 قالب استفاده کرده‌اند. تنها تفاوت بین نسخه‌های 035 و 037 افزودن روش‌های پیش‌فرض و اصلاح invoke است.

توجه: حداقل چند نسخه قبلی از این قالب در نسخه‌های نرم‌افزار عمومی که به‌طور گسترده دردسترس هستند استفاده شده است. برای مثال، نسخه 009 برای نسخه‌های پخش M3 پلاتفرم Android (نوامبر–دسامبر ۲۰۰۷) استفاده شد، و نسخه 013 برای نسخه‌های پخش M5 پلاتفرم Android (فوریه–مارس ۲۰۰۸) استفاده شد. از چند جهت، این نسخه‌های قدیمی‌تر قالب تفاوت قابل‌توجهی با نسخه شرح‌داده‌شده در این سند دارند.

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;

بدون نمایه

در class_def_item و debug_info_item جاسازی‌شده است

از ثابت NO_INDEX برای نشان دادن اینکه مقدار شاخص وجود ندارد استفاده می‌شود.

توجه: این مقدار به‌عنوان 0 تعریف نشده است، زیرا درواقع معمولاً نمایه‌ای معتبر است.

مقدار انتخابی برای NO_INDEX در کدبندی uleb128p1 می‌تواند به‌عنوان یک بایت واحد نمایش داده شود.

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

تعاریف پرچم‌های دسترسی

جاسازی‌شده در class_def_item،‏ encoded_field،‏ encoded_method، و InnerClass

از فیلدهای بیتی این پرچم‌ها برای نشان دادن دسترس‌پذیری و ویژگی‌های کلی کلاس‌ها و اعضای کلاس استفاده می‌شود.

نام مقدار برای کلاس‌ها (و InnerClass حاشیه‌نویسی) برای فیلدها برای روش‌ها
ACC_PUBLIC 0x1 ‫public: در همه‌جا قابل‌مشاهده است ‫public: در همه‌جا نمایان است ‫public: در همه‌جا نمایان است
ACC_PRIVATE ‫0x2 * private: فقط برای کلاس تعریف‌کننده قابل‌مشاهده است ‫private: فقط برای کلاس تعریف‌کننده قابل‌مشاهده است private: فقط برای کلاس تعریف‌کننده قابل‌مشاهده است
ACC_PROTECTED ‫0x4 * protected: برای بسته و زیرکلاس‌ها قابل‌مشاهده است ‫protected: برای بسته و زیرکلاس‌ها قابل‌مشاهده است ‫protected: برای بسته و زیرکلاس‌ها قابل‌مشاهده است
ACC_STATIC ‫0x8 * static: با مرجع بیرونی this ساخته نشده است ‫static: سراسری به کلاس تعریف‌کننده static: متغیر مستقل this را نمی‌پذیرد
ACC_FINAL ۰x۱۰ ‫final: قابل زیرکلاس‌بندی نیست ‫final: پس‌از ساخت تغییرناپذیر است ‫final: قابل‌لغو نیست
ACC_SYNCHRONIZED 0x20     ‫synchronized: قفل مرتبط به‌طور خودکار در اطراف فراخوانی این روش به‌دست آمد.

توجه: این تنظیم فقط زمانی معتبر است که ACC_NATIVE نیز تنظیم شده باشد.

ACC_VOLATILE ‫۰x۴۰   ‫volatile: قوانین دسترسی ویژه برای کمک به ایمنی رشته  
ACC_BRIDGE 0x40     روش پل، که به‌طور خودکار توسط کامپایلر به‌عنوان پلی از نوع ایمن اضافه شده است
ACC_TRANSIENT ۰x۸۰   ‫transient: با سریال‌سازی پیش‌فرض ذخیره نمی‌شود  
ACC_VARARGS ۰x۸۰     آخرین آرگومان باید توسط کامپایلر به‌عنوان آرگومان «بقیه» درنظر گرفته شود
ACC_NATIVE 0x100     ‫native: در کد بومی پیاده‌سازی شده است
ACC_INTERFACE ‫0x200 ‫interface: کلاس انتزاعی با قابلیت پیاده‌سازی چندگانه    
ACC_ABSTRACT ‫0x400 ‫abstract: نمی‌تواند مستقیماً نمونه‌سازی شود   ‫abstract: این کلاس پیاده‌سازی نشده است
ACC_STRICT 0x800     ‫strictfp: قوانین سخت‌گیرانه برای محاسبات ممیز شناور
ACC_SYNTHETIC 0x1000 مستقیماً در کد منبع تعریف نشده است مستقیماً در کد منبع تعریف نشده است مستقیماً در کد منبع تعریف نشده است
ACC_ANNOTATION 0x2000 به‌عنوان کلاس گزارمان اعلام شد    
ACC_ENUM 0x4000 به‌عنوان نوع شمارشی اعلام شد به‌عنوان مقدار فهرست اعلام شد  
(استفاده‌نشده) 0x8000      
ACC_CONSTRUCTOR 0x10000     روش سازنده (مقداردهنده اولیه کلاس یا نمونه)
ACC_DECLARED_
SYNCHRONIZED
0x20000     اعلام‌شده synchronized.

توجه: این امر هیچ تأثیری بر اجرا (به‌جز در انعکاس این پرچم، به‌خودی خود) ندارد.

* فقط برای حاشیه‌نویسی‌های InnerClass مجاز است، و هرگز نباید در class_def_item روشن باشد.

کدبندی UTF-8 اصلاح‌شده

به‌عنوان امتیازی برای پشتیبانی آسان‌تر از نسخه‌های قدیمی، قالب .dex داده‌های رشته‌ای خود را در شکل UTF-8 اصلاح‌شده استاندارد دوفاکتو کدبندی می‌کند که ازاین‌پس به‌عنوان MUTF-8 به آن اشاره می‌شود. این فرم با UTF-8 استاندارد یکسان است، با این تفاوت که:

  • فقط از کدگذاری‌های یک، دو، و سه بایتی استفاده می‌شود.
  • نقطه‌های کد در محدوده U+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 این است که آن‌ها را نویسه به نویسه رمزگشایی کنید و مقادیر رمزگشایی‌شده را مقایسه کنید. (بااین‌حال، پیاده‌سازی‌های هوشمندانه‌تر نیز امکان‌پذیر است.)

برای اطلاعات بیشتر درباره کدبندی نویسه، لطفاً به استاندارد یونیکد مراجعه کنید. MUTF-8 درواقع به کدبندی (نسبتاً کمتر شناخته‌شده) CESU-8 نزدیک‌تر است تا به خود UTF-8.

کدبندی encoded_value

در annotation_element و encoded_array_item جاسازی شده است

encoded_value قطعه‌ای کدگذاری‌شده از داده‌های ساختاریافته سلسله‌مراتبی (تقریباً) دلخواه است. هدف از این کدبندی این است که هم فشرده باشد و هم تجزیه آن ساده باشد.

نام قالب شرح
(value_arg << 5) | value_type بایت بدون علامت بایت نشان‌دهنده نوع value بلافاصله بعدی به‌همراه یک آرگومان شفاف‌سازی اختیاری در سه بیت مرتبه بالا. برای مشاهده تعاریف مختلف value، به زیر مراجعه کنید. در اکثر موارد، value_arg طول value بلافاصله بعدی را برحسب بایت کدبندی می‌کند، مثلاً (size - 1)، برای نمونه، 0 یعنی مقدار به یک بایت نیاز دارد، و 7 یعنی به هشت بایت نیاز دارد؛ بااین‌حال، استثناهایی وجود دارد که در زیر ذکر شده است.
مقدار ubyte[] بایت‌هایی که مقدار را نشان می‌دهند، ازنظر طول متغیر هستند و برای بایت‌های value_type مختلف به‌طور متفاوتی تفسیر می‌شوند، هرچند همیشه به‌صورت little-endian هستند. برای جزئیات، تعاریف مختلف مقدار را در زیر ببینید.

قالب‌های مقدار

نام نوع value_type قالب value_arg قالب value شرح
VALUE_BYTE 0x00 (هیچ‌کدام؛ باید 0 باشد) ubyte[1] مقدار عدد صحیح یک بایتی علامت‌دار
VALUE_SHORT ‫0x02 اندازه - ۱ (۰…۱) ubyte[size] مقدار صحیح دو بایتی امضاشده، با علامت گسترش‌یافته
VALUE_CHAR 0x03 اندازه - ۱ (۰…۱) ubyte[size] مقدار عدد صحیح دو بایتی بدون علامت، با صفر گسترش‌یافته
VALUE_INT 0x04 اندازه - ۱ (۰…۳) ubyte[size] مقدار صحیح چهار بایتی امضاشده، با علامت گسترده
VALUE_LONG ۰x۰۶ اندازه - ۱ (۰…۷) ubyte[size] مقدار صحیح هشت بایتی امضاشده، با علامت گسترش‌یافته
VALUE_FLOAT ۰x۱۰ اندازه - ۱ (۰…۳) ubyte[size] الگوی بیت چهار بایتی، صفر-گسترش‌یافته به راست، و تفسیرشده به‌عنوان مقدار ممیز شناور ۳۲ بیتی IEEE754
VALUE_DOUBLE 0x11 اندازه - ۱ (۰…۷) ubyte[size] الگوی بیت هشت‌بایتی، با صفر گسترش‌یافته به‌سمت راست، و تفسیرشده به‌عنوان مقدار نقطه شناور ۶۴ بیتی IEEE۷۵۴
VALUE_METHOD_TYPE 0x15 اندازه - ۱ (۰…۳) ubyte[size] مقدار عدد صحیح چهار بایتی بدون علامت (با صفر گسترش‌یافته)، که به‌عنوان نمایه‌ای در بخش proto_ids تفسیر می‌شود و نشان‌دهنده مقدار نوع روش است
VALUE_METHOD_HANDLE ‫0x16 size - 1 (0…3) ubyte[size] مقدار عدد صحیح چهار بایتی بدون علامت (با صفر گسترش‌یافته)، که به‌عنوان نمایه‌ای در بخش method_handles تفسیر می‌شود و مقدار دسته روش را نشان می‌دهد
VALUE_STRING ‫۰x۱۷ size - 1 (0…3) ubyte[size] مقدار عدد صحیح چهاربایتی بدون علامت (با صفر گسترش‌یافته)، که به‌عنوان نمایه‌ای در بخش string_ids تفسیر می‌شود و نشان‌دهنده مقدار رشته‌ای است
VALUE_TYPE 0x18 اندازه - ۱ (۰…۳) ubyte[size] مقدار عدد صحیح چهاربایتی بدون علامت (با صفر گسترش‌یافته)، که به‌عنوان نمایه‌ای در بخش type_ids تفسیر می‌شود و نشان‌دهنده مقدار نوع/کلاس بازتابی است
VALUE_FIELD 0x19 size - 1 (0…3) ubyte[size] مقدار عدد صحیح چهاربایتی بدون علامت (با صفر گسترش‌یافته)، که به‌عنوان نمایه‌ای در بخش field_ids تفسیر می‌شود و نشان‌دهنده مقدار فیلد بازتابی است
روش_ارزش‌گذاری 0x1a اندازه - ۱ (۰…۳) ubyte[size] مقدار عدد صحیح چهار بایتی بدون علامت (با صفر گسترش‌یافته)، تفسیرشده به‌عنوان نمایه‌ای در بخش method_ids و نشان‌دهنده مقدار روش بازتابی
VALUE_ENUM 0x1b اندازه - ۱ (۰…۳) ubyte[size] مقدار عدد صحیح چهار بایتی بدون علامت (با صفر گسترش‌یافته)، تفسیرشده به‌عنوان نمایه‌ای در بخش 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 برای false و 1 برای true. بیت در value_arg نشان داده می‌شود.

قالب encoded_array

نام قالب شرح
اندازه uleb128 تعداد عناصر در آرایه
مقادیر encoded_value[size] مجموعه‌ای از توالی‌های بایت size encoded_value در قالب مشخص‌شده در این بخش که به‌صورت متوالی به‌هم متصل شده‌اند.

قالب encoded_annotation

نام قالب شرح
type_idx uleb128 نوع گزارمان. این باید نوع کلاس باشد (نه آرایه یا نوع اولیه).
اندازه uleb128 تعداد نگاشت‌های نام-مقدار در این حاشیه‌نویسی
عناصر annotation_element[size] عناصر گزارمان، که مستقیماً به‌صورت درون‌خطی (نه به‌عنوان آفست) نشان داده می‌شوند. عناصر باید براساس شاخص string_id به‌ترتیب صعودی مرتب شوند.

قالب عنصر گزارمان

نام قالب شرح
name_idx uleb128 نام عنصر، که به‌عنوان نمایه‌ای در بخش string_ids نشان داده می‌شود. رشته باید با نحو MemberName که در بالا تعریف شده است مطابقت داشته باشد.
مقدار encoded_value مقدار عنصر

نحو رشته

چندین نوع مورد در فایل .dex وجود دارد که درنهایت به یک رشته اشاره می‌کنند. تعاریف سبک BNF زیر نحو قابل‌قبول برای این رشته‌ها را نشان می‌دهد.

SimpleName

SimpleName پایه دستورگان نام‌های دیگر چیزها است. قالب .dex در اینجا (بسیار بیشتر از اکثر زبان‌های منبع رایج) آزادی عمل زیادی می‌دهد. به‌طور خلاصه، نام ساده از هر نویسه الفبایی یا رقم ASCII پایین، چند نماد ASCII پایین خاص، و بیشتر نقاط کد غیر ASCII که نویسه کنترلی، فاصله، یا نویسه خاص نیستند تشکیل شده است. از نسخه 040 این قالب علاوه‌براین نویسه‌های فاصله (دسته Zs یونی‌کد) را مجاز می‌کند. توجه داشته باشید که کدپوینت‌های جانشین (در محدوده U+d800 … U+dfff) به‌خودی خود به‌عنوان نویسه‌های نام معتبر درنظر گرفته نمی‌شوند، اما نویسه‌های تکمیلی «یونی‌کد» معتبر هستند (که با جایگزین نهایی قانون برای SimpleNameChar نشان داده می‌شوند)، و باید در فایل به‌صورت جفت کدپوینت جانشین در کدبندی MUTF-8 نشان داده شوند.

SimpleName →
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

MemberName نام یکی از اعضای کلاس است، اعضا شامل فیلدها، روش‌ها، و کلاس‌های داخلی می‌شود.

MemberName ←
SimpleName
| '<' SimpleName '>'

نام کامل کلاس

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
جنوب short
C char
I int
J long
F float
ر double
Lfully/qualified/Name; کلاس fully.qualified.Name
[descriptor آرایه descriptor، قابل‌استفاده به‌صورت بازگشتی برای آرایه‌های آرایه‌ها، هرچند داشتن بیش‌از ۲۵۵ بُعد نامعتبر است.

موارد و ساختارهای مرتبط

این بخش شامل تعاریف مربوط به هریک از موارد سطح بالا است که ممکن است در فایل .dex ظاهر شود.

header_item

در بخش سرایند ظاهر می‌شود

تراز: ۴ بایت

نام قالب شرح
جادویی ubyte[8] = DEX_FILE_MAGIC مقدار جادویی. برای جزئیات بیشتر، گفتگوی بالا در بخش «DEX_FILE_MAGIC» را ببینید.
جمع‌آزما uint کنترل‌جمع adler32 بقیه فایل (همه چیز به‌جز magic و این فیلد)؛ برای تشخیص خرابی فایل استفاده می‌شود
امضا ubyte[20] امضای SHA-1 (درهم‌سازی) بقیه فایل (همه چیز به‌جز magic، checksum، و این فیلد)؛ برای شناسایی یکتای فایل‌ها استفاده می‌شود
file_size uint

اندازه کل فایل (شامل سرایند)، برحسب بایت (نسخه ۴۰ یا قدیمی‌تر)

فاصله برحسب بایت از ابتدای این سرایند تا سرایند بعدی یا تا انتهای کل فایل (ظرف). (نسخه ۴۱ یا جدیدتر)

header_size uint

اندازه سرایند (کل این بخش)، به بایت. این کار امکان سازگاری محدود با نسخه‌های قدیمی‌تر/جدیدتر را بدون نامعتبر کردن قالب فراهم می‌کند.

باید ۰x۷۰ (۱۱۲) بایت باشد (نسخه ۴۰ یا قدیمی‌تر)

باید ۰x۷۸ (۱۲۰) بایت باشد (نسخه ۴۱ یا جدیدتر)

endian_tag uint = ENDIAN_CONSTANT برچسب اِندیان. برای جزئیات بیشتر، به بحث بالا در بخش «ENDIAN_CONSTANT و REVERSE_ENDIAN_CONSTANT» مراجعه کنید.
link_size uint اندازه بخش پیوند، یا 0 اگر این فایل به‌صورت ایستا پیوند داده نشده باشد
لغو پیوند 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 تعداد عناصر در فهرست شناسه‌های نوع، حداکثر ۶۵۵۳۵
type_ids_off uint فاصله از ابتدای فایل تا فهرست شناسه‌های نوع، یا 0 اگر type_ids_size == 0 (که البته یک مورد حاشیه‌ای عجیب است). آفست، اگر غیرصفر باشد، باید در شروع بخش type_ids باشد.
proto_ids_size uint تعداد عناصر در فهرست شناسه‌های نمونه اولیه، حداکثر ۶۵۵۳۵
proto_ids_off uint فاصله از ابتدای فایل تا فهرست شناسه‌های پیش‌نمونه، یا 0 اگر proto_ids_size == 0 (که البته یک مورد حاشیه‌ای عجیب است). آفست، اگر غیرصفر باشد، باید به ابتدای بخش proto_ids باشد.
field_ids_size uint تعداد عناصر در فهرست شناسه‌های فیلد
field_ids_off uint فاصله از ابتدای فایل تا فهرست شناسه‌های فیلد، یا 0 اگر field_ids_size == 0. آفست، اگر غیرصفر باشد، باید در شروع بخش field_ids باشد.
method_ids_size uint تعداد عناصر در فهرست شناسه‌های روش
method_ids_off uint آفست از ابتدای فایل تا فهرست شناسه‌های روش، یا 0 اگر method_ids_size == 0. آفست، اگر غیرصفر باشد، باید در شروع بخش method_ids باشد.
class_defs_size uint تعداد عناصر در فهرست تعریف‌های کلاس
class_defs_off uint انحراف از ابتدای فایل به فهرست تعریف‌های کلاس، یا 0 اگر class_defs_size == 0 (البته یک مورد حاشیه‌ای عجیب). آفست، اگر غیرصفر باشد، باید در شروع بخش class_defs باشد.
data_size uint

اندازه بخش data به بایت. باید مضرب زوج sizeof(uint) باشد. (نسخه ۴۰ یا قدیمی‌تر)

استفاده‌نشده (نسخه ۴۱ یا جدیدتر)

data_off uint

فاصله از ابتدای فایل تا ابتدای بخش data (نسخه ۴۰ یا قدیمی‌تر)

استفاده‌نشده (نسخه ۴۱ یا جدیدتر)

اندازه_ظرف uint

این فیلد وجود ندارد. می‌توان فرض کرد که برابر با file_size است. (نسخه ۴۰ یا قدیمی‌تر)

اندازه کل فایل (شامل سرایندهای dex دیگر و داده‌های آن‌ها). (نسخه ۴۱ یا جدیدتر)

header_offset uint

این فیلد وجود ندارد. می‌توان فرض کرد که برابر با 0 است. (نسخه ۴۰ یا قدیمی‌تر)

آفست از ابتدای فایل تا ابتدای این سرایند. (نسخه ۴۱ یا جدیدتر)

map_list

در بخش داده‌ها نشان داده می‌شود

ارجاع‌شده از header_item

تراز: ۴ بایت

این فهرستی از کل محتوای یک فایل به‌ترتیب است. این کلاس تاحدی با header_item هم‌پوشانی دارد اما هدف از آن ارائه فرمی آسان برای تکرار روی کل فایل است. نوع داده معینی باید حداکثر یک‌بار در نقشه ظاهر شود، اما هیچ محدودیتی در ترتیب ظاهر شدن انواع داده وجود ندارد، به‌جز محدودیت‌های ضمنی ناشی از بقیه قالب (برای نمونه، بخش header باید اول ظاهر شود و پس‌از آن بخش string_ids و غیره). علاوه‌براین، ورودی‌های نقشه باید براساس افست اولیه مرتب شوند و نباید هم‌پوشانی داشته باشند.

نام قالب شرح
اندازه uint اندازه فهرست، برحسب ورودی
فهرست map_item[size] عناصر فهرست

قالب عنصر نقشه

نام قالب شرح
نوع ushort نوع موارد؛ جدول زیر را ببینید
unused ushort (استفاده‌نشده)
اندازه uint تعداد مواردی که باید در انحراف نشان‌داده‌شده پیدا شود
پس‌گرفتن پول uint فاصله از ابتدای فایل تا موارد موردنظر

تایپ کردن کدها

نوع مورد ثابت مقدار اندازه مورد به بایت
header_item TYPE_HEADER_ITEM 0x0000 ۰x۷۰
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 ۰x۰۸
method_id_item TYPE_METHOD_ID_ITEM 0x0005 ۰x۰۸
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 ۰x۰۸
map_list TYPE_MAP_LIST ‫0x1000 ‫۴ + (item.size * 12)
type_list TYPE_TYPE_LIST 0x1001 ‫۴ + (اندازه مورد * ۲)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 ‫۴ + (اندازه مورد * ۴)
annotation_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (item.size * 4)
class_data_item TYPE_CLASS_DATA_ITEM 0x2000 ضمنی؛ باید تجزیه شود
code_item TYPE_CODE_ITEM 0x2001 ضمنی؛ باید تجزیه شود
string_data_item TYPE_STRING_DATA_ITEM 0x2002 ضمنی؛ باید تجزیه شود
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 ضمنی؛ باید تجزیه شود
annotation_item TYPE_ANNOTATION_ITEM 0x2004 ضمنی؛ باید تجزیه شود
encoded_array_item TYPE_ENCODED_ARRAY_ITEM 0x2005 ضمنی؛ باید تجزیه شود
annotations_directory_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 ضمنی؛ باید تجزیه شود
hiddenapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 ضمنی؛ باید تجزیه شود

string_id_item

در بخش string_ids نشان داده می‌شود

تراز: ۴ بایت

نام قالب شرح
string_data_off uint آفست از ابتدای فایل تا داده‌های رشته‌ای برای این مورد. انحراف باید به مکانی در بخش data باشد و داده‌ها باید در قالبی باشد که در «string_data_item» در زیر مشخص شده است. هیچ الزامی برای تراز کردن افست وجود ندارد.

string_data_item

در بخش داده‌ها نشان داده می‌شود

تراز: هیچ (تراز بایت)

نام قالب شرح
utf16_size uleb128 اندازه این رشته، در واحدهای کد UTF-16 (که در بسیاری از سیستم‌ها «طول رشته» است). یعنی این طول رمزگشایی‌شده رشته است. (طول کدبندی‌شده از موقعیت بایت 0 نتیجه می‌شود.)
داده ubyte[] رشته‌ای از واحدهای کد MUTF-8 (معروف به اکتت، معروف به بایت) به‌دنبال بایتی با مقدار 0. برای جزئیات و بحث درباره قالب داده، به «کدبندی MUTF-8 (UTF-8 اصلاح‌شده)» در بالا مراجعه کنید.

توجه: داشتن رشته‌ای که شامل واحدهای کد جایگزین UTF-16 (یعنی U+d800 … U+dfff) (شکل کدبندی‌شده) باشد، چه به‌صورت مجزا و چه خارج از ترتیب معمول کدبندی «یونی‌کد» به UTF-16، قابل‌قبول است. این وظیفه استفاده‌های سطح بالاتر از رشته‌ها است که چنین کدبندی‌های نامعتبری را درصورت لزوم رد کنند.

type_id_item

در بخش type_ids ظاهر می‌شود

تراز: ۴ بایت

نام قالب شرح
descriptor_idx uint نمایه در فهرست string_ids برای رشته توصیف‌گر از این نوع. این رشته باید با دستور زبان TypeDescriptor که در بالا تعریف شده است مطابقت داشته باشد.

proto_id_item

در بخش proto_ids نشان داده می‌شود

تراز: ۴ بایت

نام قالب شرح
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 نشان داده می‌شود

تراز: ۴ بایت

نام قالب شرح
class_idx ushort نمایه در فهرست type_ids برای تعریف‌کننده این فیلد. این باید نوع کلاس باشد، نه آرایه یا نوع اولیه.
type_idx ushort نمایه در فهرست type_ids برای نوع این فیلد
name_idx uint برای نام این فیلد، در فهرست string_ids نمایه کنید. رشته باید با نحو MemberName که در بالا تعریف شده است مطابقت داشته باشد.

method_id_item

در بخش method_ids ظاهر می‌شود

تراز: ۴ بایت

نام قالب شرح
class_idx ushort نمایه در فهرست type_ids برای تعریف‌کننده این روش. این باید از نوع کلاس یا آرایه باشد، نه از نوع ابتدایی.
proto_idx ushort نمایه در فهرست proto_ids برای پیش‌نمونه این روش
name_idx uint نمایه در فهرست string_ids برای نام این روش. این رشته باید با دستور زبان MemberName, تعریف‌شده در بالا مطابقت داشته باشد.

class_def_item

در بخش class_defs ظاهر می‌شود

تراز: ۴ بایت

نام قالب شرح
class_idx uint نمایه در فهرست type_ids برای این کلاس. این باید از نوع کلاس باشد، نه از نوع آرایه یا اولیه.
access_flags uint پرچم‌های دسترسی برای کلاس (public، final، غیره). برای جزئیات، «تعاریف access_flags» را ببینید.
superclass_idx uint شاخص در فهرست type_ids برای ابرکلاس، یا مقدار ثابت NO_INDEX اگر این کلاس ابرکلاس نداشته باشد (یعنی کلاس ریشه‌ای مثل Object باشد). اگر وجود داشته باشد، باید از نوع کلاس باشد، نه آرایه یا نوع اولیه.
interfaces_off uint آفست از شروع فایل به فهرست میاناها، یا 0 اگر هیچ‌کدام وجود نداشته باشد. این جابه‌جایی باید در بخش data باشد و داده‌های آن باید در قالب مشخص‌شده در «type_list» زیر باشد. هریک از عناصر فهرست باید از نوع کلاس باشد (نه آرایه یا نوع اولیه)، و نباید هیچ‌گونه تکراری وجود داشته باشد.
source_file_idx uint شاخص در فهرست string_ids برای نام فایلی که حاوی منبع اصلی (حداقل بیشتر) این کلاس است، یا مقدار ویژه NO_INDEX برای نشان دادن نبود این اطلاعات. debug_info_item هر روش معینی ممکن است این فایل منبع را ملغی کند، اما انتظار این است که اکثر کلاس‌ها فقط از یک فایل منبع بیایند.
annotations_off uint فاصله از ابتدای فایل تا ساختار گزارمان‌ها برای این کلاس، یا 0 اگر هیچ گزارمانی در این کلاس وجود نداشته باشد. این انحراف، اگر غیرصفر باشد، باید در بخش data باشد، و داده‌های آنجا باید در قالب مشخص‌شده توسط «annotations_directory_item» در زیر باشد، با همه مواردی که به این کلاس به‌عنوان تعریف‌کننده اشاره می‌کنند.
class_data_off uint فاصله از ابتدای فایل تا داده‌های کلاس مرتبط با این مورد، یا 0 اگر داده‌های کلاسی برای این کلاس وجود نداشته باشد. (برای مثال، اگر این کلاس یک واسط نشانگر باشد، ممکن است این‌گونه باشد.) انحراف، اگر غیرصفر باشد، باید در بخش data باشد، و داده‌های آنجا باید در قالب مشخص‌شده توسط «class_data_item» در زیر باشد، با همه عناصری که به این کلاس به‌عنوان تعریف‌کننده اشاره می‌کنند.
مقادیر ثابت خاموش است uint فاصله از ابتدای فایل تا فهرست مقادیر اولیه برای فیلدهای static، یا 0 اگر هیچ فیلدی وجود نداشته باشد (و همه فیلدهای static باید با 0 یا null مقداردهی اولیه شوند). این فاصله باید در بخش data باشد، و داده‌های آنجا باید در قالب مشخص‌شده توسط «encoded_array_item» در زیر باشد. اندازه آرایه نباید بزرگ‌تر از تعداد فیلدهای static اعلام‌شده توسط این کلاس باشد، و عناصر با فیلدهای static به همان ترتیبی که در field_list مربوطه اعلام شده‌اند مطابقت دارند. نوع هر عنصر آرایه باید با نوع اعلام‌شده فیلد مربوطه مطابقت داشته باشد. اگر تعداد عناصر در آرایه کمتر از تعداد static فیلد باشد، فیلدهای باقی‌مانده با 0 یا null متناسب با نوع مقداردهی اولیه می‌شوند.

call_site_id_item

در بخش call_site_ids نشان داده می‌شود

تراز: ۴ بایت

نام قالب شرح
call_site_off uint انحراف از شروع فایل به تعریف سایت تماس. انحراف باید در بخش داده باشد و داده‌های آنجا باید در قالبی باشد که در «مورد سایت تماس» زیر مشخص شده است.

call_site_item

در بخش داده‌ها نشان داده می‌شود

تراز: هیچ (تراز بایت)

‫call_site_item یک encoded_array_item است که عناصر آن با آرگومان‌های ارائه‌شده به روش پیونددهنده راه‌اندازی مطابقت دارد. سه استدلال اول عبارت‌اند از:

  1. یک دسته روش که نشان‌دهنده روش پیونددهنده راه‌اندازی (VALUE_METHOD_HANDLE) است.
  2. نام روشی که پیونددهنده راه‌انداز باید حل کند (VALUE_STRING).
  3. نوع روش متناظر با نوع نام روشی که باید حل شود (VALUE_METHOD_TYPE).

هرگونه آرگومان اضافی مقادیر ثابتی هستند که به روش پیونددهنده راه‌اندازی منتقل می‌شوند. این آرگومان‌ها به‌ترتیب و بدون هیچ‌گونه تبدیل نوعی ارسال می‌شوند.

دستگیره روشی که روش پیونددهنده راه‌انداز را نشان می‌دهد باید نوع پاسخ java.lang.invoke.CallSite داشته باشد. سه نوع پارامتر اول عبارت‌اند از:

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

انواع پارامترهای هرگونه آرگومان اضافی از مقادیر ثابت آن‌ها تعیین می‌شود.

method_handle_item

در بخش method_handles نشان داده می‌شود

تراز: ۴ بایت

نام قالب شرح
method_handle_type ushort نوع دستگیره روش؛ جدول زیر را ببینید
unused ushort (استفاده‌نشده)
field_or_method_id ushort شناسه فیلد یا روش بسته به اینکه نوع دستگیره روش یک دسترسی‌دهنده یا یک فراخواننده روش باشد
unused 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 ۰x۰۵ دستورالعمل روش یک فراخواننده روش نمونه است
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR ۰x۰۶ دستورات روش یک فراخواننده روش سازنده است
METHOD_HANDLE_TYPE_INVOKE_DIRECT ‫0x07 دستگیره روش یک فراخواننده روش مستقیم است
METHOD_HANDLE_TYPE_INVOKE_INTERFACE ۰x۰۸ دستورات روش یک فراخوان روش واسط است

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 به‌ترتیب صعودی مرتب شوند.
روش‌های مستقیم encoded_method[direct_methods_size] روش‌های مستقیم تعریف‌شده (هریک از static، private، یا سازنده)، که به‌صورت توالی از عناصر کدبندی‌شده نشان داده می‌شوند. روش‌ها باید براساس method_idx به‌ترتیب صعودی مرتب شوند.
روش‌های مجازی encoded_method[virtual_methods_size] روش‌های مجازی تعریف‌شده (هیچ‌کدام از static، private، یا سازنده)، که به‌صورت توالی از عناصر کدبندی‌شده نشان داده می‌شود. این فهرست نباید شامل روش‌های به‌ارث‌رسیده باشد، مگراینکه توسط کلاسی که این مورد نشان می‌دهد لغو شده باشد. روش‌ها باید براساس method_idx به‌ترتیب صعودی مرتب شوند. method_idx روش مجازی نباید با هیچ روش مستقیمی یکسان باشد.

توجه: همه نمونه‌های عنصر field_id و method_id باید به کلاس تعریف‌کننده یکسانی ارجاع دهند.

قالب encoded_field

نام قالب شرح
field_idx_diff uleb128 نمایه در فهرست field_ids برای هویت این فیلد (شامل نام و توصیفگر)، که به‌صورت تفاوت از نمایه عنصر قبلی در فهرست نشان داده می‌شود. شاخص اولین عنصر در فهرست به‌طور مستقیم نشان داده می‌شود.
access_flags uleb128 پرچم‌های دسترسی برای فیلد (public،‏ final، غیره). برای جزئیات، «تعاریف access_flags» را ببینید.

قالب encoded_method

نام قالب شرح
method_idx_diff uleb128 شاخص در فهرست method_ids برای هویت این روش (شامل نام و توصیفگر)، که به‌صورت تفاوت از شاخص عنصر قبلی در فهرست نشان داده می‌شود. نمایه اولین عنصر در فهرست مستقیماً نشان داده می‌شود.
access_flags uleb128 پرچم‌های دسترسی برای روش (public، final، و غیره). برای جزئیات، به «تعاریف access_flags» مراجعه کنید.
code_off uleb128 آفست از ابتدای فایل تا ساختار کد برای این روش، یا 0 اگر این روش یا abstract یا native باشد. جبران‌سازی باید در مکانی در بخش data باشد. قالب داده‌ها با «code_item» در زیر مشخص شده است.

type_list

ارجاع‌شده از class_def_item و proto_id_item

در بخش داده‌ها نشان داده می‌شود

تراز: ۴ بایت

نام قالب شرح
اندازه uint اندازه فهرست، برحسب ورودی
فهرست type_item[size] عناصر فهرست

قالب type_item

نام قالب شرح
type_idx ushort نمایه در فهرست type_ids

code_item

ارجاع‌شده از encoded_method

در بخش داده‌ها نشان داده می‌شود

تراز: ۴ بایت

نام قالب شرح
registers_size ushort تعداد ثبات‌های استفاده‌شده توسط این کد
ins_size ushort تعداد کلمات آرگومان‌های ورودی به روشی که این کد برای آن است
outs_size ushort تعداد کلمات فضای آرگومان خروجی موردنیاز این کد برای فراخوانی روش
tries_size ushort تعداد try_item برای این نمونه. اگر غیرصفر باشد، این موارد به‌صورت آرایه tries درست بعداز insns در این نمونه نشان داده می‌شود.
debug_info_off uint آفست از ابتدای فایل تا توالی اطلاعات اشکال‌زدایی (شماره خطوط + اطلاعات متغیر محلی) برای این کد، یا 0 اگر اطلاعاتی وجود نداشته باشد. انحراف، اگر غیرصفر باشد، باید به مکانی در بخش data باشد. قالب داده‌ها در «debug_info_item» زیر مشخص شده است.
insns_size uint اندازه فهرست دستورالعمل‌ها، در واحدهای کد ۱۶ بیتی
دستورالعمل‌ها ushort[insns_size] آرایه واقعی بایت‌کد. قالب کد در آرایه insns توسط سند همراه کد بایت Dalvik مشخص می‌شود. توجه داشته باشید که اگرچه این به‌عنوان آرایه‌ای از ushort تعریف شده است، برخی ساختارهای داخلی وجود دارند که تراز چهار بایتی را ترجیح می‌دهند. همچنین، اگر این مورد در یک فایل endian-swapped باشد، آنگاه جابه‌جایی فقط روی نمونه‌های 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 نشانی شروع بلوک کد تحت پوشش این ورودی. نشانی تعداد واحدهای کد ۱۶ بیتی تا شروع اولین دستورالعمل تحت پوشش است.
insn_count ushort تعداد واحدهای کد ۱۶ بیتی که این ورودی پوشش می‌دهد. آخرین واحد کد تحت پوشش (شامل) 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 تعداد انواع صید در این فهرست. اگر غیرمثبت باشد، این مقدار منفی تعداد انواع catch است و catchها با یک کنترل‌کننده catch-all دنبال می‌شوند. برای مثال: size از 0 به این معنی است که یک catch-all وجود دارد اما هیچ catch صریحاً تایپ‌شده‌ای وجود ندارد. ‫size از 2 یعنی دو مورد صریحاً تایپ‌شده وجود دارد و هیچ مورد همه‌گیری وجود ندارد. و size از -1 یعنی یک مورد منطبق تایپ‌شده همراه با یک مورد منطبق فراگیر وجود دارد.
کنترل‌کننده‌ها encoded_type_addr_pair[abs(size)] جاری‌سازی abs(size) عنصر کدبندی‌شده، یکی برای هر نوع گرفته‌شده، به ترتیبی که انواع باید آزمایش شوند.
catch_all_addr uleb128 (اختیاری) نشانی بایت‌کد کنترل‌کننده catch-all. این عنصر فقط درصورتی وجود دارد که 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 مرتبط در واحدهای کد ۱۶ بیتی است. ثبت 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: ثبتی که حاوی local
name_idx: شاخص رشته نام
type_idx: شاخص نوع نوع
sig_idx: شاخص رشته امضای نوع
متغیری محلی با امضای نوع در نشانی فعلی معرفی می‌کند. هرکدام از name_idx، type_idx، یا sig_idx ممکن است NO_INDEX باشد تا نشان دهد که آن مقدار نامشخص است. (اگر sig_idx -1 باشد، بااین‌حال، همان داده‌ها را می‌توان بااستفاده از کد عملیاتی DBG_START_LOCAL به‌شیوه‌ای کارآمدتر نشان داد.)

توجه: برای اطلاع از نکات احتیاطی درباره مدیریت امضاها، بحث زیر «dalvik.annotation.Signature» را ببینید.

DBG_END_LOCAL ۰x۰۵ uleb128 register_num ‫register_num: ثبت کردن آن حاوی محلی یک متغیر محلی درحال‌حاضر فعال را به‌عنوان خارج از محدوده در نشانی فعلی علامت‌گذاری می‌کند
DBG_RESTART_LOCAL ۰x۰۶ uleb128 register_num ‫register_num: برای بازراه‌اندازی ثبت کنید متغیر محلی را در نشانی فعلی دوباره معرفی می‌کند. نام و نوع آن با آخرین محلی که در ثبت مشخص‌شده زنده بوده است یکسان است.
DBG_SET_PROLOGUE_END ‫0x07 (هیچ‌کدام) ثبات ماشین حالت prologue_end را تنظیم می‌کند، و نشان می‌دهد که ورودی موقعیت بعدی که اضافه می‌شود باید انتهای پیش‌گفتار روش درنظر گرفته شود (مکان مناسبی برای نقطه گریز روش). ثبت prologue_end با هر کد عملیات ویژه (>= 0x0a) پاک می‌شود.
DBG_SET_EPILOGUE_BEGIN ۰x۰۸ (هیچ‌کدام) ثبات ماشین حالت 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

در بخش داده‌ها نشان داده می‌شود

تراز: ۴ بایت

نام قالب شرح
class_annotations_off uint فاصله از ابتدای فایل تا حاشیه‌نویسی‌های انجام‌شده مستقیماً روی کلاس، یا 0 اگر کلاس حاشیه‌نویسی مستقیم نداشته باشد. اگر مقدار افست غیرصفر باشد، باید به مکانی در بخش data اشاره کند. قالب داده‌ها با «annotation_set_item» در زیر مشخص شده است.
fields_size uint تعداد فیلدهای حاشیه‌نویسی‌شده توسط این مورد
اندازه روش‌های حاشیه‌نویسی‌شده uint تعداد روش‌های حاشیه‌نویسی‌شده با این مورد
اندازه_پارامترهای_حاشیه‌نویسی‌شده uint تعداد فهرست‌های پارامتر روش که با این مورد حاشیه‌نویسی شده است
field_annotations field_annotation[fields_size] (اختیاری) فهرست گزارمان‌های فیلد مرتبط. عناصر فهرست باید به‌ترتیب صعودی براساس field_idx مرتب شوند.
method_annotations method_annotation[methods_size] (اختیاری) فهرست نشان‌گذاری‌های روش مرتبط. عناصر فهرست باید به‌ترتیب صعودی براساس method_idx مرتب شوند.
parameter_annotations ‫parameter_annotation[parameters_size] (اختیاری) فهرست حاشیه‌نویسی‌های پارامتر روش مرتبط. عناصر فهرست باید براساس method_idx به‌ترتیب صعودی مرتب شوند.

توجه: همه نمونه‌های field_id و method_id عناصر باید به یک کلاس تعریف‌کننده ارجاع دهند.

قالب field_annotation

نام قالب شرح
field_idx uint نمایه در فهرست field_ids برای هویت فیلدی که حاشیه‌نویسی می‌شود
annotations_off uint آفست از ابتدای فایل تا فهرست گزارمان‌های مربوط به فیلد. جبران‌سازی باید در مکانی در بخش data باشد. قالب داده‌ها در «annotation_set_item» در زیر مشخص شده است.

قالب method_annotation

نام قالب شرح
method_idx uint نمایه در فهرست method_ids برای هویت روشی که حاشیه‌نویسی می‌شود
حاشیه‌نویسی‌ها خاموش است uint آفست از ابتدای فایل تا فهرست حاشیه‌نویسی‌های مربوط به روش. آفست باید به مکانی در بخش data باشد. قالب داده‌ها با «annotation_set_item» در زیر مشخص شده است.

قالب parameter_annotation

نام قالب شرح
method_idx uint نمایه در فهرست method_ids برای هویت روش که پارامترهای آن درحال حاشیه‌نویسی است
حاشیه‌نویسی‌ها خاموش است uint آفست از شروع فایل به فهرست حاشیه‌نویسی‌ها برای پارامترهای روش. انحراف باید به مکانی در بخش data باشد. قالب داده‌ها در «annotation_set_ref_list» در زیر مشخص شده است.

annotation_set_ref_list

ارجاع‌شده از parameter_annotations_item

در بخش داده‌ها نشان داده می‌شود

تراز: ۴ بایت

نام قالب شرح
اندازه uint اندازه فهرست، برحسب ورودی
فهرست annotation_set_ref_item[size] عناصر فهرست

قالب annotation_set_ref_item

نام قالب شرح
annotations_off uint فاصله از ابتدای فایل تا مجموعه گزارمان مرجع یا 0 اگر برای این عنصر گزارمانی وجود نداشته باشد. انحراف، اگر غیرصفر باشد، باید به مکانی در بخش data باشد. قالب داده‌ها در «annotation_set_item» در زیر مشخص شده است.

annotation_set_item

ارجاع‌شده از annotations_directory_item،‏ field_annotations_item،‏ method_annotations_item، و annotation_set_ref_item

در بخش داده‌ها نشان داده می‌شود

تراز: ۴ بایت

نام قالب شرح
اندازه uint اندازه مجموعه، به تعداد ورودی
ورودی‌ها annotation_off_item[size] عناصر مجموعه. عناصر باید به‌ترتیب صعودی براساس type_idx مرتب شوند.

قالب annotation_off_item

نام قالب شرح
شرح خاموش است uint آفست از ابتدای فایل تا یک گزارمان. انحراف باید به مکانی در بخش data باشد، و قالب داده‌ها در آن مکان با «annotation_item» در زیر مشخص می‌شود.

مورد_گزارمان

ارجاع‌شده از annotation_set_item

در بخش داده‌ها نشان داده می‌شود

تراز: هیچ (تراز بایت)

نام قالب شرح
رؤیت‌پذیری ubyte رؤیت‌پذیری موردنظر برای این حاشیه‌نویسی (به زیر مراجعه کنید)
گزارمان encoded_annotation محتوای حاشیه‌نویسی کدبندی‌شده، در قالبی که توسط «قالب encoded_annotation» در بخش «کدبندی encoded_value» در بالا شرح داده شده است.

مقادیر رؤیت‌پذیری

این‌ها گزینه‌های فیلد visibility در annotation_item هستند:

نام مقدار شرح
VISIBILITY_BUILD 0x00 فقط برای قابل‌مشاهده بودن در زمان ساخت (مثلاً درطول کامپایل کردن کدهای دیگر) درنظر گرفته شده است
VISIBILITY_RUNTIME 0x01 درنظر گرفته شده است که در زمان اجرا قابل‌مشاهده باشد
VISIBILITY_SYSTEM 0x02 intended to visible at runtime, but only to the underlying system (and not to regular user code)

encoded_array_item

ارجاع‌شده از class_def_item

در بخش داده‌ها نشان داده می‌شود

تراز: هیچ (تراز بایت)

نام قالب شرح
مقدار آرایه_کدبندی‌شده بایت‌هایی که مقدار آرایه کدبندی‌شده را در قالب مشخص‌شده توسط «قالب encoded_array» در بخش «کدبندی encoded_value» در بالا نشان می‌دهند.

hiddenapi_class_data_item

این بخش حاوی داده‌های مربوط به میاناهای محدودشده‌ای است که هر کلاس استفاده می‌کند.

توجه: ویژگی میانای برنامه‌سازی کاربردی پنهان در Android 10.0 معرفی شد و فقط برای فایل‌های DEX کلاس‌ها در مسیر کلاس راه‌اندازی قابل‌اجرا است. فهرست پرچم‌های شرح‌داده‌شده در زیر ممکن است در نسخه‌های آینده Android گسترش یابد. برای اطلاعات بیشتر، محدودیت‌های مربوط به میاناهای غیر کیت توسعه نرم‌افزار را ببینید.

نام قالب شرح
اندازه uint اندازه کل بخش
جبران uint[] آرایه افست‌های نمایه‌گذاری‌شده براساس class_idx. ورودی آرایه صفر در نمایه class_idx یعنی یا داده‌ای برای این class_idx وجود ندارد، یا همه پرچم‌های میانای برنامه‌سازی کاربردی پنهان صفر هستند. درغیراین‌صورت، ورودی آرایه غیرصفر است و شامل یک انحراف از ابتدای بخش به آرایه‌ای از پرچم‌های API پنهان برای این class_idx است.
پرچم‌ها uleb128[] آرایه‌های به‌هم پیوسته پرچم‌های API پنهان برای هر کلاس. مقادیر احتمالی پرچم در جدول زیر شرح داده شده است. پرچم‌ها به همان ترتیبی کدگذاری می‌شوند که فیلدها و روش‌ها در داده‌های کلاس کدگذاری می‌شوند.

انواع پرچم محدودیت:

نام مقدار شرح
فهرست مجازها 0 میاناهایی که می‌توانند آزادانه استفاده شوند و به‌عنوان بخشی از چارچوب Android که به‌طور رسمی مستند شده است نمایه بسته پشتیبانی می‌شوند.
فهرست خاکستری 1 میاناهای غیر کیت توسعه نرم‌افزار که صرف‌نظر از سطح میانای برنامه‌سازی کاربردی هدف برنامه می‌توانند استفاده شوند.
فهرست سیاه 2 واسط‌های غیرکیت توسعه نرم‌افزار که صرف‌نظر از سطح میانای برنامه‌سازی کاربردی هدف برنامه قابل‌استفاده نیستند. دسترسی به یکی از این میان‌ها باعث خطای زمان اجرا می‌شود.
greylist‑max‑o 3 میاناهای غیرکیت توسعه نرم‌افزار که می‌توانند برای Android 8.x و نسخه‌های قدیمی‌تر استفاده شوند مگر اینکه محدود شده باشند.
greylist‑max‑p 4 میاناهای غیر کیت توسعه نرم‌افزار که می‌توانند برای Android 9.x استفاده شوند مگر اینکه محدود شده باشند.
greylist‑max‑q 5 میاناهای غیر کیت توسعه نرم‌افزار که می‌توانند برای Android 10.x استفاده شوند مگر اینکه محدود شده باشند.
greylist‑max‑r 6 واسط‌های غیر کیت توسعه نرم‌افزار که می‌توانند برای Android 11.x استفاده شوند، مگراینکه محدود شده باشند.

حاشیه‌نویسی‌های سیستم

حاشیه‌نویسی‌های سیستم برای نمایش بخش‌های مختلف اطلاعات بازتابی درباره کلاس‌ها (و روش‌ها و فیلدها) استفاده می‌شود. این اطلاعات معمولاً فقط به‌طور غیرمستقیم توسط کد مشتری (غیرسیستم) قابل دسترسی است.

گزارمان‌های سیستم در فایل‌های .dex به‌صورت گزارمان‌هایی با نمایان بودن تنظیم‌شده روی VISIBILITY_SYSTEM نشان داده می‌شود.

dalvik.annotation.AnnotationDefault

در روش‌های موجود در میاناهای حاشیه‌نویسی نشان داده می‌شود

یک یادداشت AnnotationDefault به هر واسط یادداشتی که می‌خواهد پیوندهای پیش‌فرض را نشان دهد پیوست می‌شود.

نام قالب شرح
مقدار حاشیه‌نویسی the default bindings for this annotation, represented as an annotation of this type. شرح لازم نیست شامل همه نام‌های تعریف‌شده توسط شرح باشد؛ نام‌های ازدست‌رفته به‌سادگی پیش‌فرض ندارند.

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

در روش‌ها نشان داده می‌شود

توجه: این گزارمان پس‌از Android نسخه ۷.۱ اضافه شده است. وجود آن در نسخه‌های پخش قدیمی‌تر Android نادیده گرفته خواهد شد.

حاشیه‌نویسی MethodParameters اختیاری است و می‌تواند برای ارائه فراداده پارامتر مانند نام پارامتر و اصلاح‌کننده استفاده شود.

وقتی فراداده پارامتر در زمان اجرا موردنیاز نباشد، می‌توان حاشیه‌نویسی را به‌طور ایمن از روش یا سازنده حذف کرد. java.lang.reflect.Parameter.isNamePresent() را می‌توان برای بررسی اینکه آیا فراداده برای پارامتری وجود دارد یا نه استفاده کرد، و روش‌های بازتاب مرتبط مانند java.lang.reflect.Parameter.getName() در زمان اجرا، اگر اطلاعات وجود نداشته باشد، به رفتار پیش‌فرض برمی‌گردند.

هنگام افزودن فراداده پارامتر، کامپایلرها باید اطلاعات مربوط به کلاس‌های تولیدشده مثل شمارشی‌ها را اضافه کنند، زیرا فراداده پارامتر شامل این می‌شود که آیا پارامتر مصنوعی یا اجباری است یا نه.

یک شرح MethodParameters فقط پارامترهای روش فردی را توصیف می‌کند. بنابراین، کامپایلرها ممکن است حاشیه‌نویسی را به‌طور کامل برای سازنده‌ها و روش‌هایی که پارامتر ندارند حذف کنند تا اندازه کد و کارایی زمان اجرا بهبود یابد.

آرایه‌های مستندشده در زیر باید هم‌اندازه با method_id_item ساختار dex مرتبط با روش باشند، درغیراین‌صورت java.lang.reflect.MalformedParametersException در زمان اجرا ایجاد خواهد شد.

یعنی: method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size باید با names().length و accessFlags().length یکسان باشد.

ازآنجایی‌که MethodParameters همه پارامترهای روش رسمی را توصیف می‌کند، حتی آن‌هایی که به‌طور صریح یا ضمنی در کد منبع اعلام نشده‌اند، اندازه آرایه‌ها ممکن است با «امضا» یا دیگر اطلاعات فراداده که فقط براساس پارامترهای صریح اعلام‌شده در کد منبع است متفاوت باشد. MethodParameters همچنین هیچ اطلاعاتی درباره پارامترهای گیرنده حاشیه‌نویسی نوع که در امضای روش واقعی وجود ندارند، نخواهد داشت.

نام قالب شرح
نام‌ها رشته[] نام‌های پارامترهای رسمی برای روش مرتبط. آرایه نباید تهی باشد اما اگر پارامترهای رسمی وجود نداشته باشد باید خالی باشد. اگر پارامتر رسمی با آن نمایه نامی نداشته باشد، مقدار موجود در آرایه باید تهی باشد.
اگر رشته‌های نام پارامتر خالی باشند یا حاوی «.»، «;»، «[»، یا «/» باشند، java.lang.reflect.MalformedParametersException در زمان اجرا پرتاب خواهد شد.
accessFlags int[] پرچم‌های دسترسی پارامترهای رسمی برای روش مرتبط. اگر پارامتر رسمی وجود ندارد، آرایه نباید تهی باشد اما باید خالی باشد.
مقدار یک ماسک بیت با مقادیر زیر است:
  • ‫0x0010 : نهایی، پارامتر نهایی اعلام شد
  • 0x1000 : synthetic, the parameter was introduced by the compiler
  • ‫0x8000 : اجباری، پارامتر مصنوعی است اما در مشخصات زبان نیز ذکر شده است
اگر هر بیتی خارج از این مجموعه تنظیم شود، java.lang.reflect.MalformedParametersException در زمان اجرا ایجاد خواهد شد.

dalvik.annotation.Signature

در کلاس‌ها، فیلدها، و روش‌ها ظاهر می‌شود

یک گزارمان Signature به هر کلاس، فیلد، یا روشی که براساس نوع پیچیده‌تری تعریف شده است که با type_id_item قابل‌نمایش نیست پیوست می‌شود. قالب .dex قالب امضاها را تعریف نمی‌کند؛ صرفاً برای این است که بتواند هر امضایی را که زبان منبع برای پیاده‌سازی موفق معناشناسی آن زبان نیاز دارد نشان دهد. به‌همین دلیل، امضاها معمولاً توسط پیاده‌سازی‌های ماشین مجازی تجزیه (یا درستی‌سنجی) نمی‌شوند. امضاها به‌سادگی به میاناهای برنامه‌سازی کاربردی و ابزارهای سطح بالاتر (مانند اشکال‌زداها) واگذار می‌شوند. بنابراین، هرگونه استفاده از امضا باید به‌گونه‌ای نوشته شود که هیچ فرضی درباره دریافت امضاهای معتبر نداشته باشد و صریحاً خود را دربرابر احتمال مواجهه با امضای نامعتبر ازنظر نحوی محافظت کند.

چون رشته‌های امضا معمولاً محتوای تکراری زیادی دارند، حاشیه‌نویسی Signature به‌عنوان آرایه‌ای از رشته‌ها تعریف می‌شود که در آن عناصر تکراری طبیعتاً به همان داده‌های اساسی ارجاع می‌دهند و امضا به‌عنوان الحاق همه رشته‌ها در آرایه درنظر گرفته می‌شود. هیچ قانونی درباره نحوه جدا کردن امضا به رشته‌های جداگانه وجود ندارد؛ این کاملاً به ابزارهایی که فایل‌های .dex را تولید می‌کنند بستگی دارد.

نام قالب شرح
مقدار رشته[] امضای این کلاس یا عضو، به‌عنوان آرایه‌ای از رشته‌ها که باید به‌هم متصل شوند

dalvik.annotation.Throws

در روش‌ها نشان داده می‌شود

یک Throws گزارمان به هر روشی که اعلام شده است یک یا چند نوع استثنا را ایجاد می‌کند پیوست می‌شود.

نام قالب شرح
مقدار کلاس[] آرایه انواع استثناهای پرتاب‌شده