این سند طرحبندی و محتوای فایلهای .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 |
|---|---|---|---|
| 00 | 0 | 0 | ۱- |
| ۰۱ | 1 | 1 | 0 |
| ۷f | ۱- | 127 | 126 |
| ۸۰ ۷f | -128 | 16256 | 16255 |
چیدمان فایل
| نام | قالب | شرح |
|---|---|---|
| سرایند | header_item | سرایند |
| string_ids | string_id_item[] | فهرست شناسههای رشتهای. اینها شناسههایی برای همه رشتههای استفادهشده توسط این فایل هستند، چه برای نامگذاری داخلی (مثلاً توصیفکنندههای نوع) یا بهعنوان اشیای ثابت ارجاعشده توسط کد. این فهرست باید براساس محتوای رشته بااستفاده از مقادیر نقطه کد UTF-16 (نه به روش حساس به زبان) مرتب شود و نباید حاوی هیچ ورودی تکراری باشد. |
| type_ids | type_id_item[] | فهرست شناسههای نوع. اینها شناسههای همه انواع (کلاسها،
آرایهها، یا انواع ابتدایی) هستند که این فایل به آنها ارجاع میدهد، چه در فایل تعریف شده باشند چه نه. این فهرست باید براساس نمایه string_id
مرتب شود و نباید حاوی ورودیهای تکراری باشد.
|
| proto_ids | proto_id_item[] | فهرست شناسههای نمونه اولیه روش. اینها شناسههای همه
نمونههای اولیهای هستند که این فایل به آنها ارجاع میدهد. این فهرست باید براساس
نوع برگشتی (با ترتیب اصلی type_id) مرتب شود، و سپس
براساس فهرست آرگومان (ترتیب واژگانی، آرگومانهای جداگانه
براساس ترتیب type_id) مرتب شود. فهرست نباید
هیچ ورودی تکراری داشته باشد.
|
| field_ids | field_id_item[] | فهرست شناسههای فیلد. اینها شناسههای همه فیلدهایی هستند که
این فایل به آنها ارجاع میدهد، چه در فایل تعریف شده باشند چه نشده باشند. این
فهرست باید مرتب شود، که در آن نوع تعریفکننده (براساس type_id
نمایه) ترتیب اصلی، نام فیلد (براساس string_id نمایه)
ترتیب میانی، و نوع (براساس type_id نمایه)
ترتیب فرعی است. فهرست نباید حاوی ورودیهای تکراری باشد.
|
| method_ids | method_id_item[] | فهرست شناسههای روش. اینها شناسههای همه روشهایی هستند که این فایل به آنها ارجاع میدهد، چه در فایل تعریف شده باشند چه نشده باشند. این
فهرست باید مرتب شود، بهطوریکه نوع تعریفکننده (براساس type_id
نمایه) ترتیب اصلی، نام روش (براساس string_id
نمایه) ترتیب میانی، و پیشنمونه روش (براساس
نمایه proto_id) ترتیب فرعی باشد. فهرست نباید
هیچ ورودی تکراری داشته باشد.
|
| class_defs | class_def_item[] | فهرست تعریفهای کلاس. کلاسها باید بهترتیبی مرتب شوند که ابرکلاس و واسطهای پیادهسازیشده کلاس معین در فهرست زودتر از کلاس ارجاعدهنده ظاهر شوند. علاوهبراین، اگر تعریف کلاسی با نام یکسان بیشاز یکبار در فهرست ظاهر شود، نامعتبر است. |
| call_site_ids | call_site_id_item[] | فهرست شناسههای سایت تماس. اینها شناسههای همه سایتهای تماسی هستند که این فایل به آنها ارجاع میدهد، چه در فایل تعریف شده باشند چه نشده باشند. این فهرست باید براساس call_site_off بهترتیب صعودی مرتب شود.
|
| method_handles | method_handle_item[] | فهرست روشها را مدیریت میکند. فهرستی از همه دستههای روش که این فایل به آنها ارجاع داده است، چه در فایل تعریف شده باشند چه نه. این فهرست مرتب نشده است و ممکن است حاوی موارد تکراری باشد که ازنظر منطقی با نمونههای مختلف دسته روش مطابقت دارد. |
| داده | ubyte[] | ناحیه داده، حاوی همه دادههای پشتیبانی برای جدولهای فهرستشده در بالا. موارد مختلف الزامات تراز مختلفی دارند و اگر لازم باشد، بایتهای حاشیهای قبلاز هر مورد درج میشوند تا تراز مناسب بهدست آید. |
| link_data | ubyte[] | دادههای استفادهشده در فایلهای پیوندشده بهصورت ایستا. قالب دادهها در این بخش در این سند مشخص نشده است. این بخش در فایلهای پیوندنشده خالی است و پیادهسازیهای زمان اجرا ممکن است از آن به صلاحدید خود استفاده کنند. |
قالب محتوی
نسخه ۴۱ قالب جدیدی برای دادههای 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_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_off | uint |
فاصله از ابتدای فایل تا ابتدای بخش استفادهنشده (نسخه ۴۱ یا جدیدتر) |
| اندازه_ظرف | uint |
این فیلد وجود ندارد. میتوان فرض کرد که برابر با اندازه کل فایل (شامل سرایندهای dex دیگر و دادههای آنها). (نسخه ۴۱ یا جدیدتر) |
| header_offset | uint |
این فیلد وجود ندارد. میتوان فرض کرد که برابر با آفست از ابتدای فایل تا ابتدای این سرایند. (نسخه ۴۱ یا جدیدتر) |
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 (یعنی |
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 است که عناصر آن با آرگومانهای ارائهشده به روش پیونددهنده راهاندازی مطابقت دارد. سه استدلال اول عبارتاند از:
- یک دسته روش که نشاندهنده روش پیونددهنده راهاندازی (VALUE_METHOD_HANDLE) است.
- نام روشی که پیونددهنده راهانداز باید حل کند (VALUE_STRING).
- نوع روش متناظر با نوع نام روشی که باید حل شود (VALUE_METHOD_TYPE).
هرگونه آرگومان اضافی مقادیر ثابتی هستند که به روش پیونددهنده راهاندازی منتقل میشوند. این آرگومانها بهترتیب و بدون هیچگونه تبدیل نوعی ارسال میشوند.
دستگیره روشی که روش پیونددهنده راهانداز را نشان میدهد باید نوع پاسخ java.lang.invoke.CallSite داشته باشد. سه نوع پارامتر اول عبارتاند از:
java.lang.invoke.Lookupjava.lang.Stringjava.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: ثبتی که حاوی localname_idx: شاخص رشته نامtype_idx: شاخص نوع نوعsig_idx: شاخص رشته امضای نوع
|
متغیری محلی با امضای نوع در نشانی فعلی معرفی میکند.
هرکدام از name_idx، type_idx، یا
sig_idx ممکن است NO_INDEX باشد
تا نشان دهد که آن مقدار نامشخص است. (اگر sig_idx
-1 باشد، بااینحال، همان دادهها را میتوان بااستفاده از کد عملیاتی DBG_START_LOCAL بهشیوهای کارآمدتر نشان داد.)
توجه: برای اطلاع از نکات احتیاطی درباره
مدیریت امضاها، بحث زیر
« |
| 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[] | پرچمهای دسترسی پارامترهای رسمی برای روش مرتبط. اگر پارامتر رسمی وجود ندارد، آرایه نباید تهی باشد اما باید خالی باشد. مقدار یک ماسک بیت با مقادیر زیر است:
java.lang.reflect.MalformedParametersException در زمان اجرا ایجاد خواهد شد.
|
dalvik.annotation.Signature
در کلاسها، فیلدها، و روشها ظاهر میشود
یک گزارمان Signature به هر کلاس،
فیلد، یا روشی که براساس نوع پیچیدهتری تعریف شده است
که با type_id_item قابلنمایش نیست پیوست میشود. قالب
.dex قالب امضاها را تعریف نمیکند؛
صرفاً برای این است که بتواند هر امضایی را که زبان منبع
برای پیادهسازی موفق معناشناسی آن زبان نیاز دارد
نشان دهد. بههمین دلیل، امضاها معمولاً توسط پیادهسازیهای ماشین مجازی تجزیه (یا درستیسنجی) نمیشوند. امضاها بهسادگی به میاناهای برنامهسازی کاربردی و ابزارهای سطح بالاتر (مانند اشکالزداها) واگذار میشوند. بنابراین، هرگونه استفاده از امضا باید بهگونهای نوشته شود که هیچ فرضی درباره دریافت امضاهای معتبر نداشته باشد و صریحاً خود را دربرابر احتمال مواجهه با امضای نامعتبر ازنظر نحوی محافظت کند.
چون رشتههای امضا معمولاً محتوای تکراری زیادی دارند،
حاشیهنویسی Signature بهعنوان آرایهای از
رشتهها تعریف میشود که در آن عناصر تکراری طبیعتاً به همان
دادههای اساسی ارجاع میدهند و امضا بهعنوان الحاق
همه رشتهها در آرایه درنظر گرفته میشود. هیچ قانونی درباره نحوه جدا کردن امضا به رشتههای جداگانه وجود ندارد؛ این کاملاً به ابزارهایی که فایلهای .dex را تولید میکنند بستگی دارد.
| نام | قالب | شرح |
|---|---|---|
| مقدار | رشته[] | امضای این کلاس یا عضو، بهعنوان آرایهای از رشتهها که باید بههم متصل شوند |
dalvik.annotation.Throws
در روشها نشان داده میشود
یک Throws گزارمان به هر روشی که
اعلام شده است یک یا چند نوع استثنا را ایجاد میکند پیوست میشود.
| نام | قالب | شرح |
|---|---|---|
| مقدار | کلاس[] | آرایه انواع استثناهای پرتابشده |