เอกสารนี้อธิบายโครงร่างและเนื้อหาของไฟล์ .dex
ซึ่งใช้เพื่อเก็บชุดคำจำกัดความของคลาสและข้อมูลเสริมที่เกี่ยวข้อง
คำแนะนำเกี่ยวกับประเภท
ชื่อ | คำอธิบาย |
---|---|
ไบต์ | ลงชื่อเข้าใช้แบบ 8 บิต |
ยูไบต์ | int ที่ไม่ได้ลงนาม 8 บิต |
สั้น | int ที่ลงนามแบบ 16 บิต, little-endian |
ushort | int ที่ไม่ได้ลงนาม 16 บิต, little-endian |
ภายใน | int ที่ลงนามแบบ 32 บิต, little-endian |
ไม่ได้ | int ที่ไม่ได้ลงนาม 32 บิต, little-endian |
ยาว | int ที่ลงนามแบบ 64 บิต, little-endian |
อู่หลง | int ที่ไม่ได้ลงนาม 64 บิต, little-endian |
สเลบ128 | ลงนาม LEB128 ความยาวผันแปรได้ (ดูด้านล่าง) |
uleb128 | LEB128 ที่ไม่ได้ลงนาม ความยาวผันแปรได้ (ดูด้านล่าง) |
uleb128p1 | LEB128 บวก 1 ที่ไม่ได้ลงนาม ความยาวผันแปรได้ (ดูด้านล่าง) |
LEB128
LEB128 (" L ittle- E ndian B ase 128 ") คือการเข้ารหัสที่มีความยาวผันแปรได้สำหรับปริมาณจำนวนเต็มที่ลงนามหรือไม่ได้ลงนามโดยอำเภอใจ รูปแบบนี้ยืมมาจากข้อกำหนด DWARF3 ในไฟล์ .dex
LEB128 ใช้เพื่อเข้ารหัสปริมาณ 32 บิตเท่านั้น
ค่าที่เข้ารหัส LEB128 แต่ละค่าประกอบด้วยหนึ่งถึงห้าไบต์ ซึ่งรวมกันแสดงถึงค่า 32 บิตเดียว แต่ละไบต์จะมีชุดบิตที่สำคัญที่สุดของตัวเอง ยกเว้นไบต์สุดท้ายในลำดับซึ่งมีบิตที่สำคัญที่สุดที่ชัดเจน เจ็ดบิตที่เหลือของแต่ละไบต์เป็นเพย์โหลด โดยมีเจ็ดบิตที่มีนัยสำคัญน้อยที่สุดในไบต์แรก เจ็ดบิตถัดไปในไบต์ที่สองและอื่นๆ ในกรณีของ LEB128 ที่ลงนาม ( sleb128
) บิตของเพย์โหลดที่สำคัญที่สุดของไบต์สุดท้ายในลำดับจะถูกขยายสัญญาณเพื่อสร้างค่าสุดท้าย ในกรณีที่ไม่ได้ลงนาม ( uleb128
) บิตใด ๆ ที่ไม่ได้แสดงอย่างชัดเจนจะถูกตีความว่าเป็น 0
แผนภาพระดับบิตของค่า LEB128 สองไบต์ | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ไบต์แรก | ไบต์ที่สอง | ||||||||||||||
1 | บิต 6 | บิต 5 | บิต 4 | บิต 3 | บิต 2 | บิต 1 | บิต 0 | 0 | บิต 13 | บิต 12 | บิต 11 | บิต 10 | บิต 9 | บิต 8 | บิต 7 |
ตัวแปร uleb128p1
ใช้เพื่อแสดงค่าที่เซ็นชื่อ โดยที่การแทนค่านั้นเป็นค่า บวกหนึ่ง ที่เข้ารหัสเป็น uleb128
สิ่งนี้ทำให้การเข้ารหัส -1
(หรือคิดอีกทางหนึ่งว่าเป็นค่าที่ไม่ได้ลงนาม 0xffffffff
) - แต่ไม่มีจำนวนลบอื่น ๆ - ไบต์เดียว และมีประโยชน์ในกรณีที่ตัวเลขที่แสดงจะต้องไม่เป็นลบหรือ -1
(หรือ 0xffffffff
) และโดยที่ไม่อนุญาตให้ใช้ค่าลบอื่นๆ (หรือในกรณีที่ไม่จำเป็นต้องใช้ค่าที่ไม่ได้ลงชื่อจำนวนมาก)
นี่คือตัวอย่างบางส่วนของรูปแบบ:
ลำดับที่เข้ารหัส | เป็น sleb128 | เช่น uleb128 | เช่น uleb128p1 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7ฟ | -1 | 127 | 126 |
80 7ฟ | -128 | 16256 | 16255 |
เค้าโครงไฟล์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
หัวข้อ | header_item | ส่วนหัว |
string_ids | string_id_item[] | รายการตัวระบุสตริง สิ่งเหล่านี้คือตัวระบุสำหรับสตริงทั้งหมดที่ใช้โดยไฟล์นี้ ไม่ว่าจะสำหรับการตั้งชื่อภายใน (เช่น ตัวอธิบายประเภท) หรือเป็นวัตถุคงที่ที่อ้างอิงโดยโค้ด รายการนี้จะต้องจัดเรียงตามเนื้อหาสตริง โดยใช้ค่าจุดโค้ด UTF-16 (ไม่ใช่ในลักษณะที่คำนึงถึงโลแคล) และจะต้องไม่มีรายการที่ซ้ำกัน |
type_ids | type_id_item[] | รายการตัวระบุประเภท สิ่งเหล่านี้คือตัวระบุสำหรับทุกประเภท (คลาส อาร์เรย์ หรือประเภทพื้นฐาน) ที่อ้างอิงโดยไฟล์นี้ ไม่ว่าจะกำหนดไว้ในไฟล์หรือไม่ก็ตาม รายการนี้จะต้องจัดเรียงตามดัชนี string_id และจะต้องไม่มีรายการที่ซ้ำกัน |
proto_ids | โปรโต_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[] | รายการวิธีจัดการ รายการตัวจัดการเมธอดทั้งหมดที่อ้างอิงโดยไฟล์นี้ ไม่ว่าจะกำหนดไว้ในไฟล์หรือไม่ก็ตาม รายการนี้ไม่ได้เรียงลำดับและอาจประกอบด้วยรายการที่ซ้ำกันซึ่งจะสอดคล้องกับตรรกะกับอินสแตนซ์ของตัวจัดการเมธอดที่แตกต่างกัน |
ข้อมูล | ยูไบต์[] | พื้นที่ข้อมูลที่มีข้อมูลสนับสนุนทั้งหมดสำหรับตารางที่แสดงด้านบน รายการที่แตกต่างกันมีข้อกำหนดการจัดตำแหน่งที่แตกต่างกัน และไบต์ของช่องว่างภายในจะถูกแทรกก่อนแต่ละรายการหากจำเป็นเพื่อให้ได้การจัดตำแหน่งที่เหมาะสม |
link_data | ยูไบต์[] | ข้อมูลที่ใช้ในไฟล์ที่เชื่อมโยงแบบคงที่ รูปแบบของข้อมูลในส่วนนี้ไม่ได้ระบุไว้ในเอกสารนี้ ส่วนนี้จะว่างเปล่าในไฟล์ที่ไม่ได้เชื่อมโยง และการใช้งานรันไทม์อาจใช้ส่วนนี้ได้ตามที่เห็นสมควร |
Bitfield สตริง และคำจำกัดความคงที่
DEX_FILE_MAGIC
ฝังอยู่ใน header_item
อาร์เรย์/สตริงคงที่ DEX_FILE_MAGIC
คือรายการไบต์ที่ต้องปรากฏที่จุดเริ่มต้นของไฟล์ .dex
เพื่อให้รับรู้ได้เช่นนี้ ค่านี้จงใจขึ้นบรรทัดใหม่ ( "\n"
หรือ 0x0a
) และไบต์ว่าง ( "\0"
หรือ 0x00
) เพื่อช่วยในการตรวจจับความเสียหายบางรูปแบบ ค่านี้ยังเข้ารหัสหมายเลขเวอร์ชันของรูปแบบเป็นทศนิยมสามหลัก ซึ่งคาดว่าจะเพิ่มขึ้นแบบซ้ำซากเมื่อเวลาผ่านไปเมื่อรูปแบบพัฒนาขึ้น
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
หมายเหตุ: มีการเพิ่มการรองรับเวอร์ชัน 039
ของรูปแบบใน Android 9.0 ซึ่งเปิดตัวรหัสไบต์ใหม่สองรหัส ได้แก่ const-method-handle
และ const-method-type
(แต่ละข้ออธิบายไว้ในตาราง สรุปชุดโค้ดไบต์ ) ใน Android 10 เวอร์ชัน 039
จะขยายรูปแบบไฟล์ DEX เพื่อรวมข้อมูล API ที่ซ่อนอยู่ซึ่งใช้ได้กับไฟล์ DEX บนพาธคลาสบูตเท่านั้น
หมายเหตุ: มีการเพิ่มการรองรับเวอร์ชัน 038
ของรูปแบบในรุ่น Android 8.0 เวอร์ชัน 038
เพิ่มรหัสไบต์ใหม่ ( invoke-polymorphic
และ invoke-custom
) และข้อมูลสำหรับการจัดการเมธอด
หมายเหตุ: มีการเพิ่มการรองรับเวอร์ชัน 037
ของรูปแบบในรุ่น Android 7.0 ก่อนเวอร์ชัน 037
Android เวอร์ชันส่วนใหญ่ใช้เวอร์ชัน 035
ข้อแตกต่างระหว่างเวอร์ชัน 035
และ 037
เพียงอย่างเดียวคือการเพิ่มวิธีการเริ่มต้นและการปรับเปลี่ยน invoke
หมายเหตุ: มีการใช้รูปแบบเวอร์ชันก่อนหน้าอย่างน้อยสองสามเวอร์ชันในซอฟต์แวร์สาธารณะที่เผยแพร่อย่างกว้างขวาง ตัวอย่างเช่น เวอร์ชัน 009
ใช้สำหรับแพลตฟอร์ม Android รุ่น M3 (พฤศจิกายน - ธันวาคม 2550) และเวอร์ชัน 013
ใช้สำหรับแพลตฟอร์ม Android รุ่น M5 (กุมภาพันธ์ - มีนาคม 2551) รูปแบบเวอร์ชันก่อนหน้านี้แตกต่างอย่างมากจากเวอร์ชันที่อธิบายไว้ในเอกสารนี้ในหลายประการ
ENDIAN_CONSTANT และ REVERSE_ENDIAN_CONSTANT
ฝังอยู่ใน header_item
ค่าคงที่ ENDIAN_CONSTANT
ใช้เพื่อระบุจุดสิ้นสุดของไฟล์ที่พบ แม้ว่ารูปแบบ .dex
มาตรฐานจะเป็นแบบ little-endian แต่การใช้งานอาจเลือกที่จะทำการสลับไบต์ได้ หากการใช้งานเจอส่วนหัวที่มี endian_tag
เป็น REVERSE_ENDIAN_CONSTANT
แทนที่จะเป็น ENDIAN_CONSTANT
ก็จะรู้ว่าไฟล์นั้นได้รับการสลับไบต์จากแบบฟอร์มที่คาดไว้
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
NO_INDEX
ฝังอยู่ใน class_def_item และ debug_info_item
ค่าคงที่ NO_INDEX
ใช้เพื่อระบุว่าไม่มีค่าดัชนี
หมายเหตุ: ค่านี้ไม่ได้กำหนดให้เป็น 0
เนื่องจากจริงๆ แล้วค่าดังกล่าวเป็นดัชนีที่ถูกต้อง
ค่าที่เลือกสำหรับ NO_INDEX
สามารถแสดงเป็นไบต์เดียวในการเข้ารหัส uleb128p1
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
คำจำกัดความ access_flags
ฝังอยู่ใน class_def_item, encoded_field, encoded_method และ InnerClass
บิตฟิลด์ของแฟล็กเหล่านี้ใช้เพื่อระบุการเข้าถึงและคุณสมบัติโดยรวมของคลาสและสมาชิกของคลาส
ชื่อ | ค่า | สำหรับคลาส (และคำอธิบายประกอบ InnerClass ) | สำหรับฟิลด์ | สำหรับวิธีการต่างๆ |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : มองเห็นได้ทุกที่ | public : มองเห็นได้ทุกที่ | public : มองเห็นได้ทุกที่ |
ACC_PRIVATE | 0x2 | private : มองเห็นได้เฉพาะการกำหนดคลาสเท่านั้น | private : มองเห็นได้เฉพาะการกำหนดคลาสเท่านั้น | private : มองเห็นได้เฉพาะการกำหนดคลาสเท่านั้น |
ACC_ป้องกัน | 0x4 | protected : มองเห็นได้จากแพ็คเกจและคลาสย่อย | protected : มองเห็นได้จากแพ็คเกจและคลาสย่อย | protected : มองเห็นได้จากแพ็คเกจและคลาสย่อย |
ACC_STATIC | 0x8 | static : ไม่ได้ถูกสร้างขึ้นโดยมีการอ้างอิงภายนอก this | static : global เพื่อกำหนดคลาส | static : ไม่ใช้อาร์กิวเมนต์ this |
ACC_FINAL | 0x10 | final : ไม่สามารถจัดประเภทย่อยได้ | final : ไม่เปลี่ยนรูปหลังการก่อสร้าง | final : ไม่สามารถเอาชนะได้ |
ACC_ซิงโครไนซ์แล้ว | 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_บทคัดย่อ | 0x400 | abstract : ไม่สามารถเกิดขึ้นได้ทันทีโดยตรง | abstract : ไม่ได้ใช้งานโดยคลาสนี้ | |
ACC_STRICT | 0x800 | strictfp : กฎที่เข้มงวดสำหรับเลขคณิตทศนิยม | ||
ACC_สังเคราะห์ | 0x1000 | ไม่ได้กำหนดไว้โดยตรงในซอร์สโค้ด | ไม่ได้กำหนดไว้โดยตรงในซอร์สโค้ด | ไม่ได้กำหนดไว้โดยตรงในซอร์สโค้ด |
ACC_ANNOTATION | 0x2000 | ประกาศเป็นคลาสคำอธิบายประกอบ | ||
ACC_ENUM | 0x4000 | ประกาศให้เป็นประเภทแจกแจง | ประกาศเป็นมูลค่าแจกแจง | |
(ไม่ได้ใช้) | 0x8000 | |||
ACC_คอนสตรัคเตอร์ | 0x10000 | วิธีการสร้าง (คลาสหรือตัวเริ่มต้นอินสแตนซ์) | ||
ACC_DECLARED_ ซิงโครไนซ์ | 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
ในสตริงพร้อมกันได้ และ ยังคงจัดการเป็นสตริงที่สิ้นสุดด้วยค่า null แบบ 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) | ค่า_ประเภท | ยูไบต์ | ไบต์ที่ระบุประเภทของ value ที่ตามมาในทันทีพร้อมกับอาร์กิวเมนต์ชี้แจงทางเลือกในสามบิตที่มีลำดับสูง ดูด้านล่างสำหรับคำจำกัดความ value ต่างๆ ในกรณีส่วนใหญ่ value_arg เข้ารหัสความยาวของ value ที่ตามมาทันทีในหน่วยไบต์ เนื่องจาก (size - 1) เช่น 0 หมายความว่าค่าต้องการหนึ่งไบต์ และ 7 หมายความว่าต้องการแปดไบต์ อย่างไรก็ตาม มีข้อยกเว้นตามที่ระบุไว้ด้านล่างนี้ |
ค่า | ยูไบต์[] | ไบต์ที่แสดงถึงค่า ตัวแปรในความยาว และตีความแตกต่างกันสำหรับไบต์ value_type ที่แตกต่างกัน แม้ว่าจะเป็น endian เพียงเล็กน้อยก็ตาม ดูคำจำกัดความของค่าต่างๆ ด้านล่างเพื่อดูรายละเอียด |
รูปแบบค่า
พิมพ์ชื่อ | value_type | รูปแบบ value_arg | รูป value | คำอธิบาย |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (ไม่มี; ต้องเป็น 0 ) | ยูไบต์[1] | ค่าจำนวนเต็มหนึ่งไบต์ที่เซ็นชื่อ |
VALUE_SHORT | 0x02 | ขนาด - 1 (0…1) | ยูไบต์ [ขนาด] | ค่าจำนวนเต็มสองไบต์ที่เซ็นชื่อ ขยายเครื่องหมาย |
VALUE_CHAR | 0x03 | ขนาด - 1 (0…1) | ยูไบต์ [ขนาด] | ค่าจำนวนเต็มสองไบต์ที่ไม่ได้ลงนาม ขยายเป็นศูนย์ |
VALUE_INT | 0x04 | ขนาด - 1 (0…3) | ยูไบต์ [ขนาด] | ค่าจำนวนเต็มสี่ไบต์ที่เซ็นชื่อ ขยายเครื่องหมาย |
VALUE_LONG | 0x06 | ขนาด - 1 (0…7) | ยูไบต์ [ขนาด] | ค่าจำนวนเต็มแปดไบต์ที่เซ็นชื่อ ขยายเครื่องหมาย |
VALUE_FLOAT | 0x10 | ขนาด - 1 (0…3) | ยูไบต์ [ขนาด] | รูปแบบบิตสี่ไบต์ ขยายเป็นศูนย์ ไปทางขวา และตีความว่าเป็นค่าจุดลอยตัว IEEE754 32 บิต |
VALUE_DOUBLE | 0x11 | ขนาด - 1 (0…7) | ยูไบต์ [ขนาด] | รูปแบบบิตแปดไบต์ ขยายเป็นศูนย์ ไปทางขวา และตีความว่าเป็นค่าจุดลอยตัว IEEE754 64 บิต |
VALUE_METHOD_TYPE | 0x15 | ขนาด - 1 (0…3) | ยูไบต์ [ขนาด] | ค่าจำนวนเต็มสี่ไบต์ที่ไม่ได้ลงนาม (ขยายเป็นศูนย์) ตีความว่าเป็นดัชนีในส่วน proto_ids และแสดงถึงค่าประเภทวิธีการ |
VALUE_METHOD_HANDLE | 0x16 | ขนาด - 1 (0…3) | ยูไบต์ [ขนาด] | ค่าจำนวนเต็มสี่ไบต์ที่ไม่ได้ลงนาม (ขยายเป็นศูนย์) ตีความว่าเป็นดัชนีในส่วน method_handles และแสดงถึงค่าตัวจัดการวิธีการ |
VALUE_STRING | 0x17 | ขนาด - 1 (0…3) | ยูไบต์ [ขนาด] | ค่าจำนวนเต็มสี่ไบต์ที่ไม่ได้ลงนาม (ขยายเป็นศูนย์) แปลเป็นดัชนีในส่วน string_ids และแสดงถึงค่าสตริง |
VALUE_TYPE | 0x18 | ขนาด - 1 (0…3) | ยูไบต์ [ขนาด] | ค่าจำนวนเต็มสี่ไบต์ที่ไม่ได้ลงนาม (ขยายเป็นศูนย์) แปลเป็นดัชนีในส่วน type_ids และแสดงถึงค่าประเภท/คลาสสะท้อนแสง |
VALUE_FIELD | 0x19 | ขนาด - 1 (0…3) | ยูไบต์ [ขนาด] | ค่าจำนวนเต็มสี่ไบต์ที่ไม่ได้ลงนาม (ขยายเป็นศูนย์) แปลเป็นดัชนีในส่วน field_ids และแสดงถึงค่าฟิลด์สะท้อนแสง |
VALUE_METHOD | 0x1a | ขนาด - 1 (0…3) | ยูไบต์ [ขนาด] | ค่าจำนวนเต็มสี่ไบต์ที่ไม่ได้ลงนาม (ขยายเป็นศูนย์) ตีความว่าเป็นดัชนีในส่วน method_ids และแสดงถึงค่าวิธีการสะท้อนกลับ |
VALUE_ENUM | 0x1b | ขนาด - 1 (0…3) | ยูไบต์ [ขนาด] | ค่าจำนวนเต็มสี่ไบต์ที่ไม่ได้ลงนาม (ขยายเป็นศูนย์) ซึ่งแปลเป็นดัชนีในส่วน field_ids และแสดงค่าของค่าคงที่ประเภทที่แจกแจง |
VALUE_ARRAY | 0x1c | (ไม่มี; ต้องเป็น 0 ) | encoded_array | อาร์เรย์ของค่าในรูปแบบที่ระบุโดย " encoded_array format" ด้านล่าง ขนาดของ value มีความหมายโดยนัยในการเข้ารหัส |
VALUE_ANNOTATION | 0x1d | (ไม่มี; ต้องเป็น 0 ) | encoded_annotation | คำอธิบายประกอบย่อยในรูปแบบที่ระบุโดย "รูปแบบ encoded_annotation " ด้านล่าง ขนาดของ value มีความหมายโดยนัยในการเข้ารหัส |
VALUE_NULL | 0x1e | (ไม่มี; ต้องเป็น 0 ) | (ไม่มี) | ค่าอ้างอิงที่ null |
VALUE_BOOLEAN | 0x1f | บูลีน (0…1) | (ไม่มี) | ค่าหนึ่งบิต 0 สำหรับ false และ 1 สำหรับ true บิตจะแสดงอยู่ใน value_arg |
รูปแบบ encoded_array
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | uleb128 | จำนวนองค์ประกอบในอาร์เรย์ |
ค่านิยม | encoded_value[ขนาด] | ชุดของลำดับไบต์ size encoded_value ในรูปแบบที่ระบุโดยส่วนนี้ เชื่อมต่อกันตามลำดับ |
รูปแบบ encoded_annotation
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
type_idx | uleb128 | ประเภทของคำอธิบายประกอบ ต้องเป็นประเภทคลาส (ไม่ใช่อาร์เรย์หรือดั้งเดิม) |
ขนาด | uleb128 | จำนวนการแมปชื่อ-ค่าในคำอธิบายประกอบนี้ |
องค์ประกอบ | คำอธิบายประกอบ_องค์ประกอบ[ขนาด] | องค์ประกอบของคำอธิบายประกอบ แสดงในบรรทัดโดยตรง (ไม่ใช่ออฟเซ็ต) องค์ประกอบจะต้องเรียงลำดับเพิ่มขึ้นตามดัชนี string_id |
รูปแบบคำอธิบายประกอบ_องค์ประกอบ
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
name_idx | uleb128 | ชื่อองค์ประกอบ ซึ่งแสดงเป็นดัชนีในส่วน string_ids สตริงต้องเป็นไปตามไวยากรณ์สำหรับ MemberName ที่กำหนดไว้ข้างต้น |
ค่า | encoded_value | ค่าองค์ประกอบ |
ไวยากรณ์สตริง
มีรายการหลายประเภทในไฟล์ .dex
ซึ่งท้ายที่สุดจะอ้างอิงถึงสตริง คำจำกัดความลักษณะ BNF ต่อไปนี้ระบุไวยากรณ์ที่ยอมรับได้สำหรับสตริงเหล่านี้
SimpleName
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 คือชื่อคลาสแบบเต็ม รวมถึงตัวระบุแพ็กเกจเสริมที่ตามด้วยชื่อที่ต้องการ
ชื่อคลาสเต็ม → | |
OptionalPackagePrefix SimpleName | |
ตัวเลือก PackagePrefix → | |
( SimpleName '/' )* |
TypeDescriptor
ใช้โดย type_id_item
TypeDescriptor คือการแสดงประเภทใดๆ รวมถึงแบบดั้งเดิม คลาส อาร์เรย์ และ void
ดูความหมายของเวอร์ชันต่างๆ ด้านล่าง
ประเภทคำอธิบาย → | |
'V' | |
| | FieldTypeDescriptor |
ตัวอธิบายชนิดฟิลด์ → | |
NonArrayFieldTypeDescriptor | |
| | ( '[' * 1…255) NonArrayFieldTypeDescriptor |
ตัวอธิบาย NonArrayFieldType → | |
'Z' | |
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' ชื่อคลาสเต็ม ';' |
ShortyDescriptor
ใช้โดย proto_id_item
ShortyDescriptor คือการแสดงรูปแบบสั้นของต้นแบบวิธีการ รวมถึงประเภทการส่งคืนและพารามิเตอร์ ยกเว้นว่าไม่มีความแตกต่างระหว่างประเภทการอ้างอิงต่างๆ (คลาสหรืออาร์เรย์) ประเภทการอ้างอิงทั้งหมดจะแสดงด้วยอักขระ 'L'
ตัวเดียวแทน
ตัวอธิบายแบบสั้น → | |
ชอร์ตี้รีเทิร์นไทป์ ( ShortyFieldType )* | |
ShortyReturnType → | |
'V' | |
| | ShortyFieldType |
ShortyFieldType → | |
'Z' | |
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
ความหมาย TypeDescriptor
นี่คือความหมายของแต่ละตัวแปรของ TypeDescriptor
ไวยากรณ์ | ความหมาย |
---|---|
วี | void ; ใช้ได้กับประเภทการคืนสินค้าเท่านั้น |
ซี | boolean |
บี | byte |
ส | short |
ค | char |
ฉัน | int |
เจ | long |
เอฟ | float |
ดี | double |
L ครบถ้วน/มีคุณสมบัติครบถ้วน/ชื่อ ; | ชั้นเรียน fully.qualified.Name |
[ คำอธิบาย | array of descriptor ใช้งานได้แบบเรียกซ้ำสำหรับ arrays-of-arrays แม้ว่าจะไม่ถูกต้องที่จะมีมากกว่า 255 มิติก็ตาม |
รายการและโครงสร้างที่เกี่ยวข้อง
ส่วนนี้ประกอบด้วยคำจำกัดความสำหรับแต่ละรายการระดับบนสุดที่อาจปรากฏในไฟล์ .dex
header_item
ปรากฏในส่วนหัว
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
มายากล | ubyte[8] = DEX_FILE_MAGIC | คุณค่ามหัศจรรย์ ดูการสนทนาด้านบนภายใต้ " DEX_FILE_MAGIC " สำหรับรายละเอียดเพิ่มเติม |
เช็คซัม | ไม่ได้ | การตรวจสอบ adler32 ของไฟล์ที่เหลือ (ทุกอย่างยกเว้น magic และฟิลด์นี้); ใช้ในการตรวจจับความเสียหายของไฟล์ |
ลายเซ็น | ยูไบต์[20] | ลายเซ็น SHA-1 (แฮช) ของส่วนที่เหลือของไฟล์ (ทุกอย่างยกเว้น magic , checksum และฟิลด์นี้) ใช้เพื่อระบุไฟล์โดยไม่ซ้ำกัน |
file_size | ไม่ได้ | ขนาดของไฟล์ทั้งหมด (รวมส่วนหัว) มีหน่วยเป็นไบต์ |
header_size | uint = 0x70 | ขนาดของส่วนหัว (ส่วนทั้งหมดนี้) มีหน่วยเป็นไบต์ ซึ่งช่วยให้มีความเข้ากันได้แบบย้อนกลับ/ไปข้างหน้าอย่างน้อยในจำนวนที่จำกัด โดยไม่ทำให้รูปแบบไม่ถูกต้อง |
endian_tag | uint = ENDIAN_CONSTANT | แท็ก endianness ดูการสนทนาด้านบนภายใต้ " ENDIAN_CONSTANT และ REVERSE_ENDIAN_CONSTANT " สำหรับรายละเอียดเพิ่มเติม |
link_size | ไม่ได้ | ขนาดของส่วนลิงก์ หรือ 0 หากไฟล์นี้ไม่ได้ลิงก์แบบคงที่ |
link_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังส่วนลิงก์ หรือ 0 ถ้า link_size == 0 ออฟเซ็ต หากไม่เป็นศูนย์ ควรเป็นออฟเซ็ตในส่วน link_data รูปแบบของข้อมูลที่ชี้ไปไม่ได้ระบุไว้ในเอกสารนี้ ฟิลด์ส่วนหัวนี้ (และก่อนหน้า) จะถูกปล่อยให้เป็น hooks สำหรับการใช้งานรันไทม์ |
map_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการแผนที่ ค่าชดเชยซึ่งจะต้องไม่เป็นศูนย์ ควรเป็นการชดเชยในส่วน data และข้อมูลควรอยู่ในรูปแบบที่ระบุโดย " map_list " ด้านล่าง |
string_ids_size | ไม่ได้ | จำนวนสตริงในรายการตัวระบุสตริง |
string_ids_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุสตริงหรือ 0 ถ้า string_ids_size == 0 (เป็นที่ยอมรับว่าเป็นตัวพิมพ์เล็กที่แปลก) ค่าชดเชย หากไม่เป็นศูนย์ ควรอยู่ที่จุดเริ่มต้นของส่วน string_ids |
type_ids_size | ไม่ได้ | จำนวนองค์ประกอบในรายการตัวระบุประเภท สูงสุด 65535 |
type_ids_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุประเภทหรือ 0 ถ้า type_ids_size == 0 (เป็นที่ยอมรับว่าเป็นตัวพิมพ์เล็กที่แปลก) ค่าชดเชย หากไม่เป็นศูนย์ ควรอยู่ที่จุดเริ่มต้นของส่วน type_ids |
proto_ids_size | ไม่ได้ | จำนวนองค์ประกอบในรายการตัวระบุต้นแบบ สูงสุด 65535 |
โปรโต_ids_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุต้นแบบหรือ 0 ถ้า proto_ids_size == 0 (ยอมรับว่าเป็นกรณีขอบแปลก) ค่าชดเชย หากไม่เป็นศูนย์ ควรอยู่ที่จุดเริ่มต้นของส่วน proto_ids |
field_ids_size | ไม่ได้ | จำนวนองค์ประกอบในรายการตัวระบุฟิลด์ |
field_ids_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุฟิลด์ หรือ 0 ถ้า field_ids_size == 0 ค่าชดเชย (หากไม่ใช่ศูนย์) ควรอยู่ที่จุดเริ่มต้นของส่วน field_ids |
method_ids_size | ไม่ได้ | จำนวนองค์ประกอบในรายการตัวระบุวิธีการ |
method_ids_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุวิธีการ หรือ 0 ถ้า method_ids_size == 0 ค่าชดเชยหากไม่เป็นศูนย์ ควรอยู่ที่จุดเริ่มต้นของส่วน method_ids |
class_defs_size | ไม่ได้ | จำนวนองค์ประกอบในรายการคำจำกัดความของคลาส |
class_defs_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการคำจำกัดความของคลาสหรือ 0 ถ้า class_defs_size == 0 (เป็นที่ยอมรับว่าเป็นตัวพิมพ์เล็กที่แปลก) ค่าชดเชย หากไม่เป็นศูนย์ ควรอยู่ที่จุดเริ่มต้นของส่วน class_defs |
data_size | ไม่ได้ | ขนาดของส่วน data เป็นไบต์ จะต้องเป็นจำนวนคู่ของ sizeof(uint) |
ข้อมูล_ปิด | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังจุดเริ่มต้นของส่วน data |
แผนที่_รายการ
ปรากฏในส่วนข้อมูล
อ้างอิงจาก header_item
การจัดตำแหน่ง: 4 ไบต์
นี่คือรายการเนื้อหาทั้งหมดของไฟล์ตามลำดับ มันมีความซ้ำซ้อนบางส่วนเกี่ยวกับ header_item
แต่ตั้งใจให้เป็นรูปแบบที่ง่ายต่อการใช้ในการวนซ้ำทั้งไฟล์ ประเภทที่กำหนดจะต้องปรากฏไม่เกินหนึ่งครั้งในแผนที่ แต่ไม่มีข้อจำกัดเกี่ยวกับประเภทลำดับที่อาจปรากฏใน นอกเหนือจากข้อจำกัดโดยนัยของรูปแบบที่เหลือ (เช่น ส่วน header
จะต้องปรากฏก่อน ตามด้วย string_ids
ส่วน ฯลฯ) นอกจากนี้ รายการแผนที่จะต้องเรียงลำดับตามออฟเซ็ตเริ่มต้น และต้องไม่ทับซ้อนกัน
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | ไม่ได้ | ขนาดของรายการในรายการ |
รายการ | map_item[ขนาด] | องค์ประกอบของรายการ |
รูปแบบ map_item
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
พิมพ์ | ushort | ประเภทของรายการ ดูตารางด้านล่าง |
ไม่ได้ใช้ | ushort | (ไม่ได้ใช้) |
ขนาด | ไม่ได้ | นับจำนวนรายการที่จะพบที่ออฟเซ็ตที่ระบุ |
ชดเชย | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการที่เป็นปัญหา |
พิมพ์รหัส
ประเภทรายการ | คงที่ | ค่า | ขนาดรายการเป็นไบต์ |
---|---|---|---|
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 |
โปรโต_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 |
แผนที่_รายการ | TYPE_MAP_LIST | 0x1000 | 4 + (รายการขนาด * 12) |
type_list | TYPE_TYPE_LIST | 0x1001 | 4 + (รายการขนาด * 2) |
annotation_set_ref_list | TYPE_ANNOTATION_SET_REF_LIST | 0x1002 | 4 + (รายการขนาด * 4) |
annotation_set_item | TYPE_ANNOTATION_SET_ITEM | 0x1003 | 4 + (รายการขนาด * 4) |
class_data_item | TYPE_CLASS_DATA_ITEM | 0x2000 | โดยปริยาย; ต้องแยกวิเคราะห์ |
รหัส_รายการ | TYPE_CODE_ITEM | 0x2001 | โดยปริยาย; ต้องแยกวิเคราะห์ |
string_data_item | TYPE_STRING_DATA_ITEM | 0x2002 | โดยปริยาย; ต้องแยกวิเคราะห์ |
debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | โดยปริยาย; ต้องแยกวิเคราะห์ |
annotation_item | TYPE_ANNOTATION_ITEM | 0x2004 | โดยปริยาย; ต้องแยกวิเคราะห์ |
encoded_array_item | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | โดยปริยาย; ต้องแยกวิเคราะห์ |
annotations_directory_item | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | โดยปริยาย; ต้องแยกวิเคราะห์ |
Hiddenapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | โดยปริยาย; ต้องแยกวิเคราะห์ |
string_id_item
ปรากฏในส่วน string_ids
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
string_data_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังข้อมูลสตริงสำหรับรายการนี้ ค่าชดเชยควรอยู่ที่ตำแหน่งในส่วน data และข้อมูลควรอยู่ในรูปแบบที่ระบุโดย " string_data_item " ด้านล่าง ไม่มีข้อกำหนดการจัดตำแหน่งสำหรับออฟเซ็ต |
string_data_item
ปรากฏในส่วนข้อมูล
การจัดตำแหน่ง: ไม่มี (จัดแนวไบต์)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
utf16_size | uleb128 | ขนาดของสตริงนี้ในหน่วยโค้ด UTF-16 (ซึ่งก็คือ "ความยาวสตริง" ในหลายระบบ) นั่นคือนี่คือความยาวที่ถอดรหัสของสตริง (ความยาวที่เข้ารหัสจะแสดงโดยตำแหน่งของไบต์ 0 ) |
ข้อมูล | ยูไบต์[] | ชุดของหน่วยรหัส MUTF-8 (aka octets หรือ aka bytes) ตามด้วยค่าไบต์ 0 ดู "การเข้ารหัส MUTF-8 (แก้ไข UTF-8)" ด้านบนสำหรับรายละเอียดและการอภิปรายเกี่ยวกับรูปแบบข้อมูล หมายเหตุ: เป็นที่ยอมรับได้ที่จะมีสตริงซึ่งรวมถึง (รูปแบบที่เข้ารหัสของ) หน่วยรหัสตัวแทน UTF-16 (นั่นคือ |
type_id_item
ปรากฏในส่วน type_ids
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
descriptor_idx | ไม่ได้ | จัดทำดัชนีในรายการ string_ids สำหรับสตริงตัวอธิบายประเภทนี้ สตริงต้องเป็นไปตามไวยากรณ์สำหรับ TypeDescriptor ที่กำหนดไว้ข้างต้น |
โปรโต_id_item
ปรากฏในส่วน proto_ids
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
shorty_idx | ไม่ได้ | จัดทำดัชนีในรายการ string_ids สำหรับสตริงตัวอธิบายแบบสั้นของต้นแบบนี้ สตริงต้องเป็นไปตามไวยากรณ์สำหรับ ShortyDescriptor ที่กำหนดไว้ข้างต้น และต้องสอดคล้องกับประเภทการส่งคืนและพารามิเตอร์ของรายการนี้ |
return_type_idx | ไม่ได้ | จัดทำดัชนีในรายการ type_ids สำหรับประเภทการส่งคืนของต้นแบบนี้ |
พารามิเตอร์_ปิด | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการประเภทพารามิเตอร์สำหรับต้นแบบนี้ หรือ 0 หากต้นแบบนี้ไม่มีพารามิเตอร์ ค่าชดเชยนี้ (หากไม่เป็นศูนย์) ควรอยู่ในส่วน data และข้อมูลควรมีอยู่ในรูปแบบที่ระบุโดย "type_list" ด้านล่าง นอกจากนี้ ไม่ควรมีการอ้างอิงถึงประเภท void ในรายการ |
field_id_item
ปรากฏในส่วน field_ids
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
class_idx | ushort | จัดทำดัชนีในรายการ type_ids สำหรับผู้กำหนดฟิลด์นี้ นี่ต้องเป็นประเภทคลาส และไม่ใช่อาร์เรย์หรือประเภทดั้งเดิม |
type_idx | ushort | จัดทำดัชนีในรายการ type_ids สำหรับประเภทของฟิลด์นี้ |
name_idx | ไม่ได้ | จัดทำดัชนีในรายการ string_ids สำหรับชื่อของฟิลด์นี้ สตริงต้องเป็นไปตามไวยากรณ์สำหรับ MemberName ที่กำหนดไว้ข้างต้น |
method_id_item
ปรากฏในส่วน method_ids
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
class_idx | ushort | จัดทำดัชนีในรายการ type_ids สำหรับผู้กำหนดวิธีนี้ นี่ต้องเป็นคลาสหรือประเภทอาร์เรย์ และไม่ใช่ประเภทดั้งเดิม |
proto_idx | ushort | จัดทำดัชนีในรายการ proto_ids สำหรับต้นแบบของวิธีนี้ |
name_idx | ไม่ได้ | จัดทำดัชนีในรายการ string_ids สำหรับชื่อของเมธอดนี้ สตริงต้องเป็นไปตามไวยากรณ์สำหรับ MemberName ที่กำหนดไว้ข้างต้น |
class_def_item
ปรากฏในส่วน class_defs
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
class_idx | ไม่ได้ | จัดทำดัชนีในรายการ type_ids สำหรับคลาสนี้ นี่ต้องเป็นประเภทคลาส และไม่ใช่อาร์เรย์หรือประเภทดั้งเดิม |
การเข้าถึง_ธง | ไม่ได้ | แฟล็กการเข้าถึงสำหรับคลาส ( public , final ฯลฯ ) ดู "คำจำกัดความ access_flags " สำหรับรายละเอียด |
ซูเปอร์คลาส_idx | ไม่ได้ | จัดทำดัชนีในรายการ type_ids สำหรับซูเปอร์คลาส หรือค่าคงที่ NO_INDEX หากคลาสนี้ไม่มีซูเปอร์คลาส (นั่นคือ เป็นคลาสรูท เช่น Object ) หากมี จะต้องเป็นประเภทคลาส ไม่ใช่อาร์เรย์หรือประเภทดั้งเดิม |
อินเทอร์เฟซ_ปิด | ไม่ได้ | offset จากจุดเริ่มต้นของไฟล์ไปยังรายการอินเทอร์เฟซ หรือ 0 หากไม่มี การชดเชยนี้ควรอยู่ในส่วน data และข้อมูลควรอยู่ในรูปแบบที่ระบุโดย " type_list " ด้านล่าง แต่ละองค์ประกอบของรายการจะต้องเป็นประเภทคลาส (ไม่ใช่อาร์เรย์หรือประเภทดั้งเดิม) และจะต้องไม่มีการซ้ำกัน |
source_file_idx | ไม่ได้ | จัดทำดัชนีในรายการ string_ids สำหรับชื่อของไฟล์ที่มีแหล่งที่มาดั้งเดิมสำหรับ (อย่างน้อยที่สุด) คลาสนี้ หรือค่าพิเศษ NO_INDEX เพื่อแสดงถึงการขาดข้อมูลนี้ debug_info_item ของวิธีการที่กำหนดอาจแทนที่ไฟล์ต้นฉบับนี้ แต่ความคาดหวังก็คือคลาสส่วนใหญ่จะมาจากไฟล์ต้นฉบับเดียวเท่านั้น |
คำอธิบายประกอบ_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังโครงสร้างคำอธิบายประกอบสำหรับคลาสนี้ หรือ 0 หากไม่มีคำอธิบายประกอบในคลาสนี้ อ็อฟเซ็ตนี้ (หากไม่เป็นศูนย์) ควรอยู่ในส่วน data และข้อมูลควรมีในรูปแบบที่ระบุโดย " annotations_directory_item " ด้านล่าง โดยรายการทั้งหมดที่อ้างอิงถึงคลาสนี้เป็นตัวกำหนด |
class_data_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังข้อมูลคลาสที่เกี่ยวข้องสำหรับรายการนี้ หรือ 0 หากไม่มีข้อมูลคลาสสำหรับคลาสนี้ (อาจเป็นกรณีนี้ เช่น หากคลาสนี้เป็นอินเทอร์เฟซของมาร์กเกอร์) อ็อฟเซ็ต (หากไม่ใช่ศูนย์) ควรอยู่ในส่วน data และข้อมูลควรมีอยู่ในรูปแบบที่ระบุโดย " class_data_item " ด้านล่าง โดยรายการทั้งหมดที่อ้างถึงคลาสนี้เป็นผู้กำหนด |
static_values_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการค่าเริ่มต้นสำหรับฟิลด์ 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 | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์เพื่อเรียกคำจำกัดความของไซต์ ออฟเซ็ตควรอยู่ในส่วนข้อมูล และข้อมูลควรอยู่ในรูปแบบที่ระบุโดย "call_site_item" ด้านล่าง |
call_site_item
ปรากฏในส่วนข้อมูล
การจัดตำแหน่ง: ไม่มี (การจัดตำแหน่งไบต์)
call_site_item คือ encoded_array_item ซึ่งมีองค์ประกอบที่สอดคล้องกับอาร์กิวเมนต์ที่ระบุให้กับเมธอด bootstrap linker ข้อโต้แย้งสามข้อแรกคือ:
- ตัวจัดการเมธอดที่แสดงถึงเมธอด bootstrap linker (VALUE_METHOD_HANDLE)
- ชื่อเมธอดที่ตัวเชื่อมโยงบูตสแตรปควรแก้ไข (VALUE_STRING)
- ประเภทวิธีการที่สอดคล้องกับประเภทของชื่อวิธีการที่จะแก้ไข (VALUE_METHOD_TYPE)
อาร์กิวเมนต์เพิ่มเติมใดๆ จะเป็นค่าคงที่ที่ส่งไปยังเมธอด bootstrap linker อาร์กิวเมนต์เหล่านี้ถูกส่งตามลำดับและไม่มีการแปลงประเภทใดๆ
ตัวจัดการเมธอดที่แสดงถึงเมธอด bootstrap linker ต้องมีชนิดส่งคืน java.lang.invoke.CallSite
ประเภทพารามิเตอร์สามชนิดแรกคือ:
-
java.lang.invoke.Lookup
-
java.lang.String
-
java.lang.invoke.MethodType
ประเภทพารามิเตอร์ของอาร์กิวเมนต์เพิ่มเติมใดๆ จะถูกกำหนดจากค่าคงที่
method_handle_item
ปรากฏในส่วน method_handles
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
method_handle_type | ushort | ประเภทของตัวจัดการวิธีการ ดูตารางด้านล่าง |
ไม่ได้ใช้ | ushort | (ไม่ได้ใช้) |
field_or_method_id | ushort | รหัสฟิลด์หรือเมธอดขึ้นอยู่กับว่าประเภทตัวจัดการเมธอดคือตัวเข้าถึงหรือตัวเรียกใช้เมธอด |
ไม่ได้ใช้ | ushort | (ไม่ได้ใช้) |
รหัสประเภทตัวจัดการวิธีการ
คงที่ | ค่า | คำอธิบาย |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0x00 | ตัวจัดการเมธอดคือตัวตั้งค่าฟิลด์แบบคงที่ (ตัวเข้าถึง) |
METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | ตัวจัดการเมธอดเป็นตัวรับฟิลด์แบบคงที่ (ตัวเข้าถึง) |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | ตัวจัดการเมธอดเป็นตัวตั้งค่าฟิลด์อินสแตนซ์ (ตัวเข้าถึง) |
method_handle_type_instance_get | 0x03 | การจัดการวิธีการเป็นฟิลด์อินสแตนซ์ getter (accessor) |
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 | Handing Method Method Method Method |
class_data_item
อ้างอิงจาก class_def_item
ปรากฏในส่วนข้อมูล
การจัดตำแหน่ง: ไม่มี (แนวไบต์)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
Static_fields_size | ULEB128 | จำนวนฟิลด์คงที่ที่กำหนดไว้ในรายการนี้ |
อินสแตนซ์ _fields_size | ULEB128 | จำนวนฟิลด์อินสแตนซ์ที่กำหนดไว้ในรายการนี้ |
direct_methods_size | ULEB128 | จำนวนวิธีการโดยตรงที่กำหนดไว้ในรายการนี้ |
virtual_methods_size | ULEB128 | จำนวนวิธีการเสมือนจริงที่กำหนดไว้ในรายการนี้ |
Static_fields | encoded_field [Static_fields_size] | ฟิลด์คงที่ที่กำหนดซึ่งแสดงเป็นลำดับขององค์ประกอบที่เข้ารหัส ฟิลด์จะต้องเรียงลำดับโดย field_idx ในการเพิ่มลำดับ |
อินสแตนซ์ _fields | ENCODED_FIELD [Instant_fields_size] | ฟิลด์อินสแตนซ์ที่กำหนดซึ่งแสดงเป็นลำดับขององค์ประกอบที่เข้ารหัส ฟิลด์จะต้องเรียงลำดับโดย field_idx ในการเพิ่มลำดับ |
direct_methods | encoded_method [direct_methods_size] | วิธีการโดยตรง (ใด ๆ ของ static private หรือคอนสตรัคเตอร์) แสดงเป็นลำดับขององค์ประกอบที่เข้ารหัส วิธีการจะต้องเรียงลำดับโดย method_idx ในการเพิ่มลำดับ |
Virtual_methods | encoded_method [virtual_methods_size] | วิธีการเสมือนที่กำหนด (ไม่มีวิธี static private หรือคอนสตรัคเตอร์) แสดงเป็นลำดับขององค์ประกอบที่เข้ารหัส รายการนี้ ไม่ ควรรวมถึงวิธีการที่สืบทอดมาเว้นแต่จะถูกแทนที่โดยคลาสที่รายการนี้แสดงถึง วิธีการจะต้องเรียงลำดับโดย method_idx ในการเพิ่มลำดับ method_idx ของวิธีการเสมือนจะต้อง ไม่ เหมือนกับวิธีการโดยตรงใด ๆ |
หมายเหตุ: อินสแตนซ์ field_id
ขององค์ประกอบทั้งหมดและ method_id
จะต้องอ้างถึงคลาสที่กำหนดเดียวกัน
รูปแบบ encoded_field
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
field_idx_diff | ULEB128 | ดัชนีลงในรายการ field_ids สำหรับตัวตนของฟิลด์นี้ (รวมถึงชื่อและตัวอธิบาย) ซึ่งแสดงเป็นความแตกต่างจากดัชนีขององค์ประกอบก่อนหน้าในรายการ ดัชนีขององค์ประกอบแรกในรายการจะแสดงโดยตรง |
access_flags | ULEB128 | การเข้าถึงธงสำหรับสนาม ( public , final , ฯลฯ ) ดู "คำจำกัดความ access_flags " สำหรับรายละเอียด |
รูปแบบ encoded_method
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
method_idx_diff | ULEB128 | ดัชนีลงในรายการ method_ids สำหรับตัวตนของวิธีนี้ (รวมถึงชื่อและตัวอธิบาย) ซึ่งแสดงเป็นความแตกต่างจากดัชนีขององค์ประกอบก่อนหน้าในรายการ ดัชนีขององค์ประกอบแรกในรายการจะแสดงโดยตรง |
access_flags | ULEB128 | เข้าถึงธงสำหรับวิธีการ ( public , final , ฯลฯ ) ดู "คำจำกัดความ access_flags " สำหรับรายละเอียด |
code_off | ULEB128 | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังโครงสร้างรหัสสำหรับวิธีนี้หรือ 0 ถ้าวิธีนี้เป็น abstract หรือ native การชดเชยควรอยู่ที่ตำแหน่งในส่วน data รูปแบบของข้อมูลถูกระบุโดย " code_item " ด้านล่าง |
type_list
อ้างอิงจาก class_def_item และ proto_id_item
ปรากฏในส่วนข้อมูล
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | ไม่ได้ | ขนาดของรายการในรายการ |
รายการ | type_item [ขนาด] | องค์ประกอบของรายการ |
รูปแบบ type_item
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
type_idx | ushort | ดัชนีลงในรายการ type_ids |
code_item
อ้างอิงจาก encoded_method
ปรากฏในส่วนข้อมูล
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ลงทะเบียน _size | ushort | จำนวนการลงทะเบียนที่ใช้โดยรหัสนี้ |
ins_size | ushort | จำนวนคำของอาร์กิวเมนต์ที่เข้ามาในวิธีการที่รหัสนี้มีไว้สำหรับ |
outs_size | ushort | จำนวนคำของพื้นที่อาร์กิวเมนต์ขาออกที่กำหนดไว้ในรหัสนี้สำหรับการเรียกใช้เมธอด |
tries_size | ushort | จำนวน try_item s สำหรับอินสแตนซ์นี้ หากไม่ใช่ศูนย์แล้วสิ่งเหล่านี้จะปรากฏเป็นอาร์เรย์ tries หลังจาก insns ในอินสแตนซ์นี้ |
debug_info_off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังข้อมูลการดีบัก (หมายเลขบรรทัด + ข้อมูลตัวแปรโลคัล) สำหรับรหัสนี้หรือ 0 หากไม่มีข้อมูล ออฟเซ็ตถ้าไม่ใช่ศูนย์ควรอยู่ที่ตำแหน่งในส่วน data รูปแบบของข้อมูลถูกระบุโดย " debug_info_item " ด้านล่าง |
insns_size | ไม่ได้ | ขนาดของรายการคำแนะนำในรหัส 16 บิต |
insns | ushort [insns_size] | อาร์เรย์จริงของไบต์ รูปแบบของรหัสในอาร์เรย์ insns ถูกระบุโดยเอกสารร่วม Dalvik bytecode โปรดทราบว่าแม้ว่าสิ่งนี้จะถูกกำหนดให้เป็นอาร์เรย์ของ ushort แต่ก็มีโครงสร้างภายในบางอย่างที่ต้องการการจัดตำแหน่งแบบสี่ไบต์ นอกจากนี้หากสิ่งนี้เกิดขึ้นในไฟล์ endian-swapped การสลับจะทำ เฉพาะ ในอินสแตนซ์ ushort ของแต่ละบุคคลเท่านั้นและไม่ได้อยู่ในโครงสร้างภายในที่ใหญ่กว่า |
การขยายความ | 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 | ไม่ได้ | เริ่มต้นที่อยู่ของบล็อกของรหัสที่ครอบคลุมโดยรายการนี้ ที่อยู่คือจำนวนรหัสรหัส 16 บิตถึงจุดเริ่มต้นของคำสั่งที่ครอบคลุมครั้งแรก |
insn_count | ushort | จำนวนหน่วยรหัส 16 บิตที่ครอบคลุมโดยรายการนี้ รหัสสุดท้ายที่ครอบคลุม (รวม) คือ start_addr + insn_count - 1 |
handler_off | ushort | ออฟเซ็ตในไบต์จากจุดเริ่มต้นของ enction encoded_catch_hander_list ถึง encoded_catch_handler สำหรับรายการนี้ นี่จะต้องชดเชยกับจุดเริ่มต้นของ encoded_catch_handler |
รูปแบบ encoded_catch_handler_list
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | ULEB128 | ขนาดของรายการนี้ในรายการ |
รายการ | encoded_catch_handler [handlers_size] | รายการจริงของรายการ handler แสดงโดยตรง (ไม่ใช่เป็นออฟเซ็ต) และต่อกันตามลำดับ |
รูปแบบ encoded_catch_handler
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | SLEB128 | จำนวนประเภทจับในรายการนี้ หากไม่เป็นบวกนี่คือค่าลบของจำนวนประเภทจับและการจับจะตามด้วยตัวจัดการจับทั้งหมด ตัวอย่างเช่น: size 0 หมายความว่ามีการจับทั้งหมด แต่ไม่มีการจับที่พิมพ์ออกมาอย่างชัดเจน size 2 หมายความว่ามีการจับที่พิมพ์ได้สองครั้งและไม่มีการจับทั้งหมด และ size -1 หมายความว่ามีการพิมพ์หนึ่งครั้งพร้อมกับการจับทั้งหมด |
ตัวจัดการ | encoded_type_addr_pair [abs (ขนาด)] | สตรีมของรายการที่เข้ารหัส abs(size) หนึ่งรายการสำหรับแต่ละประเภทที่จับได้ตามลำดับที่ควรทดสอบประเภท |
catch_all_addr | ULEB128 (ไม่บังคับ) | ที่อยู่ bytecode ของ Handler Catch-all องค์ประกอบนี้มีอยู่เฉพาะในกรณีที่ size ไม่เป็นบวก |
รูปแบบ encoded_type_addr_pair
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
type_idx | ULEB128 | ดัชนีลงในรายการ type_ids สำหรับประเภทของข้อยกเว้นที่จะจับ |
บวก | ULEB128 | ที่อยู่ bytecode ของตัวจัดการข้อยกเว้นที่เกี่ยวข้อง |
debug_info_item
อ้างอิงจาก code_item
ปรากฏในส่วนข้อมูล
การจัดตำแหน่ง: ไม่มี (แนวไบต์)
debug_info_item
แต่ละตัวจะกำหนดเครื่องจักรสถานะไบต์ที่ได้รับแรงบันดาลใจจาก DWARF3 ซึ่งเมื่อตีความแล้วจะปล่อยตารางตำแหน่งและ (อาจ) ข้อมูลตัวแปรท้องถิ่นสำหรับ code_item
ลำดับเริ่มต้นด้วยส่วนหัวความยาวตัวแปร (ความยาวที่ขึ้นอยู่กับจำนวนของพารามิเตอร์วิธี) ตามด้วยรหัสสถานะของเครื่องและจบลงด้วยไบต์ DBG_END_SEQUENCE
BYTE
เครื่องจักรของรัฐประกอบด้วยการลงทะเบียนห้าครั้ง address
ลงทะเบียนที่อยู่หมายถึงการชดเชยคำสั่งใน insns_item
ที่เกี่ยวข้องในหน่วยรหัส 16 บิต การลง address
ที่อยู่เริ่มต้นที่ 0
ที่จุดเริ่มต้นของแต่ละลำดับ debug_info
และจะต้องเพิ่มขึ้น monotonically เท่านั้น การลงทะเบียน line
แสดงถึงหมายเลขสายต้นทางที่ควรเชื่อมโยงกับรายการตารางตำแหน่งถัดไปที่ปล่อยออกมาโดยเครื่องรัฐ มันเริ่มต้นในส่วนหัวลำดับและอาจเปลี่ยนแปลงไปในทิศทางบวกหรือลบ แต่ต้องไม่น้อยกว่า 1
การลงทะเบียน source_file
แสดงถึงไฟล์ต้นฉบับที่รายการหมายเลขบรรทัดอ้างถึง มันเริ่มต้นจากค่าของ source_file_idx
ใน class_def_item
อีกสองตัวแปรคือ prologue_end
และ epilogue_begin
เป็นธงบูลีน (เริ่มต้นเป็น false
) ที่ระบุว่าตำแหน่งถัดไปที่ปล่อยออกมาควรได้รับการพิจารณาว่าเป็นวิธีการหรือบทส่งท้าย เครื่องรัฐจะต้องติดตามชื่อและประเภทของตัวแปรท้องถิ่นสุดท้ายสดในแต่ละการลงทะเบียนสำหรับรหัส DBG_RESTART_LOCAL
ส่วนหัวมีดังนี้:
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
line_start | ULEB128 | ค่าเริ่มต้นสำหรับการลงทะเบียน line ของเครื่องรัฐ ไม่ได้แสดงถึงรายการตำแหน่งจริง |
พารามิเตอร์ _size | ULEB128 | จำนวนชื่อพารามิเตอร์ที่เข้ารหัส ควรมีพารามิเตอร์หนึ่งวิธีต่อวิธียกเว้นวิธีการอินสแตนซ์ this ถ้ามี |
parameter_names | ULEB128P1 [PARAMETERS_SIZE] | ดัชนีสตริงของชื่อพารามิเตอร์เมธอด ค่าที่เข้ารหัสของ NO_INDEX ระบุว่าไม่มีชื่อสำหรับพารามิเตอร์ที่เกี่ยวข้อง ตัวบ่งชี้ประเภทและลายเซ็นนั้นบอกเป็นนัยจากตัวบ่งชี้วิธีการและลายเซ็น |
ค่ารหัสไบต์มีดังนี้:
ชื่อ | ค่า | รูปแบบ | ข้อโต้แย้ง | คำอธิบาย |
---|---|---|---|---|
DBG_END_SEXENCE | 0x00 | (ไม่มี) | ยุติลำดับข้อมูลการดีบักสำหรับ code_item | |
dbg_advance_pc | 0x01 | ULEB128 ADDR_DIFF | addr_diff : จำนวนเงินที่จะเพิ่มลงในการลงทะเบียนที่อยู่ | ล่วงหน้าการลงทะเบียนที่อยู่โดยไม่ต้องเปล่งการเข้าตำแหน่ง |
dbg_advance_line | 0x02 | SLEB128 LINE_DIFF | line_diff : จำนวนเงินที่จะเปลี่ยนการลงทะเบียนบรรทัดโดย | ล่วงหน้าการลงทะเบียนบรรทัดโดยไม่ต้องเปล่งรายการตำแหน่ง |
dbg_start_local | 0x03 | uleb128 register_num ULEB128P1 NAME_IDX ULEB128P1 TYPE_IDX | register_num : ลงทะเบียนที่จะมีท้องถิ่นname_idx : ดัชนีสตริงของชื่อtype_idx : ประเภทดัชนีของประเภท | แนะนำตัวแปรท้องถิ่นตามที่อยู่ปัจจุบัน name_idx หรือ type_idx อาจเป็น NO_INDEX เพื่อระบุว่าไม่ทราบค่านั้น |
dbg_start_local_extended | 0x04 | uleb128 register_num ULEB128P1 NAME_IDX ULEB128P1 TYPE_IDX ULEB128P1 SIG_IDX | register_num : ลงทะเบียนที่จะมีท้องถิ่นname_idx : ดัชนีสตริงของชื่อtype_idx : ประเภทดัชนีของประเภทsig_idx : ดัชนีสตริงของลายเซ็นประเภท | แนะนำท้องถิ่นด้วยลายเซ็นประเภทที่ที่อยู่ปัจจุบัน name_idx , type_idx หรือ sig_idx ใด ๆ อาจเป็น NO_INDEX เพื่อระบุว่าไม่ทราบค่านั้น (ถ้า sig_idx คือ -1 แต่ข้อมูลเดียวกันสามารถแสดงได้อย่างมีประสิทธิภาพมากขึ้นโดยใช้ OpCode DBG_START_LOCAL ) หมายเหตุ: ดูการสนทนาภายใต้ " |
dbg_end_local | 0x05 | uleb128 register_num | register_num : ลงทะเบียนที่มีท้องถิ่น | ทำเครื่องหมายตัวแปรท้องถิ่นในปัจจุบันซึ่งอยู่นอกขอบเขตตามที่อยู่ปัจจุบัน |
dbg_restart_local | 0x06 | uleb128 register_num | register_num : ลงทะเบียนเพื่อรีสตาร์ท | แนะนำตัวแปรท้องถิ่นอีกครั้งตามที่อยู่ปัจจุบัน ชื่อและประเภทนั้นเหมือนกับท้องถิ่นสุดท้ายที่อาศัยอยู่ในทะเบียนที่ระบุ |
dbg_set_prologue_end | 0x07 | (ไม่มี) | ตั้งค่าการลงทะเบียนเครื่อง prologue_end State Machine ซึ่งระบุว่ารายการตำแหน่งถัดไปที่เพิ่มเข้ามาควรได้รับการพิจารณาว่าเป็นจุดสิ้นสุดของวิธีการใด ๆ (สถานที่ที่เหมาะสมสำหรับจุดพักของวิธีการ) การลงทะเบียน prologue_end จะถูกล้างด้วย opcode พิเศษ ( >= 0x0a ) | |
dbg_set_epilogue_begin | 0x08 | (ไม่มี) | ตั้งค่าการลงทะเบียนเครื่อง epilogue_begin State Machine ซึ่งระบุว่ารายการตำแหน่งถัดไปที่เพิ่มเข้ามาควรได้รับการพิจารณาว่าเป็นจุดเริ่มต้นของวิธีการส่งสัญญาณ (สถานที่ที่เหมาะสมในการระงับการดำเนินการก่อนออกจากวิธีการ) epilogue_begin Register ถูกล้างด้วย opcode พิเศษใด ๆ ( >= 0x0a ) | |
dbg_set_file | 0x09 | ULEB128P1 NAME_IDX | name_idx : ดัชนีสตริงของชื่อไฟล์ต้นฉบับ; NO_INDEX ถ้าไม่ทราบ | ระบุว่ารายการหมายเลขบรรทัดที่ตามมาทั้งหมดอ้างอิงถึงชื่อไฟล์ต้นฉบับนี้แทนที่จะเป็นชื่อเริ่มต้นที่ระบุใน code_item |
opcodes พิเศษ | 0x0a … 0xff | (ไม่มี) | ความก้าวหน้าของการลงทะเบียน line และ address ปล่อยการเข้าตำแหน่งและล้าง prologue_end และ epilogue_begin ดูด้านล่างสำหรับคำอธิบาย |
opcodes พิเศษ
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 | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังคำอธิบายประกอบที่ทำโดยตรงในชั้นเรียนหรือ 0 หากคลาสไม่มีคำอธิบายประกอบโดยตรง ออฟเซ็ตถ้าไม่ใช่ศูนย์ควรอยู่ที่ตำแหน่งในส่วน data รูปแบบของข้อมูลถูกระบุโดย " annotation_set_item " ด้านล่าง |
Fields_size | ไม่ได้ | จำนวนฟิลด์มีคำอธิบายประกอบโดยรายการนี้ |
คำอธิบายประกอบ _Methods_size | ไม่ได้ | จำนวนวิธีการที่มีคำอธิบายประกอบโดยรายการนี้ |
หมายเหตุประกอบ _Parameters_size | ไม่ได้ | จำนวนพารามิเตอร์เมธอดแสดงรายการคำอธิบายประกอบโดยรายการนี้ |
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 | ไม่ได้ | ดัชนีลงในรายการ field_ids สำหรับตัวตนของฟิลด์ที่มีคำอธิบายประกอบ |
คำอธิบายประกอบ _off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับฟิลด์ การชดเชยควรอยู่ที่ตำแหน่งในส่วน data รูปแบบของข้อมูลถูกระบุโดย " annotation_set_item " ด้านล่าง |
รูปแบบ method_annotation
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
method_idx | ไม่ได้ | ดัชนีลงในรายการ method_ids สำหรับตัวตนของวิธีการที่มีคำอธิบายประกอบ |
คำอธิบายประกอบ _off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับวิธีการ การชดเชยควรอยู่ที่ตำแหน่งในส่วน data รูปแบบของข้อมูลถูกระบุโดย " annotation_set_item " ด้านล่าง |
รูปแบบ parameter_annotation
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
method_idx | ไม่ได้ | ดัชนีลงในรายการ method_ids สำหรับข้อมูลประจำตัวของวิธีการที่พารามิเตอร์กำลังถูกใส่คำอธิบายประกอบ |
คำอธิบายประกอบ _off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับพารามิเตอร์เมธอด การชดเชยควรอยู่ที่ตำแหน่งในส่วน data รูปแบบของข้อมูลถูกระบุโดย " annotation_set_ref_list " ด้านล่าง |
Annotation_set_ref_list
อ้างอิงจาก parameter_annotations_item
ปรากฏในส่วนข้อมูล
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | ไม่ได้ | ขนาดของรายการในรายการ |
รายการ | Annotation_set_ref_item [ขนาด] | องค์ประกอบของรายการ |
annotation_set_ref_item รูปแบบ
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
คำอธิบายประกอบ _off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์ไปยังชุดคำอธิบายประกอบที่อ้างอิงหรือ 0 หากไม่มีคำอธิบายประกอบสำหรับองค์ประกอบนี้ ออฟเซ็ตถ้าไม่ใช่ศูนย์ควรอยู่ที่ตำแหน่งในส่วน data รูปแบบของข้อมูลถูกระบุโดย " annotation_set_item " ด้านล่าง |
Annotation_set_item
อ้างอิงจาก Annotations_directory_item, field_annotations_item, method_annotations_item และ Annotation_set_ref_item
ปรากฏในส่วนข้อมูล
การจัดตำแหน่ง: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | ไม่ได้ | ขนาดของชุดในรายการ |
รายการ | Annotation_off_item [ขนาด] | องค์ประกอบของชุด องค์ประกอบจะต้องจัดเรียงตามลำดับที่เพิ่มขึ้นโดย type_idx |
รูปแบบคำอธิบายประกอบ _off_item
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
คำอธิบายประกอบ _off | ไม่ได้ | ชดเชยจากจุดเริ่มต้นของไฟล์เป็นคำอธิบายประกอบ การชดเชยควรอยู่ที่ตำแหน่งในส่วน data และรูปแบบของข้อมูลที่ตำแหน่งนั้นระบุโดย " annotation_item " ด้านล่าง |
คำอธิบายประกอบ _item
อ้างอิงจาก Annotation_set_item
ปรากฏในส่วนข้อมูล
การจัดตำแหน่ง: ไม่มี (แนวไบต์)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ทัศนวิสัย | Ubyte | การมองเห็นที่ตั้งใจไว้ของคำอธิบายประกอบนี้ (ดูด้านล่าง) |
คำอธิบายประกอบ | ENCODED_ANNOTATION | เนื้อหาคำอธิบายประกอบที่เข้ารหัสในรูปแบบที่อธิบายโดย "รูปแบบ encoded_annotation " ภายใต้ "การเข้ารหัส encoded_value " ด้านบน |
ค่าการมองเห็น
นี่คือตัวเลือกสำหรับฟิลด์ visibility
ใน annotation_item
:
ชื่อ | ค่า | คำอธิบาย |
---|---|---|
การมองเห็น _build | 0x00 | ตั้งใจจะมองเห็นได้ในเวลาที่สร้าง (เช่นในระหว่างการรวบรวมรหัสอื่น) |
การมองเห็น _runtime | 0x01 | มีจุดประสงค์เพื่อให้มองเห็นได้เมื่อรันไทม์ |
การมองเห็น _System | 0x02 | มีวัตถุประสงค์เพื่อให้มองเห็นได้ในเวลาทำงาน แต่เฉพาะกับระบบพื้นฐาน (และไม่ใช่รหัสผู้ใช้ปกติ) |
ENCODED_ARRAY_ITEM
อ้างอิงจาก class_def_item
ปรากฏในส่วนข้อมูล
การจัดตำแหน่ง: ไม่มี (แนวไบต์)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | encoded_array | ไบต์แสดงถึงค่าอาร์เรย์ที่เข้ารหัสในรูปแบบที่ระบุโดย "รูปแบบ encoded_array " ภายใต้ "การเข้ารหัส encoded_value " ด้านบน |
hiddenapi_class_data_item
ส่วนนี้มีข้อมูลเกี่ยวกับอินเทอร์เฟซที่ จำกัด ที่ใช้โดยแต่ละคลาส
หมายเหตุ: คุณลักษณะ API ที่ซ่อนอยู่ได้รับการแนะนำใน Android 10.0 และใช้ได้เฉพาะกับไฟล์ DEX ของคลาสในเส้นทาง Boot Class เท่านั้น รายการธงที่อธิบายไว้ด้านล่างอาจขยายออกไปในการเผยแพร่ในอนาคตของ Android สำหรับข้อมูลเพิ่มเติมดู ข้อ จำกัด เกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ SDK
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | ไม่ได้ | ขนาดทั้งหมดของส่วน |
ชดเชย | uint [] | อาร์เรย์ของออฟเซ็ตที่จัดทำดัชนีโดย class_idx รายการอาร์เรย์ศูนย์ที่ดัชนี class_idx หมายความว่าไม่มีข้อมูลสำหรับ class_idx นี้หรือธง API ที่ซ่อนอยู่ทั้งหมดเป็นศูนย์ มิฉะนั้นรายการอาร์เรย์จะไม่เป็นศูนย์และมีออฟเซ็ตจากจุดเริ่มต้นของส่วนไปยังอาร์เรย์ของธง API ที่ซ่อนอยู่สำหรับ class_idx นี้ |
ธง | uleb128 [] | อาร์เรย์ API ที่ซ่อนอยู่สำหรับแต่ละชั้นเรียน ค่าธงที่เป็นไปได้อธิบายไว้ในตารางด้านล่าง ธงจะถูกเข้ารหัสในลำดับเดียวกันกับฟิลด์และวิธีการที่เข้ารหัสในข้อมูลคลาส |
ข้อ จำกัด ประเภทธง:
ชื่อ | ค่า | คำอธิบาย |
---|---|---|
รายการที่อนุญาต | 0 | อินเทอร์เฟซที่สามารถใช้งานได้อย่างอิสระและได้รับการสนับสนุนเป็นส่วนหนึ่งของ ดัชนีแพ็คเกจ Android Framework ที่บันทึกไว้อย่างเป็นทางการ |
Greylist | 1 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่สามารถใช้งานได้โดยไม่คำนึงถึง ระดับ API เป้าหมาย ของแอปพลิเคชัน |
บัญชีดำ | 2 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่ไม่สามารถใช้งานได้โดยไม่คำนึงถึง ระดับ API เป้าหมาย ของแอปพลิเคชัน การเข้าถึงหนึ่งในอินเทอร์เฟซเหล่านี้ทำให้เกิด ข้อผิดพลาดรันไทม์ |
Greylist - Max - O | 3 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่สามารถใช้สำหรับ Android 8.X และต่ำกว่าเว้นแต่ว่าจะถูก จำกัด |
Greylist - Max - P | 4 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่สามารถใช้สำหรับ Android 9.x เว้นแต่จะถูก จำกัด |
Greylist - Max - Q | 5 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่สามารถใช้สำหรับ Android 10.x เว้นแต่จะถูก จำกัด |
Greylist - Max - R | 6 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่สามารถใช้สำหรับ Android 11.x เว้นแต่จะถูก จำกัด |
คำอธิบายประกอบระบบ
คำอธิบายประกอบของระบบใช้เพื่อแสดงข้อมูลไตร่ตรองต่าง ๆ เกี่ยวกับคลาส (และวิธีการและฟิลด์) ข้อมูลนี้โดยทั่วไปจะเข้าถึงได้เฉพาะรหัสลูกค้า (ไม่ใช่ระบบ)
คำอธิบายประกอบของระบบจะแสดงในไฟล์ .dex
เป็นคำอธิบายประกอบที่มีการมองเห็นที่ตั้งไว้เป็น VISIBILITY_SYSTEM
dalvik.annotation.annotationdefault
ปรากฏบนวิธีการในอินเทอร์เฟซคำอธิบายประกอบ
คำอธิบายประกอบ AnnotationDefault
ติดอยู่กับอินเทอร์เฟซคำอธิบายประกอบแต่ละรายการซึ่งต้องการระบุการผูกเริ่มต้น
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | คำอธิบายประกอบ | การผูกเริ่มต้นสำหรับคำอธิบายประกอบนี้แสดงเป็นคำอธิบายประกอบของประเภทนี้ คำอธิบายประกอบไม่จำเป็นต้องรวมชื่อทั้งหมดที่กำหนดโดยคำอธิบายประกอบ; ชื่อที่ขาดหายไปไม่มีค่าเริ่มต้น |
dalvik.annotation.enclosingclass
ปรากฏในชั้นเรียน
คำอธิบายประกอบ EnclosingClass
ถูกแนบมากับแต่ละคลาสซึ่งถูกกำหนดให้เป็นสมาชิกของคลาสอื่นต่อ se หรือไม่ระบุชื่อ แต่ไม่ได้กำหนดไว้ในร่างกายวิธีการ (เช่นคลาสสังเคราะห์ภายใน) ทุกชั้นเรียนที่มีคำอธิบายประกอบนี้จะต้องมีคำอธิบาย InnerClass
นอกจากนี้ชั้นเรียนจะต้องไม่มีทั้งแบบ EnclosingClass
และคำอธิบาย EnclosingMethod
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | ระดับ | คลาสที่มีขอบเขตอย่างใกล้ชิดที่สุดในชั้นเรียนนี้ |
dalvik.annotation.enclosingMethod
ปรากฏในชั้นเรียน
คำอธิบาย EnclosingMethod
จะติดอยู่กับแต่ละคลาสซึ่งกำหนดไว้ในร่างกายของวิธีการ ทุกชั้นเรียนที่มีคำอธิบายประกอบนี้จะต้องมีคำอธิบาย InnerClass
นอกจากนี้ชั้นเรียนจะต้องไม่มีทั้งแบบ EnclosingClass
และคำอธิบาย EnclosingMethod
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | วิธี | วิธีการที่มีขอบเขตอย่างใกล้ชิดที่สุดในชั้นเรียนนี้ |
dalvik.annotation.innerclass
ปรากฏในชั้นเรียน
คำอธิบายประกอบ InnerClass
ถูกแนบมากับแต่ละคลาสซึ่งกำหนดไว้ในขอบเขตคำศัพท์ของคำจำกัดความของคลาสอื่น ชั้นเรียนใด ๆ ที่มีคำอธิบายประกอบนี้จะต้องมีคำอธิบายประกอบ แบบ EnclosingClass
หรือ คำอธิบาย EnclosingMethod
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ชื่อ | สตริง | ชื่อง่าย ๆ ที่ประกาศไว้เดิมของคลาสนี้ (ไม่รวมคำนำหน้าแพ็คเกจใด ๆ ) หากคลาสนี้ไม่ระบุชื่อชื่อนั้นจะเป็น null |
AccessFlags | ภายใน | ธงการเข้าถึงที่ประกาศไว้เดิมของคลาส (ซึ่งอาจแตกต่างจากธงที่มีประสิทธิภาพเนื่องจากไม่ตรงกันระหว่างโมเดลการดำเนินการของภาษาต้นทางและเครื่องเสมือนเป้าหมาย) |
dalvik.annotation.memberclasses
ปรากฏในชั้นเรียน
คำอธิบายประกอบ MemberClasses
จะแนบกับแต่ละคลาสซึ่งประกาศคลาสสมาชิก (คลาสสมาชิกเป็นคลาสภายในโดยตรงที่มีชื่อ)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | ระดับ[] | อาร์เรย์ของคลาสสมาชิก |
dalvik.annotation.methodparameters
ปรากฏบนวิธีการ
หมายเหตุ: เพิ่มคำอธิบายประกอบนี้หลังจาก Android 7.1 การปรากฏตัวของมันในการปล่อย Android ก่อนหน้านี้จะถูกละเว้น
คำอธิบายประกอบ MethodParameters
เป็นทางเลือกและสามารถใช้เพื่อให้ข้อมูลเมตาพารามิเตอร์เช่นชื่อพารามิเตอร์และตัวดัดแปลง
คำอธิบายประกอบสามารถละเว้นได้จากวิธีการหรือตัวสร้างอย่างปลอดภัยเมื่อไม่จำเป็นต้องใช้ข้อมูลเมตาของพารามิเตอร์ในเวลาทำงาน java.lang.reflect.Parameter.isNamePresent()
สามารถใช้เพื่อตรวจสอบว่าเมตาดาต้ามีอยู่สำหรับพารามิเตอร์และวิธีการสะท้อนที่เกี่ยวข้องเช่น java.lang.reflect.Parameter.getName()
จะกลับไปสู่พฤติกรรมเริ่มต้นที่รันไทม์ หากข้อมูลไม่มีอยู่
เมื่อรวมถึงข้อมูลเมตาพารามิเตอร์คอมไพเลอร์จะต้องมีข้อมูลสำหรับคลาสที่สร้างขึ้นเช่น enums เนื่องจากเมตาดาต้าพารามิเตอร์รวมถึงพารามิเตอร์ที่เป็นสังเคราะห์หรือได้รับคำสั่งหรือไม่
คำอธิบายประกอบ 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
ไม่ได้กำหนดรูปแบบสำหรับลายเซ็น มันเป็นเพียงการตั้งใจที่จะสามารถเป็นตัวแทนของลายเซ็นที่ภาษาต้นฉบับต้องการสำหรับการใช้งานที่ประสบความสำเร็จของความหมายของภาษานั้น ดังนั้นลายเซ็นจึงไม่ได้แยกวิเคราะห์ (หรือตรวจสอบแล้ว) โดยการใช้งานเครื่องเสมือนจริง ลายเซ็นเพียงแค่ส่งมอบ API และเครื่องมือระดับสูงกว่า (เช่น Debuggers) ดังนั้นการใช้ลายเซ็นใด ๆ จึงควรเขียนเพื่อไม่ให้ตั้งสมมติฐานใด ๆ เกี่ยวกับการได้รับลายเซ็นที่ถูกต้องเท่านั้นปกป้องตัวเองอย่างชัดเจนกับความเป็นไปได้ที่จะเจอลายเซ็นที่ไม่ถูกต้องทางไวยากรณ์
เนื่องจากสตริงลายเซ็นมักจะมีเนื้อหาที่ซ้ำกัน จำนวน มากคำอธิบายประกอบลาย Signature
ถูกกำหนดให้เป็นอาร์เรย์ของสตริงที่องค์ประกอบที่ซ้ำกันตามธรรมชาติอ้างถึงข้อมูลพื้นฐานเดียวกัน . ไม่มีกฎระเบียบเกี่ยวกับวิธีการดึงลายเซ็นออกเป็นสตริงแยกต่างหาก นั่นขึ้นอยู่กับเครื่องมือที่สร้างไฟล์ .dex
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | สตริง [] | ลายเซ็นของชั้นเรียนหรือสมาชิกนี้เป็นอาร์เรย์ของสตริงที่จะถูกรวมเข้าด้วยกัน |
dalvik.annotation.throws
ปรากฏบนวิธีการ
คำอธิบาย Throws
ติดอยู่กับแต่ละวิธีซึ่งประกาศให้โยนประเภทข้อยกเว้นหนึ่งประเภทขึ้นไป
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | ระดับ[] | อาร์เรย์ของประเภทข้อยกเว้นที่ถูกโยนทิ้ง |