เอกสารนี้อธิบายเลย์เอาต์และเนื้อหาของ.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 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
เลย์เอาต์ไฟล์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ส่วนหัว | 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_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+10000
…U+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+d800
… U+dfff
) ไม่ได้ถือว่าเป็นอักขระชื่อที่ถูกต้อง แต่อักขระเสริมของ Unicode ถูกต้อง (ซึ่งแสดงโดยทางเลือกสุดท้ายของกฎสำหรับ SimpleNameChar) และควรแสดงในไฟล์เป็นคู่ของจุดโค้ดตัวแทนในการเข้ารหัส MUTF-8
SimpleName → | ||
SimpleNameChar (SimpleNameChar)* | ||
SimpleNameChar → | ||
'A' … 'Z' |
||
| | 'a' … 'z' |
|
| | '0' … '9' |
|
| | ' ' |
ตั้งแต่ DEX เวอร์ชัน 040 |
| | '$' |
|
| | '-' |
|
| | '_' |
|
| | U+00a0 |
ตั้งแต่ DEX เวอร์ชัน 040 |
| | U+00a1 … U+1fff |
|
| | U+2000 … U+200a |
ตั้งแต่ DEX เวอร์ชัน 040 |
| | U+2010 … U+2027 |
|
| | U+202f |
ตั้งแต่ DEX เวอร์ชัน 040 |
| | U+2030 … U+d7ff |
|
| | U+e000 … U+ffef |
|
| | U+10000 … U+10ffff |
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 |
ขนาดของส่วน ไม่ได้ใช้ (v41 ขึ้นไป) |
data_off | uint |
ส่วนย่อยจากจุดเริ่มต้นของไฟล์ถึงจุดเริ่มต้นของส่วน ไม่ได้ใช้ (v41 ขึ้นไป) |
container_size | uint |
ช่องนี้ไม่มีอยู่ สมมติว่าค่านี้เท่ากับ ขนาดของไฟล์ทั้งหมด (รวมถึงส่วนหัว dex อื่นๆ และข้อมูลของส่วนหัวเหล่านั้น) (v41 ขึ้นไป) |
header_offset | uint |
ช่องนี้ไม่มีอยู่ สมมติว่าค่านี้เท่ากับ ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปจนถึงจุดเริ่มต้นของส่วนหัวนี้ (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 (นั่นคือ |
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 รายการแรก ได้แก่
- แฮนเดิลเมธอดที่แสดงถึงเมธอดลิงก์บูต (VALUE_METHOD_HANDLE)
- ชื่อเมธอดที่ลิงก์บูตควรแก้ไข (VALUE_STRING)
- ประเภทเมธอดที่สอดคล้องกับประเภทของชื่อเมธอดที่จะแก้ไข (VALUE_METHOD_TYPE)
อาร์กิวเมนต์เพิ่มเติมคือค่าคงที่ที่ส่งไปยังเมธอดลิงเกอร์บูตสแtrap โดยระบบจะส่งอาร์กิวเมนต์เหล่านี้ตามลําดับและไม่มีการแปลงประเภท
แฮนเดิลเมธอดที่แสดงถึงเมธอดลิงเกอร์บูตสแtrap ต้องมีประเภทผลลัพธ์เป็น java.lang.invoke.CallSite
พารามิเตอร์ 3 ประเภทแรก ได้แก่
java.lang.invoke.Lookup
java.lang.String
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 )
หมายเหตุ: ดูข้อควรระวังเกี่ยวกับการจัดการลายเซ็นได้ที่ส่วน " |
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 แต่ต้องว่างเปล่าหากไม่มีพารามิเตอร์อย่างเป็นทางการ ค่านี้เป็นหน้ากากบิตที่มีค่าต่อไปนี้
java.lang.reflect.MalformedParametersException ที่รันไทม์
|
dalvik.annotation.Signature
ปรากฏในคลาส ฟิลด์ และเมธอด
จะมีการแนบคำอธิบายประกอบ Signature
ไว้กับแต่ละคลาส ฟิลด์ หรือเมธอดที่กําหนดในแง่ของประเภทที่ซับซ้อนกว่าที่ type_id_item
จะแสดงได้ รูปแบบ .dex
ไม่ได้กำหนดรูปแบบสำหรับลายเซ็น แต่มีไว้เพื่อแสดงลายเซ็นใดก็ตามที่ภาษาต้นทางกำหนดให้ใช้เพื่อให้การใช้ความหมายของภาษานั้นประสบความสำเร็จ ด้วยเหตุนี้ โดยทั่วไปแล้ว การใช้งานเครื่องเสมือนจะไม่แยกวิเคราะห์ (หรือยืนยัน) ลายเซ็น ระบบจะส่งลายเซ็นไปยัง API และเครื่องมือระดับสูงขึ้น (เช่น โปรแกรมแก้ไขข้อบกพร่อง) ดังนั้น การใช้ลายเซ็นจึงควรเขียนขึ้นเพื่อไม่ให้เกิดการคาดเดาว่าจะได้รับเฉพาะลายเซ็นที่ถูกต้อง โดยป้องกันตัวเองอย่างชัดเจนจากโอกาสที่จะได้รับลายเซ็นที่ไม่ถูกต้องตามไวยากรณ์
เนื่องจากสตริงลายเซ็นมีแนวโน้มที่จะมีเนื้อหาที่ซ้ำกันเป็นจำนวนมาก ระบบจึงกำหนดคำอธิบายประกอบ Signature
เป็นอาร์เรย์ของสตริง โดยองค์ประกอบที่ซ้ำกันจะอ้างอิงถึงข้อมูลพื้นฐานเดียวกันโดยธรรมชาติ และระบบจะถือว่าลายเซ็นเป็นการต่อสตริงทั้งหมดในอาร์เรย์ ไม่มีกฎเกี่ยวกับวิธีแยกลายเซ็นออกเป็นสตริงแยกต่างหาก ขึ้นอยู่กับเครื่องมือที่สร้างไฟล์ .dex
ล้วนๆ
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | String[] | ลายเซ็นของคลาสหรือสมาชิกนี้ เป็นอาร์เรย์สตริงที่จะต่อเชื่อมกัน |
dalvik.annotation.Throws
ปรากฏในวิธีการ
แต่ละเมธอดที่ประกาศให้แสดงข้อยกเว้นอย่างน้อย 1 ประเภทจะมีคำอธิบายประกอบ Throws
อยู่ด้วย
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | Class[] | อาร์เรย์ของประเภทข้อยกเว้นที่ส่ง |