เอกสารนี้อธิบายเลย์เอาต์และเนื้อหาของไฟล์ .dex
ซึ่งใช้เพื่อเก็บชุดคำจำกัดความของคลาสและข้อมูลเสริมที่เกี่ยวข้อง
คำแนะนำเกี่ยวกับประเภท
ชื่อ | คำอธิบาย |
---|---|
ไบต์ | จำนวนเต็มแบบมีเครื่องหมาย 8 บิต |
ubyte | จำนวนเต็มแบบไม่มีเครื่องหมาย 8 บิต |
วิดีโอสั้น | จำนวนเต็มแบบมีเครื่องหมาย 16 บิต, Little-Endian |
ushort | จำนวนเต็มแบบไม่มีเครื่องหมาย 16 บิต, Little-Endian |
Int | int แบบมีเครื่องหมาย 32 บิต, Little-Endian |
uint | int แบบไม่มีเครื่องหมาย 32 บิต, Little-Endian |
ยาว | int แบบมีเครื่องหมาย 64 บิต, little-endian |
อูหลง | จำนวนเต็มแบบไม่มีเครื่องหมาย 64 บิต, Little-Endian |
sleb128 | LEB128 ที่ลงชื่อแล้ว ความยาวตัวแปร (ดูด้านล่าง) |
uleb128 | LEB128 ที่ไม่มีการลงนาม ความยาวตัวแปร (ดูด้านล่าง) |
uleb128p1 | LEB128 ที่ไม่มีการลงนามบวก 1 ความยาวตัวแปร (ดูด้านล่าง) |
LEB128
LEB128 ("Little-Endian Base 128") คือการเข้ารหัสแบบความยาวตัวแปรสำหรับจำนวนเต็มแบบมีหรือไม่มีเครื่องหมายโดยพลการ
รูปแบบนี้ยืมมาจากข้อกำหนด DWARF3
ในไฟล์ .dex
จะใช้ LEB128 เพื่อเข้ารหัสปริมาณ 32 บิตเท่านั้น
ค่าที่เข้ารหัส LEB128 แต่ละค่าประกอบด้วยไบต์ 1-5 ไบต์ ซึ่งรวมกันเป็นค่า 32 บิตเดียว ไบต์แต่ละไบต์มีการตั้งค่าบิตที่สำคัญที่สุด ยกเว้นไบต์สุดท้ายในลำดับ ซึ่งมีการล้างบิตที่สำคัญที่สุด ส่วนอีก 7 บิตที่เหลือของแต่ละไบต์คือเพย์โหลด โดยมี 7 บิตที่มีความสำคัญน้อยที่สุดของปริมาณในไบต์แรก 7 บิตถัดไปในไบต์ที่ 2 และอื่นๆ ในกรณีของ LEB128 แบบมีเครื่องหมาย (sleb128
)
บิตเพย์โหลดที่มีนัยสำคัญที่สุดของไบต์สุดท้ายในลำดับจะ
ขยายเครื่องหมายเพื่อสร้างค่าสุดท้าย ในกรณีที่ไม่มีการลงนาม
(uleb128
) ระบบจะตีความบิตที่ไม่ได้แสดงอย่างชัดเจนเป็น 0
แผนภาพระดับบิตของค่า LEB128 แบบ 2 ไบต์ | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ไบต์แรก | ไบต์ที่ 2 | ||||||||||||||
1 |
bit6 | bit5 | บิต4 | bit3 | bit2 | บิต1 | บิต0 | 0 |
bit13 | bit12 | bit11 | bit10 | บิต9 | bit8 | bit7 |
ตัวแปร uleb128p1
ใช้เพื่อแสดงค่าที่มีเครื่องหมาย
โดยการแสดงค่าคือ บวก 1 ที่เข้ารหัส
เป็น uleb128
ซึ่งทำให้การเข้ารหัส -1
(หรืออาจมองว่าเป็นค่าที่ไม่มีเครื่องหมาย 0xffffffff
)
— แต่ไม่ใช่ตัวเลขลบอื่นๆ — เป็นไบต์เดียว และมีประโยชน์ในกรณีที่ตัวเลขที่แสดงต้องเป็นค่าที่ไม่เป็นลบหรือ -1
(หรือ 0xffffffff
)
และไม่อนุญาตให้ใช้ค่าลบอื่นๆ (หรือในกรณีที่ไม่น่าจะต้องใช้ค่าที่ไม่มีเครื่องหมายขนาดใหญ่)
ตัวอย่างรูปแบบมีดังนี้
ลำดับที่เข้ารหัส | เมื่อ sleb128 |
เมื่อ uleb128 |
เมื่อ uleb128p1 |
---|---|---|---|
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[] | method handles list รายการแฮนเดิลของเมธอดทั้งหมดที่ไฟล์นี้อ้างอิงถึง ไม่ว่าจะกำหนดไว้ในไฟล์หรือไม่ก็ตาม รายการนี้ไม่ได้จัดเรียงและอาจมีรายการที่ซ้ำกัน ซึ่งจะสอดคล้องกับอินสแตนซ์ของตัวแฮนเดิลเมธอดที่แตกต่างกัน |
เพิ่มเติม | ubyte[] | พื้นที่ข้อมูลซึ่งมีข้อมูลสนับสนุนทั้งหมดสำหรับตารางที่ระบุไว้ข้างต้น รายการต่างๆ มีข้อกำหนดการจัดแนวที่แตกต่างกัน และ ระบบจะแทรกไบต์การจัดช่องว่างก่อนแต่ละรายการหากจำเป็นเพื่อให้ การจัดแนวที่เหมาะสม |
link_data | ubyte[] | ข้อมูลที่ใช้ในไฟล์ที่ลิงก์แบบคงที่ เอกสารนี้ไม่ได้ระบุรูปแบบของข้อมูลใน ส่วนนี้ ส่วนนี้จะว่างเปล่าในไฟล์ที่ไม่ได้ลิงก์ และการใช้งานรันไทม์ อาจใช้ส่วนนี้ตามที่เห็นสมควร |
รูปแบบคอนเทนเนอร์
เวอร์ชัน 41 เปิดตัวรูปแบบคอนเทนเนอร์ใหม่สำหรับข้อมูล DEX โดยมีเป้าหมายเพื่อประหยัดพื้นที่ รูปแบบคอนเทนเนอร์นี้ช่วยให้รวมไฟล์ DEX เชิงตรรกะหลายไฟล์ไว้ในไฟล์จริงไฟล์เดียวได้ รูปแบบใหม่ส่วนใหญ่เป็นการต่อไฟล์อย่างง่ายในรูปแบบก่อนหน้า โดยมีความแตกต่างดังนี้
file_size
คือขนาดของไฟล์เชิงตรรกะ ไม่ใช่ไฟล์จริง ซึ่งใช้เพื่อวนซ้ำไฟล์เชิงตรรกะทั้งหมดในคอนเทนเนอร์ได้- ไฟล์ Dex เชิงตรรกะอาจอ้างอิงข้อมูลในภายหลังในคอนเทนเนอร์ (แต่จะอ้างอิงข้อมูลก่อนหน้าไม่ได้) ซึ่งช่วยให้ไฟล์ DEX แชร์ข้อมูล เช่น สตริง ระหว่างกันได้
- ออฟเซ็ตทั้งหมดเกี่ยวข้องกับไฟล์จริง ไม่มีออฟเซ็ตที่สัมพันธ์กับส่วนหัว ซึ่งช่วยให้มั่นใจได้ว่าส่วนที่มีออฟเซ็ตจะแชร์ระหว่างไฟล์เชิงตรรกะได้
- ส่วนหัวจะเพิ่มฟิลด์ใหม่ 2 รายการเพื่ออธิบายขอบเขตของคอนเทนเนอร์ ซึ่งเป็นการตรวจสอบความสอดคล้องเพิ่มเติมและช่วยให้การย้ายโค้ดไปยังรูปแบบใหม่ทำได้ง่ายขึ้น
- ตอนนี้เราไม่ได้ใช้
data_size
และdata_off
แล้ว ข้อมูลสามารถกระจายอยู่ในไฟล์เชิงตรรกะหลายไฟล์และไม่จำเป็นต้องอยู่ติดกัน
คำจำกัดความของบิตฟิลด์ สตริง และค่าคงที่
DEX_FILE_MAGIC
ฝังอยู่ใน header_item
อาร์เรย์/สตริงค่าคงที่ DEX_FILE_MAGIC
คือรายการไบต์ที่ต้องปรากฏที่จุดเริ่มต้นของ.dex
ไฟล์
เพื่อให้ระบบจดจำได้ ค่ามีบรรทัดใหม่ ("\n"
หรือ 0x0a
) และไบต์ Null ("\0"
หรือ 0x00
) โดยตั้งใจเพื่อช่วยในการตรวจหาการเสียหายบางรูปแบบ ค่านี้ยัง
เข้ารหัสหมายเลขเวอร์ชันรูปแบบเป็นเลขทศนิยม 3 หลัก ซึ่ง
คาดว่าจะเพิ่มขึ้นเรื่อยๆ เมื่อเวลาผ่านไปตามการพัฒนาของรูปแบบ
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
หมายเหตุ: การรองรับรูปแบบเวอร์ชัน 041
ได้รับการเพิ่มในการเปิดตัว Android 16 ซึ่งรองรับรูปแบบคอนเทนเนอร์
หมายเหตุ: การรองรับรูปแบบเวอร์ชัน 040
ได้รับการเพิ่มในการเปิดตัว Android 10.0 ซึ่งขยายชุดอักขระที่อนุญาตใน SimpleNames
หมายเหตุ: การรองรับรูปแบบเวอร์ชัน 039
ได้รับการเพิ่มในการเปิดตัว Android 9.0 ซึ่งได้เปิดตัวไบต์โค้ดใหม่ 2 รายการ ได้แก่ const-method-handle
และ
const-method-type
(แต่ละรายการอธิบายไว้ในตารางสรุปชุดไบต์โค้ด
) ใน Android 10 เวอร์ชัน 039
จะขยายรูปแบบไฟล์ DEX ให้รวมข้อมูล API ที่ซ่อนไว้
ซึ่งใช้ได้กับไฟล์ DEX ในเส้นทางคลาสการบูตเท่านั้น
หมายเหตุ: การรองรับรูปแบบเวอร์ชัน
038
ได้รับการเพิ่มในการเปิดตัว Android 8.0
เวอร์ชัน 038
เพิ่มไบต์โค้ดใหม่
(invoke-polymorphic
และ invoke-custom
) และ
ข้อมูลสำหรับตัวแฮนเดิลของเมธอด
หมายเหตุ: เราได้เพิ่มการรองรับรูปแบบเวอร์ชัน 037
ในการเปิดตัว Android 7.0 ก่อนเวอร์ชัน 037
Android
ส่วนใหญ่ใช้รูปแบบเวอร์ชัน 035
ความแตกต่างเพียงอย่างเดียวระหว่างเวอร์ชัน 035
กับ 037
คือการเพิ่มวิธีการเริ่มต้นและการปรับ invoke
หมายเหตุ: รูปแบบนี้มีเวอร์ชันก่อนหน้าอย่างน้อย 2 เวอร์ชัน
ที่ใช้ในซอฟต์แวร์สาธารณะที่เผยแพร่ในวงกว้าง เช่น
เวอร์ชัน 009
ใช้สำหรับการเปิดตัว M3 ของ
แพลตฟอร์ม Android (พฤศจิกายน - ธันวาคม 2007)
และเวอร์ชัน 013
ใช้สำหรับการเปิดตัว M5 ของแพลตฟอร์ม Android (กุมภาพันธ์ - มีนาคม 2008) ในหลายๆ ด้าน รูปแบบเวอร์ชันก่อนหน้าเหล่านี้แตกต่างจากเวอร์ชันที่อธิบายไว้ในเอกสารนี้อย่างมาก
ENDIAN_CONSTANT และ REVERSE_ENDIAN_CONSTANT
ฝังอยู่ใน header_item
ค่าคงที่ ENDIAN_CONSTANT
ใช้เพื่อระบุ
รูปแบบการจัดเก็บข้อมูลของไฟล์ที่พบ แม้ว่ารูปแบบมาตรฐาน
.dex
จะเป็นแบบ Little-Endian แต่การติดตั้งใช้งานอาจเลือก
ที่จะทำการสลับไบต์ หากการติดตั้งใช้งานพบส่วนหัวที่มี endian_tag
เป็น REVERSE_ENDIAN_CONSTANT
แทนที่จะเป็น ENDIAN_CONSTANT
ก็จะทราบว่าไฟล์
มีการสลับไบต์จากรูปแบบที่คาดไว้
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
NO_INDEX
ฝังอยู่ใน class_def_item และ debug_info_item
ค่าคงที่ NO_INDEX
ใช้เพื่อระบุว่าไม่มีค่าดัชนี
หมายเหตุ: ค่านี้ไม่ได้กำหนดให้เป็น
0
เนื่องจากโดยปกติแล้วค่านี้จะเป็นดัชนีที่ถูกต้อง
ค่าที่เลือกสำหรับ NO_INDEX
สามารถแสดงเป็นไบต์เดียวในการเข้ารหัส uleb128p1
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
คำจำกัดความของแฟล็กการเข้าถึง
ฝังอยู่ใน class_def_item, encoded_field, encoded_method และ InnerClass
ฟิลด์บิตของแฟล็กเหล่านี้ใช้เพื่อระบุการช่วยเหลือพิเศษและ พร็อพเพอร์ตี้โดยรวมของคลาสและสมาชิกในคลาส
ชื่อ | ค่านิยม | สำหรับชั้นเรียน (และคำอธิบายประกอบ InnerClass ) |
สำหรับฟิลด์ | สำหรับวิธีการ |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : มองเห็นได้ทุกที่ |
public : มองเห็นได้ทุกที่ |
public : มองเห็นได้ทุกที่ |
ACC_PRIVATE | 0x2 | private : only visible to defining class
|
private : มองเห็นได้เฉพาะในคลาสที่กำหนด |
private : มองเห็นได้เฉพาะในคลาสที่กำหนด |
ACC_PROTECTED | 0x4 | protected : มองเห็นได้ในแพ็กเกจและคลาสย่อย
|
protected : มองเห็นได้สำหรับแพ็กเกจและคลาสย่อย |
protected : มองเห็นได้สำหรับแพ็กเกจและคลาสย่อย |
ACC_STATIC | 0x8 | static : is not constructed with an outer
this reference |
static : ทั่วโลกถึงคลาสที่กำหนด |
static : ไม่รับอาร์กิวเมนต์ this |
ACC_FINAL | 0x10 | final : ไม่สามารถสร้างคลาสย่อยได้ |
final : เปลี่ยนแปลงไม่ได้หลังจากสร้าง |
final : ลบล้างไม่ได้ |
ACC_SYNCHRONIZED | 0x20 | synchronized : ล็อกที่เชื่อมโยงจะได้รับโดยอัตโนมัติ
เมื่อเรียกใช้เมธอดนี้ หมายเหตุ: การตั้งค่านี้จะใช้ได้ก็ต่อเมื่อตั้งค่า
|
||
ACC_VOLATILE | 0x40 | volatile : กฎการเข้าถึงพิเศษเพื่อช่วยเรื่องความปลอดภัยของเธรด
|
||
ACC_BRIDGE | 0x40 | bridge method ซึ่งคอมไพเลอร์จะเพิ่มโดยอัตโนมัติเป็น bridge ที่ปลอดภัยต่อประเภท | ||
ACC_TRANSIENT | 0x80 | transient : ไม่บันทึกโดยการซีเรียลไลซ์เริ่มต้น |
||
ACC_VARARGS | 0x80 | คอมไพเลอร์ควรถือว่าอาร์กิวเมนต์สุดท้ายเป็นอาร์กิวเมนต์ "ที่เหลือ" | ||
ACC_NATIVE | 0x100 | native : ใช้ในโค้ดแบบเนทีฟ |
||
ACC_INTERFACE | 0x200 | interface : คลาสแบบนามธรรมที่ใช้ได้หลายครั้ง |
||
ACC_ABSTRACT | 0x400 | abstract : สร้างอินสแตนซ์โดยตรงไม่ได้ |
abstract : ไม่ได้ใช้โดยคลาสนี้ |
|
ACC_STRICT | 0x800 | strictfp : กฎที่เข้มงวดสำหรับการคำนวณเลขทศนิยม |
||
ACC_SYNTHETIC | 0x1000 | ไม่ได้กำหนดไว้ในซอร์สโค้ดโดยตรง | ไม่ได้กำหนดไว้ในซอร์สโค้ดโดยตรง | ไม่ได้กำหนดไว้ในซอร์สโค้ดโดยตรง |
ACC_ANNOTATION | 0x2000 | ประกาศเป็นคลาสคำอธิบายประกอบ | ||
ACC_ENUM | 0x4000 | ประกาศเป็นประเภทที่แจงนับ | ประกาศเป็นค่าที่แจกแจง | |
(ไม่ได้ใช้) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | เมธอดตัวสร้าง (ตัวเริ่มต้นคลาสหรืออินสแตนซ์) | ||
ACC_DECLARED_ SYNCHRONIZED |
0x20000 | ประกาศ synchronized หมายเหตุ: การดำเนินการนี้ไม่มีผลต่อ การดำเนินการ (นอกเหนือจากการแสดงผลของแฟล็กนี้โดยตัวมันเอง) |
InnerClass
คำอธิบายประกอบเท่านั้น
และต้องไม่ใช้ในclass_def_item
การเข้ารหัส UTF-8 ที่แก้ไขแล้ว
เพื่ออำนวยความสะดวกในการรองรับระบบเดิม .dex
รูปแบบ
จะเข้ารหัสข้อมูลสตริงในรูปแบบ UTF-8 ที่แก้ไขแล้วซึ่งเป็นมาตรฐานโดยพฤตินัย ซึ่งต่อไปนี้
จะเรียกว่า MUTF-8 รูปแบบนี้เหมือนกับ UTF-8 มาตรฐานทุกประการ ยกเว้น
- ระบบจะใช้เฉพาะการเข้ารหัสแบบ 1, 2 และ 3 ไบต์
- จุดรหัสในช่วง
U+10000
…U+10ffff
จะได้รับการเข้ารหัสเป็นคู่ทดแทน โดยแต่ละจุด จะแสดงเป็นค่าที่เข้ารหัส 3 ไบต์ - ระบบจะเข้ารหัสโค้ดพอยต์
U+0000
ในรูปแบบ 2 ไบต์ - ไบต์ Null ธรรมดา (ค่า
0
) จะระบุจุดสิ้นสุดของ สตริง ซึ่งเป็นไปตามการตีความภาษา C มาตรฐาน
สรุปรายการ 2 รายการแรกข้างต้นได้ดังนี้ MUTF-8 เป็นรูปแบบการเข้ารหัสสำหรับ UTF-16 แทนที่จะเป็นรูปแบบการเข้ารหัสที่ตรงกว่า สำหรับอักขระ Unicode
2 รายการสุดท้ายข้างต้นทำให้สามารถรวม
โค้ดพอยต์ U+0000
ในสตริงและยังคงจัดการ
เป็นสตริงที่ลงท้ายด้วยค่าว่างสไตล์ C ได้พร้อมกัน
อย่างไรก็ตาม การเข้ารหัสพิเศษของ U+0000
หมายความว่าเมื่อเรียกใช้ฟังก์ชัน C มาตรฐาน strcmp()
กับสตริง MUTF-8 2 สตริง ผลลัพธ์จะไม่ระบุผลลัพธ์ที่ลงนามอย่างถูกต้องของการเปรียบเทียบสตริงที่ไม่เท่ากันเสมอไป ซึ่งต่างจาก UTF-8 ปกติ
เมื่อการเรียงลำดับ (ไม่ใช่แค่ความเท่ากัน) เป็นข้อกังวล วิธีที่ตรงไปตรงมาที่สุดในการเปรียบเทียบสตริง MUTF-8 คือการถอดรหัสสตริงทีละอักขระ และเปรียบเทียบค่าที่ถอดรหัสแล้ว (อย่างไรก็ตาม คุณยังสามารถใช้การติดตั้งใช้งานที่ชาญฉลาดกว่านี้ได้ด้วย)
โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการเข้ารหัสอักขระในมาตรฐาน Unicode จริงๆ แล้ว MUTF-8 ใกล้เคียงกับการเข้ารหัส CESU-8 (ซึ่งค่อนข้างไม่เป็นที่รู้จัก) มากกว่า UTF-8 โดยตัวมันเอง
การเข้ารหัส encoded_value
ฝังอยู่ใน annotation_element และ encoded_array_item
encoded_value
คือข้อมูลที่มีโครงสร้างแบบลำดับชั้นที่เข้ารหัสแล้ว (เกือบ)
โดยพลการ การเข้ารหัสมีจุดประสงค์เพื่อ
ให้ทั้งกะทัดรัดและแยกวิเคราะห์ได้ตรงไปตรงมา
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
(value_arg << 5) | value_type | ubyte | ไบต์ที่ระบุประเภทของ
value along
พร้อมอาร์กิวเมนต์ที่อธิบายเพิ่มเติมซึ่งไม่บังคับใน 3 บิตที่มีลำดับสูง
ดูคำจำกัดความต่างๆ ของ value ได้ที่ด้านล่าง
ในกรณีส่วนใหญ่ value_arg จะเข้ารหัสความยาวของ
value ที่อยู่ถัดไปทันทีเป็นไบต์
(size - 1) เช่น 0 หมายความว่าค่าต้องใช้ 1 ไบต์ และ 7 หมายความว่าต้องใช้ 8 ไบต์ แต่ก็มีข้อยกเว้นตามที่ระบุไว้ด้านล่าง
|
ค่า | ubyte[] | ไบต์ที่แสดงค่า ความยาวของตัวแปร และการตีความ
จะแตกต่างกันสำหรับไบต์ value_type ที่ต่างกัน แม้ว่า
จะเป็นแบบ Little-Endian เสมอ โปรดดูรายละเอียดในคำจำกัดความของค่าต่างๆ ด้านล่าง
|
รูปแบบค่า
ชื่อประเภท | value_type |
value_arg รูปแบบ |
value รูปแบบ |
คำอธิบาย |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (ไม่มี ต้องเป็น 0 ) |
ubyte[1] | ค่าจำนวนเต็มแบบมีเครื่องหมาย 1 ไบต์ |
VALUE_SHORT | 0x02 | ขนาด - 1 (0…1) | ubyte[size] | ค่าจำนวนเต็ม 2 ไบต์แบบมีเครื่องหมาย ขยายเครื่องหมาย |
VALUE_CHAR | 0x03 | ขนาด - 1 (0…1) | ubyte[size] | ค่าจำนวนเต็ม 2 ไบต์ที่ไม่มีการลงนาม ซึ่งขยายเป็น 0 |
VALUE_INT | 0x04 | ขนาด - 1 (0…3) | ubyte[size] | ค่าจำนวนเต็ม 4 ไบต์แบบมีเครื่องหมาย ขยายเครื่องหมาย |
VALUE_LONG | 0x06 | ขนาด - 1 (0…7) | ubyte[size] | ค่าจำนวนเต็ม 8 ไบต์แบบมีเครื่องหมาย ขยายเครื่องหมาย |
VALUE_FLOAT | 0x10 | ขนาด - 1 (0…3) | ubyte[size] | รูปแบบบิต 4 ไบต์ ขยายด้วย 0 ทางด้านขวา และ ตีความเป็นค่าจุดลอยตัว 32 บิตของ IEEE754 |
VALUE_DOUBLE | 0x11 | ขนาด - 1 (0…7) | ubyte[size] | รูปแบบบิต 8 ไบต์ ขยายด้วย 0 ไปทางขวา และ ตีความเป็นค่าจุดลอยตัว 64 บิตของ IEEE754 |
VALUE_METHOD_TYPE | 0x15 | ขนาด - 1 (0…3) | ubyte[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายด้วย 0)
ตีความเป็นดัชนีในส่วน proto_ids
และแสดงค่าประเภทเมธอด
|
VALUE_METHOD_HANDLE | 0x16 | ขนาด - 1 (0…3) | ubyte[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายด้วย 0)
ตีความเป็นดัชนีในส่วน method_handles และแสดงค่าตัวแฮนเดิลของเมธอด
|
VALUE_STRING | 0x17 | ขนาด - 1 (0…3) | ubyte[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็น 0)
ตีความเป็นดัชนีในส่วน string_ids
และแสดงค่าสตริง
|
VALUE_TYPE | 0x18 | ขนาด - 1 (0…3) | ubyte[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็น 0)
ตีความเป็นดัชนีในส่วน type_ids
และแสดงค่าประเภท/คลาสแบบสะท้อน
|
VALUE_FIELD | 0x19 | ขนาด - 1 (0…3) | ubyte[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายด้วยศูนย์)
ตีความเป็นดัชนีใน
ส่วน field_ids และแสดงค่าฟิลด์แบบรีเฟลกทีฟ
|
VALUE_METHOD | 0x1a | ขนาด - 1 (0…3) | ubyte[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็น 0)
ตีความเป็นดัชนีในส่วน method_ids
และแสดงค่าเมธอดแบบรีเฟลกทีฟ
|
VALUE_ENUM | 0x1b | ขนาด - 1 (0…3) | ubyte[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่ได้ลงนาม (ขยายเป็น 0)
ตีความเป็นดัชนีในส่วน field_ids และแสดงค่าของ
ค่าคงที่ประเภทที่แจงนับ
|
VALUE_ARRAY | 0x1c | (ไม่มี ต้องเป็น 0 ) |
encoded_array | อาร์เรย์ของค่าในรูปแบบที่ระบุโดย
"รูปแบบ encoded_array " ด้านล่าง ขนาด
ของ value จะอยู่ในรูปแบบการเข้ารหัส
|
VALUE_ANNOTATION | 0x1d | (ไม่มี ต้องเป็น 0 ) |
encoded_annotation | คำอธิบายย่อยในรูปแบบที่ระบุโดย
"รูปแบบ encoded_annotation " ด้านล่าง ขนาด
ของ value จะอยู่ในรูปแบบการเข้ารหัส
|
VALUE_NULL | 0x1e | (ไม่มี ต้องเป็น 0 ) |
(ไม่มี) | ค่าอ้างอิง null |
VALUE_BOOLEAN | 0x1f | บูลีน (0…1) | (ไม่มี) | ค่า 1 บิต 0 สำหรับ false และ
1 สำหรับ true โดยบิตจะแสดงใน
value_arg
|
รูปแบบ encoded_array
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | uleb128 | จำนวนองค์ประกอบในอาร์เรย์ |
values | encoded_value[size] | ลำดับไบต์ size encoded_value
ในรูปแบบที่ระบุไว้ในส่วนนี้ โดยต่อกัน
ตามลำดับ
|
รูปแบบ encoded_annotation
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
type_idx | uleb128 | ประเภทของคำอธิบายประกอบ ต้องเป็นคลาส (ไม่ใช่อาร์เรย์หรือไทป์ดั้งเดิม) |
ขนาด | uleb128 | จำนวนการแมปชื่อ-ค่าในคำอธิบายประกอบนี้ |
องค์ประกอบ | annotation_element[size] | องค์ประกอบของคำอธิบายประกอบที่แสดงในบรรทัดโดยตรง (ไม่ใช่เป็นออฟเซ็ต) ต้องจัดเรียงองค์ประกอบตามลำดับจากน้อยไปมากตาม
string_id ดัชนี
|
รูปแบบ annotation_element
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
name_idx | uleb128 | ชื่อองค์ประกอบที่แสดงเป็นดัชนีในส่วน string_ids สตริงต้องเป็นไปตาม
รูปแบบคำสั่งสำหรับ MemberName ที่กำหนดไว้ข้างต้น
|
ค่า | encoded_value | ค่าองค์ประกอบ |
ไวยากรณ์ของสตริง
มีรายการหลายประเภทในไฟล์ .dex
ซึ่ง
อ้างอิงถึงสตริงในท้ายที่สุด คำจำกัดความรูปแบบ BNF ต่อไปนี้
ระบุไวยากรณ์ที่ยอมรับได้สำหรับสตริงเหล่านี้
SimpleName
SimpleName เป็นพื้นฐานสำหรับไวยากรณ์ของชื่อสิ่งอื่นๆ
.dex
รูปแบบนี้ช่วยให้มีความยืดหยุ่นในระดับหนึ่ง (มากกว่าภาษาต้นฉบับที่พบบ่อยส่วนใหญ่) กล่าวโดยย่อ ชื่อที่เรียบง่ายประกอบด้วยอักขระตัวอักษรหรือตัวเลข ASCII ขนาดเล็ก สัญลักษณ์ ASCII ขนาดเล็กบางตัว และจุดรหัสที่ไม่ใช่ ASCII ส่วนใหญ่ซึ่งไม่ใช่ตัวควบคุม ช่องว่าง หรืออักขระพิเศษ ตั้งแต่เวอร์ชัน 040
รูปแบบจะอนุญาตให้ใช้อักขระช่องว่าง (หมวดหมู่ Unicode Zs
) เพิ่มเติมด้วย โปรดทราบว่าจุดรหัสตัวแทน
(ในช่วง U+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 |
ชื่อสมาชิก
ใช้โดย field_id_item และ method_id_item
MemberName คือชื่อของสมาชิกในคลาส โดยสมาชิกจะเป็นฟิลด์ เมธอด และคลาสใน
MemberName → | |
SimpleName | |
| | '<' SimpleName '>' |
FullClassName
FullClassName คือชื่อคลาสที่สมบูรณ์ในตัวเอง ซึ่งรวมถึงตัวระบุแพ็กเกจที่ไม่บังคับตามด้วยชื่อที่ต้องระบุ
FullClassName → | |
OptionalPackagePrefix SimpleName | |
OptionalPackagePrefix → | |
(SimpleName '/' )* |
TypeDescriptor
ใช้โดย type_id_item
TypeDescriptor คือการแสดงประเภทใดก็ได้ ซึ่งรวมถึง
ประเภทข้อมูลพื้นฐาน คลาส อาร์เรย์ และ void
ดูความหมายของเวอร์ชันต่างๆ ได้ที่ด้านล่าง
TypeDescriptor → | |
'V' |
|
| | FieldTypeDescriptor |
FieldTypeDescriptor → | |
NonArrayFieldTypeDescriptor | |
| | ('[' * 1…255)
NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor→ | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' FullClassName ';' |
ShortyDescriptor
ใช้โดย proto_id_item
ShortyDescriptor คือการแสดงรูปแบบย่อของต้นแบบเมธอด
ซึ่งรวมถึงประเภทการคืนค่าและพารามิเตอร์ ยกเว้นว่าจะไม่มี
การแยกความแตกต่างระหว่างประเภทการอ้างอิง (คลาสหรืออาร์เรย์) ต่างๆ แต่จะใช้'L'
ตัวเดียวแทนประเภทการอ้างอิงทั้งหมด
ShortyDescriptor → | |
ShortyReturnType (ShortyFieldType)* | |
ShortyReturnType → | |
'V' |
|
| | ShortyFieldType |
ShortyFieldType → | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
ความหมายของ TypeDescriptor
นี่คือความหมายของตัวแปรแต่ละตัวของ TypeDescriptor
วากยสัมพันธ์ | ความหมาย |
---|---|
V | void ใช้ได้กับประเภทการคืนสินค้าเท่านั้น |
Z | boolean |
B | byte |
อา | short |
C | char |
I | int |
J | long |
F | float |
D | double |
Lfully/qualified/Name; | ชั้นเรียน fully.qualified.Name |
[descriptor | อาร์เรย์ของ descriptor ซึ่งใช้แบบเรียกซ้ำได้สำหรับ
อาร์เรย์ของอาร์เรย์ แม้ว่าจะมีมิติข้อมูลมากกว่า 255
มิติข้อมูลไม่ได้
|
รายการและโครงสร้างที่เกี่ยวข้อง
ส่วนนี้มีคำจำกัดความของแต่ละรายการระดับบนสุดที่อาจปรากฏในไฟล์ .dex
header_item
ปรากฏในส่วนหัว
การจัดแนว: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
มายากล | ubyte[8] = DEX_FILE_MAGIC | ดูรายละเอียดเพิ่มเติมได้ที่การสนทนาด้านบนในส่วน "DEX_FILE_MAGIC "
|
การตรวจสอบข้อผิดพลาด | uint | ผลรวมตรวจสอบ adler32 ของส่วนที่เหลือของไฟล์ (ทุกอย่างยกเว้น
magic และฟิลด์นี้) ใช้เพื่อตรวจหาความเสียหายของไฟล์
|
ลายเซ็น | ubyte[20] | ลายเซ็น (แฮช) SHA-1 ของไฟล์ที่เหลือ (ทุกอย่างยกเว้น
magic , checksum และฟิลด์นี้) ใช้
เพื่อระบุไฟล์ที่ไม่ซ้ำกัน
|
file_size | uint |
ขนาดของไฟล์ทั้งหมด (รวมส่วนหัว) ในหน่วยไบต์ (v40 หรือก่อนหน้า) ระยะห่างเป็นไบต์จากจุดเริ่มต้นของส่วนหัวนี้ไปยังส่วนหัวถัดไป หรือไปยังจุดสิ้นสุดของทั้งไฟล์ (คอนเทนเนอร์) (v41 ขึ้นไป) |
header_size | uint |
ขนาดของส่วนหัว (ทั้งส่วนนี้) ในหน่วยไบต์ ซึ่งจะช่วยให้มีความเข้ากันได้แบบย้อนหลัง/ไปข้างหน้าในระดับหนึ่งโดยไม่ทำให้รูปแบบไม่ถูกต้อง ต้องมีขนาด 0x70 (112) ไบต์ (v40 หรือเก่ากว่า) ต้องมีขนาด 0x78 (120) ไบต์ (v41 ขึ้นไป) |
แท็ก endian | uint = ENDIAN_CONSTANT | แท็ก Endianness ดูรายละเอียดเพิ่มเติมได้ที่การสนทนาด้านบนในส่วน "ENDIAN_CONSTANT
และ REVERSE_ENDIAN_CONSTANT "
|
link_size | uint | ขนาดของส่วนลิงก์ หรือ 0 หากไฟล์นี้ไม่ได้ลิงก์แบบคงที่
|
link_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังส่วนลิงก์ หรือ
0 หาก link_size == 0 ออฟเซ็ต หากไม่ใช่ 0
ควรเป็นออฟเซ็ตในส่วน link_data เอกสารนี้ไม่ได้ระบุรูปแบบของข้อมูลที่ชี้ไปถึง
ฟิลด์ส่วนหัวนี้ (และฟิลด์ก่อนหน้า) จะยังคงเป็นจุดเชื่อมต่อเพื่อให้การใช้งานรันไทม์ใช้ได้
|
map_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการแผนที่ ออฟเซ็ตซึ่งต้องไม่เป็น 0 ควรเป็นออฟเซ็ตในส่วน data
และข้อมูลควรอยู่ในรูปแบบที่ระบุโดย "map_list "
ด้านล่าง
|
string_ids_size | uint | จำนวนสตริงในรายการตัวระบุสตริง |
string_ids_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุสตริง หรือ
0 หาก string_ids_size == 0 (ซึ่งเป็นกรณีที่
แปลกประหลาด) ออฟเซ็ต หากไม่ใช่ 0
ควรอยู่ที่จุดเริ่มต้นของส่วน string_ids
|
type_ids_size | uint | จำนวนองค์ประกอบในรายการตัวระบุประเภท สูงสุด 65535 |
type_ids_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุประเภท หรือ
0 หาก type_ids_size == 0 (แม้ว่าจะเป็น
กรณีขอบที่แปลกประหลาด) ออฟเซ็ต หากไม่ใช่ 0
ควรอยู่ที่จุดเริ่มต้นของส่วน type_ids
|
proto_ids_size | uint | จำนวนองค์ประกอบในรายการตัวระบุต้นแบบ สูงสุด 65535 |
proto_ids_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุต้นแบบ หรือ
0 หาก proto_ids_size == 0 (ยอมรับว่าเป็น
กรณีขอบที่แปลก) ออฟเซ็ต หากไม่ใช่ 0
ควรอยู่ที่จุดเริ่มต้นของส่วน proto_ids
|
field_ids_size | uint | จำนวนองค์ประกอบในรายการตัวระบุฟิลด์ |
field_ids_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุฟิลด์ หรือ
0 หาก field_ids_size == 0 ออฟเซ็ต หาก
ไม่ใช่ 0 ควรเป็นจุดเริ่มต้นของส่วน field_ids
|
method_ids_size | uint | จำนวนองค์ประกอบในรายการตัวระบุวิธีการ |
method_ids_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุเมธอด หรือ
0 หาก method_ids_size == 0 ออฟเซ็ต หาก
ไม่ใช่ 0 ควรเป็นจุดเริ่มต้นของส่วน method_ids
|
class_defs_size | uint | จำนวนองค์ประกอบในรายการคำจำกัดความของคลาส |
class_defs_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการคำจำกัดความของคลาส หรือ
0 หาก class_defs_size == 0 (ยอมรับว่าเป็น
กรณีขอบที่แปลก) ออฟเซ็ต หากไม่ใช่ 0
ควรอยู่ที่จุดเริ่มต้นของส่วน class_defs
|
data_size | uint |
ขนาดของส่วน ไม่ได้ใช้ (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 (หรือที่เรียกว่าอ็อกเทต หรือไบต์)
ตามด้วยไบต์ที่มีค่า 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 | แฟล็กการเข้าถึงสำหรับชั้นเรียน (public , final ,
ฯลฯ) ดูรายละเอียดได้ที่ "access_flags คำจำกัดความ"
|
superclass_idx | uint | ดัชนีในรายการ type_ids สำหรับคลาสแม่ หรือ
ค่าคงที่ NO_INDEX หากคลาสนี้ไม่มีคลาสแม่ (เช่น เป็นคลาสรูทอย่าง Object )
หากมีอยู่ ค่านี้ต้องเป็นประเภทคลาส ไม่ใช่อาร์เรย์หรือประเภทดั้งเดิม
|
interfaces_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการอินเทอร์เฟซ หรือ
0 หากไม่มี ออฟเซ็ตนี้
ควรอยู่ในส่วน data และข้อมูล
ในส่วนนั้นควรอยู่ในรูปแบบที่ระบุโดย
"type_list " ด้านล่าง องค์ประกอบแต่ละรายการของลิสต์
ต้องเป็นประเภทคลาส (ไม่ใช่ประเภทอาร์เรย์หรือประเภทดั้งเดิม) และต้อง
ไม่มีรายการที่ซ้ำกัน
|
source_file_idx | uint | ดัชนีในรายการ string_ids สำหรับชื่อของ
ไฟล์ที่มีแหล่งที่มาต้นฉบับของ (อย่างน้อยที่สุด) คลาสนี้
หรือค่าพิเศษ NO_INDEX เพื่อแสดงว่าไม่มี
ข้อมูลนี้ debug_info_item ของเมธอดใดก็ตาม
อาจลบล้างไฟล์แหล่งที่มานี้ แต่คาดว่าคลาสส่วนใหญ่
จะมาจากไฟล์แหล่งที่มาเพียงไฟล์เดียว
|
annotations_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังโครงสร้างคำอธิบายประกอบ
สำหรับคลาสนี้ หรือ 0 หากไม่มีคำอธิบายประกอบใน
คลาสนี้ ออฟเซ็ตนี้ หากไม่ใช่ 0 ควรอยู่ในส่วน
data และข้อมูลในส่วนนั้นควรอยู่ใน
รูปแบบที่ระบุโดย "annotations_directory_item " ด้านล่าง
โดยมีรายการทั้งหมดที่อ้างอิงถึงคลาสนี้เป็นตัวกำหนด
|
class_data_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังข้อมูลชั้นเรียนที่เชื่อมโยง
สำหรับรายการนี้ หรือ 0 หากไม่มีข้อมูลชั้นเรียน
สำหรับชั้นเรียนนี้ (กรณีนี้อาจเกิดขึ้นได้ เช่น หากคลาสนี้
เป็นอินเทอร์เฟซเครื่องหมาย) ออฟเซ็ต หากไม่ใช่ 0 ควรอยู่ในส่วน
data และข้อมูลในส่วนนั้นควรอยู่ในรูปแบบ
ที่ระบุโดย "class_data_item " ด้านล่าง โดยมีรายการ
ทั้งหมดที่อ้างอิงถึงคลาสนี้เป็นตัวกำหนด
|
static_values_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการค่าเริ่มต้นสำหรับฟิลด์ static หรือ 0 หากไม่มี (และต้องเริ่มต้นฟิลด์ static ทั้งหมดด้วย 0 หรือ null ) ออฟเซ็ตนี้ควรอยู่ในส่วน data และข้อมูลในส่วนนั้นควรอยู่ในรูปแบบที่ระบุโดย "encoded_array_item " ด้านล่าง ขนาด
ของอาร์เรย์ต้องไม่เกินจํานวนฟิลด์ static
ที่ประกาศโดยคลาสนี้ และองค์ประกอบต้องสอดคล้องกับฟิลด์ static
ตามลําดับเดียวกับที่ประกาศใน field_list
ที่เกี่ยวข้อง ประเภทขององค์ประกอบอาร์เรย์แต่ละรายการ
ต้องตรงกับประเภทที่ประกาศของฟิลด์ที่เกี่ยวข้อง
หากมีองค์ประกอบในอาร์เรย์น้อยกว่า
static ฟิลด์ ระบบจะเริ่มต้นฟิลด์ที่เหลือ
ด้วย 0 หรือ null ที่เหมาะสมกับประเภท
|
call_site_id_item
ปรากฏในส่วน call_site_ids
การจัดแนว: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
call_site_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังคำจำกัดความของเว็บไซต์ ออฟเซ็ตควร อยู่ในส่วนข้อมูล และข้อมูลในส่วนนั้นควรอยู่ในรูปแบบที่ระบุโดย "call_site_item" ด้านล่าง |
call_site_item
ปรากฏในส่วนข้อมูล
การจัดแนว: ไม่มี (จัดแนวไบต์)
call_site_item คือ encoded_array_item ซึ่งมีองค์ประกอบที่สอดคล้องกับอาร์กิวเมนต์ ที่ระบุให้กับเมธอดลิงก์การเริ่มต้น อาร์กิวเมนต์ 3 รายการแรกคือ
- ตัวแฮนเดิลของเมธอดที่แสดงเมธอดลิงก์การเริ่มต้น (VALUE_METHOD_HANDLE)
- ชื่อเมธอดที่ Linker ของ Bootstrap ควรแก้ไข (VALUE_STRING)
- ประเภทเมธอดที่สอดคล้องกับประเภทของชื่อเมธอดที่จะแก้ไข (VALUE_METHOD_TYPE)
อาร์กิวเมนต์เพิ่มเติมใดๆ คือค่าคงที่ที่ส่งไปยังเมธอดลิงก์การเริ่มต้น อาร์กิวเมนต์เหล่านี้จะ ส่งผ่านตามลำดับและไม่มีการแปลงประเภท
แฮนเดิลเมธอดที่แสดงเมธอดลิงก์การเริ่มต้นต้องมีประเภทการคืนค่าเป็น 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 is a static field setter (accessor) |
METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | Method handle คือตัวรับฟิลด์แบบคงที่ (ตัวเข้าถึง) |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | Method handle คือตัวตั้งค่าฟิลด์อินสแตนซ์ (ตัวเข้าถึง) |
METHOD_HANDLE_TYPE_INSTANCE_GET | 0x03 | Method handle คือตัวรับฟิลด์อินสแตนซ์ (ตัวเข้าถึง) |
METHOD_HANDLE_TYPE_INVOKE_STATIC | 0x04 | MethodHandle คือตัวเรียกใช้เมธอดแบบคงที่ |
METHOD_HANDLE_TYPE_INVOKE_INSTANCE | 0x05 | Method handle คือตัวเรียกใช้เมธอดอินสแตนซ์ |
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR | 0x06 | MethodHandle คือตัวเรียกใช้เมธอดของตัวสร้าง |
METHOD_HANDLE_TYPE_INVOKE_DIRECT | 0x07 | MethodHandle คือตัวเรียกใช้เมธอดโดยตรง |
METHOD_HANDLE_TYPE_INVOKE_INTERFACE | 0x08 | MethodHandle คือตัวเรียกใช้เมธอดอินเทอร์เฟซ |
class_data_item
อ้างอิงจาก class_def_item
ปรากฏในส่วนข้อมูล
การจัดแนว: ไม่มี (จัดแนวไบต์)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
static_fields_size | uleb128 | จำนวนฟิลด์แบบคงที่ที่กำหนดไว้ในรายการนี้ |
instance_fields_size | uleb128 | จำนวนฟิลด์อินสแตนซ์ที่กำหนดในรายการนี้ |
direct_methods_size | uleb128 | จำนวนวิธีการโดยตรงที่กำหนดไว้ในรายการนี้ |
virtual_methods_size | uleb128 | จำนวนเมธอดเสมือนที่กำหนดไว้ในรายการนี้ |
static_fields | encoded_field[static_fields_size] | ฟิลด์แบบคงที่ที่กำหนด ซึ่งแสดงเป็นลำดับของ
องค์ประกอบที่เข้ารหัส ต้องจัดเรียงฟิลด์ตาม
field_idx โดยเรียงจากน้อยไปมาก
|
instance_fields | encoded_field[instance_fields_size] | ฟิลด์อินสแตนซ์ที่กำหนด ซึ่งแสดงเป็นลำดับของ
องค์ประกอบที่เข้ารหัส ต้องจัดเรียงฟิลด์ตาม
field_idx โดยเรียงจากน้อยไปมาก
|
direct_methods | encoded_method[direct_methods_size] | วิธีการที่กำหนดโดยตรง (static , private หรือตัวสร้าง)
ซึ่งแสดงเป็นลำดับขององค์ประกอบที่เข้ารหัส ต้องจัดเรียงวิธีการตาม
method_idx จากน้อยไปมาก
|
virtual_methods | encoded_method[virtual_methods_size] | เมธอดเสมือนที่กำหนด (ไม่มี static , private
หรือตัวสร้าง) ซึ่งแสดงเป็นลำดับของ
องค์ประกอบที่เข้ารหัส รายการนี้ไม่ควรรวมเมธอดที่รับค่ามา
เว้นแต่จะมีการลบล้างโดยคลาสที่รายการนี้แสดง ต้องจัดเรียงเมธอด
ตาม method_idx จากน้อยไปมาก
method_idx ของเมธอดเสมือนต้องไม่เหมือนกับ
เมธอดโดยตรง
|
หมายเหตุ: อินสแตนซ์ field_id
และ
method_id
ขององค์ประกอบทั้งหมดต้องอ้างอิงคลาสที่กำหนดเดียวกัน
รูปแบบฟิลด์ที่เข้ารหัส
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
field_idx_diff | uleb128 | ดัชนีในfield_ids รายการสำหรับข้อมูลประจำตัวของฟิลด์นี้ (รวมถึงชื่อและตัวอธิบาย) ซึ่งแสดงเป็นความแตกต่าง
จากดัชนีขององค์ประกอบก่อนหน้าในรายการ ดัชนีของ
องค์ประกอบแรกในรายการจะแสดงโดยตรง
|
access_flags | uleb128 | แฟล็กการเข้าถึงสำหรับฟิลด์ (public , final ,
ฯลฯ) ดูรายละเอียดได้ที่ "access_flags คำจำกัดความ"
|
รูปแบบ encoded_method
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
method_idx_diff | uleb128 | ดัชนีในmethod_ids รายการสำหรับข้อมูลระบุตัวตนของ
เมธอดนี้ (รวมถึงชื่อและตัวอธิบาย) ซึ่งแสดงเป็นความแตกต่าง
จากดัชนีขององค์ประกอบก่อนหน้าในรายการ ดัชนีของ
องค์ประกอบแรกในรายการจะแสดงโดยตรง
|
access_flags | uleb128 | แฟล็กการเข้าถึงสำหรับเมธอด (public , final ,
ฯลฯ) ดูรายละเอียดได้ที่ "access_flags คำจำกัดความ"
|
code_off | uleb128 | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังโครงสร้างโค้ดสำหรับเมธอดนี้ หรือ 0 หากเมธอดนี้เป็น abstract
หรือ native ออฟเซ็ตควรเป็นตำแหน่งในส่วน data รูปแบบของข้อมูลจะระบุโดย
"code_item " ด้านล่าง
|
type_list
อ้างอิงจาก class_def_item และ proto_id_item
ปรากฏในส่วนข้อมูล
การจัดแนว: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | uint | ขนาดของรายการในหน่วยรายการ |
ลิสต์ | type_item[size] | องค์ประกอบของรายการ |
รูปแบบ type_item
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
type_idx | ushort | ดัชนีในรายการ type_ids |
code_item
อ้างอิงจาก encoded_method
ปรากฏในส่วนข้อมูล
การจัดแนว: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
registers_size | ushort | จำนวนรีจิสเตอร์ที่โค้ดนี้ใช้ |
ins_size | ushort | จำนวนคำของอาร์กิวเมนต์ขาเข้าในเมธอดที่โค้ดนี้ ใช้ |
outs_size | ushort | จำนวนคำของพื้นที่อาร์กิวเมนต์ขาออกที่โค้ดนี้ต้องการ สำหรับการเรียกใช้เมธอด |
tries_size | ushort | จำนวน try_item สำหรับอินสแตนซ์นี้ หากไม่ใช่ 0
รายการเหล่านี้จะปรากฏเป็นอาร์เรย์ tries ทันทีหลังจาก
insns ในอินสแตนซ์นี้
|
debug_info_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังลำดับข้อมูลการแก้ไขข้อบกพร่อง (หมายเลขบรรทัด +
ข้อมูลตัวแปรภายใน) สำหรับโค้ดนี้ หรือ 0 หาก
ไม่มีข้อมูล หากออฟเซ็ตไม่ใช่ 0 ออฟเซ็ตควรเป็น
ตำแหน่งในส่วน data รูปแบบของ
ข้อมูลระบุโดย "debug_info_item " ด้านล่าง
|
insns_size | uint | ขนาดของรายการคำสั่งในหน่วยโค้ด 16 บิต |
insns | ushort[insns_size] | อาร์เรย์ไบต์โค้ดจริง รูปแบบของโค้ดในinsns
อาร์เรย์ระบุไว้ในเอกสารประกอบ
ไบต์โค้ด Dalvik โปรดทราบ
ว่าแม้จะกำหนดเป็นอาร์เรย์ของ ushort แต่
โครงสร้างภายในบางอย่างต้องการการจัดแนว 4 ไบต์ นอกจากนี้
หากข้อมูลนี้อยู่ในไฟล์ที่มีการสลับ Endian ระบบจะสลับ
เฉพาะอินสแตนซ์ ushort แต่จะไม่สลับ
โครงสร้างภายในที่ใหญ่กว่า
|
padding | ushort (ไม่บังคับ) = 0 | ไบต์การเพิ่ม 2 ไบต์เพื่อให้tries จัดแนว 4 ไบต์
องค์ประกอบนี้จะแสดงก็ต่อเมื่อ tries_size ไม่ใช่ 0
และ insns_size เป็นจำนวนคี่
|
ลอง | try_item[tries_size] (ไม่บังคับ) | อาร์เรย์ที่ระบุตำแหน่งในโค้ดที่ตรวจพบข้อยกเว้นและ
วิธีจัดการ องค์ประกอบของอาร์เรย์ต้องไม่ซ้อนทับกันใน
ช่วงและเรียงลำดับจากที่อยู่ต่ำไปสูง องค์ประกอบนี้จะแสดงก็ต่อเมื่อ tries_size ไม่ใช่ 0
|
ตัวแฮนเดิล | encoded_catch_handler_list (ไม่บังคับ) | ไบต์ที่แสดงรายการของรายการประเภทการจับและที่อยู่แฮนเดิลที่เชื่อมโยง
แต่ละ try_item มีออฟเซ็ตระดับไบต์
ในโครงสร้างนี้ องค์ประกอบนี้จะแสดงก็ต่อเมื่อ tries_size ไม่ใช่ 0
|
รูปแบบ try_item
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
start_addr | uint | ที่อยู่เริ่มต้นของบล็อกโค้ดที่รายการนี้ครอบคลุม The address is a count of 16-bit code units to the start of the first covered instruction. |
insn_count | ushort | จำนวนหน่วยโค้ด 16 บิตที่รายการนี้ครอบคลุม หน่วยรหัสสุดท้าย
ที่ครอบคลุม (รวม) คือ start_addr + insn_count - 1
|
handler_off | ushort | ออฟเซ็ตเป็นไบต์จากจุดเริ่มต้นของencoded_catch_hander_list ที่เชื่อมโยง
ถึงencoded_catch_handler สำหรับรายการนี้ ต้องเป็นออฟเซ็ตไปยังจุดเริ่มต้นของ encoded_catch_handler
|
รูปแบบ encoded_catch_handler_list
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | uleb128 | ขนาดของรายการนี้ในหน่วยรายการ |
ลิสต์ | encoded_catch_handler[handlers_size] | รายการจริงของรายการแฮนเดิลเลอร์ที่แสดงโดยตรง (ไม่ใช่เป็นออฟเซ็ต) และเชื่อมต่อตามลําดับ |
รูปแบบ encoded_catch_handler
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | sleb128 | จำนวนประเภทการจับในรายการนี้ หากไม่ใช่ค่าบวก ค่านี้จะเป็นค่าลบของจำนวนประเภทการจับ และการจับจะตามด้วยตัวแฮนเดิลการจับทั้งหมด เช่น size ของ 0
หมายความว่ามีอีเมลแบบ Catch-all แต่ไม่มีอีเมลแบบ Catch ที่ระบุประเภทอย่างชัดเจน
size 2 หมายความว่ามีข้อความที่พิมพ์อย่างชัดเจน 2 รายการ
และไม่มีข้อความที่ครอบคลุมทั้งหมด และ size ของ -1
หมายความว่ามีการจับคู่ที่พิมพ์พร้อมกับการจับคู่ทั้งหมด
|
ตัวแฮนเดิล | encoded_type_addr_pair[abs(size)] | สตรีมของabs(size) ที่เข้ารหัส 1 รายการสำหรับแต่ละประเภทที่แคช
ตามลำดับที่ควรทดสอบประเภท
|
catch_all_addr | uleb128 (ไม่บังคับ) | ที่อยู่ไบต์โค้ดของตัวแฮนเดิลที่รับทั้งหมด องค์ประกอบนี้จะปรากฏก็ต่อเมื่อ size ไม่เป็นบวก
|
รูปแบบ encoded_type_addr_pair
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
type_idx | uleb128 | ดัชนีในtype_ids รายการสำหรับประเภทของ
ข้อยกเว้นที่จะจับ
|
addr | uleb128 | ที่อยู่ไบต์โค้ดของตัวแฮนเดิลข้อยกเว้นที่เชื่อมโยง |
debug_info_item
อ้างอิงจาก code_item
ปรากฏในส่วนข้อมูล
การจัดแนว: ไม่มี (จัดแนวไบต์)
แต่ละ debug_info_item
จะกำหนดเครื่องสถานะที่เข้ารหัสไบต์ซึ่งได้รับแรงบันดาลใจจาก DWARF3
ซึ่งเมื่อตีความแล้วจะปล่อยตารางตำแหน่ง
และ (อาจ) ข้อมูลตัวแปรภายในสำหรับ code_item
ลำดับจะเริ่มต้นด้วยส่วนหัวที่มีความยาวผันแปร (ซึ่งความยาวจะขึ้นอยู่กับจำนวนพารามิเตอร์ของเมธอด)
ตามด้วยไบต์โค้ดของเครื่องสถานะ และลงท้ายด้วยไบต์ DBG_END_SEQUENCE
เครื่องสถานะประกอบด้วยรีจิสเตอร์ 5 รายการ
address
register แสดงออฟเซ็ตของคำสั่งใน
insns_item
ที่เกี่ยวข้องในหน่วยโค้ด 16 บิต
address
รีจิสเตอร์จะเริ่มต้นที่ 0
เมื่อเริ่มต้นแต่ละ
debug_info
ลำดับ และต้องเพิ่มขึ้นแบบโมโนโทนเท่านั้น
รีจิสเตอร์ line
แสดงหมายเลขบรรทัดต้นฉบับ
ที่ควรเชื่อมโยงกับรายการตารางตำแหน่งถัดไปที่ปล่อยออกมาจาก
เครื่องสถานะ โดยจะเริ่มต้นในส่วนหัวของลำดับ และอาจ
เปลี่ยนแปลงในทิศทางบวกหรือลบ แต่ต้องไม่น้อยกว่า
1
source_file
รีจิสเตอร์แสดงถึง
ไฟล์ต้นฉบับที่รายการหมายเลขบรรทัดอ้างอิงถึง โดยจะเริ่มต้นด้วยค่าของ source_file_idx
ใน class_def_item
ตัวแปรอีก 2 ตัว ได้แก่ prologue_end
และ
epilogue_begin
เป็นแฟล็กบูลีน (เริ่มต้นเป็น
false
) ที่ระบุว่าควรพิจารณาตำแหน่งถัดไปที่ปล่อยออกมาเป็นคำนำหรือบทสรุปของเมธอดหรือไม่ เครื่องสถานะ
ต้องติดตามชื่อและประเภทของตัวแปรภายในล่าสุดที่ใช้งานอยู่
ในแต่ละรีจิสเตอร์สำหรับโค้ด DBG_RESTART_LOCAL
ด้วย
ส่วนหัวมีดังนี้
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
line_start | uleb128 | ค่าเริ่มต้นสำหรับรีจิสเตอร์ line ของเครื่องสถานะ
ไม่ได้แสดงถึงรายการตำแหน่งจริง
|
parameters_size | uleb128 | จำนวนชื่อพารามิเตอร์ที่เข้ารหัส ควรมี
1 รายการต่อพารามิเตอร์ของเมธอด โดยไม่รวม this ของเมธอดอินสแตนซ์
หากมี
|
parameter_names | uleb128p1[parameters_size] | ดัชนีสตริงของชื่อพารามิเตอร์เมธอด ค่าที่เข้ารหัสของ
NO_INDEX แสดงว่าไม่มีชื่อ
สำหรับพารามิเตอร์ที่เชื่อมโยง ตัวอธิบายประเภท
และลายเซ็นจะอิงตามตัวอธิบายเมธอดและลายเซ็น
|
ค่ารหัสไบต์มีดังนี้
ชื่อ | ค่านิยม | รูปแบบ | อาร์กิวเมนต์ | คำอธิบาย |
---|---|---|---|---|
DBG_END_SEQUENCE | 0x00 | (ไม่มี) | สิ้นสุดลำดับข้อมูลการแก้ไขข้อบกพร่องสำหรับ code_item |
|
DBG_ADVANCE_PC | 0x01 | uleb128 addr_diff | addr_diff : จำนวนเงินที่จะเพิ่มลงในทะเบียนที่อยู่ |
เลื่อนรีจิสเตอร์ที่อยู่โดยไม่ต้องส่งรายการตำแหน่ง |
DBG_ADVANCE_LINE | 0x02 | sleb128 line_diff | line_diff : จำนวนที่จะเปลี่ยนรีจิสเตอร์บรรทัด |
เลื่อนบรรทัดโดยไม่ต้องส่งรายการตำแหน่ง |
DBG_START_LOCAL | 0x03 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx |
register_num : register that will contain localname_idx : string index of the nametype_idx : type index of the type
|
จะประกาศตัวแปรภายในที่ที่อยู่ปัจจุบัน name_idx หรือ type_idx อาจเป็น
NO_INDEX เพื่อระบุว่าไม่ทราบค่าดังกล่าว
|
DBG_START_LOCAL_EXTENDED | 0x04 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx uleb128p1 sig_idx |
register_num : รีจิสเตอร์ที่มีname_idx : ดัชนีสตริงของชื่อtype_idx : ดัชนีประเภทของประเภทsig_idx : ดัชนีสตริงของลายเซ็นประเภท
|
แนะนำตัวแปรเฉพาะที่พร้อมลายเซ็นประเภทที่ที่อยู่ปัจจุบัน
name_idx , type_idx หรือ
sig_idx อาจเป็น NO_INDEX
เพื่อระบุว่าค่าดังกล่าวไม่ทราบ (หาก sig_idx เป็น
-1 คุณจะแสดงข้อมูลเดียวกันได้อย่างมีประสิทธิภาพมากขึ้น
โดยใช้ตัวดำเนินการ DBG_START_LOCAL )
หมายเหตุ: โปรดดูการสนทนาในส่วน
" |
DBG_END_LOCAL | 0x05 | uleb128 register_num | register_num : ลงทะเบียนที่มีคำว่า "ท้องถิ่น" |
ทำเครื่องหมายตัวแปรภายในที่ใช้งานอยู่ปัจจุบันว่าอยู่นอกขอบเขตที่ที่อยู่ปัจจุบัน |
DBG_RESTART_LOCAL | 0x06 | uleb128 register_num | register_num : ลงทะเบียนเพื่อรีสตาร์ท |
จะนำตัวแปรภายในที่ที่อยู่ปัจจุบันกลับมาใช้ใหม่ ชื่อ และประเภทจะเหมือนกับรายการในเครื่องล่าสุดที่เผยแพร่ใน รีจิสเตอร์ที่ระบุ |
DBG_SET_PROLOGUE_END | 0x07 | (ไม่มี) | ตั้งค่ารีจิสเตอร์เครื่องสถานะ prologue_end
ซึ่งบ่งชี้ว่ารายการตำแหน่งถัดไปที่เพิ่มเข้ามาควร
ถือเป็นจุดสิ้นสุดของคำนำของเมธอด (ตำแหน่งที่เหมาะสมสำหรับ
เบรกพอยต์ของเมธอด) prologue_end รีจิสเตอร์จะ
ล้างโดยรหัสปฏิบัติการพิเศษ (>= 0x0a )
|
|
DBG_SET_EPILOGUE_BEGIN | 0x08 | (ไม่มี) | ตั้งค่าepilogue_begin รีจิสเตอร์เครื่องสถานะ
ซึ่งบ่งชี้ว่ารายการตำแหน่งถัดไปที่เพิ่มควร
ถือเป็นจุดเริ่มต้นของบทส่งท้ายของเมธอด (ตำแหน่งที่เหมาะสม
ในการระงับการดำเนินการก่อนออกจากเมธอด)
epilogue_begin รีจิสเตอร์จะล้างโดยรหัสปฏิบัติการพิเศษ
(>= 0x0a )
|
|
DBG_SET_FILE | 0x09 | uleb128p1 name_idx | name_idx : ดัชนีสตริงของชื่อไฟล์ต้นฉบับ
NO_INDEX หากไม่รู้จัก
|
ระบุว่ารายการหมายเลขบรรทัดทั้งหมดหลังจากนี้จะอ้างอิงถึง
ชื่อไฟล์ต้นฉบับนี้ แทนที่จะเป็นชื่อเริ่มต้นที่ระบุใน
code_item
|
Opcodes พิเศษ | 0x0a…0xff | (ไม่มี) | เลื่อนรีจิสเตอร์ line และ address
ออกรายการตำแหน่ง และล้าง prologue_end และ
epilogue_begin ดูคำอธิบายด้านล่าง
|
รหัสดำเนินการพิเศษ
โอเปอเรชันโค้ดที่มีค่าระหว่าง 0x0a
ถึง 0xff
(รวม) จะย้ายทั้งรีจิสเตอร์ line
และ address
เล็กน้อย แล้วปล่อยรายการตารางตำแหน่งใหม่
สูตรสำหรับการเพิ่มมีดังนี้
DBG_FIRST_SPECIAL = 0x0a // the smallest special opcode DBG_LINE_BASE = -4 // the smallest line number increment DBG_LINE_RANGE = 15 // the number of line increments represented adjusted_opcode = opcode - DBG_FIRST_SPECIAL line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE) address += (adjusted_opcode / DBG_LINE_RANGE)
annotations_directory_item
อ้างอิงจาก class_def_item
ปรากฏในส่วนข้อมูล
การจัดแนว: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
class_annotations_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังคำอธิบายประกอบที่สร้างโดยตรง
ในคลาส หรือ 0 หากคลาสไม่มีคำอธิบายประกอบโดยตรง
หากออฟเซ็ตไม่ใช่ 0 ออฟเซ็ตควรเป็นตำแหน่งในส่วน data รูปแบบของข้อมูลจะระบุโดย "annotation_set_item " ด้านล่าง
|
fields_size | uint | จำนวนฟิลด์ที่อธิบายประกอบโดยรายการนี้ |
annotated_methods_size | uint | จำนวนเมธอดที่อธิบายประกอบโดยรายการนี้ |
annotated_parameters_size | uint | จำนวนรายการพารามิเตอร์ของเมธอดที่อธิบายประกอบโดยรายการนี้ |
field_annotations | field_annotation[fields_size] (ไม่บังคับ) | รายการคำอธิบายประกอบฟิลด์ที่เชื่อมโยง องค์ประกอบของรายการต้อง
จัดเรียงตามลำดับจากน้อยไปมากตาม field_idx
|
method_annotations | method_annotation[methods_size] (ไม่บังคับ) | รายการคำอธิบายประกอบของเมธอดที่เชื่อมโยง องค์ประกอบของรายการต้อง
จัดเรียงตามลำดับจากน้อยไปมากตาม method_idx
|
parameter_annotations | parameter_annotation[parameters_size] (ไม่บังคับ) | รายการคำอธิบายประกอบพารามิเตอร์ของเมธอดที่เกี่ยวข้อง องค์ประกอบของ
รายการต้องจัดเรียงตามลำดับจากน้อยไปมากตาม method_idx
|
หมายเหตุ: อินสแตนซ์ field_id
และ
method_id
ขององค์ประกอบทั้งหมดต้องอ้างอิงคลาสที่กำหนดเดียวกัน
รูปแบบฟิลด์คำอธิบายประกอบ
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
field_idx | uint | ดัชนีในfield_ids รายการสำหรับข้อมูลประจำตัวของ
ฟิลด์ที่กำลังใส่คำอธิบายประกอบ
|
annotations_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับ
ฟิลด์ ออฟเซ็ตควรเป็นตำแหน่งในส่วน data
รูปแบบของข้อมูลจะระบุโดย
"annotation_set_item " ด้านล่าง
|
รูปแบบ method_annotation
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
method_idx | uint | ดัชนีในรายการ method_ids สำหรับข้อมูลประจำตัวของ
เมธอดที่กำลังใส่คำอธิบายประกอบ
|
annotations_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับ
เมธอด ออฟเซ็ตควรเป็นตำแหน่งในส่วน data รูปแบบของข้อมูลจะระบุโดย
"annotation_set_item " ด้านล่าง
|
รูปแบบ parameter_annotation
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
method_idx | uint | ดัชนีในรายการ method_ids สำหรับข้อมูลระบุตัวตนของเมธอด
ที่มีการใส่คำอธิบายประกอบพารามิเตอร์
|
annotations_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับ
พารามิเตอร์ของเมธอด ออฟเซ็ตควรเป็นตำแหน่งในส่วน data รูปแบบของข้อมูลจะระบุโดย
"annotation_set_ref_list " ด้านล่าง
|
annotation_set_ref_list
อ้างอิงจาก parameter_annotations_item
ปรากฏในส่วนข้อมูล
การจัดแนว: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | uint | ขนาดของรายการในหน่วยรายการ |
ลิสต์ | annotation_set_ref_item[size] | องค์ประกอบของรายการ |
รูปแบบ annotation_set_ref_item
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
annotations_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังชุดคำอธิบายประกอบที่อ้างอิง
หรือ 0 หากไม่มีคำอธิบายประกอบสำหรับองค์ประกอบนี้
หากออฟเซ็ตไม่ใช่ 0 ออฟเซ็ตควรเป็นตำแหน่งในส่วน data
รูปแบบของข้อมูลจะระบุโดย
"annotation_set_item " ด้านล่าง
|
annotation_set_item
อ้างอิงจาก annotations_directory_item, field_annotations_item, method_annotations_item และ annotation_set_ref_item
ปรากฏในส่วนข้อมูล
การจัดแนว: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | uint | ขนาดของชุดข้อมูลในรายการ |
รายการ | annotation_off_item[size] | องค์ประกอบของชุด ต้องจัดเรียงองค์ประกอบโดยเรียงจากน้อยไปมาก
ตาม type_idx
|
รูปแบบ annotation_off_item
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
annotation_off | uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังคำอธิบายประกอบ
ออฟเซ็ตควรเป็นตำแหน่งในdata ส่วน
และรูปแบบของข้อมูลในตำแหน่งนั้นจะระบุโดย
"annotation_item " ด้านล่าง
|
annotation_item
อ้างอิงจาก annotation_set_item
ปรากฏในส่วนข้อมูล
การจัดแนว: ไม่มี (จัดแนวไบต์)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
การเปิดเผย | ubyte | ระดับการมองเห็นที่ต้องการของคำอธิบายประกอบนี้ (ดูด้านล่าง) |
หมายเหตุ | encoded_annotation | เนื้อหาคำอธิบายประกอบที่เข้ารหัสในรูปแบบที่อธิบายไว้ใน
"encoded_annotation รูปแบบ" ในส่วน
"encoded_value การเข้ารหัส" ด้านบน
|
ค่าระดับการเข้าถึง
ตัวเลือกสำหรับฟิลด์ visibility
ใน
annotation_item
มีดังนี้
ชื่อ | ค่านิยม | คำอธิบาย |
---|---|---|
VISIBILITY_BUILD | 0x00 | มีไว้ให้เห็นเฉพาะในเวลาบิลด์ (เช่น ระหว่างการคอมไพล์ โค้ดอื่นๆ) |
VISIBILITY_RUNTIME | 0x01 | มีไว้ให้มองเห็นได้ในรันไทม์ |
VISIBILITY_SYSTEM | 0x02 | มีไว้เพื่อแสดงในเวลาเรียกใช้ แต่จะแสดงเฉพาะในระบบพื้นฐาน (และไม่ใช่โค้ดผู้ใช้ทั่วไป) |
encoded_array_item
อ้างอิงจาก class_def_item
ปรากฏในส่วนข้อมูล
การจัดแนว: ไม่มี (จัดแนวไบต์)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | encoded_array | ไบต์ที่แสดงค่าอาร์เรย์ที่เข้ารหัสในรูปแบบที่ระบุ
โดย "encoded_array รูปแบบ" ในส่วน "encoded_value
การเข้ารหัส" ด้านบน
|
hiddenapi_class_data_item
ส่วนนี้ประกอบด้วยข้อมูลเกี่ยวกับอินเทอร์เฟซที่ถูกจำกัดซึ่งแต่ละคลาสใช้
หมายเหตุ: ฟีเจอร์ API ที่ซ่อนไว้เปิดตัวใน Android 10.0 และใช้ได้กับไฟล์ DEX ของคลาสในเส้นทางคลาสการบูตเท่านั้น รายการฟีเจอร์ที่อธิบายไว้ด้านล่างอาจมีการขยายใน Android รุ่นต่อๆ ไป ดูข้อมูลเพิ่มเติมได้ที่ข้อจำกัดเกี่ยวกับอินเทอร์เฟซที่ไม่ใช่ SDK
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | uint | ขนาดรวมของส่วน |
การชดเชย | uint[] | อาร์เรย์ของออฟเซ็ตที่จัดทำดัชนีโดย class_idx
รายการอาร์เรย์ที่มีค่าเป็น 0 ที่ดัชนี class_idx หมายความว่า
ไม่มีข้อมูลสำหรับ class_idx นี้ หรือค่าของแฟล็ก API ที่ซ่อนทั้งหมดเป็น 0
ไม่เช่นนั้นรายการอาร์เรย์จะเป็นค่าที่ไม่ใช่ 0 และมีออฟเซ็ตจาก
จุดเริ่มต้นของส่วนไปยังอาร์เรย์ของค่าสถานะ API ที่ซ่อนอยู่
สำหรับ class_idx นี้
|
ธง | uleb128[] | อาร์เรย์ที่ต่อกันของแฟล็ก API ที่ซ่อนไว้สำหรับแต่ละคลาส ค่าสถานะที่เป็นไปได้อธิบายไว้ในตารางด้านล่าง โดยจะมีการเข้ารหัสแฟล็กในลำดับเดียวกับฟิลด์และเมธอด และมีการเข้ารหัสในข้อมูลคลาส |
ประเภทของธงข้อจำกัด
ชื่อ | ค่านิยม | คำอธิบาย |
---|---|---|
รายการที่อนุญาตพิเศษ | 0 | อินเทอร์เฟซที่ใช้ได้อย่างอิสระและได้รับการรองรับในส่วนของ เฟรมเวิร์ก Android ที่มีการบันทึกอย่างเป็นทางการ ดัชนีแพ็กเกจ |
รายการที่ต้องสงสัย | 1 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่ใช้ได้โดยไม่คำนึงถึงระดับ API เป้าหมายของแอปพลิเคชัน |
รายการที่ไม่อนุญาต | 2 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่ใช้ไม่ได้ไม่ว่าระดับ API เป้าหมายของแอปพลิเคชันจะเป็นเท่าใดก็ตาม การเข้าถึงอินเทอร์เฟซใดอินเทอร์เฟซหนึ่งเหล่านี้จะทำให้เกิดข้อผิดพลาดเกี่ยวกับรันไทม์ |
greylist‑max‑o | 3 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่ใช้กับ Android 8.x และต่ำกว่าได้ เว้นแต่จะมีการจำกัด |
greylist‑max‑p | 4 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่ใช้กับ Android 9.x ได้ เว้นแต่จะมีการจำกัด |
greylist‑max‑q | 5 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่ใช้กับ Android 10.x ได้ เว้นแต่จะถูกจำกัด |
greylist‑max‑r | 6 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่ใช้กับ Android 11.x ได้ เว้นแต่จะถูกจำกัด |
คำอธิบายประกอบของระบบ
คำอธิบายประกอบของระบบใช้เพื่อแสดงข้อมูลสะท้อนต่างๆ เกี่ยวกับคลาส (และเมธอดและฟิลด์) โดยทั่วไปแล้ว โค้ดไคลเอ็นต์ (ที่ไม่ใช่ระบบ) จะเข้าถึงข้อมูลนี้ได้โดยอ้อมเท่านั้น
คำอธิบายประกอบของระบบจะแสดงในไฟล์ .dex
เป็น
คำอธิบายประกอบที่มีการตั้งค่าระดับการแชร์เป็น VISIBILITY_SYSTEM
dalvik.annotation.AnnotationDefault
ปรากฏในเมธอดในอินเทอร์เฟซคำอธิบายประกอบ
AnnotationDefault
คำอธิบายประกอบจะแนบไปกับอินเทอร์เฟซคำอธิบายประกอบแต่ละรายการที่ต้องการระบุการเชื่อมโยงเริ่มต้น
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | หมายเหตุ | การเชื่อมโยงเริ่มต้นสำหรับคำอธิบายประกอบนี้ ซึ่งแสดงเป็นคำอธิบายประกอบ ของประเภทนี้ คำอธิบายประกอบไม่จำเป็นต้องมีชื่อทั้งหมดที่กำหนดโดย คำอธิบายประกอบ ชื่อที่ขาดหายไปจะไม่มีค่าเริ่มต้น |
dalvik.annotation.EnclosingClass
ปรากฏในชั้นเรียน
EnclosingClass
มีการแนบคำอธิบายประกอบกับแต่ละคลาส
ซึ่งกำหนดให้เป็นสมาชิกของคลาสอื่น หรือเป็น
แบบไม่ระบุตัวตนแต่ไม่ได้กำหนดไว้ในเนื้อหาของเมธอด (เช่น คลาสในสังเคราะห์) ทุกคลาสที่มีคำอธิบายประกอบนี้ต้องมีคำอธิบายประกอบ
InnerClass
ด้วย นอกจากนี้ คลาสต้องไม่มีทั้งคำอธิบายประกอบ EnclosingClass
และ EnclosingMethod
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | ชั้น | คลาสที่ขอบเขตคำศัพท์ของคลาสนี้ใกล้เคียงที่สุด |
dalvik.annotation.EnclosingMethod
ปรากฏในชั้นเรียน
EnclosingMethod
คำอธิบายประกอบจะแนบไปกับแต่ละคลาส
ซึ่งกำหนดไว้ภายในเนื้อหาของเมธอด ทุกคลาสที่มีคำอธิบายประกอบนี้
ต้องมีคำอธิบายประกอบ InnerClass
ด้วย
นอกจากนี้ ชั้นเรียนต้องไม่มีทั้งคำอธิบายประกอบEnclosingClass
และEnclosingMethod
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | วิธีการ | เมธอดที่กำหนดขอบเขตระดับคำของคลาสนี้อย่างใกล้ชิดที่สุด |
dalvik.annotation.InnerClass
ปรากฏในชั้นเรียน
InnerClass
คำอธิบายประกอบจะแนบไปกับแต่ละคลาส
ซึ่งกำหนดไว้ในขอบเขตคำศัพท์ของคำจำกัดความของคลาสอื่น
คลาสที่มีคำอธิบายประกอบนี้ต้องมีคำอธิบายประกอบ
EnclosingClass
หรือ
EnclosingMethod
ด้วย
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ชื่อ | สตริง | ชื่อแบบง่ายที่ประกาศไว้เดิมของคลาสนี้ (ไม่รวมคำนำหน้าแพ็กเกจ) หากชั้นเรียนนี้ไม่ระบุตัวตน ชื่อจะเป็น
null
|
accessFlags | Int | แฟล็กการเข้าถึงที่ประกาศไว้เดิมของคลาส (ซึ่งอาจแตกต่าง จากแฟล็กที่มีประสิทธิภาพเนื่องจากโมเดลการดำเนินการของภาษาต้นฉบับและเครื่องเสมือนเป้าหมายไม่ตรงกัน) |
dalvik.annotation.MemberClasses
ปรากฏในชั้นเรียน
ระบบจะแนบคำอธิบายประกอบ MemberClasses
กับแต่ละคลาส
ซึ่งประกาศคลาสสมาชิก (คลาสสมาชิกคือคลาสในโดยตรง
ที่มีชื่อ)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | Class[] | อาร์เรย์ของคลาสสมาชิก |
dalvik.annotation.MethodParameters
ปรากฏในวิธีการ
หมายเหตุ: มีการเพิ่มคำอธิบายประกอบนี้หลังจาก Android 7.1 ระบบจะไม่สนใจการมีอยู่ของฟีเจอร์นี้ใน Android เวอร์ชันก่อนหน้า
MethodParameters
คำอธิบายประกอบเป็นตัวเลือกและสามารถใช้เพื่อ
ระบุข้อมูลเมตาของพารามิเตอร์ เช่น ชื่อพารามิเตอร์และตัวแก้ไข
คุณสามารถละเว้นคำอธิบายประกอบจากเมธอดหรือตัวสร้างได้อย่างปลอดภัยเมื่อไม่จำเป็นต้องใช้ข้อมูลเมตาของพารามิเตอร์ในรันไทม์
java.lang.reflect.Parameter.isNamePresent()
สามารถใช้เพื่อตรวจสอบว่ามีข้อมูลเมตาสำหรับพารามิเตอร์หรือไม่ และวิธีการสะท้อนที่เชื่อมโยง เช่น java.lang.reflect.Parameter.getName()
จะกลับไปใช้ลักษณะการทำงานเริ่มต้นในขณะรันไทม์หากไม่มีข้อมูล
เมื่อรวมข้อมูลเมตาของพารามิเตอร์ คอมไพเลอร์ต้องรวมข้อมูล สำหรับคลาสที่สร้างขึ้น เช่น Enum เนื่องจากข้อมูลเมตาของพารามิเตอร์ จะรวมว่าพารามิเตอร์เป็นแบบสังเคราะห์หรือบังคับหรือไม่
MethodParameters
คำอธิบายประกอบจะอธิบายเฉพาะพารามิเตอร์ของเมธอดแต่ละรายการ
ดังนั้น คอมไพเลอร์อาจละเว้นคำอธิบายประกอบทั้งหมด
สำหรับตัวสร้างและเมธอดที่ไม่มีพารามิเตอร์ เพื่อให้โค้ดมีขนาดเล็ก
และมีประสิทธิภาพขณะรันไทม์
อาร์เรย์ที่ระบุไว้ด้านล่างต้องมีขนาดเท่ากับmethod_id_item
โครงสร้าง dex ที่เชื่อมโยงกับเมธอด ไม่เช่นนั้นระบบจะแสดง java.lang.reflect.MalformedParametersException
ที่รันไทม์
กล่าวคือ method_id_item.proto_idx
->
proto_id_item.parameters_off
->
type_list.size
ต้องเหมือนกับ names().length
และ
accessFlags().length
เนื่องจาก MethodParameters
อธิบายพารามิเตอร์ของเมธอดอย่างเป็นทางการทั้งหมด แม้แต่พารามิเตอร์ที่ไม่ได้ประกาศอย่างชัดเจนหรือโดยนัยในซอร์สโค้ด
ขนาดของอาร์เรย์จึงอาจแตกต่างจากข้อมูลลายเซ็นหรือข้อมูลเมตาอื่นๆ
ที่อิงตามพารามิเตอร์ที่ประกาศอย่างชัดเจนในซอร์สโค้ดเท่านั้น MethodParameters
จะไม่มีข้อมูลเกี่ยวกับ
พารามิเตอร์ตัวรับคำอธิบายประกอบประเภทที่ไม่มีอยู่ในลายเซ็น
เมธอดจริงด้วย
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ชื่อ | String[] | ชื่อของพารามิเตอร์ที่เป็นทางการสำหรับเมธอดที่เชื่อมโยง อาร์เรย์
ต้องไม่เป็นค่าว่าง แต่ต้องว่างเปล่าหากไม่มีพารามิเตอร์ที่เป็นทางการ ค่าใน
อาร์เรย์ต้องเป็น Null หากพารามิเตอร์ที่เป็นทางการที่มีดัชนีนั้นไม่มีชื่อ หากสตริงชื่อพารามิเตอร์ว่างเปล่าหรือมี ".", ";", "[" หรือ "/" ระบบจะแสดงข้อผิดพลาด java.lang.reflect.MalformedParametersException ที่
รันไทม์
|
accessFlags | int[] | แฟล็กการเข้าถึงของพารามิเตอร์อย่างเป็นทางการสำหรับเมธอดที่เชื่อมโยง
อาร์เรย์ต้องไม่เป็นค่าว่าง แต่ต้องว่างเปล่าหากไม่มีพารามิเตอร์ที่เป็นทางการ ค่านี้คือบิตมาสก์ที่มีค่าต่อไปนี้
java.lang.reflect.MalformedParametersException ที่รันไทม์
|
dalvik.annotation.Signature
ปรากฏในคลาส ฟิลด์ และเมธอด
Signature
คำอธิบายประกอบจะแนบไปกับแต่ละคลาส ฟิลด์ หรือเมธอดที่กำหนดในแง่ของประเภทที่ซับซ้อนกว่าที่แสดงด้วย type_id_item
รูปแบบ
.dex
ไม่ได้กำหนดรูปแบบสำหรับลายเซ็น แต่มีไว้เพื่อแสดงลายเซ็นใดก็ตามที่ภาษาต้นฉบับกำหนดเพื่อให้การใช้งานความหมายของภาษานั้นๆ ประสบความสำเร็จ ดังนั้น โดยทั่วไปแล้วการติดตั้งใช้งานเครื่องเสมือนจึงไม่ได้แยกวิเคราะห์ (หรือยืนยัน)
ลายเซ็น ระบบจะส่งต่อลายเซ็นไปยัง API และเครื่องมือระดับสูงกว่า (เช่น ดีบักเกอร์) ดังนั้น การใช้ลายเซ็นใดๆ ควรเขียนในลักษณะที่ไม่ทำให้เกิดการคาดการณ์ว่าได้รับเฉพาะลายเซ็นที่ถูกต้องเท่านั้น โดยป้องกันตนเองอย่างชัดเจนจากความเป็นไปได้ที่จะพบกับลายเซ็นที่ไม่ถูกต้องตามไวยากรณ์
เนื่องจากสตริงลายเซ็นมักจะมีเนื้อหาที่ซ้ำกันเป็นจำนวนมาก
จึงมีการกำหนดคำอธิบายประกอบ Signature
เป็นอาร์เรย์ของ
สตริง ซึ่งองค์ประกอบที่ซ้ำกันจะอ้างอิงถึงข้อมูลพื้นฐานเดียวกันโดยอัตโนมัติ
และลายเซ็นจะถือเป็นการต่อสตริงทั้งหมดในอาร์เรย์ ไม่มีกฎเกี่ยวกับวิธีแยก
ลายเซ็นออกเป็นสตริงแยกต่างหาก ซึ่งขึ้นอยู่กับ
เครื่องมือที่สร้างไฟล์ .dex
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | String[] | ลายเซ็นของคลาสหรือสมาชิกนี้เป็นอาร์เรย์ของสตริงที่จะ ต่อกัน |
dalvik.annotation.Throws
ปรากฏในวิธีการ
ระบบจะแนบคำอธิบายประกอบ Throws
ไปกับแต่ละเมธอดที่ประกาศให้ส่งข้อยกเว้นอย่างน้อย 1 ประเภท
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | Class[] | อาร์เรย์ของประเภทข้อยกเว้นที่ส่ง |