מסמך זה מתאר את הפריסה והתוכן של קובצי .dex
, המשמשים לשמירה על קבוצה של הגדרות מחלקות ונתוני נלווים הקשורים אליהן.
מדריך לסוגים
שֵׁם | תיאור |
---|---|
בייט | 8 סיביות חתומות |
ubyte | 8-bit unsigned int |
קצר | 16-bit חתום int, little-endian |
קצר | 16-bit unsigned int, little-endian |
int | 32-bit חתום int, little-endian |
uint | 32-bit unsigned int, little-endian |
ארוך | 64-bit חתום int, little-endian |
ulong | int 64 סיביות לא חתום, little-endian |
sleb128 | חתום LEB128, באורך משתנה (ראה להלן) |
uleb128 | LEB128 לא חתום, באורך משתנה (ראה להלן) |
uleb128p1 | LEB128 פלוס 1 ללא חתימה, באורך משתנה (ראה להלן) |
LEB128
LEB128 (" L ittle- En ndian B ase 128 ") הוא קידוד באורך משתנה עבור כמויות שלמים בחתימה שרירותית או ללא סימן. הפורמט הושאל ממפרט DWARF3 . בקובץ .dex
, LEB128 משמש רק לקידוד כמויות של 32 סיביות.
כל ערך מקודד LEB128 מורכב מאחד עד חמישה בתים, המייצגים יחד ערך בודד של 32 סיביות. לכל בייט יש את הסיביות המשמעותיות ביותר שלו פרט לבייט הסופי ברצף, שהסיביות המשמעותית ביותר שלו ברורה. שבעת הסיביות הנותרות של כל בייט הן מטען, כאשר שבעת הסיביות הפחות משמעותיות של הכמות בבייט הראשון, שבעת הבאות בבייט השני וכן הלאה. במקרה של LEB128 חתום ( sleb128
), סיבית המטען המשמעותית ביותר של הבית הסופי ברצף מורחב בסימן כדי לייצר את הערך הסופי. במקרה הבלתי חתום ( uleb128
), כל סיביות שאינן מיוצגות במפורש מתפרשות כ 0
.
דיאגרמת סיביות של ערך LEB128 של שני בתים | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
בייט ראשון | בייט שני | ||||||||||||||
1 | סיביות 6 | סיביות 5 | סיביות 4 | סיביות 3 | ביט 2 | סיביות 1 | ביט 0 | 0 | סיביות 13 | סיביות 12 | סיביות 11 | סיביות 10 | סיביות 9 | סיביות 8 | סיביות 7 |
הגרסה uleb128p1
משמשת לייצוג ערך בסימן, כאשר הייצוג הוא של הערך פלוס אחד המקודד כ- uleb128
. זה הופך את הקידוד של -1
(לחילופין נחשב כערך ללא סימן 0xffffffff
) - אבל שום מספר שלילי אחר - לבייט בודד, והוא שימושי בדיוק באותם מקרים שבהם המספר המיוצג חייב להיות לא שלילי או -1
(או 0xffffffff
), ושם לא מותרים ערכים שליליים אחרים (או כאשר לא סביר שיהיה צורך בערכים גדולים ללא סימנים).
להלן כמה דוגמאות לפורמטים:
רצף מקודד | בתור sleb128 | בתור uleb128 | בתור uleb128p1 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7ו | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
פריסת קובץ
שֵׁם | פוּרמָט | תיאור |
---|---|---|
כּוֹתֶרֶת | header_item | הכותרת |
string_ids | string_id_item[] | רשימת מזהי מחרוזת. אלו הם מזהים עבור כל המחרוזות המשמשות את הקובץ הזה, או למתן שמות פנימיים (למשל, מתארי סוג) או כאובייקטים קבועים שמתייחסים אליהם בקוד. רשימה זו חייבת להיות ממוינת לפי תוכן מחרוזת, תוך שימוש בערכי נקודת קוד UTF-16 (לא באופן רגיש לאזור), ואין לה להכיל ערכים כפולים. |
type_ID | type_id_item[] | רשימת מזהי סוגים. אלו הם מזהים לכל הסוגים (מחלקות, מערכים או טיפוסים פרימיטיביים) אליהם מתייחס הקובץ הזה, בין אם הם מוגדרים בקובץ ובין אם לא. רשימה זו חייבת להיות ממוינת לפי string_id index, והיא לא יכולה להכיל ערכים כפולים. |
proto_ids | proto_id_item[] | רשימת מזהי אב טיפוס של שיטה. אלו הם מזהים עבור כל אבות הטיפוס שאליהם הקובץ הזה מתייחס. יש למיין רשימה זו בסדר עיקרי מסוג החזרה (לפי type_id index), ולאחר מכן לפי רשימת ארגומנטים (סדר לקסיקוגרפי, ארגומנטים בודדים מסודרים לפי אינדקס type_id ). אסור שהרשימה תכיל ערכים כפולים. |
field_ids | field_id_item[] | רשימת מזהי שדות. אלו הם מזהים לכל השדות אליהם מתייחס הקובץ הזה, בין אם הם מוגדרים בקובץ ובין אם לא. יש למיין את הרשימה הזו, כאשר הסוג המגדיר (לפי type_id index) הוא הסדר הראשי, שם השדה (לפי string_id index) הוא סדר הביניים, ו-type (by type_id index) הוא הסדר המינורי. אסור שהרשימה תכיל ערכים כפולים. |
method_ids | method_id_item[] | רשימת מזהי שיטה. אלו הם מזהים לכל השיטות שהקובץ הזה מתייחס אליהן, בין אם מוגדרות בקובץ ובין אם לא. יש למיין את הרשימה הזו, כאשר הסוג המגדיר (לפי type_id index) הוא הסדר הראשי, שם השיטה (לפי string_id index) הוא סדר הביניים, ואב הטיפוס של השיטה (לפי מדד 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[] | נתונים המשמשים בקבצים מקושרים סטטית. פורמט הנתונים בסעיף זה אינו מצוין במסמך זה. קטע זה ריק בקבצים לא מקושרים, ויישומי זמן ריצה עשויים להשתמש בו כראות עיניהם. |
Bitfield, מחרוזת והגדרות קבועות
DEX_FILE_MAGIC
מוטבע ב-header_item
המערך/מחרוזת הקבועה DEX_FILE_MAGIC
היא רשימת הבתים שחייבים להופיע בתחילת קובץ .dex
כדי שיוכר ככזה. הערך מכיל בכוונה שורה חדשה ( "\n"
או 0x0a
) ובית null ( "\0"
או 0x00
) על מנת לסייע באיתור צורות מסוימות של שחיתות. הערך גם מקודד מספר גרסת פורמט כשלוש ספרות עשרוניות, שצפוי לעלות באופן מונוטוני עם הזמן ככל שהפורמט יתפתח.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
הערה: תמיכה בגרסה 039
של הפורמט נוספה במהדורת אנדרואיד 9.0, שהציגה שני קודי בתים חדשים, const-method-handle
ו- const-method-type
. (כל אחד מהם מתואר בטבלת סיכום של ערכת קוד בתים .) באנדרואיד 10, גרסה 039
מרחיבה את פורמט קובץ ה-DEX כך שיכלול מידע API מוסתר שמתאים רק לקבצי DEX בנתיב מחלקת האתחול.
הערה: תמיכה בגרסה 038
של הפורמט נוספה במהדורת אנדרואיד 8.0. גרסה 038
הוסיפה בתים-קודים חדשים ( invoke-polymorphic
ו- invoke-custom
) ונתונים עבור נקודות אחיזה של השיטה.
הערה: תמיכה בגרסה 037
של הפורמט נוספה במהדורת אנדרואיד 7.0. לפני גרסה 037
רוב הגרסאות של אנדרואיד השתמשו בגרסה 035
של הפורמט. ההבדל היחיד בין גרסאות 035
ו 037
הוא הוספת שיטות ברירת המחדל והתאמת ה- invoke
.
הערה: לפחות כמה גרסאות קודמות של הפורמט שימשו במהדורות תוכנה ציבוריות זמינות. לדוגמה, גרסה 009
שימשה עבור מהדורות M3 של פלטפורמת אנדרואיד (נובמבר–דצמבר 2007), וגרסה 013
שימשה עבור מהדורות M5 של פלטפורמת אנדרואיד (פברואר–מרץ 2008). מכמה בחינות, גרסאות קודמות אלה של הפורמט שונות באופן משמעותי מהגרסה המתוארת במסמך זה.
ENDIAN_CONSTANT ו-REVERSE_ENDIAN_CONSTANT
מוטבע ב-header_item
הקבוע ENDIAN_CONSTANT
משמש לציון הקצה של הקובץ שבו הוא נמצא. למרות שפורמט .dex
הסטנדרטי הוא מעט נדיאני, יישומים עשויים לבחור לבצע החלפת בתים. אם יישום יתקל בכותרת שה- endian_tag
שלה הוא REVERSE_ENDIAN_CONSTANT
במקום ENDIAN_CONSTANT
, הוא יידע שהקובץ הוחלף בתים מהצורה הצפויה.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
NO_INDEX
מוטבע ב-class_def_item וב-debug_info_item
הקבוע NO_INDEX
משמש לציון שערך אינדקס חסר.
הערה: ערך זה אינו מוגדר כ 0
, כי זה למעשה אינדקס חוקי.
הערך הנבחר עבור NO_INDEX
ניתן לייצוג כבייט בודד בקידוד uleb128p1
.
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
הגדרות access_flags
מוטבע ב-class_def_item, encoded_field, encoded_method ו-InnerClass
שדות סיביות של דגלים אלה משמשים לציון הנגישות והמאפיינים הכוללים של מחלקות וחברי כיתה.
שֵׁם | ערך | לשיעורים (והערות InnerClass ) | עבור שדות | עבור שיטות |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : גלוי בכל מקום | public : גלוי בכל מקום | public : גלוי בכל מקום |
ACC_PRIVATE | 0x2 | private : גלוי רק להגדרת המחלקה | private : גלוי רק להגדרת המחלקה | private : גלוי רק להגדרת המחלקה |
ACC_PROTECTED | 0x4 | protected : גלוי לחבילה ותתי מחלקות | protected : גלוי לחבילה ותתי מחלקות | protected : גלוי לחבילה ותתי מחלקות |
ACC_STATIC | 0x8 | static : אינו בנוי עם אסמכתא חיצונית this | static : מחלקה גלובלית עד מגדירה | static : לא לוקח את הטיעון this |
ACC_FINAL | 0x10 | final : לא ניתן לסיווג משנה | final : בלתי משתנה לאחר הבנייה | final : לא ניתן לעקוף |
ACC_SYNCHRONIZED | 0x20 | synchronized : מנעול משויך נרכש אוטומטית סביב קריאה לשיטה זו. הערה: זה תקף להגדרה רק כאשר | ||
ACC_VOLATILE | 0x40 | volatile : כללי גישה מיוחדים כדי לסייע בבטיחות החוטים | ||
ACC_BRIDGE | 0x40 | שיטת גשר, נוספה אוטומטית על ידי מהדר כגשר בטוח מסוג | ||
ACC_TRANSIENT | 0x80 | transient : לא להישמר כברירת מחדל | ||
ACC_VARARGS | 0x80 | יש להתייחס לארגומנט האחרון כאל ארגומנט "מנוחה" על ידי המהדר | ||
ACC_NATIVE | 0x100 | native : מיושם בקוד מקורי | ||
ACC_INTERFACE | 0x200 | interface : מחלקה מופשטת הניתנת ליישום כפול | ||
ACC_ABSTRACT | 0x400 | abstract : לא ניתן לזיהוי ישיר | abstract : לא מיושם על ידי מחלקה זו | |
ACC_STRICT | 0x800 | strictfp : כללים נוקשים לאריתמטיקה של נקודה צפה | ||
ACC_SYNTHETIC | 0x1000 | לא מוגדר ישירות בקוד המקור | לא מוגדר ישירות בקוד המקור | לא מוגדר ישירות בקוד המקור |
ACC_ANNOTATION | 0x2000 | הוכרז כמעמד ביאור | ||
ACC_ENUM | 0x4000 | הוכרז כסוג מסופר | הוכרז כערך מסופר | |
(לא בשימוש) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | שיטת בנאי (מאתחל מחלקה או מופע) | ||
ACC_DECLARED_ מסונכרן | 0x20000 | הוכרז synchronized .הערה: אין לכך השפעה על הביצוע (מלבד בשיקוף של דגל זה, כשלעצמו). |
InnerClass
, ואסור להפעיל אותו לעולם ב- class_def_item
.
קידוד MUTF-8 (שינוי UTF-8).
כוויתור לתמיכה קלה יותר מדור קודם, פורמט ה- .dex
מקודד את נתוני המחרוזת שלו בצורת UTF-8 מתוקנת דה-פקטו, להלן MUTF-8. טופס זה זהה ל-UTF-8 הסטנדרטי, למעט:
- נעשה שימוש רק בקידוד של אחד, שניים ושלושה בתים.
- נקודות קוד בטווח
U+10000
…U+10ffff
מקודדות כזוג פונדקאות, שכל אחת מהן מיוצגת כערך מקודד של שלושה בתים. - נקודת הקוד
U+0000
מקודדת בצורת שני בתים. - בית null רגיל (ערך
0
) מציין את סוף המחרוזת, וכך גם הפירוש הסטנדרטי של שפת C.
ניתן לסכם את שני הפריטים הראשונים לעיל כך: MUTF-8 הוא פורמט קידוד עבור UTF-16, במקום להיות פורמט קידוד ישיר יותר עבור תווי Unicode.
שני הפריטים האחרונים לעיל מאפשרים בו זמנית לכלול את נקודת הקוד U+0000
במחרוזת ועדיין לתפעל אותה כמחרוזת עם סיומת אפס בסגנון C.
עם זאת, הקידוד המיוחד של U+0000
אומר שבניגוד ל-UTF-8 רגיל, התוצאה של קריאה לפונקציית C הסטנדרטית strcmp()
על זוג מחרוזות MUTF-8 לא תמיד מציינת את התוצאה החתומה כהלכה של השוואה של מחרוזות לא שוות . כאשר סדר (לא רק שוויון) הוא דאגה, הדרך הפשוטה ביותר להשוות מחרוזות MUTF-8 היא לפענח אותן תו אחר תו, ולהשוות בין הערכים המפוענחים. (עם זאת, אפשר גם יישומים חכמים יותר.)
אנא עיין ב-Unicode Standard לקבלת מידע נוסף על קידוד תווים. MUTF-8 למעשה קרוב יותר לקידוד CESU-8 (הפחות מוכר יחסית) מאשר ל-UTF-8 כשלעצמו.
קידוד encoded_value
מוטבע ב-annotation_element וב-encoded_array_item
encoded_value
הוא חלק מקודד של נתונים (כמעט) שרירותיים במבנה היררכי. הקידוד נועד להיות גם קומפקטי וגם פשוט לניתוח.
שֵׁם | פוּרמָט | תיאור |
---|---|---|
(value_arg << 5) | סוג_ערך | ubyte | בייט המציין את סוג 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 | גודל - 1 (0...1) | ubyte [גודל] | ערך מספר שלם בסימן שני בתים, מורחב בסימן |
VALUE_CHAR | 0x03 | גודל - 1 (0...1) | ubyte [גודל] | ערך מספר שלם של שני בתים ללא סימן, מורחב אפס |
VALUE_INT | 0x04 | גודל - 1 (0...3) | ubyte [גודל] | ערך מספר שלם של ארבעה בתים חתום, מורחב בסימן |
VALUE_LONG | 0x06 | מידה - 1 (0…7) | ubyte [גודל] | ערך מספר שלם בסימן שמונה בתים, מורחב בסימן |
VALUE_FLOAT | 0x10 | גודל - 1 (0...3) | ubyte [גודל] | דפוס סיביות של ארבעה בתים, מורחב אפס ימינה , ומתפרש כערך IEEE754 32 סיביות נקודה צפה |
VALUE_DOUBLE | 0x11 | מידה - 1 (0…7) | ubyte [גודל] | תבנית סיביות של שמונה בתים, מורחבת אפס ימינה , ומתפרשת כערך IEEE754 64 סיביות נקודה צפה |
VALUE_METHOD_TYPE | 0x15 | גודל - 1 (0...3) | ubyte [גודל] | ערך מספר שלם של ארבעה בתים ללא סימן (מורחב אפס), מתפרש כאינדקס למקטע proto_ids ומייצג ערך מסוג שיטה |
VALUE_METHOD_HANDLE | 0x16 | גודל - 1 (0...3) | ubyte [גודל] | ערך מספר שלם של ארבעה בתים ללא סימן (מורחב אפס), המתפרש כאינדקס לתוך המקטע method_handles ומייצג ערך טיפול של מתודה |
VALUE_STRING | 0x17 | גודל - 1 (0...3) | ubyte [גודל] | ערך מספר שלם של ארבעה בתים ללא סימן (מורחב אפס), מתפרש כאינדקס למקטע string_ids ומייצג ערך מחרוזת |
VALUE_TYPE | 0x18 | גודל - 1 (0...3) | ubyte [גודל] | ערך מספר שלם של ארבעה בתים ללא סימן (מורחב אפס), מתפרש כאינדקס בקטע type_ids ומייצג ערך סוג/מחלקה משקף |
VALUE_FIELD | 0x19 | גודל - 1 (0...3) | ubyte [גודל] | ערך מספר שלם של ארבעה בתים ללא סימן (מורחב אפס), מתפרש כאינדקס בקטע field_ids ומייצג ערך שדה רפלקטיבי |
VALUE_METHOD | 0x1a | גודל - 1 (0...3) | ubyte [גודל] | ערך מספר שלם של ארבעה בתים ללא סימן (מורחב אפס), מתפרש כאינדקס בקטע method_ids ומייצג ערך שיטה רפלקטיבי |
VALUE_ENUM | 0x1b | גודל - 1 (0...3) | ubyte [גודל] | ערך מספר שלם של ארבעה בתים ללא סימן (מורחב אפס), מתפרש כאינדקס בקטע field_ids ומייצג את הערך של קבוע טיפוס שנמנה |
VALUE_ARRAY | 0x1c | (אין; חייב להיות 0 ) | מערך_מקודד | מערך של ערכים, בפורמט המצוין ב-" encoded_array format" להלן. גודל value משתמע בקידוד. |
VALUE_ANNOTATION | 0x1d | (אין; חייב להיות 0 ) | ביאור_מקודד | ביאור משנה, בפורמט המצוין ב-" encoded_annotation format" להלן. גודל value משתמע בקידוד. |
VALUE_NULL | 0x1e | (אין; חייב להיות 0 ) | (אף אחד) | ערך הפניה null |
VALUE_BOOLEAN | 0x1f | בוליאני (0…1) | (אף אחד) | ערך סיביות אחד; 0 עבור false ו 1 עבור true . הביט מיוצג ב- value_arg . |
תבנית_encoded_array
שֵׁם | פוּרמָט | תיאור |
---|---|---|
גודל | uleb128 | מספר האלמנטים במערך |
ערכים | ערך_מקודד[גודל] | סדרה של רצפי בתים size encoded_value בפורמט שצוין בסעיף זה, משורשרים ברצף. |
תבנית_encoded_annotation
שֵׁם | פוּרמָט | תיאור |
---|---|---|
type_idx | uleb128 | סוג ההערה. זה חייב להיות סוג מחלקה (לא מערך או פרימיטיבי). |
גודל | uleb128 | מספר מיפויי שם-ערך בהערה זו |
אלמנטים | annotation_element[size] | אלמנטים של ההערה, המיוצגים ישירות בשורה (לא כהיסטים). יש למיין את האלמנטים בסדר הולך וגדל לפי אינדקס string_id . |
annotation_element format
שֵׁם | פוּרמָט | תיאור |
---|---|---|
name_idx | uleb128 | שם האלמנט, המיוצג כאינדקס במקטע string_ids . המחרוזת חייבת להתאים לתחביר של MemberName , שהוגדר לעיל. |
ערך | ערך_מקודד | ערך אלמנט |
תחביר מחרוזת
ישנם מספר סוגים של פריטים בקובץ .dex
שמתייחסים בסופו של דבר למחרוזת. ההגדרות הבאות בסגנון BNF מציינות את התחביר המקובל עבור מחרוזות אלו.
שם פשוט
A SimpleName הוא הבסיס לתחביר של שמות של דברים אחרים. פורמט .dex
מאפשר כאן כמות נכבדת של קו רוחב (הרבה יותר משפות המקור הנפוצות ביותר). בקצרה, שם פשוט מורכב מכל תו או ספרה אלפביתית נמוכה ASCII, כמה סמלים ספציפיים עם ASCII נמוכה, ורוב נקודות הקוד שאינן ASCII שאינן בקרה, רווח או תווים מיוחדים. החל מגרסה 040
הפורמט מאפשר בנוסף תווי רווח (קטגוריית Unicode Zs
). שימו לב שנקודות קוד פונדקאיות (בטווח U+d800
… U+dfff
) אינן נחשבות לתווי שם חוקיים, כשלעצמם, אך תווים משלימים של Unicode תקפים (אשר מיוצגים על ידי החלופה הסופית של הכלל עבור SimpleNameChar ), והם צריך להיות מיוצג בקובץ כזוגות של נקודות קוד סרוגייט בקידוד MUTF-8.
שם פשוט → | ||
SimpleNameChar ( SimpleNameChar )* | ||
SimpleNameChar → | ||
'A' … 'Z' | ||
| | 'a' … 'z' | |
| | '0' … '9' | |
| | ' ' | מאז גירסת DEX 040 |
| | '$' | |
| | '-' | |
| | '_' | |
| | U+00a0 | מאז גירסת DEX 040 |
| | U+00a1 … U+1fff | |
| | U+2000 … U+200a | מאז גירסת DEX 040 |
| | U+2010 … U+2027 | |
| | U+202f | מאז גירסת DEX 040 |
| | U+2030 … U+d7ff | |
| | U+e000 … U+ffef | |
| | U+10000 … U+10ffff |
שם חבר
בשימוש על ידי field_id_item ו-method_id_item
MemberName הוא שמו של חבר בכיתה, החברים הם שדות, שיטות ומחלקות פנימיות.
שם חבר → | |
שם פשוט | |
| | '<' SimpleName '>' |
FullClassName
FullClassName הוא שם מחלקה מלא, כולל מפרט חבילה אופציונלי ואחריו שם נדרש.
FullClassName → | |
OptionalPackagePrefix SimpleName | |
OptionalPackagePrefix → | |
( SimpleName '/' )* |
TypeDescriptor
בשימוש על ידי type_id_item
TypeDescriptor הוא הייצוג של כל סוג, כולל פרימיטיבים, מחלקות, מערכים ו- void
. ראה להלן את המשמעות של הגרסאות השונות.
TypeDescriptor → | |
'V' | |
| | FieldTypeDescriptor |
FieldTypeDescriptor ← | |
NonArrayFieldTypeDescriptor | |
| | ( '[' * 1...255) NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor ← | |
'Z' | |
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' FullClassName ';' |
ShortyDescriptor
בשימוש על ידי proto_id_item
ShortyDescriptor הוא ייצוג הצורה הקצרה של אב טיפוס של מתודה, כולל סוגי החזר ופרמטרים, אלא שאין הבחנה בין סוגי הפניות שונים (מחלקה או מערך). במקום זאת, כל סוגי ההפניה מיוצגים על ידי תו 'L'
בודד.
ShortyDescriptor → | |
ShortyReturnType ( ShortyFieldType )* | |
ShortyReturnType → | |
'V' | |
| | ShortyFieldType |
ShortyFieldType → | |
'Z' | |
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
סמנטיקה של TypeDescriptor
זוהי המשמעות של כל אחת מהווריאציות של TypeDescriptor .
תחביר | מַשְׁמָעוּת |
---|---|
V | void ; תקף רק לסוגי החזרות |
ז | boolean |
ב | byte |
ס | short |
ג | char |
אני | int |
י | long |
ו | float |
ד | double |
L מלא/מוסמך/שם ; | fully.qualified.Name הכיתה |
[ מתאר | array of descriptor , שמיש באופן רקורסיבי עבור מערכים-של-מערכים, אם כי זה לא חוקי שיש יותר מ-255 ממדים. |
פריטים ומבנים קשורים
סעיף זה כולל הגדרות עבור כל אחד מהפריטים ברמה העליונה שעשויים להופיע בקובץ .dex
.
header_item
מופיע בסעיף הכותרת
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
קֶסֶם | ubyte[8] = DEX_FILE_MAGIC | ערך קסם. ראה דיון למעלה תחת " DEX_FILE_MAGIC " לפרטים נוספים. |
סכום בדיקה | uint | adler32 checksum של שאר הקובץ (הכל מלבד magic והשדה הזה); משמש לזיהוי פגמים בקבצים |
חֲתִימָה | ubyte[20] | חתימת SHA-1 (hash) של שאר הקובץ (הכל מלבד magic , checksum ושדה זה); משמש לזיהוי ייחודי של קבצים |
גודל הקובץ | uint | גודל הקובץ כולו (כולל הכותרת), בבתים |
header_size | uint = 0x70 | גודל הכותרת (כל הקטע הזה), בבתים. זה מאפשר לפחות כמות מוגבלת של תאימות אחורה/קדימה מבלי לבטל את תוקף הפורמט. |
endian_tag | uint = ENDIAN_CONSTANT | תג קצה. ראה דיון למעלה תחת " ENDIAN_CONSTANT ו- REVERSE_ENDIAN_CONSTANT " לפרטים נוספים. |
קישור_גודל | uint | גודל של קטע הקישור, או 0 אם קובץ זה אינו מקושר סטטית |
link_off | uint | היסט מתחילת הקובץ למקטע הקישור, או 0 אם link_size == 0 . ההיסט, אם אינו אפס, צריך להיות להיסט בקטע link_data . הפורמט של הנתונים שעליו הצביע לא מצוין במסמך זה; שדה הכותרת הזה (והקודם) נשארים כ-hooks לשימוש על ידי יישומי זמן ריצה. |
map_off | uint | היסט מתחילת הקובץ לפריט המפה. ההיסט, שעליו להיות לא-אפס, צריך להיות להיסט בקטע data , והנתונים צריכים להיות בפורמט שצוין על ידי " map_list " למטה. |
string_ids_size | uint | ספירת המחרוזות ברשימת מזהי המחרוזות |
string_ids_off | uint | היסט מתחילת הקובץ לרשימת מזהי המחרוזות, או 0 אם string_ids_size == 0 (אומנם מקרה קצה מוזר). ההיסט, אם אינו אפס, צריך להיות לתחילת הקטע string_ids . |
type_ID_size | uint | ספירת הרכיבים ברשימת מזהי הסוג, לכל היותר 65535 |
type_ids_off | uint | היסט מתחילת הקובץ לרשימת מזהי הסוג, או 0 אם type_ids_size == 0 (אומנם מקרה קצה מוזר). ההיסט, אם אינו אפס, צריך להיות לתחילת הקטע type_ids . |
proto_ids_size | uint | ספירת האלמנטים ברשימת מזהי אב הטיפוס, לכל היותר 65535 |
proto_ids_off | uint | היסט מתחילת הקובץ לרשימת מזהי אב הטיפוס, או 0 אם proto_ids_size == 0 (אומנם מקרה קצה מוזר). ההיסט, אם אינו אפס, צריך להיות לתחילת הקטע proto_ids . |
field_ids_size | uint | ספירת האלמנטים ברשימת מזהי השדות |
field_ids_off | uint | היסט מתחילת הקובץ לרשימת מזהי השדות, או 0 אם field_ids_size == 0 . ההיסט, אם אינו אפס, צריך להיות לתחילת הקטע field_ids . |
method_ids_size | uint | ספירת האלמנטים ברשימת מזהי השיטה |
method_ids_off | uint | היסט מתחילת הקובץ לרשימת מזהי השיטה, או 0 אם method_ids_size == 0 . ההיסט, אם אינו אפס, צריך להיות לתחילת הקטע method_ids . |
class_defs_size | uint | ספירת האלמנטים ברשימת הגדרות המחלקה |
class_defs_off | uint | offset מתחילת הקובץ לרשימת הגדרות המחלקה, או 0 אם class_defs_size == 0 (אומנם מקרה קצה מוזר). ההיסט, אם אינו אפס, צריך להיות לתחילת הקטע class_defs . |
גודל_נתונים | uint | גודל מקטע data בבתים. חייב להיות כפול זוגי של sizeof(uint). |
data_off | uint | היסט מתחילת הקובץ לתחילת קטע data . |
map_list
מופיע בסעיף הנתונים
הפניה מ-header_item
יישור: 4 בתים
זוהי רשימה של כל התוכן של קובץ, לפי הסדר. הוא מכיל יתירות מסוימת ביחס ל- header_item
אך נועד להיות טופס קל לשימוש כדי לחזור על קובץ שלם. סוג נתון חייב להופיע לכל היותר פעם אחת במפה, אבל אין הגבלה באיזה סוגי סדר יכולים להופיע, מלבד ההגבלות המשתמעות משאר הפורמט (למשל, קטע header
חייב להופיע קודם, ואחריו string_ids
סעיף וכו'). בנוסף, יש לסדר את כניסות המפה לפי היסט ראשוני ואסור לחפוף.
שֵׁם | פוּרמָט | תיאור |
---|---|---|
גודל | uint | גודל הרשימה, בערכים |
רשימה | map_item [גודל] | מרכיבי הרשימה |
תבנית map_item
שֵׁם | פוּרמָט | תיאור |
---|---|---|
סוּג | קצר | סוג הפריטים; ראה טבלה למטה |
לא בשימוש | קצר | (לא בשימוש) |
גודל | uint | ספירה של מספר הפריטים שניתן למצוא בהיסט המצוין |
לְקַזֵז | uint | קיזוז מתחילת הקובץ לפריטים המדוברים |
הקלד קודים
סוג פריט | קָבוּעַ | ערך | גודל פריט בבתים |
---|---|---|---|
header_item | TYPE_HEADER_ITEM | 0x0000 | 0x70 |
string_id_item | TYPE_STRING_ID_ITEM | 0x0001 | 0x04 |
type_id_item | TYPE_TYPE_ID_ITEM | 0x0002 | 0x04 |
proto_id_item | TYPE_PROTO_ID_ITEM | 0x0003 | 0x0c |
field_id_item | TYPE_FIELD_ID_ITEM | 0x0004 | 0x08 |
method_id_item | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
class_def_item | TYPE_CLASS_DEF_ITEM | 0x0006 | 0x20 |
call_site_id_item | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x04 |
method_handle_item | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
map_list | TYPE_MAP_LIST | 0x1000 | 4+ (item.size * 12) |
type_list | TYPE_TYPE_LIST | 0x1001 | 4+ (item.size * 2) |
annotation_set_ref_list | TYPE_ANNOTATION_SET_REF_LIST | 0x1002 | 4+ (item.size * 4) |
annotation_set_item | TYPE_ANNOTATION_SET_ITEM | 0x1003 | 4+ (item.size * 4) |
class_data_item | TYPE_CLASS_DATA_ITEM | 0x2000 | משתמע; חייב לנתח |
code_item | TYPE_CODE_ITEM | 0x2001 | משתמע; חייב לנתח |
string_data_item | TYPE_STRING_DATA_ITEM | 0x2002 | משתמע; חייב לנתח |
debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | משתמע; חייב לנתח |
annotation_item | TYPE_ANNOTATION_ITEM | 0x2004 | משתמע; חייב לנתח |
פריט_מערך_מקודד | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | משתמע; חייב לנתח |
annotations_directory_item | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | משתמע; חייב לנתח |
hiddenapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | משתמע; חייב לנתח |
string_id_item
מופיע בקטע string_ids
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
string_data_off | uint | היסט מתחילת הקובץ לנתוני המחרוזת של פריט זה. ההיסט צריך להיות למיקום בקטע data , והנתונים צריכים להיות בפורמט שצוין ב-" string_data_item " למטה. אין דרישת יישור לקיזוז. |
string_data_item
מופיע בסעיף הנתונים
יישור: אין (מיושר בייטים)
שֵׁם | פוּרמָט | תיאור |
---|---|---|
utf16_size | uleb128 | גודל מחרוזת זו, ביחידות קוד UTF-16 (שזהו "אורך המחרוזת" במערכות רבות). כלומר, זהו האורך המפוענח של המחרוזת. (האורך המקודד משתמע מהמיקום של ה 0 בתים.) |
נתונים | ubyte[] | סדרה של יחידות קוד MUTF-8 (aka אוקטטים, aka בתים) ואחריה בתים של ערך 0 . ראה "קידוד MUTF-8 (שינוי UTF-8)" לעיל לפרטים ודיון על פורמט הנתונים. הערה: מקובל לקבל מחרוזת הכוללת (הצורה המקודדת של) יחידות קוד פונדקאות UTF-16 (כלומר, |
type_id_item
מופיע בקטע type_ids
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
descriptor_idx | uint | אינדקס לרשימת string_ids עבור מחרוזת התיאור מסוג זה. המחרוזת חייבת להתאים לתחביר עבור TypeDescriptor , שהוגדר לעיל. |
proto_id_item
מופיע בקטע proto_ids
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
shorty_idx | uint | אינדקס לתוך רשימת string_ids עבור מחרוזת התיאור בצורת קצר של אב טיפוס זה. המחרוזת חייבת להתאים לתחביר של ShortyDescriptor , שהוגדר לעיל, ועליה להתאים לסוג ההחזרה ולפרמטרים של פריט זה. |
return_type_idx | uint | אינדקס לרשימת type_ids עבור סוג ההחזר של אב טיפוס זה |
parameters_off | uint | היסט מתחילת הקובץ לרשימת סוגי הפרמטרים של אב טיפוס זה, או 0 אם לאב טיפוס זה אין פרמטרים. היסט זה, אם אינו אפס, צריך להיות בקטע data , והנתונים שם צריכים להיות בפורמט שצוין ב- "type_list" למטה. בנוסף, לא אמורה להיות התייחסות לסוג void ברשימה. |
field_id_item
מופיע בקטע field_ids
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
class_idx | קצר | אינדקס לרשימת type_ids עבור המגדיר של שדה זה. זה חייב להיות סוג מחלקה, ולא מערך או סוג פרימיטיבי. |
type_idx | קצר | אינדקס לרשימת type_ids עבור הסוג של שדה זה |
name_idx | uint | אינדקס לרשימת string_ids עבור השם של שדה זה. המחרוזת חייבת להתאים לתחביר של MemberName , שהוגדר לעיל. |
method_id_item
מופיע בקטע method_ids
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
class_idx | קצר | אינדקס לרשימת type_ids עבור המגדיר של שיטה זו. זה חייב להיות סוג מחלקה או מערך, ולא סוג פרימיטיבי. |
proto_idx | קצר | אינדקס לרשימת proto_ids עבור אב הטיפוס של שיטה זו |
name_idx | uint | אינדקס לרשימת string_ids עבור השם של שיטה זו. המחרוזת חייבת להתאים לתחביר של MemberName , שהוגדר לעיל. |
class_def_item
מופיע בקטע class_defs
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
class_idx | uint | אינדקס לרשימת type_ids עבור מחלקה זו. זה חייב להיות סוג מחלקה, ולא מערך או סוג פרימיטיבי. |
דגלי_גישה | uint | דגלי גישה לכיתה ( public , final וכו'). ראה "הגדרות access_flags " לפרטים. |
superclass_idx | uint | אינדקס לרשימת type_ids עבור מחלקת העל, או לערך הקבוע NO_INDEX אם למחלקה הזו אין מחלקה על (כלומר, זוהי מחלקת שורש כגון Object ). אם קיים, זה חייב להיות סוג מחלקה, ולא מערך או סוג פרימיטיבי. |
ממשקים_כבוי | uint | היסט מתחילת הקובץ לרשימת הממשקים, או 0 אם אין כאלה. היסט זה צריך להיות בקטע data , והנתונים שם צריכים להיות בפורמט שצוין על ידי " type_list " למטה. כל אחד מהרכיבים ברשימה חייב להיות סוג מחלקה (לא מערך או סוג פרימיטיבי), ואסור שיהיו כפילויות. |
source_file_idx | uint | אינדקס לתוך רשימת string_ids עבור שם הקובץ המכיל את המקור המקורי עבור (לפחות רוב) המחלקה הזו, או את הערך המיוחד NO_INDEX כדי לייצג חוסר במידע זה. ה- debug_info_item של כל שיטה נתונה עשוי לעקוף את קובץ המקור הזה, אבל הציפייה היא שרוב המחלקות יגיעו רק מקובץ מקור אחד. |
הערות_כבוי | uint | offset מתחילת הקובץ למבנה ההערות עבור מחלקה זו, או 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
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
call_site_off | uint | קיזוז מתחילת הקובץ להגדרת האתר. ההיסט צריך להיות בקטע הנתונים, והנתונים שם צריכים להיות בפורמט המצוין ב-"call_site_item" למטה. |
call_site_item
מופיע בסעיף הנתונים
יישור: אין (מיושר בייט)
ה-call_site_item הוא פריט_array_encoded שהרכיבים שלו תואמים לארגומנטים שסופקו לשיטת bootstrap Linker. שלושת הטיעונים הראשונים הם:
- ידית שיטה המייצגת את שיטת הקישור של bootstrap (VALUE_METHOD_HANDLE).
- שם שיטה שמקשר האתחול צריך לפתור (VALUE_STRING).
- סוג שיטה המתאים לסוג שם השיטה שיש לפתור (VALUE_METHOD_TYPE).
כל ארגומנט נוסף הוא ערכים קבועים המועברים לשיטת bootstrap Linker. ארגומנטים אלה מועברים לפי הסדר וללא כל המרות מסוג.
ידית השיטה המייצגת את שיטת הקישור של bootstrap חייבת להיות בעלת סוג החזרה java.lang.invoke.CallSite
. שלושת סוגי הפרמטרים הראשונים הם:
-
java.lang.invoke.Lookup
-
java.lang.String
-
java.lang.invoke.MethodType
סוגי הפרמטרים של ארגומנטים נוספים נקבעים מהערכים הקבועים שלהם.
method_handle_item
מופיע בקטע method_handles
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
method_handle_type | קצר | סוג ידית השיטה; ראה טבלה למטה |
לא בשימוש | אושורט | (לא בשימוש) |
field_or_method_id | אושורט | מזהה שדה או שיטה תלוי אם סוג ידית השיטה הוא אביזר או שיטה שיטה |
לא בשימוש | אושורט | (לא בשימוש) |
שיטה
קָבוּעַ | ערך | תיאור |
---|---|---|
Method_handle_type_static_put | 0x00 | ידית שיטה היא מערך שדה סטטי (אביזר) |
Method_handle_type_static_get | 0x01 | ידית שיטה היא שדה סטטי Getter (אביזר) |
Method_handle_type_instance_put | 0x02 | ידית שיטה היא גדר שדה מופע (אביזר) |
Method_handle_type_instance_get | 0x03 | ידית שיטה היא שדה מופע Getter (אביזר) |
Method_handle_type_invoke_static | 0x04 | ידית שיטה היא שיטה סטטית invoker |
Method_handle_type_invoke_instance | 0x05 | ידית שיטה היא תמצית שיטות מופע |
Method_handle_type_invoke_constructor | 0x06 | ידית שיטה היא מכשיר שיטת קונסטרוקטור |
Method_handle_type_invoke_direct | 0x07 | ידית שיטה היא שיטה ישירה invoker |
Method_handle_type_invoke_interface | 0x08 | ידית שיטה היא invoker שיטת ממשק |
class_data_item
מופנה מ- Class_DEF_ITEM
מופיע בסעיף הנתונים
יישור: אין (מיושר בתים)
שֵׁם | פוּרמָט | תיאור |
---|---|---|
static_fields_size | ULEB128 | מספר השדות הסטטיים המוגדרים בפריט זה |
DESANT_FIELDS_SIZE | ULEB128 | מספר שדות המופע המוגדרים בפריט זה |
direct_methods_size | ULEB128 | מספר השיטות הישירות המוגדרות בפריט זה |
Virtual_Methods_size | ULEB128 | מספר השיטות הווירטואליות המוגדרות בפריט זה |
Static_fields | kenoded_field [static_fields_size] | השדות הסטטיים המוגדרים, המיוצגים כרצף של אלמנטים מקודדים. השדות חייבים להיות ממוינים על ידי field_idx בסדר גובר. |
מופע_פילדס | kenoded_fiel | שדות המופע המוגדרים, המיוצגים כרצף של אלמנטים מקודדים. השדות חייבים להיות ממוינים על ידי field_idx בסדר גובר. |
direct_methods | gended_method [direct_methods_size] | השיטות הישירה (כל אחת מהשיטות static , private או הבנאי) המוגדרות, המיוצגות כרצף של אלמנטים מקודדים. יש למיין את השיטות לפי method_idx בסדר גובר. |
Virtual_Methods | gended_method [virtual_methods_size] | השיטות הווירטואליות המוגדרות (אף אחת מהשיטות static , private או הבנאי), המיוצגות כרצף של אלמנטים מקודדים. רשימה זו לא צריכה לכלול שיטות בירושה אלא אם כן הוחלף על ידי הכיתה שפריט זה מייצג. יש למיין את השיטות לפי method_idx בסדר גובר. method_idx של שיטה וירטואלית לא צריכה להיות זהה לשיטה ישירה כלשהי. |
הערה: כל field_id
של כל האלמנטים ו- method_id
חייבים להתייחס לאותה מעמד מגדיר.
פורמט konded_field
שֵׁם | פוּרמָט | תיאור |
---|---|---|
field_idx_diff | ULEB128 | אינדקס לרשימת field_ids לזהות שדה זה (כולל את השם והמתאר), המיוצג כהבדל מתוך אינדקס האלמנט הקודם ברשימה. המדד של האלמנט הראשון ברשימה מיוצג ישירות. |
Access_flags | ULEB128 | גישה לדגלי הגישה לשדה ( public , final וכו '). ראה " access_flags הגדרות" לפרטים. |
פורמט ingoded_method
שֵׁם | פוּרמָט | תיאור |
---|---|---|
Method_idx_diff | ULEB128 | אינדקס לרשימת method_ids לזהות שיטה זו (כולל את השם והמתאר), המיוצג כהבדל מאינדקס האלמנט הקודם ברשימה. המדד של האלמנט הראשון ברשימה מיוצג ישירות. |
Access_flags | ULEB128 | גישה לדגלי גישה לשיטה ( public , final וכו '). ראה " access_flags הגדרות" לפרטים. |
CODE_OFF | ULEB128 | קוזז מתחילת הקובץ למבנה הקוד לשיטה זו, או 0 אם שיטה זו היא abstract או native . הקיזוז צריך להיות למיקום בקטע data . להלן פורמט הנתונים מצוין על ידי " code_item ". |
type_list
מופנה מ- class_def_item ו- proto_id_item
מופיע בסעיף הנתונים
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
גודל | uint | גודל הרשימה, בערכים |
רשימה | type_item [גודל] | אלמנטים ברשימה |
form_item format
שֵׁם | פוּרמָט | תיאור |
---|---|---|
type_idx | אושורט | אינדקס לרשימת type_ids |
CODE_ITEM
מופנה מ- gended_method
מופיע בסעיף הנתונים
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
Registers_size | אושורט | מספר הרישומים המשמשים קוד זה |
ins_size | אושורט | מספר המילים של טיעונים נכנסים לשיטה שהקוד הזה מיועד |
outs_size | אושורט | מספר המילים של מרחב הארגומנט היוצא הנדרש על ידי קוד זה לפתיחת שיטות |
Tries_size | אושורט | מספר ה- try_item S למופע זה. אם לא אפס, אזי אלה מופיעים כמערך tries ממש אחרי ה- insns במקרה זה. |
DEBUG_INFO_OFF | uint | קוזז מתחילת הקובץ למידע על ניפוי באגים (מספרי שורה + מידע משתנה מקומי) רצף לקוד זה, או 0 אם פשוט אין מידע. הקיזוז, אם לא אפס, צריך להיות למיקום בסעיף data . להלן פורמט הנתונים מצוין על ידי " debug_info_item ". |
insns_size | uint | גודל רשימת ההוראות, ביחידות קוד 16 סיביות |
insns | ushort [insns_size] | מערך של קוד bytecode בפועל. פורמט הקוד במערך insns מוגדר על ידי מסמך המלווה dalvik bytecode . שים לב שלמרות שזה מוגדר כמערך של ushort , ישנם כמה מבנים פנימיים שמעדיפים יישור של ארבעה בתים. כמו כן, אם זה במקרה בקובץ שנחלף על ידי אנדיאן, ההחלפה נעשית רק על ushort אינדיבידואליות ולא על המבנים הפנימיים הגדולים יותר. |
ריפוד | ushort (אופציונלי) = 0 | שני בתים של ריפוד כדי להתיישר עם tries ארבעה בתים. אלמנט זה קיים רק אם tries_size הוא שאינו אפס ו- insns_size הוא מוזר. |
מנסה | try_item [TrieS_Size] (אופציונלי) | מערך המציין היכן נתפסים בחריגים בקוד וכיצד לטפל בהם. אלמנטים של המערך חייבים להיות ללא חפיסה בטווח ובאמצעות כתובת נמוכה עד גבוהה. אלמנט זה קיים רק אם tries_size אינו אפס. |
מטפלים | gended_catch_handler_list (אופציונלי) | בתים המייצגים רשימה של רשימות של סוגי תפיסה וכתובות מטפל נלוות. לכל try_item יש קיזוז חכמת בתים למבנה זה. אלמנט זה קיים רק אם tries_size אינו אפס. |
Format try_item
שֵׁם | פוּרמָט | תיאור |
---|---|---|
start_addr | uint | התחל כתובת של חסימת הקוד המכוסה על ידי ערך זה. הכתובת היא ספירה של יחידות קוד של 16 סיביות לתחילת ההוראות המקורה הראשון. |
insn_count | אושורט | מספר יחידות קוד 16 סיביות המכוסות על ידי רשומה זו. יחידת הקוד האחרונה המכוסה (כולל) היא start_addr + insn_count - 1 . |
Handler_off | אושורט | קוזז בבתים מתחילת ה- konded encoded_catch_hander_list ל- encoded_catch_handler לכניסה זו. זה חייב להיות קיזוז לתחילתו של encoded_catch_handler . |
פורמט ingoded_catch_handler_list
שֵׁם | פוּרמָט | תיאור |
---|---|---|
גודל | ULEB128 | גודל רשימה זו, בערכים |
רשימה | gended_catch_handler [Handlers_size] | רשימה בפועל של רשימות מטפלים, מיוצגות באופן ישיר (לא כקיזוז), ורשור ברצף |
פורמט ingoded_catch_handler
שֵׁם | פוּרמָט | תיאור |
---|---|---|
גודל | SLEB128 | מספר סוגי התפיסה ברשימה זו. אם לא חיובי, אז זה השלילי של מספר סוגי התפיסה, והתפסים אחריו מטפל בתפוס. לדוגמא: size של 0 פירושו שיש תפס תפס אך אין תפסים מוקלדים במפורש. size של 2 פירושו שיש שני תפסים שהוקלדו במפורש וללא כל תופסים. size של -1 פירושו שיש מלכוד אחד שהוקלד יחד עם תפיסה הכל. |
מטפלים | gended_type_addr_pair [ABS (גודל)] | זרם abs(size) פריטים מקודדים, אחד לכל סוג שנתפס, לפי הסדר שיש לבדוק את הסוגים. |
Catch_all_addr | ULEB128 (אופציונלי) | כתובת קוד BYTECODE של המטפל לתפוס. אלמנט זה קיים רק אם size אינו חיובי. |
פורמט redoded_type_addr_pair
שֵׁם | פוּרמָט | תיאור |
---|---|---|
type_idx | ULEB128 | אינדקס לרשימת type_ids עבור סוג החריג לתפוס |
addr | ULEB128 | כתובת קוד BYTECODE של מטפל החריגים המשויך |
DEBUG_INFO_ITEM
הוזכר מ- CODE_ITEM
מופיע בסעיף הנתונים
יישור: אין (מיושר בתים)
כל debug_info_item
מגדיר מכונת מצב בהשראת Byte בהשראת Byte בהשראת Byte, שכאשר היא מתפרשת, פולטת את טבלת המיקומים ו (פוטנציאל) את המידע המשתנה המקומי עבור code_item
. הרצף מתחיל בכותרת באורך משתנה (שאורךו תלוי במספר הפרמטרים של השיטה), אחריו מקדמי המצב של מכונת המצב, ומסתיים בבייט DBG_END_SEQUENCE
.
המכונה הממלכתית מורכבת מחמישה רישומים. פנקס address
מייצג את קיזוז ההוראות ב- insns_item
המשויך ביחידות קוד 16 סיביות. מרשם address
מתחיל בתחילת כל רצף debug_info
ועליו רק להגדיל 0
מונוטוני. פנקס line
מייצג איזה מספר קו מקור צריך להיות משויך לשיר העמדות הבאות שנפלטו על ידי מכונת המדינה. הוא מאתחל בכותרת הרצף, ועשוי להשתנות בכיוונים חיוביים או שליליים אך אסור לעולם להיות פחות מ 1
. פנקס ה- source_file
מייצג את קובץ המקור אליו מתייחסים רשומות מספר השורה. זה מאתחל לערך של source_file_idx
ב- class_def_item
. שני המשתנים האחרים, prologue_end
ו- epilogue_begin
, הם דגלים בוליאניים (מאתחלים false
) המצביעים על אם יש לראות במיקום הבא הנפלט כפרולוג או אפילוג שיטה. על מכונת המדינה לעקוב גם אחר שם וסוג המשתנה המקומי האחרון בשידור חי בכל פנקס לקוד DBG_RESTART_LOCAL
.
הכותרת היא כדלקמן:
שֵׁם | פוּרמָט | תיאור |
---|---|---|
LINE_START | ULEB128 | הערך הראשוני לפנקס line של מכונת המדינה. אינו מייצג ערך עמדות בפועל. |
parameters_size | ULEB128 | מספר שמות הפרמטרים המקודדים. צריך להיות פרמטר אחד לשיטה, למעט שיטת מופע this , אם בכלל. |
parameter_names | uleb128p1 [parameters_size] | אינדקס מחרוזת של שם פרמטר השיטה. ערך מקודד של NO_INDEX מציין כי אין שום שם זמין לפרמטר המשויך. מתאר הסוג והחתימה משתמעים מתאר השיטה וחתימתו. |
ערכי קוד בתים הם כדלקמן:
שֵׁם | ערך | פוּרמָט | טיעונים | תיאור |
---|---|---|---|---|
Dbg_end_sequence | 0x00 | (אף אחד) | מסתיים רצף מידע על ניפוי באגים עבור code_item | |
Dbg_advance_pc | 0x01 | ULEB128 addr_diff | addr_diff : סכום להוסיף לרישום כתובות | מקדם את רישום הכתובות מבלי לפלוט כניסה לתפקידים |
Dbg_advance_line | 0x02 | SLEB128 LINE_DIFF | line_diff : סכום לשינוי רישום השורות על ידי | מקדם את רישום הקו מבלי לפלוט כניסה לתפקידים |
Dbg_start_local | 0x03 | ULEB128 register_num uleb128p1 name_idx ULEB128P1 TYPE_IDX | register_num : הרשמה שתכיל מקומיname_idx : אינדקס מחרוזות של השםtype_idx : סוג אינדקס מהסוג | מציג משתנה מקומי בכתובת הנוכחית. או name_idx או type_idx עשויים להיות NO_INDEX לציין שערך זה אינו ידוע. |
Dbg_start_local_extended | 0x04 | ULEB128 register_num uleb128p1 name_idx ULEB128P1 TYPE_IDX ULEB128P1 SIG_IDX | register_num : הרשמה שתכיל מקומיname_idx : אינדקס מחרוזות של השםtype_idx : סוג אינדקס מהסוגsig_idx : אינדקס מחרוזת של חתימת הסוג | מציג מקומי עם חתימת סוג בכתובת הנוכחית. כל אחד מ- name_idx , type_idx , או sig_idx עשוי להיות NO_INDEX לציין שהערך הזה אינו ידוע. (אם sig_idx הוא -1 , עם זאת, ניתן לייצג את אותם נתונים בצורה יעילה יותר באמצעות Opcode DBG_START_LOCAL .) הערה: עיין בדיון תחת " |
Dbg_end_local | 0x05 | ULEB128 register_num | register_num : הרשמה שהכילה מקומי | מסמן משתנה מקומי חי כרגע כ- Out of Spore בכתובת הנוכחית |
DBG_RESTART_LOCAL | 0x06 | ULEB128 register_num | register_num : הרשמה להפעלה מחדש | מציג מחדש משתנה מקומי בכתובת הנוכחית. השם והסוג זהים למקומי האחרון שהיה בשידור חי בפנקס שצוין. |
DBG_SET_PROLOGUE_END | 0x07 | (אף אחד) | מגדיר את פנקס המכונות prologue_end , ומציין כי יש לקחת בחשבון את ערך המיקום הבא שנוסף לסוף של פרולוג שיטה (מקום מתאים לנקודת שבר של שיטה). פנקס ה- prologue_end מנוקה על ידי כל קוד מיוחד ( >= 0x0a ). | |
Dbg_set_epilogue_begin | 0x08 | (אף אחד) | מגדיר את מרשם המכונות epilogue_begin , ומצביע על כך שיש לקחת בחשבון את כניסת המיקום הבאה שמתווספת תחילתו של אפילוג שיטה (מקום מתאים להשעה לביצוע לפני יציאת השיטה). מרשם epilogue_begin מנוקה על ידי כל קוד מיוחד ( >= 0x0a ). | |
Dbg_set_file | 0x09 | uleb128p1 name_idx | name_idx : אינדקס מחרוזת של שם קובץ המקור; NO_INDEX אם לא ידוע | מציין כי כל רשומות מספר השורה שלאחר מכן מתייחסות לשם קובץ מקור זה, במקום שם ברירת המחדל שצוין ב- code_item |
אופקודות מיוחדות | 0x0a ... 0xff | (אף אחד) | מקדם את line וכתובת address , פולט כניסה למצב ומנקה את prologue_end ו- epilogue_begin . ראה להלן לתיאור. |
אופקודות מיוחדות
Opcodes עם ערכים בין 0x0a
ל- 0xff
(כולל) מזיזים הן את line
והן את רישומי address
בכמות קטנה ואז פולטים ערך טבלת מיקום חדש. הנוסחה לתוספות היא כדלקמן:
DBG_FIRST_SPECIAL = 0x0a // the smallest special opcode DBG_LINE_BASE = -4 // the smallest line number increment DBG_LINE_RANGE = 15 // the number of line increments represented adjusted_opcode = opcode - DBG_FIRST_SPECIAL line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE) address += (adjusted_opcode / DBG_LINE_RANGE)
annotations_directory_item
מופנה מ- Class_DEF_ITEM
מופיע בסעיף הנתונים
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
class_annotations_off | uint | קוזז מתחילת הקובץ להערות שנעשו ישירות בכיתה, או 0 אם לכיתה אין הערות ישירות. הקיזוז, אם לא אפס, צריך להיות למיקום בסעיף data . להלן פורמט הנתונים מצוין על ידי " annotation_set_item ". |
Fields_size | uint | ספירת השדות המוערכת על ידי פריט זה |
annotated_methods_size | uint | ספירת שיטות שהוצגה על ידי פריט זה |
annotated_parameters_size | uint | ספירת רשימות פרמטר שיטה המוצגות על ידי פריט זה |
Field_annotations | field_annotation [fields_size] (אופציונלי) | רשימת הערות שדה משויכות. יש למיין את האלמנטים של הרשימה בסדר גובר, על ידי field_idx . |
שיטה_נוטציות | 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
שֵׁם | פוּרמָט | תיאור |
---|---|---|
שיטה_דקס | uint | אינדקס לרשימת method_ids לזהות השיטה המוצגת |
annotations_off | uint | קוזז מתחילת הקובץ לרשימת ההערות לשיטה. הקיזוז צריך להיות למיקום בקטע data . להלן פורמט הנתונים מצוין על ידי " annotation_set_item ". |
פורמט Parameter_Annotation
שֵׁם | פוּרמָט | תיאור |
---|---|---|
שיטה_דקס | uint | אינדקס לרשימת method_ids לזהות השיטה שלה פרמטרים מבוטלים |
annotations_off | uint | קיזוז מתחילת הקובץ לרשימת ההערות לפרמטרים של השיטה. הקיזוז צריך להיות למיקום בקטע data . להלן פורמט הנתונים מצוין על ידי " annotation_set_ref_list " להלן. |
annotation_set_ref_list
מופנה מ- parameter_annotations_item
מופיע בסעיף הנתונים
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
גודל | uint | גודל הרשימה, בערכים |
רשימה | annotation_set_ref_item [גודל] | אלמנטים ברשימה |
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
מופיע בסעיף הנתונים
יישור: 4 בתים
שֵׁם | פוּרמָט | תיאור |
---|---|---|
גודל | uint | גודל הסט, בכניסות |
ערכים | annotation_off_item [גודל] | אלמנטים של הסט. יש למיין את האלמנטים בסדר גובר, על ידי type_idx . |
פורמט annotation_off_item
שֵׁם | פוּרמָט | תיאור |
---|---|---|
annotation_off | uint | קיזוז מתחילת הקובץ להערות. הקיזוז צריך להיות למיקום בקטע data , ופורמט הנתונים באותו מיקום מוגדר על ידי " annotation_item " להלן. |
annotation_item
מופנה מ- annotation_set_item
מופיע בסעיף הנתונים
יישור: אין (מיושר בתים)
שֵׁם | פוּרמָט | תיאור |
---|---|---|
רְאוּת | Ubyte | הראות המיועדת של הערה זו (ראה להלן) |
ביאור | konded_annotation | תוכן ביאור מקודד, בפורמט המתואר על ידי "פורמט encoded_annotation " תחת "קידוד encoded_value " לעיל. |
ערכי נראות
אלה האפשרויות לשדה visibility
ב- annotation_item
:
שֵׁם | ערך | תיאור |
---|---|---|
Volifity_build | 0x00 | נועד להיות גלוי רק בזמן הבנייה (למשל, במהלך אוסף קוד אחר) |
Voliess_runtime | 0x01 | נועד לעין בזמן ריצה |
Voliess_system | 0x02 | מיועד לעין בזמן ריצה, אך רק למערכת הבסיסית (ולא לקוד משתמש רגיל) |
kenoded_array_item
מופנה מ- Class_DEF_ITEM
מופיע בסעיף הנתונים
יישור: אין (מיושר בתים)
שֵׁם | פוּרמָט | תיאור |
---|---|---|
ערך | konded_array | בתים המייצגים את ערך המערך המקודד, בפורמט שצוין על ידי " encoded_array " תחת " encoded_value מקודד" לעיל. |
varvicapi_class_data_item
פרק זה מכיל נתונים על ממשקים מוגבלים המשמשים כל מחלקה.
הערה: תכונת ה- API הנסתרת הוצגה ב- Android 10.0 והיא חלה רק על קבצי DEX של שיעורים בנתיב מחלקת האתחול. רשימת הדגלים המתוארים להלן עשויה להיות מורחבת במהדורות העתידיות של אנדרואיד. למידע נוסף, ראה הגבלות על ממשקי SDK .
שֵׁם | פוּרמָט | תיאור |
---|---|---|
גודל | uint | הגודל הכולל של הקטע |
קיזוז | uint [] | מערך הקיזוזים באינדקס על ידי class_idx . ערך מערך אפס ב- index class_idx פירושו שאין נתונים עבור class_idx זה, או שכל דגלי ה- API הנסתרים הם אפס. אחרת כניסת המערך אינה אפסית והיא מכילה קיזוז מתחילת הקטע למערך של דגלי API נסתרים עבור class_idx זה. |
דגלים | uleb128 [] | מערכים משוררים של דגלי API נסתרים לכל כיתה. ערכי דגל אפשריים מתוארים בטבלה שלהלן. דגלים מקודדים באותו סדר כמו שדות ושיטות מקודדות בנתוני הכיתה. |
סוגי דגל הגבלה:
שֵׁם | ערך | תיאור |
---|---|---|
רשימת לבנים | 0 | ממשקים שניתן להשתמש בהם בחופשיות ותומכים כחלק ממדד חבילות המסגרת של אנדרואיד המתועדת רשמית. |
גריליסט | 1 | ממשקים שאינם SDK שניתן להשתמש בהם ללא קשר לרמת API של היישום. |
רשימה שחורה | 2 | ממשקים שאינם SDK שלא ניתן להשתמש בהם ללא קשר לרמת ה- API של היישום. גישה לאחד מהממשקים הללו גורמת לשגיאת זמן ריצה . |
גריליסט -מאקס -או | 3 | ממשקים שאינם SDK שיכולים לשמש לאנדרואיד 8.x ומטה אלא אם כן הם מוגבלים. |
גריליסט -מאקס -פ | 4 | ממשקים שאינם SDK שיכולים לשמש עבור אנדרואיד 9.x אלא אם כן הם מוגבלים. |
Greylist -Max -Q | 5 | ממשקים שאינם SDK שיכולים לשמש לאנדרואיד 10.x אלא אם הם מוגבלים. |
גריליסט -מאקס -ר | 6 | ממשקים שאינם SDK שיכולים לשמש עבור אנדרואיד 11.x אלא אם כן הם מוגבלים. |
הערות מערכת
הערות מערכת משמשות לייצוג יצירות שונות של מידע רפלקטיבי על שיעורים (ושיטות ושדות). מידע זה ניגש בדרך כלל רק בעקיפין על ידי קוד לקוח (שאינו מערכת).
הערות המערכת מיוצגות בקבצי .dex
כהערות עם ראות מוגדרת ל- VISIBILITY_SYSTEM
.
dalvik.annotation.annotationdefault
מופיע בשיטות בממשקי ההערה
ביאור AnnotationDefault
מחובר לכל ממשק ביאור המבקש לציין כריכות ברירת מחדל.
שֵׁם | פוּרמָט | תיאור |
---|---|---|
ערך | ביאור | כריכות ברירת המחדל להערות זו, המיוצגות כהערה מסוג זה. ההערה לא צריכה לכלול את כל השמות שהוגדרו על ידי ההערה; לשמות חסרים פשוט אין ברירות מחדל. |
dalvik.annotation.enclossionclass
מופיע בשיעורים
הערה של EnclosingClass
מחוברת לכל כיתה המוגדרת כחבר בכיתה אחרת, כשלעצמה, או שהיא אנונימית אך אינה מוגדרת בתוך גוף שיטה (למשל, מעמד פנימי סינטטי). לכל כיתה שיש לה ביאור זה חייבת להיות גם הערה InnerClass
. בנוסף, אסור שיעור צריך להיות גם EnclosingClass
וגם EnclosingMethod
.
שֵׁם | פוּרמָט | תיאור |
---|---|---|
ערך | מעמד | הכיתה שמסעדת את הכיתה הזו בצורה הדוקה ביותר |
dalvik.annotation.enclossionmethod
מופיע בשיעורים
הערה EnclosingMethod
מחוברת לכל מחלקה המוגדרת בתוך גוף שיטה. לכל כיתה שיש לה ביאור זה חייבת להיות גם הערה InnerClass
. בנוסף, אסור שיעור צריך להיות גם EnclosingClass
וגם EnclosingMethod
.
שֵׁם | פוּרמָט | תיאור |
---|---|---|
ערך | שיטה | השיטה שמסעדת את הכיתה הזו בצורה הדוקה ביותר |
dalvik.annotation.innerclass
מופיע בשיעורים
הערה InnerClass
מחוברת לכל כיתה המוגדרת בהיקף הלקסיקלי של הגדרת הכיתה אחרת. לכל כיתה שיש לה ביאור זה חייבת להיות גם ביאור EnclosingClass
או EnclosingMethod
.
שֵׁם | פוּרמָט | תיאור |
---|---|---|
שֵׁם | חוּט | השם הפשוט שהוכרז במקור של מחלקה זו (לא כולל קידומת חבילה). אם הכיתה הזו אנונימית, אז השם null . |
AccessFlags | int | דגלי הגישה שהוכרזו במקור של הכיתה (שעשויים להיות שונים מהדגלים האפקטיביים בגלל אי התאמה בין מודלים הביצועיים של שפת המקור לבין מכונה וירטואלית היעד) |
dalvik.annotation.memberclasses
מופיע בשיעורים
ביאור MemberClasses
מחוברים לכל כיתה שמכריז על כיתות חברים. (מחלקת חברים היא מעמד פנימי ישיר שיש לו שם.)
שֵׁם | פוּרמָט | תיאור |
---|---|---|
ערך | מעמד[] | מערך כיתות החברים |
dalvik.annotation.methodparameters
מופיע בשיטות
הערה: הערה זו נוספה לאחר אנדרואיד 7.1. תתעלם מהנוכחות שלה במהדורות אנדרואיד קודמות.
ביאור MethodParameters
הוא אופציונלי וניתן להשתמש בו כדי לספק מטא נתונים של פרמטרה כגון שמות פרמטרים ושינויים.
ניתן להשמיט את ההערה משיטה או מבנאי בבטחה כאשר מטא נתונים של הפרמטר אינו נדרש בזמן ריצה. ניתן להשתמש java.lang.reflect.Parameter.isNamePresent()
כדי לבדוק אם מטא נתונים קיימים לפרמטר, ושיטות ההשתקפות המשויכות כמו java.lang.reflect.Parameter.getName()
ייפלו להתנהגות ברירת מחדל בזמן ריצה אם המידע אינו קיים.
כאשר כולל מטא נתונים של פרמטר, על המהדרים לכלול מידע לשיעורים שנוצרו כמו enums, מכיוון שמטא נתונים של הפרמטר כולל אם פרמטר הוא סינטטי או לא מנדט.
ביאור MethodParameters
מתאר רק פרמטרים של שיטה פרטנית. לפיכך, מהדרים עשויים להשמיט את ההערה לחלוטין עבור בניינים ושיטות שאין להם פרמטרים, לצורך יעילות גודל קוד ויעילות זמן ריצה.
המערכים המתועדים להלן חייבים להיות בגודל זהה למבנה DEX של method_id_item
המשויך לשיטה, אחרת java.lang.reflect.MalformedParametersException
יושלך בזמן הריצה.
כלומר: method_id_item.proto_idx
-> proto_id_item.parameters_off
-> type_list.size
חייב להיות זהה names().length
ו- accessFlags().length
.
מכיוון ש- MethodParameters
מתאר את כל פרמטרי השיטה הפורמליים, אפילו אלה שאינם מוכרזים במפורש או מרומז בקוד המקור, גודל המערכים עשוי להיות שונה מחתימה או מידע אחר מטא נתונים המבוסס רק על פרמטרים מפורשים המוכרזים בקוד המקור. MethodParameters
לא יכללו גם מידע על פרמטרים של מקלט ביאור סוג שאינם קיימים בחתימת השיטה בפועל.
שֵׁם | פוּרמָט | תיאור |
---|---|---|
שמות | חוּט[] | שמות הפרמטרים הפורמליים לשיטה המשויכת. המערך אסור להיות null אך חייב להיות ריק אם אין פרמטרים רשמיים. ערך במערך חייב להיות null אם לפרמטר הרשמי עם אותו אינדקס אין שם. אם מיתרי שם הפרמטר ריקים או מכילים '.', ';', '[' או '/' אז java.lang.reflect.MalformedParametersException יושלך בזמן הריצה. |
AccessFlags | int [] | דגלי הגישה של הפרמטרים הרשמיים לשיטה המשויכת. המערך אסור להיות null אך חייב להיות ריק אם אין פרמטרים רשמיים. הערך הוא קצת מסכה עם הערכים הבאים:
java.lang.reflect.MalformedParametersException יושלך בזמן ריצה. |
dalvik.annotation.signature
מופיע בשיעורים, בשדות ובשיטות
הערה Signature
מחוברת לכל מחלקה, שדה או שיטה המוגדרת במונחים של סוג מסובך יותר ממה שניתן לייצג על ידי type_id_item
. פורמט ה- .dex
אינו מגדיר את הפורמט לחתימות; זה נועד רק להיות מסוגל לייצג את כל החתימות ששפת המקור דורשת ליישום מוצלח של הסמנטיקה של אותה שפה. כיוון שכך, חתימות בדרך כלל אינן ניתנות (או מאומתות) על ידי יישומי מכונה וירטואלית. החתימות פשוט מועברות לממשקי API וכלים ברמה הגבוהה יותר (כמו בורג). לפיכך יש לכתוב כל שימוש בחתימה כדי לא להניח הנחות לגבי קבלת חתימות תקפות בלבד, תוך שמירה על עצמה מפורשת מפני האפשרות להיתקל בחתימה לא חוקית תחבירית.
מכיוון שמיתרי חתימה נוטים להיות בעלי הרבה תוכן משוכפל, ביאור Signature
מוגדר כמערך של מיתרים, כאשר אלמנטים משוכפלים מתייחסים באופן טבעי לאותם נתונים בסיסיים, והחתימה נדרשת לשרשור של כל המיתרים במערך . אין כללים כיצד לפרק חתימה למיתרים נפרדים; זה לגמרי תלוי בכלים המייצרים קבצי .dex
.
שֵׁם | פוּרמָט | תיאור |
---|---|---|
ערך | חוּט[] | חתימתו של מעמד או חבר זה, כמגוון מיתרים שיש לרשתות יחד |
dalvik.annotation.trows
מופיע בשיטות
הערה Throws
מחוברת לכל שיטה המוצהרת לזרוק סוג חריג אחד או יותר.
שֵׁם | פוּרמָט | תיאור |
---|---|---|
ערך | מעמד[] | מערך סוגי החריגים שנזרקו |