รูปแบบไฟล์ที่ดำเนินการได้ Dalvik

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

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

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

LEB128

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

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

แผนภาพแบบบิตของค่า LEB128 2 ไบต์
ไบต์แรก ไบต์ที่ 2
1 bit6 bit5 bit4 bit3 bit2 บิต 1 บิต 0 0 bit13 bit12 bit11 bit10 bit9 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[] รายการแฮนเดิลเมธอด รายการแฮนเดิลเมธอดทั้งหมดที่ไฟล์นี้อ้างอิง ไม่ว่าจะกำหนดไว้ในไฟล์หรือไม่ก็ตาม รายการนี้ไม่ได้จัดเรียงและอาจมีรายการที่ซ้ำกัน ซึ่งจะสอดคล้องกับอินสแตนซ์แฮนเดิลเมธอดที่แตกต่างกันตามตรรกะ
เพิ่มเติม 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"

หมายเหตุ: มีการรองรับรูปแบบเวอร์ชัน 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 เวอร์ชัน Android ส่วนใหญ่ก่อนเวอร์ชัน 037 ใช้รูปแบบเวอร์ชัน 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

คำจำกัดความของ access_flags

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

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

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

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

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

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

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

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

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

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

ชื่อ รูปแบบ คำอธิบาย
(value_arg << 5) | value_type ubyte ไบต์ที่ระบุประเภทของvalueที่อยู่ถัดไปตามลำดับ พร้อมกับอาร์กิวเมนต์ที่ชี้แจง (ไม่บังคับ) ใน 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 size - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์แบบมีเครื่องหมายที่ขยายเครื่องหมาย
VALUE_LONG 0x06 size - 1 (0…7) ubyte[size] ค่าจำนวนเต็ม 8 ไบต์แบบมีเครื่องหมายที่ขยายเครื่องหมาย
VALUE_FLOAT 0x10 size - 1 (0…3) ubyte[size] รูปแบบบิต 4 ไบต์ที่ขยายด้วยศูนย์ไปทางขวา และตีความเป็นค่าทศนิยม 32 บิต IEEE754
VALUE_DOUBLE 0x11 size - 1 (0…7) ubyte[size] รูปแบบบิต 8 ไบต์ ขยายด้วย 0 ไปทางขวา และตีความเป็นค่าทศนิยม 64 บิต IEEE754
VALUE_METHOD_TYPE 0x15 size - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์แบบไม่ลงนาม (ขยายด้วย 0) ซึ่งตีความว่าเป็นดัชนีในส่วน proto_ids และแสดงค่าประเภทเมธอด
VALUE_METHOD_HANDLE 0x16 size - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์แบบไม่ลงนาม (ขยายด้วย 0) ซึ่งตีความว่าเป็นดัชนีในส่วน method_handles และแสดงค่าแฮนเดิลเมธอด
VALUE_STRING 0x17 size - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์แบบไม่ลงท้ายด้วยเครื่องหมาย (เพิ่มค่า 0) ซึ่งตีความว่าเป็นดัชนีในส่วน string_ids และแสดงค่าสตริง
VALUE_TYPE 0x18 size - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายด้วย 0) ซึ่งตีความว่าเป็นดัชนีในส่วน type_ids และแสดงค่าประเภท/คลาสแบบสะท้อน
VALUE_FIELD 0x19 size - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์แบบไม่ลงนาม (ขยายด้วย 0) ซึ่งตีความว่าเป็นดัชนีในส่วน field_ids และแสดงค่าฟิลด์แบบสะท้อน
VALUE_METHOD 0x1a size - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์แบบไม่ลงนาม (ขยายด้วย 0) ซึ่งตีความว่าเป็นดัชนีในส่วน method_ids และแสดงค่าเมธอดแบบสะท้อน
VALUE_ENUM 0x1b size - 1 (0…3) ubyte[size] ค่าจำนวนเต็ม 4 ไบต์แบบไม่ลงนาม (ขยายด้วย 0) ซึ่งตีความว่าเป็นดัชนีในส่วน field_ids และแสดงค่าของค่าคงที่ประเภทที่ระบุ
VALUE_ARRAY 0x1c (ไม่มี ต้องเป็น 0) encoded_array อาร์เรย์ของค่าในรูปแบบที่ระบุโดย "encoded_array format" ด้านล่าง ขนาดของ value จะระบุไว้ในการเข้ารหัส
VALUE_ANNOTATION 0x1d (ไม่มี ต้องเป็น 0) encoded_annotation คําอธิบายประกอบย่อยในรูปแบบที่ระบุโดย "encoded_annotation format" ด้านล่าง ขนาดของ 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

