รูปแบบไฟล์ปฏิบัติการ Dalvik

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

คำแนะนำเกี่ยวกับประเภท

ชื่อ คำอธิบาย
ไบต์ จำนวนเต็มแบบมีเครื่องหมาย 8 บิต
ubyte จำนวนเต็มแบบไม่มีเครื่องหมาย 8 บิต
วิดีโอสั้น จำนวนเต็มแบบมีเครื่องหมาย 16 บิต, Little-Endian
ushort จำนวนเต็มแบบไม่มีเครื่องหมาย 16 บิต, Little-Endian
Int int แบบมีเครื่องหมาย 32 บิต, Little-Endian
uint int แบบไม่มีเครื่องหมาย 32 บิต, Little-Endian
ยาว int แบบมีเครื่องหมาย 64 บิต, little-endian
อูหลง จำนวนเต็มแบบไม่มีเครื่องหมาย 64 บิต, Little-Endian
sleb128 LEB128 ที่ลงชื่อแล้ว ความยาวตัวแปร (ดูด้านล่าง)
uleb128 LEB128 ที่ไม่มีการลงนาม ความยาวตัวแปร (ดูด้านล่าง)
uleb128p1 LEB128 ที่ไม่มีการลงนามบวก 1 ความยาวตัวแปร (ดูด้านล่าง)

LEB128

LEB128 ("Little-Endian Base 128") คือการเข้ารหัสแบบความยาวตัวแปรสำหรับจำนวนเต็มแบบมีหรือไม่มีเครื่องหมายโดยพลการ รูปแบบนี้ยืมมาจากข้อกำหนด DWARF3 ในไฟล์ .dex จะใช้ LEB128 เพื่อเข้ารหัสปริมาณ 32 บิตเท่านั้น

ค่าที่เข้ารหัส LEB128 แต่ละค่าประกอบด้วยไบต์ 1-5 ไบต์ ซึ่งรวมกันเป็นค่า 32 บิตเดียว ไบต์แต่ละไบต์มีการตั้งค่าบิตที่สำคัญที่สุด ยกเว้นไบต์สุดท้ายในลำดับ ซึ่งมีการล้างบิตที่สำคัญที่สุด ส่วนอีก 7 บิตที่เหลือของแต่ละไบต์คือเพย์โหลด โดยมี 7 บิตที่มีความสำคัญน้อยที่สุดของปริมาณในไบต์แรก 7 บิตถัดไปในไบต์ที่ 2 และอื่นๆ ในกรณีของ LEB128 แบบมีเครื่องหมาย (sleb128) บิตเพย์โหลดที่มีนัยสำคัญที่สุดของไบต์สุดท้ายในลำดับจะ ขยายเครื่องหมายเพื่อสร้างค่าสุดท้าย ในกรณีที่ไม่มีการลงนาม (uleb128) ระบบจะตีความบิตที่ไม่ได้แสดงอย่างชัดเจนเป็น 0

แผนภาพระดับบิตของค่า LEB128 แบบ 2 ไบต์
ไบต์แรก ไบต์ที่ 2
1 bit6 bit5 บิต4 bit3 bit2 บิต1 บิต0 0 bit13 bit12 bit11 bit10 บิต9 bit8 bit7

ตัวแปร uleb128p1 ใช้เพื่อแสดงค่าที่มีเครื่องหมาย โดยการแสดงค่าคือ บวก 1 ที่เข้ารหัส เป็น uleb128 ซึ่งทำให้การเข้ารหัส -1 (หรืออาจมองว่าเป็นค่าที่ไม่มีเครื่องหมาย 0xffffffff) — แต่ไม่ใช่ตัวเลขลบอื่นๆ — เป็นไบต์เดียว และมีประโยชน์ในกรณีที่ตัวเลขที่แสดงต้องเป็นค่าที่ไม่เป็นลบหรือ -1 (หรือ 0xffffffff) และไม่อนุญาตให้ใช้ค่าลบอื่นๆ (หรือในกรณีที่ไม่น่าจะต้องใช้ค่าที่ไม่มีเครื่องหมายขนาดใหญ่)

ตัวอย่างรูปแบบมีดังนี้

ลำดับที่เข้ารหัส เมื่อ sleb128 เมื่อ uleb128 เมื่อ uleb128p1
0000-1
01110
7f-1127126
80 7f-1281625616255

เลย์เอาต์ไฟล์

ชื่อ รูปแบบ คำอธิบาย
ส่วนหัว header_item ส่วนหัว
string_ids string_id_item[] รายการตัวระบุสตริง ตัวระบุเหล่านี้ใช้สำหรับสตริงทั้งหมด ที่ไฟล์นี้ใช้ ไม่ว่าจะสำหรับการตั้งชื่อภายใน (เช่น ตัวอธิบายประเภท) หรือเป็นออบเจ็กต์ค่าคงที่ที่โค้ดอ้างอิง รายการนี้ต้องเรียงตามเนื้อหาของสตริงโดยใช้ค่าโค้ดพอยต์ UTF-16 (ไม่ใช่ในลักษณะที่คำนึงถึงภาษา) และต้องไม่มีรายการที่ซ้ำกัน
type_ids type_id_item[] รายการตัวระบุประเภท ซึ่งเป็นตัวระบุสำหรับประเภททั้งหมด (คลาส อาร์เรย์ หรือประเภทดั้งเดิม) ที่ไฟล์นี้อ้างอิง ไม่ว่าจะกำหนดไว้ในไฟล์หรือไม่ก็ตาม รายการนี้ต้องจัดเรียงตามดัชนี string_id และต้องไม่มีรายการที่ซ้ำกัน
proto_ids proto_id_item[] รายการตัวระบุต้นแบบของเมธอด ซึ่งเป็นตัวระบุสำหรับต้นแบบทั้งหมด ที่ไฟล์นี้อ้างอิง รายการนี้ต้องเรียงตาม ประเภทการคืนค่า (ตามลำดับดัชนี type_id) เป็นลำดับหลัก แล้วจึงเรียงตาม รายการอาร์กิวเมนต์ (การเรียงตามพจนานุกรม อาร์กิวเมนต์แต่ละรายการ เรียงตามดัชนี type_id) รายการต้องไม่มีรายการที่ซ้ำกัน
field_ids field_id_item[] รายการตัวระบุฟิลด์ ซึ่งเป็นตัวระบุสำหรับฟิลด์ทั้งหมด ที่ไฟล์นี้อ้างอิง ไม่ว่าจะกำหนดไว้ในไฟล์หรือไม่ก็ตาม รายการนี้ ต้องจัดเรียง โดยประเภทที่กำหนด (ตามดัชนี type_id ) เป็นลำดับหลัก ชื่อฟิลด์ (ตามดัชนี string_id) เป็นลำดับกลาง และประเภท (ตามดัชนี type_id) เป็นลำดับรอง รายการต้องไม่มีรายการที่ซ้ำกัน
method_ids method_id_item[] รายการตัวระบุวิธีการ ตัวระบุสำหรับเมธอดทั้งหมด ที่ไฟล์นี้อ้างอิง ไม่ว่าจะกำหนดไว้ในไฟล์หรือไม่ก็ตาม รายการนี้ต้องเรียงลำดับ โดยที่ประเภทที่กำหนด (ตามดัชนี type_id ) เป็นลำดับหลัก ชื่อเมธอด (ตามดัชนี string_id ) เป็นลำดับกลาง และต้นแบบเมธอด (ตามดัชนี proto_id ) เป็นลำดับรอง รายการต้องไม่มีรายการที่ซ้ำกัน
class_defs class_def_item[] รายการคำจำกัดความของคลาส ต้องจัดเรียงคลาสเพื่อให้คลาสซูเปอร์คลาสและอินเทอร์เฟซที่ใช้ของคลาสหนึ่งๆ ปรากฏในรายการก่อนคลาสที่อ้างอิง นอกจากนี้ การกำหนดสำหรับคลาสที่มีชื่อเดียวกันจะปรากฏในรายการมากกว่า 1 ครั้งไม่ได้
call_site_ids call_site_id_item[] รายการตัวระบุเว็บไซต์ที่เรียก ซึ่งเป็นตัวระบุสำหรับเว็บไซต์ที่เรียกทั้งหมด ที่ไฟล์นี้อ้างอิง ไม่ว่าจะกำหนดไว้ในไฟล์หรือไม่ก็ตาม รายการนี้ ต้องจัดเรียงตามลำดับจากน้อยไปมากของ call_site_off
method_handles method_handle_item[] method handles list รายการแฮนเดิลของเมธอดทั้งหมดที่ไฟล์นี้อ้างอิงถึง ไม่ว่าจะกำหนดไว้ในไฟล์หรือไม่ก็ตาม รายการนี้ไม่ได้จัดเรียงและอาจมีรายการที่ซ้ำกัน ซึ่งจะสอดคล้องกับอินสแตนซ์ของตัวแฮนเดิลเมธอดที่แตกต่างกัน
เพิ่มเติม ubyte[] พื้นที่ข้อมูลซึ่งมีข้อมูลสนับสนุนทั้งหมดสำหรับตารางที่ระบุไว้ข้างต้น รายการต่างๆ มีข้อกำหนดการจัดแนวที่แตกต่างกัน และ ระบบจะแทรกไบต์การจัดช่องว่างก่อนแต่ละรายการหากจำเป็นเพื่อให้ การจัดแนวที่เหมาะสม
link_data ubyte[] ข้อมูลที่ใช้ในไฟล์ที่ลิงก์แบบคงที่ เอกสารนี้ไม่ได้ระบุรูปแบบของข้อมูลใน ส่วนนี้ ส่วนนี้จะว่างเปล่าในไฟล์ที่ไม่ได้ลิงก์ และการใช้งานรันไทม์ อาจใช้ส่วนนี้ตามที่เห็นสมควร

รูปแบบคอนเทนเนอร์

