รูปแบบปฏิบัติการ Dalvik

เอกสารนี้อธิบายโครงร่างและเนื้อหาของไฟล์ .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_NATIVE ด้วย

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+10000U+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+d800U+dfff ) ไม่ถือเป็นอักขระชื่อที่ถูกต้อง แต่อักขระเสริม Unicode นั้น ถูก ต้อง (ซึ่งแสดงโดยทางเลือกสุดท้ายของกฎสำหรับ SimpleNameChar ) และพวกเขา ควรแสดงในไฟล์เป็นคู่ของจุดรหัสตัวแทนในการเข้ารหัส MUTF-8

ชื่อธรรมดา
SimpleNameChar ( SimpleNameChar )*
SimpleNameChar
'A''Z'
| 'a''z'
| '0''9'
| ' ' ตั้งแต่ DEX เวอร์ชัน 040
| '$'
| '-'
| '_'
| U+00a0 ตั้งแต่ DEX เวอร์ชัน 040
| U+00a1U+1fff
| U+2000U+200a ตั้งแต่ DEX เวอร์ชัน 040
| U+2010U+2027
| U+202f ตั้งแต่ DEX เวอร์ชัน 040
| U+2030U+d7ff
| U+e000U+ffef
| U+10000U+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 (นั่นคือ U+d800U+dfff ) ไม่ว่าจะแยกกันหรือไม่อยู่ในลำดับที่เกี่ยวข้องกับการเข้ารหัสตามปกติ ของ Unicode เป็น 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 ข้อโต้แย้งสามข้อแรกคือ:

  1. ตัวจัดการเมธอดที่แสดงถึงเมธอด bootstrap linker (VALUE_METHOD_HANDLE)
  2. ชื่อเมธอดที่ตัวเชื่อมโยงบูตสแตรปควรแก้ไข (VALUE_STRING)
  3. ประเภทวิธีการที่สอดคล้องกับประเภทของชื่อวิธีการที่จะแก้ไข (VALUE_METHOD_TYPE)

อาร์กิวเมนต์เพิ่มเติมใดๆ จะเป็นค่าคงที่ที่ส่งไปยังเมธอด bootstrap linker อาร์กิวเมนต์เหล่านี้ถูกส่งตามลำดับและไม่มีการแปลงประเภทใดๆ

ตัวจัดการเมธอดที่แสดงถึงเมธอด bootstrap linker ต้องมีชนิดส่งคืน java.lang.invoke.CallSite ประเภทพารามิเตอร์สามชนิดแรกคือ:

  1. java.lang.invoke.Lookup
  2. java.lang.String
  3. 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 )

หมายเหตุ: ดูการสนทนาภายใต้ " dalvik.annotation.Signature " ด้านล่างสำหรับคำเตือนเกี่ยวกับการจัดการลายเซ็น

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 [] ธงการเข้าถึงของพารามิเตอร์อย่างเป็นทางการสำหรับวิธีการที่เกี่ยวข้อง อาร์เรย์จะต้องไม่เป็นโมฆะ แต่ต้องว่างเปล่าหากไม่มีพารามิเตอร์ที่เป็นทางการ
ค่าเป็นหน้ากากบิตที่มีค่าต่อไปนี้:
  • 0x0010: สุดท้ายพารามิเตอร์ได้รับการประกาศขั้นสุดท้าย
  • 0x1000: สังเคราะห์พารามิเตอร์ถูกแนะนำโดยคอมไพเลอร์
  • 0x8000: ได้รับคำสั่งพารามิเตอร์เป็นสังเคราะห์ แต่ก็บอกเป็นนัยตามข้อกำหนดภาษา
หากมีการตั้งค่าบิตใด ๆ นอกชุดนี้แล้ว java.lang.reflect.MalformedParametersException จะถูกโยนลงในเวลาทำงาน

dalvik.annotation.Signature

ปรากฏในชั้นเรียนฟิลด์และวิธีการ

คำอธิบายประกอบ Signature ติดตั้งกับแต่ละคลาสฟิลด์หรือวิธีการที่กำหนดไว้ในแง่ของประเภทที่ซับซ้อนกว่าที่สามารถแสดงโดย type_id_item รูปแบบ .dex ไม่ได้กำหนดรูปแบบสำหรับลายเซ็น มันเป็นเพียงการตั้งใจที่จะสามารถเป็นตัวแทนของลายเซ็นที่ภาษาต้นฉบับต้องการสำหรับการใช้งานที่ประสบความสำเร็จของความหมายของภาษานั้น ดังนั้นลายเซ็นจึงไม่ได้แยกวิเคราะห์ (หรือตรวจสอบแล้ว) โดยการใช้งานเครื่องเสมือนจริง ลายเซ็นเพียงแค่ส่งมอบ API และเครื่องมือระดับสูงกว่า (เช่น Debuggers) ดังนั้นการใช้ลายเซ็นใด ๆ จึงควรเขียนเพื่อไม่ให้ตั้งสมมติฐานใด ๆ เกี่ยวกับการได้รับลายเซ็นที่ถูกต้องเท่านั้นปกป้องตัวเองอย่างชัดเจนกับความเป็นไปได้ที่จะเจอลายเซ็นที่ไม่ถูกต้องทางไวยากรณ์

เนื่องจากสตริงลายเซ็นมักจะมีเนื้อหาที่ซ้ำกัน จำนวน มากคำอธิบายประกอบลาย Signature ถูกกำหนดให้เป็นอาร์เรย์ของสตริงที่องค์ประกอบที่ซ้ำกันตามธรรมชาติอ้างถึงข้อมูลพื้นฐานเดียวกัน . ไม่มีกฎระเบียบเกี่ยวกับวิธีการดึงลายเซ็นออกเป็นสตริงแยกต่างหาก นั่นขึ้นอยู่กับเครื่องมือที่สร้างไฟล์ .dex

ชื่อ รูปแบบ คำอธิบาย
ค่า สตริง [] ลายเซ็นของชั้นเรียนหรือสมาชิกนี้เป็นอาร์เรย์ของสตริงที่จะถูกรวมเข้าด้วยกัน

dalvik.annotation.throws

ปรากฏบนวิธีการ

คำอธิบาย Throws ติดอยู่กับแต่ละวิธีซึ่งประกาศให้โยนประเภทข้อยกเว้นหนึ่งประเภทขึ้นไป

ชื่อ รูปแบบ คำอธิบาย
ค่า ระดับ[] อาร์เรย์ของประเภทข้อยกเว้นที่ถูกโยนทิ้ง