MemberName

ใช้โดย 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 Checksum ของ adler32 สำหรับไฟล์ที่เหลือ (ทุกอย่างยกเว้น magic และช่องนี้) ใช้เพื่อตรวจหาไฟล์ที่เสียหาย
ลายเซ็น ubyte[20] ลายเซ็น SHA-1 (แฮช) ของส่วนที่เหลือของไฟล์ (ทุกอย่างยกเว้น magic, checksum และฟิลด์นี้) ใช้เพื่อระบุไฟล์ที่ไม่ซ้ำกัน
file_size uint

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

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

header_size uint

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

ต้องเท่ากับ 0x70 (112) ไบต์ (v40 หรือเก่ากว่า)

ต้องเท่ากับ 0x78 (120) ไบต์ (v41 ขึ้นไป)

endian_tag 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 (หรือที่เรียกว่า Octet หรือไบต์) followed by a byte of value 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 Flag การเข้าถึงสำหรับชั้นเรียน (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 ที่มีองค์ประกอบซึ่งสอดคล้องกับอาร์กิวเมนต์ที่ส่งไปยังเมธอด Bootstrap Linker อาร์กิวเมนต์ 3 รายการแรก ได้แก่

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

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

แฮนเดิลเมธอดที่แสดงถึงเมธอดลิงเกอร์บูตสแtrap ต้องมีประเภทผลลัพธ์เป็น 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_TYPE_STATIC_GET 0x01 แฮนเดิลเมธอดคือตัวรับค่า (ตัวเข้าถึง) ของฟิลด์แบบคงที่
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 แฮนเดิลเมธอดคือตัวตั้งค่าฟิลด์อินสแตนซ์ (ตัวเข้าถึงข้อมูล)
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 แฮนเดิลเมธอดคือตัวรับฟิลด์อินสแตนซ์ (ตัวเข้าถึงข้อมูล)
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 แฮนเดิลเมธอดคือตัวเรียกใช้เมธอดแบบคงที่
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 แฮนเดิลเมธอดคือตัวเรียกใช้เมธอดอินสแตนซ์
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 แฮนเดิลเมธอดคือตัวเรียกใช้เมธอดคอนสตรัคเตอร์
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 แฮนเดิลเมธอดคือตัวเรียกใช้เมธอดโดยตรง
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 แฮนเดิลเมธอดคือตัวเรียกใช้เมธอดอินเทอร์เฟซ

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 ขององค์ประกอบทั้งหมดต้องอ้างอิงคลาสที่กําหนดเดียวกัน

รูปแบบ encoded_field

ชื่อ รูปแบบ คำอธิบาย
field_idx_diff uleb128 ดัชนีในรายการ field_ids สำหรับตัวระบุของช่องนี้ (รวมถึงชื่อและตัวบ่งชี้) ซึ่งแสดงเป็นความแตกต่างจากดัชนีขององค์ประกอบก่อนหน้าในรายการ ดัชนีขององค์ประกอบแรกในรายการจะแสดงโดยตรง
access_flags uleb128 FLAG การเข้าถึงสำหรับช่อง (public, final เป็นต้น) ดูรายละเอียดได้ที่ "access_flags คำจำกัดความ"

รูปแบบ encoded_method

ชื่อ รูปแบบ คำอธิบาย
method_idx_diff uleb128 ดัชนีในรายการ method_ids สำหรับตัวระบุของวิธีการนี้ (รวมถึงชื่อและตัวบ่งชี้) ซึ่งแสดงเป็นความแตกต่างจากดัชนีขององค์ประกอบก่อนหน้าในรายการ ดัชนีขององค์ประกอบแรกในรายการจะแสดงโดยตรง
access_flags uleb128 FLAG การเข้าถึงสําหรับเมธอด (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 ที่อยู่เริ่มต้นของบล็อกโค้ดที่อยู่ภายใต้รายการนี้ ที่อยู่คือจํานวนหน่วยโค้ด 16 บิตจนถึงจุดเริ่มต้นของคำสั่งแรกที่อยู่ในขอบเขต
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 หมายความว่ามีรายการที่รับทั้งหมด แต่ไม่มีรายการที่รับที่ระบุประเภทไว้อย่างชัดเจน size ของ 2 หมายความว่ามีการจับที่ระบุประเภทอย่างชัดเจน 2 รายการและไม่มีรายการที่จับทั้งหมด และ size of -1 หมายความว่ามีการจับที่พิมพ์ 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 แสดงออฟเซตคำสั่งใน 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: รีจิสทรีที่มีข้อมูลในเครื่อง
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 ข้อมูลเดียวกันนี้อาจแสดงได้อย่างมีประสิทธิภาพมากขึ้นโดยใช้อ็อปโค้ด 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
Opcode พิเศษ 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 format" ในส่วน "encoded_value encoding" ด้านบน

ค่าระดับการมองเห็น

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

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

encoded_array_item

อ้างอิงจาก class_def_item

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

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

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

hiddenapi_class_data_item

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

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

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

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

ชื่อ ค่า คำอธิบาย
รายการที่อนุญาตพิเศษ 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 Flag การเข้าถึงที่ประกาศไว้ตั้งแต่ต้นของคลาส (ซึ่งอาจแตกต่างจาก Flag ที่มีประสิทธิภาพเนื่องจากรูปแบบการดําเนินการของภาษาต้นทางและเครื่องเสมือนเป้าหมายไม่ตรงกัน)

dalvik.annotation.MemberClasses

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

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

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

dalvik.annotation.MethodParameters

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

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

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

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

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

คําอธิบายประกอบ MethodParameters จะอธิบายเฉพาะพารามิเตอร์ของเมธอดแต่ละรายการ ดังนั้น คอมไพเลอร์อาจละเว้นการกำกับเนื้อหาทั้งหมดสำหรับตัวสร้างและเมธอดที่ไม่มีพารามิเตอร์ เพื่อประโยชน์ด้านขนาดโค้ดและประสิทธิภาพรันไทม์

อาร์เรย์ที่ระบุไว้ด้านล่างต้องมีขนาดเท่ากับโครงสร้าง method_id_item dex ที่เชื่อมโยงกับเมธอด ไม่เช่นนั้นระบบจะแสดง java.lang.reflect.MalformedParametersException ที่รันไทม์

กล่าวคือ method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size ต้องเหมือนกับ names().length และ accessFlags().length

เนื่องจาก MethodParameters อธิบายพารามิเตอร์ของเมธอดอย่างเป็นทางการทั้งหมด แม้ว่าจะไม่ได้ประกาศอย่างชัดแจ้งหรือโดยนัยในซอร์สโค้ดก็ตาม ขนาดของอาร์เรย์จึงอาจแตกต่างจากข้อมูลลายเซ็นหรือข้อมูลเมตาอื่นๆ ที่อิงตามพารามิเตอร์ที่ประกาศอย่างชัดแจ้งในซอร์สโค้ดเท่านั้น นอกจากนี้ MethodParameters จะไม่รวมข้อมูลเกี่ยวกับพารามิเตอร์ตัวรับคำอธิบายประกอบประเภทที่ไม่มีอยู่ในลายเซ็นเมธอดจริง

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

dalvik.annotation.Signature

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

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

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

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

dalvik.annotation.Throws

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

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

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