เวอร์ชัน 41 เปิดตัวรูปแบบคอนเทนเนอร์ใหม่สำหรับข้อมูล DEX โดยมีเป้าหมายเพื่อประหยัดพื้นที่ รูปแบบคอนเทนเนอร์นี้ช่วยให้รวมไฟล์ DEX เชิงตรรกะหลายไฟล์ไว้ในไฟล์จริงไฟล์เดียวได้ รูปแบบใหม่ส่วนใหญ่เป็นการต่อไฟล์อย่างง่ายในรูปแบบก่อนหน้า โดยมีความแตกต่างดังนี้

  • file_size คือขนาดของไฟล์เชิงตรรกะ ไม่ใช่ไฟล์จริง ซึ่งใช้เพื่อวนซ้ำไฟล์เชิงตรรกะทั้งหมดในคอนเทนเนอร์ได้
  • ไฟล์ Dex เชิงตรรกะอาจอ้างอิงข้อมูลในภายหลังในคอนเทนเนอร์ (แต่จะอ้างอิงข้อมูลก่อนหน้าไม่ได้) ซึ่งช่วยให้ไฟล์ DEX แชร์ข้อมูล เช่น สตริง ระหว่างกันได้
  • ออฟเซ็ตทั้งหมดเกี่ยวข้องกับไฟล์จริง ไม่มีออฟเซ็ตที่สัมพันธ์กับส่วนหัว ซึ่งช่วยให้มั่นใจได้ว่าส่วนที่มีออฟเซ็ตจะแชร์ระหว่างไฟล์เชิงตรรกะได้
  • ส่วนหัวจะเพิ่มฟิลด์ใหม่ 2 รายการเพื่ออธิบายขอบเขตของคอนเทนเนอร์ ซึ่งเป็นการตรวจสอบความสอดคล้องเพิ่มเติมและช่วยให้การย้ายโค้ดไปยังรูปแบบใหม่ทำได้ง่ายขึ้น
  • ตอนนี้เราไม่ได้ใช้ data_size และ data_off แล้ว ข้อมูลสามารถกระจายอยู่ในไฟล์เชิงตรรกะหลายไฟล์และไม่จำเป็นต้องอยู่ติดกัน

คำจำกัดความของบิตฟิลด์ สตริง และค่าคงที่

DEX_FILE_MAGIC

ฝังอยู่ใน header_item

อาร์เรย์/สตริงค่าคงที่ DEX_FILE_MAGIC คือรายการไบต์ที่ต้องปรากฏที่จุดเริ่มต้นของ.dexไฟล์ เพื่อให้ระบบจดจำได้ ค่ามีบรรทัดใหม่ ("\n" หรือ 0x0a) และไบต์ Null ("\0" หรือ 0x00) โดยตั้งใจเพื่อช่วยในการตรวจหาการเสียหายบางรูปแบบ ค่านี้ยัง เข้ารหัสหมายเลขเวอร์ชันรูปแบบเป็นเลขทศนิยม 3 หลัก ซึ่ง คาดว่าจะเพิ่มขึ้นเรื่อยๆ เมื่อเวลาผ่านไปตามการพัฒนาของรูปแบบ

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

หมายเหตุ: การรองรับรูปแบบเวอร์ชัน 041 ได้รับการเพิ่มในการเปิดตัว Android 16 ซึ่งรองรับรูปแบบคอนเทนเนอร์

หมายเหตุ: การรองรับรูปแบบเวอร์ชัน 040 ได้รับการเพิ่มในการเปิดตัว Android 10.0 ซึ่งขยายชุดอักขระที่อนุญาตใน SimpleNames

หมายเหตุ: การรองรับรูปแบบเวอร์ชัน 039 ได้รับการเพิ่มในการเปิดตัว Android 9.0 ซึ่งได้เปิดตัวไบต์โค้ดใหม่ 2 รายการ ได้แก่ 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

หมายเหตุ: รูปแบบนี้มีเวอร์ชันก่อนหน้าอย่างน้อย 2 เวอร์ชัน ที่ใช้ในซอฟต์แวร์สาธารณะที่เผยแพร่ในวงกว้าง เช่น เวอร์ชัน 009 ใช้สำหรับการเปิดตัว M3 ของ แพลตฟอร์ม Android (พฤศจิกายน - ธันวาคม 2007) และเวอร์ชัน 013 ใช้สำหรับการเปิดตัว M5 ของแพลตฟอร์ม Android (กุมภาพันธ์ - มีนาคม 2008) ในหลายๆ ด้าน รูปแบบเวอร์ชันก่อนหน้าเหล่านี้แตกต่างจากเวอร์ชันที่อธิบายไว้ในเอกสารนี้อย่างมาก

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

คำจำกัดความของแฟล็กการเข้าถึง

ฝังอยู่ใน class_def_item, encoded_field, encoded_method และ InnerClass

ฟิลด์บิตของแฟล็กเหล่านี้ใช้เพื่อระบุการช่วยเหลือพิเศษและ พร็อพเพอร์ตี้โดยรวมของคลาสและสมาชิกในคลาส

ชื่อ ค่านิยม สำหรับชั้นเรียน (และคำอธิบายประกอบ InnerClass) สำหรับฟิลด์ สำหรับวิธีการ
ACC_PUBLIC 0x1 public: มองเห็นได้ทุกที่ public: มองเห็นได้ทุกที่ public: มองเห็นได้ทุกที่
ACC_PRIVATE 0x2 * private: only visible to defining class private: มองเห็นได้เฉพาะในคลาสที่กำหนด private: มองเห็นได้เฉพาะในคลาสที่กำหนด
ACC_PROTECTED 0x4 * protected: มองเห็นได้ในแพ็กเกจและคลาสย่อย protected: มองเห็นได้สำหรับแพ็กเกจและคลาสย่อย protected: มองเห็นได้สำหรับแพ็กเกจและคลาสย่อย
ACC_STATIC 0x8 * static: is not constructed with an outer this reference static: ทั่วโลกถึงคลาสที่กำหนด static: ไม่รับอาร์กิวเมนต์ this
ACC_FINAL 0x10 final: ไม่สามารถสร้างคลาสย่อยได้ final: เปลี่ยนแปลงไม่ได้หลังจากสร้าง final: ลบล้างไม่ได้
ACC_SYNCHRONIZED 0x20     synchronized: ล็อกที่เชื่อมโยงจะได้รับโดยอัตโนมัติ เมื่อเรียกใช้เมธอดนี้

หมายเหตุ: การตั้งค่านี้จะใช้ได้ก็ต่อเมื่อตั้งค่า ACC_NATIVE ด้วย

ACC_VOLATILE 0x40   volatile: กฎการเข้าถึงพิเศษเพื่อช่วยเรื่องความปลอดภัยของเธรด  
ACC_BRIDGE 0x40     bridge method ซึ่งคอมไพเลอร์จะเพิ่มโดยอัตโนมัติเป็น bridge ที่ปลอดภัยต่อประเภท
ACC_TRANSIENT 0x80   transient: ไม่บันทึกโดยการซีเรียลไลซ์เริ่มต้น  
ACC_VARARGS 0x80     คอมไพเลอร์ควรถือว่าอาร์กิวเมนต์สุดท้ายเป็นอาร์กิวเมนต์ "ที่เหลือ"
ACC_NATIVE 0x100     native: ใช้ในโค้ดแบบเนทีฟ
ACC_INTERFACE 0x200 interface: คลาสแบบนามธรรมที่ใช้ได้หลายครั้ง    
ACC_ABSTRACT 0x400 abstract: สร้างอินสแตนซ์โดยตรงไม่ได้   abstract: ไม่ได้ใช้โดยคลาสนี้
ACC_STRICT 0x800     strictfp: กฎที่เข้มงวดสำหรับการคำนวณเลขทศนิยม
ACC_SYNTHETIC 0x1000 ไม่ได้กำหนดไว้ในซอร์สโค้ดโดยตรง ไม่ได้กำหนดไว้ในซอร์สโค้ดโดยตรง ไม่ได้กำหนดไว้ในซอร์สโค้ดโดยตรง
ACC_ANNOTATION 0x2000 ประกาศเป็นคลาสคำอธิบายประกอบ    
ACC_ENUM 0x4000 ประกาศเป็นประเภทที่แจงนับ ประกาศเป็นค่าที่แจกแจง  
(ไม่ได้ใช้) 0x8000      
ACC_CONSTRUCTOR 0x10000     เมธอดตัวสร้าง (ตัวเริ่มต้นคลาสหรืออินสแตนซ์)
ACC_DECLARED_
SYNCHRONIZED
0x20000     ประกาศ synchronized

หมายเหตุ: การดำเนินการนี้ไม่มีผลต่อ การดำเนินการ (นอกเหนือจากการแสดงผลของแฟล็กนี้โดยตัวมันเอง)

* อนุญาตให้ใช้ในInnerClassคำอธิบายประกอบเท่านั้น และต้องไม่ใช้ในclass_def_item

การเข้ารหัส UTF-8 ที่แก้ไขแล้ว

เพื่ออำนวยความสะดวกในการรองรับระบบเดิม .dex รูปแบบ จะเข้ารหัสข้อมูลสตริงในรูปแบบ UTF-8 ที่แก้ไขแล้วซึ่งเป็นมาตรฐานโดยพฤตินัย ซึ่งต่อไปนี้ จะเรียกว่า MUTF-8 รูปแบบนี้เหมือนกับ UTF-8 มาตรฐานทุกประการ ยกเว้น

  • ระบบจะใช้เฉพาะการเข้ารหัสแบบ 1, 2 และ 3 ไบต์
  • จุดรหัสในช่วง U+10000U+10ffff จะได้รับการเข้ารหัสเป็นคู่ทดแทน โดยแต่ละจุด จะแสดงเป็นค่าที่เข้ารหัส 3 ไบต์
  • ระบบจะเข้ารหัสโค้ดพอยต์ U+0000 ในรูปแบบ 2 ไบต์
  • ไบต์ Null ธรรมดา (ค่า 0) จะระบุจุดสิ้นสุดของ สตริง ซึ่งเป็นไปตามการตีความภาษา C มาตรฐาน

สรุปรายการ 2 รายการแรกข้างต้นได้ดังนี้ MUTF-8 เป็นรูปแบบการเข้ารหัสสำหรับ UTF-16 แทนที่จะเป็นรูปแบบการเข้ารหัสที่ตรงกว่า สำหรับอักขระ Unicode

2 รายการสุดท้ายข้างต้นทำให้สามารถรวม โค้ดพอยต์ U+0000 ในสตริงและยังคงจัดการ เป็นสตริงที่ลงท้ายด้วยค่าว่างสไตล์ C ได้พร้อมกัน

อย่างไรก็ตาม การเข้ารหัสพิเศษของ U+0000 หมายความว่าเมื่อเรียกใช้ฟังก์ชัน C มาตรฐาน strcmp() กับสตริง MUTF-8 2 สตริง ผลลัพธ์จะไม่ระบุผลลัพธ์ที่ลงนามอย่างถูกต้องของการเปรียบเทียบสตริงที่ไม่เท่ากันเสมอไป ซึ่งต่างจาก UTF-8 ปกติ เมื่อการเรียงลำดับ (ไม่ใช่แค่ความเท่ากัน) เป็นข้อกังวล วิธีที่ตรงไปตรงมาที่สุดในการเปรียบเทียบสตริง MUTF-8 คือการถอดรหัสสตริงทีละอักขระ และเปรียบเทียบค่าที่ถอดรหัสแล้ว (อย่างไรก็ตาม คุณยังสามารถใช้การติดตั้งใช้งานที่ชาญฉลาดกว่านี้ได้ด้วย)

โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการเข้ารหัสอักขระในมาตรฐาน Unicode จริงๆ แล้ว MUTF-8 ใกล้เคียงกับการเข้ารหัส CESU-8 (ซึ่งค่อนข้างไม่เป็นที่รู้จัก) มากกว่า UTF-8 โดยตัวมันเอง

การเข้ารหัส encoded_value

ฝังอยู่ใน annotation_element และ encoded_array_item

encoded_value คือข้อมูลที่มีโครงสร้างแบบลำดับชั้นที่เข้ารหัสแล้ว (เกือบ) โดยพลการ การเข้ารหัสมีจุดประสงค์เพื่อ ให้ทั้งกะทัดรัดและแยกวิเคราะห์ได้ตรงไปตรงมา

ชื่อ รูปแบบ คำอธิบาย
(value_arg << 5) | value_type ubyte ไบต์ที่ระบุประเภทของ value along พร้อมอาร์กิวเมนต์ที่อธิบายเพิ่มเติมซึ่งไม่บังคับใน 3 บิตที่มีลำดับสูง ดูคำจำกัดความต่างๆ ของ value ได้ที่ด้านล่าง ในกรณีส่วนใหญ่ value_arg จะเข้ารหัสความยาวของ value ที่อยู่ถัดไปทันทีเป็นไบต์ (size - 1) เช่น 0 หมายความว่าค่าต้องใช้ 1 ไบต์ และ 7 หมายความว่าต้องใช้ 8 ไบต์ แต่ก็มีข้อยกเว้นตามที่ระบุไว้ด้านล่าง
ค่า ubyte[] ไบต์ที่แสดงค่า ความยาวของตัวแปร และการตีความ จะแตกต่างกันสำหรับไบต์ value_type ที่ต่างกัน แม้ว่า จะเป็นแบบ Little-Endian เสมอ โปรดดูรายละเอียดในคำจำกัดความของค่าต่างๆ ด้านล่าง

รูปแบบค่า

ชื่อประเภท value_type value_arg รูปแบบ value รูปแบบ คำอธิบาย
VALUE_BYTE 0x00 (ไม่มี ต้องเป็น 0) ubyte[1] ค่าจำนวนเต็มแบบมีเครื่องหมาย 1 ไบต์
VALUE_SHORT 0x02 ขนาด - 1 (0…1) ubyte[size] ค่าจำนวนเต็ม 2 ไบต์แบบมีเครื่องหมาย ขยายเครื่องหมาย
VALUE_CHAR 0x03 ขนาด - 1 (0…1) ubyte[size] ค่าจำนวนเต็ม 2 ไบต์ที่ไม่มีการลงนาม ซึ่งขยายเป็น 0
VALUE_INT 0x04 ขนาด - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์แบบมีเครื่องหมาย ขยายเครื่องหมาย
VALUE_LONG 0x06 ขนาด - 1 (0…7) ubyte[size] ค่าจำนวนเต็ม 8 ไบต์แบบมีเครื่องหมาย ขยายเครื่องหมาย
VALUE_FLOAT 0x10 ขนาด - 1 (0…3) ubyte[size] รูปแบบบิต 4 ไบต์ ขยายด้วย 0 ทางด้านขวา และ ตีความเป็นค่าจุดลอยตัว 32 บิตของ IEEE754
VALUE_DOUBLE 0x11 ขนาด - 1 (0…7) ubyte[size] รูปแบบบิต 8 ไบต์ ขยายด้วย 0 ไปทางขวา และ ตีความเป็นค่าจุดลอยตัว 64 บิตของ IEEE754
VALUE_METHOD_TYPE 0x15 ขนาด - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายด้วย 0) ตีความเป็นดัชนีในส่วน proto_ids และแสดงค่าประเภทเมธอด
VALUE_METHOD_HANDLE 0x16 ขนาด - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายด้วย 0) ตีความเป็นดัชนีในส่วน method_handles และแสดงค่าตัวแฮนเดิลของเมธอด
VALUE_STRING 0x17 ขนาด - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็น 0) ตีความเป็นดัชนีในส่วน string_ids และแสดงค่าสตริง
VALUE_TYPE 0x18 ขนาด - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็น 0) ตีความเป็นดัชนีในส่วน type_ids และแสดงค่าประเภท/คลาสแบบสะท้อน
VALUE_FIELD 0x19 ขนาด - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายด้วยศูนย์) ตีความเป็นดัชนีใน ส่วน field_ids และแสดงค่าฟิลด์แบบรีเฟลกทีฟ
VALUE_METHOD 0x1a ขนาด - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็น 0) ตีความเป็นดัชนีในส่วน method_ids และแสดงค่าเมธอดแบบรีเฟลกทีฟ
VALUE_ENUM 0x1b ขนาด - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์ที่ไม่ได้ลงนาม (ขยายเป็น 0) ตีความเป็นดัชนีในส่วน field_ids และแสดงค่าของ ค่าคงที่ประเภทที่แจงนับ
VALUE_ARRAY 0x1c (ไม่มี ต้องเป็น 0) encoded_array อาร์เรย์ของค่าในรูปแบบที่ระบุโดย "รูปแบบ encoded_array" ด้านล่าง ขนาด ของ value จะอยู่ในรูปแบบการเข้ารหัส
VALUE_ANNOTATION 0x1d (ไม่มี ต้องเป็น 0) encoded_annotation คำอธิบายย่อยในรูปแบบที่ระบุโดย "รูปแบบ encoded_annotation" ด้านล่าง ขนาด ของ value จะอยู่ในรูปแบบการเข้ารหัส
VALUE_NULL 0x1e (ไม่มี ต้องเป็น 0) (ไม่มี) ค่าอ้างอิง null
VALUE_BOOLEAN 0x1f บูลีน (0…1) (ไม่มี) ค่า 1 บิต 0 สำหรับ false และ 1 สำหรับ true โดยบิตจะแสดงใน value_arg

รูปแบบ encoded_array

ชื่อ รูปแบบ คำอธิบาย
ขนาด uleb128 จำนวนองค์ประกอบในอาร์เรย์
values encoded_value[size] ลำดับไบต์ size encoded_value ในรูปแบบที่ระบุไว้ในส่วนนี้ โดยต่อกัน ตามลำดับ

รูปแบบ encoded_annotation

ชื่อ รูปแบบ คำอธิบาย
type_idx uleb128 ประเภทของคำอธิบายประกอบ ต้องเป็นคลาส (ไม่ใช่อาร์เรย์หรือไทป์ดั้งเดิม)
ขนาด uleb128 จำนวนการแมปชื่อ-ค่าในคำอธิบายประกอบนี้
องค์ประกอบ annotation_element[size] องค์ประกอบของคำอธิบายประกอบที่แสดงในบรรทัดโดยตรง (ไม่ใช่เป็นออฟเซ็ต) ต้องจัดเรียงองค์ประกอบตามลำดับจากน้อยไปมากตาม string_id ดัชนี

รูปแบบ annotation_element

ชื่อ รูปแบบ คำอธิบาย
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

SimpleName
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 คือชื่อของสมาชิกในคลาส โดยสมาชิกจะเป็นฟิลด์ เมธอด และคลาสใน

MemberName
SimpleName
| '<' SimpleName '>'

FullClassName

FullClassName คือชื่อคลาสที่สมบูรณ์ในตัวเอง ซึ่งรวมถึงตัวระบุแพ็กเกจที่ไม่บังคับตามด้วยชื่อที่ต้องระบุ

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(SimpleName '/')*

TypeDescriptor

ใช้โดย type_id_item

TypeDescriptor คือการแสดงประเภทใดก็ได้ ซึ่งรวมถึง ประเภทข้อมูลพื้นฐาน คลาส อาร์เรย์ และ void ดูความหมายของเวอร์ชันต่างๆ ได้ที่ด้านล่าง

TypeDescriptor
'V'
| FieldTypeDescriptor
FieldTypeDescriptor
NonArrayFieldTypeDescriptor
| ('[' * 1…255) NonArrayFieldTypeDescriptor
NonArrayFieldTypeDescriptor
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L' FullClassName ';'

ShortyDescriptor

ใช้โดย proto_id_item

ShortyDescriptor คือการแสดงรูปแบบย่อของต้นแบบเมธอด ซึ่งรวมถึงประเภทการคืนค่าและพารามิเตอร์ ยกเว้นว่าจะไม่มี การแยกความแตกต่างระหว่างประเภทการอ้างอิง (คลาสหรืออาร์เรย์) ต่างๆ แต่จะใช้'L'ตัวเดียวแทนประเภทการอ้างอิงทั้งหมด

ShortyDescriptor
ShortyReturnType (ShortyFieldType)*
ShortyReturnType
'V'
| ShortyFieldType
ShortyFieldType
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L'

ความหมายของ TypeDescriptor

นี่คือความหมายของตัวแปรแต่ละตัวของ TypeDescriptor

วากยสัมพันธ์ ความหมาย
V void ใช้ได้กับประเภทการคืนสินค้าเท่านั้น
Z boolean
B byte
อา short
C char
I int
J long
F float
D double
Lfully/qualified/Name; ชั้นเรียน fully.qualified.Name
[descriptor อาร์เรย์ของ descriptor ซึ่งใช้แบบเรียกซ้ำได้สำหรับ อาร์เรย์ของอาร์เรย์ แม้ว่าจะมีมิติข้อมูลมากกว่า 255 มิติข้อมูลไม่ได้

รายการและโครงสร้างที่เกี่ยวข้อง

ส่วนนี้มีคำจำกัดความของแต่ละรายการระดับบนสุดที่อาจปรากฏในไฟล์ .dex

header_item

ปรากฏในส่วนหัว

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
มายากล ubyte[8] = DEX_FILE_MAGIC ดูรายละเอียดเพิ่มเติมได้ที่การสนทนาด้านบนในส่วน "DEX_FILE_MAGIC"
การตรวจสอบข้อผิดพลาด uint ผลรวมตรวจสอบ adler32 ของส่วนที่เหลือของไฟล์ (ทุกอย่างยกเว้น magic และฟิลด์นี้) ใช้เพื่อตรวจหาความเสียหายของไฟล์
ลายเซ็น ubyte[20] ลายเซ็น (แฮช) SHA-1 ของไฟล์ที่เหลือ (ทุกอย่างยกเว้น magic, checksum และฟิลด์นี้) ใช้ เพื่อระบุไฟล์ที่ไม่ซ้ำกัน
file_size uint

ขนาดของไฟล์ทั้งหมด (รวมส่วนหัว) ในหน่วยไบต์ (v40 หรือก่อนหน้า)

ระยะห่างเป็นไบต์จากจุดเริ่มต้นของส่วนหัวนี้ไปยังส่วนหัวถัดไป หรือไปยังจุดสิ้นสุดของทั้งไฟล์ (คอนเทนเนอร์) (v41 ขึ้นไป)

header_size uint

ขนาดของส่วนหัว (ทั้งส่วนนี้) ในหน่วยไบต์ ซึ่งจะช่วยให้มีความเข้ากันได้แบบย้อนหลัง/ไปข้างหน้าในระดับหนึ่งโดยไม่ทำให้รูปแบบไม่ถูกต้อง

ต้องมีขนาด 0x70 (112) ไบต์ (v40 หรือเก่ากว่า)

ต้องมีขนาด 0x78 (120) ไบต์ (v41 ขึ้นไป)

แท็ก endian uint = ENDIAN_CONSTANT แท็ก Endianness ดูรายละเอียดเพิ่มเติมได้ที่การสนทนาด้านบนในส่วน "ENDIAN_CONSTANT และ REVERSE_ENDIAN_CONSTANT"
link_size uint ขนาดของส่วนลิงก์ หรือ 0 หากไฟล์นี้ไม่ได้ลิงก์แบบคงที่
link_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังส่วนลิงก์ หรือ 0 หาก link_size == 0 ออฟเซ็ต หากไม่ใช่ 0 ควรเป็นออฟเซ็ตในส่วน link_data เอกสารนี้ไม่ได้ระบุรูปแบบของข้อมูลที่ชี้ไปถึง ฟิลด์ส่วนหัวนี้ (และฟิลด์ก่อนหน้า) จะยังคงเป็นจุดเชื่อมต่อเพื่อให้การใช้งานรันไทม์ใช้ได้
map_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการแผนที่ ออฟเซ็ตซึ่งต้องไม่เป็น 0 ควรเป็นออฟเซ็ตในส่วน data และข้อมูลควรอยู่ในรูปแบบที่ระบุโดย "map_list" ด้านล่าง
string_ids_size uint จำนวนสตริงในรายการตัวระบุสตริง
string_ids_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุสตริง หรือ 0 หาก string_ids_size == 0 (ซึ่งเป็นกรณีที่ แปลกประหลาด) ออฟเซ็ต หากไม่ใช่ 0 ควรอยู่ที่จุดเริ่มต้นของส่วน string_ids
type_ids_size uint จำนวนองค์ประกอบในรายการตัวระบุประเภท สูงสุด 65535
type_ids_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุประเภท หรือ 0 หาก type_ids_size == 0 (แม้ว่าจะเป็น กรณีขอบที่แปลกประหลาด) ออฟเซ็ต หากไม่ใช่ 0 ควรอยู่ที่จุดเริ่มต้นของส่วน type_ids
proto_ids_size uint จำนวนองค์ประกอบในรายการตัวระบุต้นแบบ สูงสุด 65535
proto_ids_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุต้นแบบ หรือ 0 หาก proto_ids_size == 0 (ยอมรับว่าเป็น กรณีขอบที่แปลก) ออฟเซ็ต หากไม่ใช่ 0 ควรอยู่ที่จุดเริ่มต้นของส่วน proto_ids
field_ids_size uint จำนวนองค์ประกอบในรายการตัวระบุฟิลด์
field_ids_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุฟิลด์ หรือ 0 หาก field_ids_size == 0 ออฟเซ็ต หาก ไม่ใช่ 0 ควรเป็นจุดเริ่มต้นของส่วน field_ids
method_ids_size uint จำนวนองค์ประกอบในรายการตัวระบุวิธีการ
method_ids_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุเมธอด หรือ 0 หาก method_ids_size == 0 ออฟเซ็ต หาก ไม่ใช่ 0 ควรเป็นจุดเริ่มต้นของส่วน method_ids
class_defs_size uint จำนวนองค์ประกอบในรายการคำจำกัดความของคลาส
class_defs_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการคำจำกัดความของคลาส หรือ 0 หาก class_defs_size == 0 (ยอมรับว่าเป็น กรณีขอบที่แปลก) ออฟเซ็ต หากไม่ใช่ 0 ควรอยู่ที่จุดเริ่มต้นของส่วน class_defs
data_size uint

ขนาดของส่วน data ในหน่วยไบต์ ต้องเป็นผลคูณคู่ของ sizeof(uint) (v40 หรือเก่ากว่า)

ไม่ได้ใช้ (v41 ขึ้นไป)

data_off uint

ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังจุดเริ่มต้นของส่วน data (v40 หรือก่อนหน้า)

ไม่ได้ใช้ (v41 ขึ้นไป)

container_size uint

ไม่มีฟิลด์นี้ โดยถือว่ามีค่าเท่ากับ file_size (v40 หรือเก่ากว่า)

ขนาดของไฟล์ทั้งหมด (รวมถึงส่วนหัว dex อื่นๆ และข้อมูลของส่วนหัวเหล่านั้น) (v41 ขึ้นไป)

header_offset uint

ไม่มีฟิลด์นี้ โดยถือว่ามีค่าเท่ากับ 0 (v40 หรือเก่ากว่า)

ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังจุดเริ่มต้นของส่วนหัวนี้ (v41 ขึ้นไป)

map_list

ปรากฏในส่วนข้อมูล

อ้างอิงจาก header_item

การจัดแนว: 4 ไบต์

นี่คือรายการเนื้อหาทั้งหมดของไฟล์ตามลำดับ โดยมีข้อมูลซ้ำซ้อนบางส่วนเกี่ยวกับ header_item แต่มีจุดประสงค์เพื่อให้เป็นแบบฟอร์มที่ใช้งานง่ายสำหรับการวนซ้ำทั้งไฟล์ ประเภทที่ระบุต้องปรากฏในแผนที่อย่างมาก 1 ครั้ง แต่ไม่มีข้อจำกัดเกี่ยวกับลำดับที่ประเภทอาจปรากฏ ยกเว้นข้อจำกัดที่ระบุโดยรูปแบบที่เหลือ (เช่น ส่วน header ต้องปรากฏก่อน ตามด้วยส่วน string_ids เป็นต้น) นอกจากนี้ รายการแผนที่ต้อง เรียงตามออฟเซ็ตเริ่มต้นและต้องไม่ซ้อนทับกัน

ชื่อ รูปแบบ คำอธิบาย
ขนาด uint ขนาดของรายการในหน่วยรายการ
ลิสต์ map_item[size] องค์ประกอบของรายการ

รูปแบบ map_item

ชื่อ รูปแบบ คำอธิบาย
ประเภท ushort ประเภทของสินค้า โปรดดูตารางด้านล่าง
unused ushort (ไม่ได้ใช้)
ขนาด uint จำนวนรายการที่จะพบที่ออฟเซ็ตที่ระบุ
ออฟเซ็ต uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการที่เป็นปัญหา

รหัสประเภท

ประเภทรายการ ค่าคงที่ ค่านิยม ขนาดของรายการในหน่วยไบต์
header_item TYPE_HEADER_ITEM 0x0000 0x70
string_id_item TYPE_STRING_ID_ITEM 0x0001 0x04
type_id_item TYPE_TYPE_ID_ITEM 0x0002 0x04
proto_id_item TYPE_PROTO_ID_ITEM 0x0003 0x0c
field_id_item TYPE_FIELD_ID_ITEM 0x0004 0x08
method_id_item TYPE_METHOD_ID_ITEM 0x0005 0x08
class_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
call_site_id_item TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
method_handle_item TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
map_list TYPE_MAP_LIST 0x1000 4 + (item.size * 12)
type_list TYPE_TYPE_LIST 0x1001 4 + (item.size * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (item.size * 4)
annotation_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (item.size * 4)
class_data_item TYPE_CLASS_DATA_ITEM 0x2000 โดยนัย ต้องแยกวิเคราะห์
code_item TYPE_CODE_ITEM 0x2001 โดยนัย ต้องแยกวิเคราะห์
string_data_item TYPE_STRING_DATA_ITEM 0x2002 โดยนัย ต้องแยกวิเคราะห์
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 โดยนัย ต้องแยกวิเคราะห์
annotation_item TYPE_ANNOTATION_ITEM 0x2004 โดยนัย ต้องแยกวิเคราะห์
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 uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังข้อมูลสตริงสำหรับรายการนี้ ออฟเซ็ตควรเป็นตำแหน่งในส่วน data และข้อมูลควรอยู่ในรูปแบบที่ระบุโดย "string_data_item" ด้านล่าง ไม่จำเป็นต้องมีการจัดแนวสำหรับการชดเชย

string_data_item

ปรากฏในส่วนข้อมูล

การจัดแนว: ไม่มี (จัดแนวไบต์)

ชื่อ รูปแบบ คำอธิบาย
utf16_size uleb128 ขนาดของสตริงนี้ในหน่วยรหัส UTF-16 (ซึ่งเป็น "ความยาวสตริง" ในหลายระบบ) กล่าวคือ นี่คือความยาวที่ถอดรหัสแล้วของ สตริง (ความยาวที่เข้ารหัสจะขึ้นอยู่กับตำแหน่งของไบต์ 0)
เพิ่มเติม ubyte[] ชุดหน่วยรหัส MUTF-8 (หรือที่เรียกว่าอ็อกเทต หรือไบต์) ตามด้วยไบต์ที่มีค่า 0 ดูรายละเอียดและ การอภิปรายเกี่ยวกับรูปแบบข้อมูลได้ที่ "การเข้ารหัส MUTF-8 (UTF-8 ที่แก้ไขแล้ว)" ด้านบน

หมายเหตุ: คุณสามารถใช้สตริงที่มี (รูปแบบที่เข้ารหัสของ) หน่วยรหัสแทน UTF-16 (เช่น U+d800U+dfff) ไม่ว่าจะแยกกันหรือเรียงลำดับไม่ถูกต้องเมื่อเทียบกับการเข้ารหัส Unicode เป็น UTF-16 ตามปกติ การใช้งานสตริงในระดับที่สูงกว่ามีหน้าที่ปฏิเสธการเข้ารหัสที่ไม่ถูกต้องดังกล่าว หากเหมาะสม

type_id_item

ปรากฏในส่วน type_ids

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
descriptor_idx uint ดัชนีในstring_idsรายการสำหรับสตริงตัวอธิบาย ของประเภทนี้ สตริงต้องเป็นไปตามไวยากรณ์สำหรับ TypeDescriptor ที่กำหนดไว้ข้างต้น

proto_id_item

ปรากฏในส่วน proto_ids

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
shorty_idx uint ดัชนีในรายการ string_ids สำหรับสตริงตัวอธิบายแบบย่อของต้นแบบนี้ สตริงต้องเป็นไปตาม ไวยากรณ์สำหรับ ShortyDescriptor ที่กำหนดไว้ข้างต้น และต้องสอดคล้อง กับประเภทการคืนค่าและพารามิเตอร์ของรายการนี้
return_type_idx uint ดัชนีในtype_ids รายการสำหรับประเภทการคืนค่า ของต้นแบบนี้
parameters_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการประเภทพารามิเตอร์ สำหรับต้นแบบนี้ หรือ 0 หากต้นแบบนี้ไม่มี พารามิเตอร์ ออฟเซ็ตนี้ หากไม่ใช่ 0 ควรอยู่ในส่วน data และข้อมูลในส่วนนั้นควรอยู่ในรูปแบบที่ระบุโดย "type_list" ด้านล่าง นอกจากนี้ ไม่ควรมีการอ้างอิงถึงประเภท void ในรายการ

field_id_item

ปรากฏในส่วน field_ids

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
class_idx ushort ดัชนีในรายการ type_ids สำหรับตัวกำหนดของฟิลด์นี้ ต้องเป็นประเภทคลาส และไม่ใช่ประเภทอาร์เรย์หรือประเภทดั้งเดิม
type_idx ushort ดัชนีในtype_idsรายการสำหรับประเภทของ ฟิลด์นี้
name_idx uint ดัชนีในstring_ids รายการสำหรับชื่อของ ฟิลด์นี้ สตริงต้องเป็นไปตามไวยากรณ์ของ MemberName ที่กำหนดไว้ข้างต้น

method_id_item

ปรากฏในส่วน method_ids

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
class_idx ushort ดัชนีในรายการ type_ids สำหรับตัวกำหนดของ เมธอดนี้ ต้องเป็นประเภทคลาสหรืออาร์เรย์ และไม่ใช่ประเภทดั้งเดิม
proto_idx ushort จัดทำดัชนีลงในรายการ proto_ids สำหรับต้นแบบของ เมธอดนี้
name_idx uint ดัชนีในstring_ids รายการสำหรับชื่อของเมธอดนี้ สตริงต้องเป็นไปตามไวยากรณ์ของ MemberName ที่กำหนดไว้ข้างต้น

class_def_item

ปรากฏในส่วน class_defs

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
class_idx uint ดัชนีในtype_idsรายการสำหรับชั้นเรียนนี้ ต้องเป็นประเภทคลาส และไม่ใช่ประเภทอาร์เรย์หรือประเภทดั้งเดิม
access_flags uint แฟล็กการเข้าถึงสำหรับชั้นเรียน (public, final, ฯลฯ) ดูรายละเอียดได้ที่ "access_flags คำจำกัดความ"
superclass_idx uint ดัชนีในรายการ type_ids สำหรับคลาสแม่ หรือ ค่าคงที่ NO_INDEX หากคลาสนี้ไม่มีคลาสแม่ (เช่น เป็นคลาสรูทอย่าง Object) หากมีอยู่ ค่านี้ต้องเป็นประเภทคลาส ไม่ใช่อาร์เรย์หรือประเภทดั้งเดิม
interfaces_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการอินเทอร์เฟซ หรือ 0 หากไม่มี ออฟเซ็ตนี้ ควรอยู่ในส่วน data และข้อมูล ในส่วนนั้นควรอยู่ในรูปแบบที่ระบุโดย "type_list" ด้านล่าง องค์ประกอบแต่ละรายการของลิสต์ ต้องเป็นประเภทคลาส (ไม่ใช่ประเภทอาร์เรย์หรือประเภทดั้งเดิม) และต้อง ไม่มีรายการที่ซ้ำกัน
source_file_idx uint ดัชนีในรายการ string_ids สำหรับชื่อของ ไฟล์ที่มีแหล่งที่มาต้นฉบับของ (อย่างน้อยที่สุด) คลาสนี้ หรือค่าพิเศษ NO_INDEX เพื่อแสดงว่าไม่มี ข้อมูลนี้ debug_info_item ของเมธอดใดก็ตาม อาจลบล้างไฟล์แหล่งที่มานี้ แต่คาดว่าคลาสส่วนใหญ่ จะมาจากไฟล์แหล่งที่มาเพียงไฟล์เดียว
annotations_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังโครงสร้างคำอธิบายประกอบ สำหรับคลาสนี้ หรือ 0 หากไม่มีคำอธิบายประกอบใน คลาสนี้ ออฟเซ็ตนี้ หากไม่ใช่ 0 ควรอยู่ในส่วน data และข้อมูลในส่วนนั้นควรอยู่ใน รูปแบบที่ระบุโดย "annotations_directory_item" ด้านล่าง โดยมีรายการทั้งหมดที่อ้างอิงถึงคลาสนี้เป็นตัวกำหนด
class_data_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังข้อมูลชั้นเรียนที่เชื่อมโยง สำหรับรายการนี้ หรือ 0 หากไม่มีข้อมูลชั้นเรียน สำหรับชั้นเรียนนี้ (กรณีนี้อาจเกิดขึ้นได้ เช่น หากคลาสนี้ เป็นอินเทอร์เฟซเครื่องหมาย) ออฟเซ็ต หากไม่ใช่ 0 ควรอยู่ในส่วน data และข้อมูลในส่วนนั้นควรอยู่ในรูปแบบ ที่ระบุโดย "class_data_item" ด้านล่าง โดยมีรายการ ทั้งหมดที่อ้างอิงถึงคลาสนี้เป็นตัวกำหนด
static_values_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการค่าเริ่มต้นสำหรับฟิลด์ static หรือ 0 หากไม่มี (และต้องเริ่มต้นฟิลด์ static ทั้งหมดด้วย 0 หรือ null) ออฟเซ็ตนี้ควรอยู่ในส่วน data และข้อมูลในส่วนนั้นควรอยู่ในรูปแบบที่ระบุโดย "encoded_array_item" ด้านล่าง ขนาด ของอาร์เรย์ต้องไม่เกินจํานวนฟิลด์ static ที่ประกาศโดยคลาสนี้ และองค์ประกอบต้องสอดคล้องกับฟิลด์ static ตามลําดับเดียวกับที่ประกาศใน field_list ที่เกี่ยวข้อง ประเภทขององค์ประกอบอาร์เรย์แต่ละรายการ ต้องตรงกับประเภทที่ประกาศของฟิลด์ที่เกี่ยวข้อง หากมีองค์ประกอบในอาร์เรย์น้อยกว่า static ฟิลด์ ระบบจะเริ่มต้นฟิลด์ที่เหลือ ด้วย 0 หรือ null ที่เหมาะสมกับประเภท

call_site_id_item

ปรากฏในส่วน call_site_ids

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
call_site_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังคำจำกัดความของเว็บไซต์ ออฟเซ็ตควร อยู่ในส่วนข้อมูล และข้อมูลในส่วนนั้นควรอยู่ในรูปแบบที่ระบุโดย "call_site_item" ด้านล่าง

call_site_item

ปรากฏในส่วนข้อมูล

การจัดแนว: ไม่มี (จัดแนวไบต์)

call_site_item คือ encoded_array_item ซึ่งมีองค์ประกอบที่สอดคล้องกับอาร์กิวเมนต์ ที่ระบุให้กับเมธอดลิงก์การเริ่มต้น อาร์กิวเมนต์ 3 รายการแรกคือ

  1. ตัวแฮนเดิลของเมธอดที่แสดงเมธอดลิงก์การเริ่มต้น (VALUE_METHOD_HANDLE)
  2. ชื่อเมธอดที่ Linker ของ Bootstrap ควรแก้ไข (VALUE_STRING)
  3. ประเภทเมธอดที่สอดคล้องกับประเภทของชื่อเมธอดที่จะแก้ไข (VALUE_METHOD_TYPE)

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

แฮนเดิลเมธอดที่แสดงเมธอดลิงก์การเริ่มต้นต้องมีประเภทการคืนค่าเป็น java.lang.invoke.CallSite พารามิเตอร์ 3 ประเภทแรก ได้แก่

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

ระบบจะกำหนดประเภทพารามิเตอร์ของอาร์กิวเมนต์เพิ่มเติมจากค่าคงที่

method_handle_item

ปรากฏในส่วน method_handles

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
method_handle_type ushort ประเภทของตัวแฮนเดิลเมธอด โปรดดูตารางด้านล่าง
unused ushort (ไม่ได้ใช้)
field_or_method_id ushort รหัสฟิลด์หรือเมธอด ขึ้นอยู่กับว่าประเภทแฮนเดิลของเมธอดเป็นตัวเข้าถึงหรือตัวเรียกใช้เมธอด
unused ushort (ไม่ได้ใช้)

โค้ดประเภทแฮนเดิลของเมธอด

ค่าคงที่ ค่านิยม คำอธิบาย
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 Method handle is a static field setter (accessor)
METHOD_HANDLE_TYPE_STATIC_GET 0x01 Method handle คือตัวรับฟิลด์แบบคงที่ (ตัวเข้าถึง)
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 Method handle คือตัวตั้งค่าฟิลด์อินสแตนซ์ (ตัวเข้าถึง)
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 Method handle คือตัวรับฟิลด์อินสแตนซ์ (ตัวเข้าถึง)
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 MethodHandle คือตัวเรียกใช้เมธอดแบบคงที่
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 Method handle คือตัวเรียกใช้เมธอดอินสแตนซ์
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 MethodHandle คือตัวเรียกใช้เมธอดของตัวสร้าง
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 MethodHandle คือตัวเรียกใช้เมธอดโดยตรง
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 MethodHandle คือตัวเรียกใช้เมธอดอินเทอร์เฟซ

class_data_item

อ้างอิงจาก class_def_item

ปรากฏในส่วนข้อมูล

การจัดแนว: ไม่มี (จัดแนวไบต์)

ชื่อ รูปแบบ คำอธิบาย
static_fields_size uleb128 จำนวนฟิลด์แบบคงที่ที่กำหนดไว้ในรายการนี้
instance_fields_size uleb128 จำนวนฟิลด์อินสแตนซ์ที่กำหนดในรายการนี้
direct_methods_size uleb128 จำนวนวิธีการโดยตรงที่กำหนดไว้ในรายการนี้
virtual_methods_size uleb128 จำนวนเมธอดเสมือนที่กำหนดไว้ในรายการนี้
static_fields encoded_field[static_fields_size] ฟิลด์แบบคงที่ที่กำหนด ซึ่งแสดงเป็นลำดับของ องค์ประกอบที่เข้ารหัส ต้องจัดเรียงฟิลด์ตาม field_idx โดยเรียงจากน้อยไปมาก
instance_fields encoded_field[instance_fields_size] ฟิลด์อินสแตนซ์ที่กำหนด ซึ่งแสดงเป็นลำดับของ องค์ประกอบที่เข้ารหัส ต้องจัดเรียงฟิลด์ตาม field_idx โดยเรียงจากน้อยไปมาก
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 ขององค์ประกอบทั้งหมดต้องอ้างอิงคลาสที่กำหนดเดียวกัน

รูปแบบฟิลด์ที่เข้ารหัส

ชื่อ รูปแบบ คำอธิบาย
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 ไบต์

ชื่อ รูปแบบ คำอธิบาย
ขนาด uint ขนาดของรายการในหน่วยรายการ
ลิสต์ type_item[size] องค์ประกอบของรายการ

รูปแบบ type_item

ชื่อ รูปแบบ คำอธิบาย
type_idx ushort ดัชนีในรายการ type_ids

code_item

อ้างอิงจาก encoded_method

ปรากฏในส่วนข้อมูล

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
registers_size ushort จำนวนรีจิสเตอร์ที่โค้ดนี้ใช้
ins_size ushort จำนวนคำของอาร์กิวเมนต์ขาเข้าในเมธอดที่โค้ดนี้ ใช้
outs_size ushort จำนวนคำของพื้นที่อาร์กิวเมนต์ขาออกที่โค้ดนี้ต้องการ สำหรับการเรียกใช้เมธอด
tries_size ushort จำนวน try_item สำหรับอินสแตนซ์นี้ หากไม่ใช่ 0 รายการเหล่านี้จะปรากฏเป็นอาร์เรย์ tries ทันทีหลังจาก insns ในอินสแตนซ์นี้
debug_info_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังลำดับข้อมูลการแก้ไขข้อบกพร่อง (หมายเลขบรรทัด + ข้อมูลตัวแปรภายใน) สำหรับโค้ดนี้ หรือ 0 หาก ไม่มีข้อมูล หากออฟเซ็ตไม่ใช่ 0 ออฟเซ็ตควรเป็น ตำแหน่งในส่วน data รูปแบบของ ข้อมูลระบุโดย "debug_info_item" ด้านล่าง
insns_size uint ขนาดของรายการคำสั่งในหน่วยโค้ด 16 บิต
insns ushort[insns_size] อาร์เรย์ไบต์โค้ดจริง รูปแบบของโค้ดในinsns อาร์เรย์ระบุไว้ในเอกสารประกอบ ไบต์โค้ด Dalvik โปรดทราบ ว่าแม้จะกำหนดเป็นอาร์เรย์ของ ushort แต่ โครงสร้างภายในบางอย่างต้องการการจัดแนว 4 ไบต์ นอกจากนี้ หากข้อมูลนี้อยู่ในไฟล์ที่มีการสลับ Endian ระบบจะสลับ เฉพาะอินสแตนซ์ ushort แต่จะไม่สลับ โครงสร้างภายในที่ใหญ่กว่า
padding ushort (ไม่บังคับ) = 0 ไบต์การเพิ่ม 2 ไบต์เพื่อให้triesจัดแนว 4 ไบต์ องค์ประกอบนี้จะแสดงก็ต่อเมื่อ tries_size ไม่ใช่ 0 และ insns_size เป็นจำนวนคี่
ลอง try_item[tries_size] (ไม่บังคับ) อาร์เรย์ที่ระบุตำแหน่งในโค้ดที่ตรวจพบข้อยกเว้นและ วิธีจัดการ องค์ประกอบของอาร์เรย์ต้องไม่ซ้อนทับกันใน ช่วงและเรียงลำดับจากที่อยู่ต่ำไปสูง องค์ประกอบนี้จะแสดงก็ต่อเมื่อ tries_size ไม่ใช่ 0
ตัวแฮนเดิล encoded_catch_handler_list (ไม่บังคับ) ไบต์ที่แสดงรายการของรายการประเภทการจับและที่อยู่แฮนเดิลที่เชื่อมโยง แต่ละ try_item มีออฟเซ็ตระดับไบต์ ในโครงสร้างนี้ องค์ประกอบนี้จะแสดงก็ต่อเมื่อ tries_size ไม่ใช่ 0

รูปแบบ try_item

ชื่อ รูปแบบ คำอธิบาย
start_addr uint ที่อยู่เริ่มต้นของบล็อกโค้ดที่รายการนี้ครอบคลุม The address is a count of 16-bit code units to the start of the first covered instruction.
insn_count ushort จำนวนหน่วยโค้ด 16 บิตที่รายการนี้ครอบคลุม หน่วยรหัสสุดท้าย ที่ครอบคลุม (รวม) คือ start_addr + insn_count - 1
handler_off ushort ออฟเซ็ตเป็นไบต์จากจุดเริ่มต้นของencoded_catch_hander_listที่เชื่อมโยง ถึงencoded_catch_handlerสำหรับรายการนี้ ต้องเป็นออฟเซ็ตไปยังจุดเริ่มต้นของ encoded_catch_handler

รูปแบบ encoded_catch_handler_list

ชื่อ รูปแบบ คำอธิบาย
ขนาด uleb128 ขนาดของรายการนี้ในหน่วยรายการ
ลิสต์ encoded_catch_handler[handlers_size] รายการจริงของรายการแฮนเดิลเลอร์ที่แสดงโดยตรง (ไม่ใช่เป็นออฟเซ็ต) และเชื่อมต่อตามลําดับ

รูปแบบ encoded_catch_handler

ชื่อ รูปแบบ คำอธิบาย
ขนาด sleb128 จำนวนประเภทการจับในรายการนี้ หากไม่ใช่ค่าบวก ค่านี้จะเป็นค่าลบของจำนวนประเภทการจับ และการจับจะตามด้วยตัวแฮนเดิลการจับทั้งหมด เช่น size ของ 0 หมายความว่ามีอีเมลแบบ Catch-all แต่ไม่มีอีเมลแบบ Catch ที่ระบุประเภทอย่างชัดเจน size2 หมายความว่ามีข้อความที่พิมพ์อย่างชัดเจน 2 รายการ และไม่มีข้อความที่ครอบคลุมทั้งหมด และ size ของ -1 หมายความว่ามีการจับคู่ที่พิมพ์พร้อมกับการจับคู่ทั้งหมด
ตัวแฮนเดิล encoded_type_addr_pair[abs(size)] สตรีมของabs(size)ที่เข้ารหัส 1 รายการสำหรับแต่ละประเภทที่แคช ตามลำดับที่ควรทดสอบประเภท
catch_all_addr uleb128 (ไม่บังคับ) ที่อยู่ไบต์โค้ดของตัวแฮนเดิลที่รับทั้งหมด องค์ประกอบนี้จะปรากฏก็ต่อเมื่อ size ไม่เป็นบวก

รูปแบบ encoded_type_addr_pair

ชื่อ รูปแบบ คำอธิบาย
type_idx uleb128 ดัชนีในtype_idsรายการสำหรับประเภทของ ข้อยกเว้นที่จะจับ
addr uleb128 ที่อยู่ไบต์โค้ดของตัวแฮนเดิลข้อยกเว้นที่เชื่อมโยง

debug_info_item

อ้างอิงจาก code_item

ปรากฏในส่วนข้อมูล

การจัดแนว: ไม่มี (จัดแนวไบต์)

แต่ละ debug_info_item จะกำหนดเครื่องสถานะที่เข้ารหัสไบต์ซึ่งได้รับแรงบันดาลใจจาก DWARF3 ซึ่งเมื่อตีความแล้วจะปล่อยตารางตำแหน่ง และ (อาจ) ข้อมูลตัวแปรภายในสำหรับ code_item ลำดับจะเริ่มต้นด้วยส่วนหัวที่มีความยาวผันแปร (ซึ่งความยาวจะขึ้นอยู่กับจำนวนพารามิเตอร์ของเมธอด) ตามด้วยไบต์โค้ดของเครื่องสถานะ และลงท้ายด้วยไบต์ DBG_END_SEQUENCE

เครื่องสถานะประกอบด้วยรีจิสเตอร์ 5 รายการ address register แสดงออฟเซ็ตของคำสั่งใน insns_item ที่เกี่ยวข้องในหน่วยโค้ด 16 บิต address รีจิสเตอร์จะเริ่มต้นที่ 0 เมื่อเริ่มต้นแต่ละ debug_infoลำดับ และต้องเพิ่มขึ้นแบบโมโนโทนเท่านั้น รีจิสเตอร์ line แสดงหมายเลขบรรทัดต้นฉบับ ที่ควรเชื่อมโยงกับรายการตารางตำแหน่งถัดไปที่ปล่อยออกมาจาก เครื่องสถานะ โดยจะเริ่มต้นในส่วนหัวของลำดับ และอาจ เปลี่ยนแปลงในทิศทางบวกหรือลบ แต่ต้องไม่น้อยกว่า 1 source_fileรีจิสเตอร์แสดงถึง ไฟล์ต้นฉบับที่รายการหมายเลขบรรทัดอ้างอิงถึง โดยจะเริ่มต้นด้วยค่าของ source_file_idx ใน class_def_item ตัวแปรอีก 2 ตัว ได้แก่ prologue_end และ epilogue_begin เป็นแฟล็กบูลีน (เริ่มต้นเป็น false) ที่ระบุว่าควรพิจารณาตำแหน่งถัดไปที่ปล่อยออกมาเป็นคำนำหรือบทสรุปของเมธอดหรือไม่ เครื่องสถานะ ต้องติดตามชื่อและประเภทของตัวแปรภายในล่าสุดที่ใช้งานอยู่ ในแต่ละรีจิสเตอร์สำหรับโค้ด DBG_RESTART_LOCAL ด้วย

ส่วนหัวมีดังนี้

ชื่อ รูปแบบ คำอธิบาย
line_start uleb128 ค่าเริ่มต้นสำหรับรีจิสเตอร์ line ของเครื่องสถานะ ไม่ได้แสดงถึงรายการตำแหน่งจริง
parameters_size uleb128 จำนวนชื่อพารามิเตอร์ที่เข้ารหัส ควรมี 1 รายการต่อพารามิเตอร์ของเมธอด โดยไม่รวม this ของเมธอดอินสแตนซ์ หากมี
parameter_names uleb128p1[parameters_size] ดัชนีสตริงของชื่อพารามิเตอร์เมธอด ค่าที่เข้ารหัสของ NO_INDEX แสดงว่าไม่มีชื่อ สำหรับพารามิเตอร์ที่เชื่อมโยง ตัวอธิบายประเภท และลายเซ็นจะอิงตามตัวอธิบายเมธอดและลายเซ็น

ค่ารหัสไบต์มีดังนี้

ชื่อ ค่านิยม รูปแบบ อาร์กิวเมนต์ คำอธิบาย
DBG_END_SEQUENCE 0x00 (ไม่มี) สิ้นสุดลำดับข้อมูลการแก้ไขข้อบกพร่องสำหรับ code_item
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff: จำนวนเงินที่จะเพิ่มลงในทะเบียนที่อยู่ เลื่อนรีจิสเตอร์ที่อยู่โดยไม่ต้องส่งรายการตำแหน่ง
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: จำนวนที่จะเปลี่ยนรีจิสเตอร์บรรทัด เลื่อนบรรทัดโดยไม่ต้องส่งรายการตำแหน่ง
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: register that will contain local
name_idx: string index of the name
type_idx: type index of the type
จะประกาศตัวแปรภายในที่ที่อยู่ปัจจุบัน 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 คุณจะแสดงข้อมูลเดียวกันได้อย่างมีประสิทธิภาพมากขึ้น โดยใช้ตัวดำเนินการ 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 ซึ่งบ่งชี้ว่ารายการตำแหน่งถัดไปที่เพิ่มเข้ามาควร ถือเป็นจุดสิ้นสุดของคำนำของเมธอด (ตำแหน่งที่เหมาะสมสำหรับ เบรกพอยต์ของเมธอด) prologue_endรีจิสเตอร์จะ ล้างโดยรหัสปฏิบัติการพิเศษ (>= 0x0a)
DBG_SET_EPILOGUE_BEGIN 0x08 (ไม่มี) ตั้งค่าepilogue_beginรีจิสเตอร์เครื่องสถานะ ซึ่งบ่งชี้ว่ารายการตำแหน่งถัดไปที่เพิ่มควร ถือเป็นจุดเริ่มต้นของบทส่งท้ายของเมธอด (ตำแหน่งที่เหมาะสม ในการระงับการดำเนินการก่อนออกจากเมธอด) epilogue_begin รีจิสเตอร์จะล้างโดยรหัสปฏิบัติการพิเศษ (>= 0x0a)
DBG_SET_FILE 0x09 uleb128p1 name_idx name_idx: ดัชนีสตริงของชื่อไฟล์ต้นฉบับ NO_INDEX หากไม่รู้จัก ระบุว่ารายการหมายเลขบรรทัดทั้งหมดหลังจากนี้จะอ้างอิงถึง ชื่อไฟล์ต้นฉบับนี้ แทนที่จะเป็นชื่อเริ่มต้นที่ระบุใน code_item
Opcodes พิเศษ 0x0a…0xff (ไม่มี) เลื่อนรีจิสเตอร์ line และ address ออกรายการตำแหน่ง และล้าง prologue_end และ epilogue_begin ดูคำอธิบายด้านล่าง

รหัสดำเนินการพิเศษ

โอเปอเรชันโค้ดที่มีค่าระหว่าง 0x0a ถึง 0xff (รวม) จะย้ายทั้งรีจิสเตอร์ line และ address เล็กน้อย แล้วปล่อยรายการตารางตำแหน่งใหม่ สูตรสำหรับการเพิ่มมีดังนี้

DBG_FIRST_SPECIAL = 0x0a  // the smallest special opcode
DBG_LINE_BASE   = -4      // the smallest line number increment
DBG_LINE_RANGE  = 15      // the number of line increments represented

adjusted_opcode = opcode - DBG_FIRST_SPECIAL

line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE)
address += (adjusted_opcode / DBG_LINE_RANGE)

annotations_directory_item

อ้างอิงจาก class_def_item

ปรากฏในส่วนข้อมูล

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
class_annotations_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังคำอธิบายประกอบที่สร้างโดยตรง ในคลาส หรือ 0 หากคลาสไม่มีคำอธิบายประกอบโดยตรง หากออฟเซ็ตไม่ใช่ 0 ออฟเซ็ตควรเป็นตำแหน่งในส่วน data รูปแบบของข้อมูลจะระบุโดย "annotation_set_item" ด้านล่าง
fields_size uint จำนวนฟิลด์ที่อธิบายประกอบโดยรายการนี้
annotated_methods_size uint จำนวนเมธอดที่อธิบายประกอบโดยรายการนี้
annotated_parameters_size uint จำนวนรายการพารามิเตอร์ของเมธอดที่อธิบายประกอบโดยรายการนี้
field_annotations field_annotation[fields_size] (ไม่บังคับ) รายการคำอธิบายประกอบฟิลด์ที่เชื่อมโยง องค์ประกอบของรายการต้อง จัดเรียงตามลำดับจากน้อยไปมากตาม field_idx
method_annotations method_annotation[methods_size] (ไม่บังคับ) รายการคำอธิบายประกอบของเมธอดที่เชื่อมโยง องค์ประกอบของรายการต้อง จัดเรียงตามลำดับจากน้อยไปมากตาม method_idx
parameter_annotations parameter_annotation[parameters_size] (ไม่บังคับ) รายการคำอธิบายประกอบพารามิเตอร์ของเมธอดที่เกี่ยวข้อง องค์ประกอบของ รายการต้องจัดเรียงตามลำดับจากน้อยไปมากตาม method_idx

หมายเหตุ: อินสแตนซ์ field_id และ method_id ขององค์ประกอบทั้งหมดต้องอ้างอิงคลาสที่กำหนดเดียวกัน

รูปแบบฟิลด์คำอธิบายประกอบ

ชื่อ รูปแบบ คำอธิบาย
field_idx uint ดัชนีในfield_ids รายการสำหรับข้อมูลประจำตัวของ ฟิลด์ที่กำลังใส่คำอธิบายประกอบ
annotations_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับ ฟิลด์ ออฟเซ็ตควรเป็นตำแหน่งในส่วน data รูปแบบของข้อมูลจะระบุโดย "annotation_set_item" ด้านล่าง

รูปแบบ method_annotation

ชื่อ รูปแบบ คำอธิบาย
method_idx uint ดัชนีในรายการ method_ids สำหรับข้อมูลประจำตัวของ เมธอดที่กำลังใส่คำอธิบายประกอบ
annotations_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับ เมธอด ออฟเซ็ตควรเป็นตำแหน่งในส่วน data รูปแบบของข้อมูลจะระบุโดย "annotation_set_item" ด้านล่าง

รูปแบบ parameter_annotation

ชื่อ รูปแบบ คำอธิบาย
method_idx uint ดัชนีในรายการ method_ids สำหรับข้อมูลระบุตัวตนของเมธอด ที่มีการใส่คำอธิบายประกอบพารามิเตอร์
annotations_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับ พารามิเตอร์ของเมธอด ออฟเซ็ตควรเป็นตำแหน่งในส่วน data รูปแบบของข้อมูลจะระบุโดย "annotation_set_ref_list" ด้านล่าง

annotation_set_ref_list

อ้างอิงจาก parameter_annotations_item

ปรากฏในส่วนข้อมูล

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
ขนาด uint ขนาดของรายการในหน่วยรายการ
ลิสต์ annotation_set_ref_item[size] องค์ประกอบของรายการ

รูปแบบ annotation_set_ref_item

ชื่อ รูปแบบ คำอธิบาย
annotations_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังชุดคำอธิบายประกอบที่อ้างอิง หรือ 0 หากไม่มีคำอธิบายประกอบสำหรับองค์ประกอบนี้ หากออฟเซ็ตไม่ใช่ 0 ออฟเซ็ตควรเป็นตำแหน่งในส่วน data รูปแบบของข้อมูลจะระบุโดย "annotation_set_item" ด้านล่าง

annotation_set_item

อ้างอิงจาก annotations_directory_item, field_annotations_item, method_annotations_item และ annotation_set_ref_item

ปรากฏในส่วนข้อมูล

การจัดแนว: 4 ไบต์

ชื่อ รูปแบบ คำอธิบาย
ขนาด uint ขนาดของชุดข้อมูลในรายการ
รายการ annotation_off_item[size] องค์ประกอบของชุด ต้องจัดเรียงองค์ประกอบโดยเรียงจากน้อยไปมาก ตาม type_idx

รูปแบบ annotation_off_item

ชื่อ รูปแบบ คำอธิบาย
annotation_off uint ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังคำอธิบายประกอบ ออฟเซ็ตควรเป็นตำแหน่งในdataส่วน และรูปแบบของข้อมูลในตำแหน่งนั้นจะระบุโดย "annotation_item" ด้านล่าง

annotation_item

อ้างอิงจาก annotation_set_item

ปรากฏในส่วนข้อมูล

การจัดแนว: ไม่มี (จัดแนวไบต์)

ชื่อ รูปแบบ คำอธิบาย
การเปิดเผย ubyte ระดับการมองเห็นที่ต้องการของคำอธิบายประกอบนี้ (ดูด้านล่าง)
หมายเหตุ encoded_annotation เนื้อหาคำอธิบายประกอบที่เข้ารหัสในรูปแบบที่อธิบายไว้ใน "encoded_annotation รูปแบบ" ในส่วน "encoded_value การเข้ารหัส" ด้านบน

ค่าระดับการเข้าถึง

ตัวเลือกสำหรับฟิลด์ visibility ใน annotation_item มีดังนี้

ชื่อ ค่านิยม คำอธิบาย
VISIBILITY_BUILD 0x00 มีไว้ให้เห็นเฉพาะในเวลาบิลด์ (เช่น ระหว่างการคอมไพล์ โค้ดอื่นๆ)
VISIBILITY_RUNTIME 0x01 มีไว้ให้มองเห็นได้ในรันไทม์
VISIBILITY_SYSTEM 0x02 มีไว้เพื่อแสดงในเวลาเรียกใช้ แต่จะแสดงเฉพาะในระบบพื้นฐาน (และไม่ใช่โค้ดผู้ใช้ทั่วไป)

encoded_array_item

อ้างอิงจาก class_def_item

ปรากฏในส่วนข้อมูล

การจัดแนว: ไม่มี (จัดแนวไบต์)

ชื่อ รูปแบบ คำอธิบาย
ค่า encoded_array ไบต์ที่แสดงค่าอาร์เรย์ที่เข้ารหัสในรูปแบบที่ระบุ โดย "encoded_array รูปแบบ" ในส่วน "encoded_value การเข้ารหัส" ด้านบน

hiddenapi_class_data_item

ส่วนนี้ประกอบด้วยข้อมูลเกี่ยวกับอินเทอร์เฟซที่ถูกจำกัดซึ่งแต่ละคลาสใช้

หมายเหตุ: ฟีเจอร์ API ที่ซ่อนไว้เปิดตัวใน Android 10.0 และใช้ได้กับไฟล์ DEX ของคลาสในเส้นทางคลาสการบูตเท่านั้น รายการฟีเจอร์ที่อธิบายไว้ด้านล่างอาจมีการขยายใน Android รุ่นต่อๆ ไป ดูข้อมูลเพิ่มเติมได้ที่ข้อจำกัดเกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ SDK

ชื่อ รูปแบบ คำอธิบาย
ขนาด uint ขนาดรวมของส่วน
การชดเชย uint[] อาร์เรย์ของออฟเซ็ตที่จัดทำดัชนีโดย class_idx รายการอาร์เรย์ที่มีค่าเป็น 0 ที่ดัชนี class_idx หมายความว่า ไม่มีข้อมูลสำหรับ class_idx นี้ หรือค่าของแฟล็ก API ที่ซ่อนทั้งหมดเป็น 0 ไม่เช่นนั้นรายการอาร์เรย์จะเป็นค่าที่ไม่ใช่ 0 และมีออฟเซ็ตจาก จุดเริ่มต้นของส่วนไปยังอาร์เรย์ของค่าสถานะ API ที่ซ่อนอยู่ สำหรับ class_idx นี้
ธง uleb128[] อาร์เรย์ที่ต่อกันของแฟล็ก API ที่ซ่อนไว้สำหรับแต่ละคลาส ค่าสถานะที่เป็นไปได้อธิบายไว้ในตารางด้านล่าง โดยจะมีการเข้ารหัสแฟล็กในลำดับเดียวกับฟิลด์และเมธอด และมีการเข้ารหัสในข้อมูลคลาส

ประเภทของธงข้อจำกัด

ชื่อ ค่านิยม คำอธิบาย
รายการที่อนุญาตพิเศษ 0 อินเทอร์เฟซที่ใช้ได้อย่างอิสระและได้รับการรองรับในส่วนของ เฟรมเวิร์ก Android ที่มีการบันทึกอย่างเป็นทางการ ดัชนีแพ็กเกจ
รายการที่ต้องสงสัย 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 มีการแนบคำอธิบายประกอบกับแต่ละคลาส ซึ่งกำหนดให้เป็นสมาชิกของคลาสอื่น หรือเป็น แบบไม่ระบุตัวตนแต่ไม่ได้กำหนดไว้ในเนื้อหาของเมธอด (เช่น คลาสในสังเคราะห์) ทุกคลาสที่มีคำอธิบายประกอบนี้ต้องมีคำอธิบายประกอบ InnerClass ด้วย นอกจากนี้ คลาสต้องไม่มีทั้งคำอธิบายประกอบ EnclosingClass และ EnclosingMethod

ชื่อ รูปแบบ คำอธิบาย
ค่า ชั้น คลาสที่ขอบเขตคำศัพท์ของคลาสนี้ใกล้เคียงที่สุด

dalvik.annotation.EnclosingMethod

ปรากฏในชั้นเรียน

EnclosingMethod คำอธิบายประกอบจะแนบไปกับแต่ละคลาส ซึ่งกำหนดไว้ภายในเนื้อหาของเมธอด ทุกคลาสที่มีคำอธิบายประกอบนี้ ต้องมีคำอธิบายประกอบ InnerClass ด้วย นอกจากนี้ ชั้นเรียนต้องไม่มีทั้งคำอธิบายประกอบEnclosingClass และEnclosingMethod

ชื่อ รูปแบบ คำอธิบาย
ค่า วิธีการ เมธอดที่กำหนดขอบเขตระดับคำของคลาสนี้อย่างใกล้ชิดที่สุด

dalvik.annotation.InnerClass

ปรากฏในชั้นเรียน

InnerClassคำอธิบายประกอบจะแนบไปกับแต่ละคลาส ซึ่งกำหนดไว้ในขอบเขตคำศัพท์ของคำจำกัดความของคลาสอื่น คลาสที่มีคำอธิบายประกอบนี้ต้องมีคำอธิบายประกอบ EnclosingClass หรือ EnclosingMethod ด้วย

ชื่อ รูปแบบ คำอธิบาย
ชื่อ สตริง ชื่อแบบง่ายที่ประกาศไว้เดิมของคลาสนี้ (ไม่รวมคำนำหน้าแพ็กเกจ) หากชั้นเรียนนี้ไม่ระบุตัวตน ชื่อจะเป็น null
accessFlags Int แฟล็กการเข้าถึงที่ประกาศไว้เดิมของคลาส (ซึ่งอาจแตกต่าง จากแฟล็กที่มีประสิทธิภาพเนื่องจากโมเดลการดำเนินการของภาษาต้นฉบับและเครื่องเสมือนเป้าหมายไม่ตรงกัน)

dalvik.annotation.MemberClasses

ปรากฏในชั้นเรียน

ระบบจะแนบคำอธิบายประกอบ MemberClasses กับแต่ละคลาส ซึ่งประกาศคลาสสมาชิก (คลาสสมาชิกคือคลาสในโดยตรง ที่มีชื่อ)

ชื่อ รูปแบบ คำอธิบาย
ค่า Class[] อาร์เรย์ของคลาสสมาชิก

dalvik.annotation.MethodParameters

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

หมายเหตุ: มีการเพิ่มคำอธิบายประกอบนี้หลังจาก Android 7.1 ระบบจะไม่สนใจการมีอยู่ของฟีเจอร์นี้ใน Android เวอร์ชันก่อนหน้า

MethodParametersคำอธิบายประกอบเป็นตัวเลือกและสามารถใช้เพื่อ ระบุข้อมูลเมตาของพารามิเตอร์ เช่น ชื่อพารามิเตอร์และตัวแก้ไข

คุณสามารถละเว้นคำอธิบายประกอบจากเมธอดหรือตัวสร้างได้อย่างปลอดภัยเมื่อไม่จำเป็นต้องใช้ข้อมูลเมตาของพารามิเตอร์ในรันไทม์ java.lang.reflect.Parameter.isNamePresent() สามารถใช้เพื่อตรวจสอบว่ามีข้อมูลเมตาสำหรับพารามิเตอร์หรือไม่ และวิธีการสะท้อนที่เชื่อมโยง เช่น java.lang.reflect.Parameter.getName() จะกลับไปใช้ลักษณะการทำงานเริ่มต้นในขณะรันไทม์หากไม่มีข้อมูล

เมื่อรวมข้อมูลเมตาของพารามิเตอร์ คอมไพเลอร์ต้องรวมข้อมูล สำหรับคลาสที่สร้างขึ้น เช่น Enum เนื่องจากข้อมูลเมตาของพารามิเตอร์ จะรวมว่าพารามิเตอร์เป็นแบบสังเคราะห์หรือบังคับหรือไม่

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 จะไม่มีข้อมูลเกี่ยวกับ พารามิเตอร์ตัวรับคำอธิบายประกอบประเภทที่ไม่มีอยู่ในลายเซ็น เมธอดจริงด้วย

ชื่อ รูปแบบ คำอธิบาย
ชื่อ String[] ชื่อของพารามิเตอร์ที่เป็นทางการสำหรับเมธอดที่เชื่อมโยง อาร์เรย์ ต้องไม่เป็นค่าว่าง แต่ต้องว่างเปล่าหากไม่มีพารามิเตอร์ที่เป็นทางการ ค่าใน อาร์เรย์ต้องเป็น Null หากพารามิเตอร์ที่เป็นทางการที่มีดัชนีนั้นไม่มีชื่อ
หากสตริงชื่อพารามิเตอร์ว่างเปล่าหรือมี ".", ";", "[" หรือ "/" ระบบจะแสดงข้อผิดพลาด java.lang.reflect.MalformedParametersException ที่ รันไทม์
accessFlags int[] แฟล็กการเข้าถึงของพารามิเตอร์อย่างเป็นทางการสำหรับเมธอดที่เชื่อมโยง อาร์เรย์ต้องไม่เป็นค่าว่าง แต่ต้องว่างเปล่าหากไม่มีพารามิเตอร์ที่เป็นทางการ
ค่านี้คือบิตมาสก์ที่มีค่าต่อไปนี้
  • 0x0010 : final, the parameter was declared final
  • 0x1000 : synthetic, the parameter was introduced by the compiler
  • 0x8000 : บังคับ พารามิเตอร์เป็นแบบสังเคราะห์ แต่ก็สื่อถึงโดยข้อกำหนดภาษา
หากมีการตั้งค่าบิตใดๆ นอกชุดนี้ ระบบจะแสดงข้อผิดพลาด java.lang.reflect.MalformedParametersExceptionที่รันไทม์

dalvik.annotation.Signature

ปรากฏในคลาส ฟิลด์ และเมธอด

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

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

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

dalvik.annotation.Throws

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

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

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