เอกสารนี้อธิบายเลย์เอาต์และเนื้อหาของ .dex
ซึ่งจะใช้เก็บชุดคำจำกัดความของคลาสและ
ที่เกี่ยวข้อง
ข้อมูลเพิ่มเติม
คำแนะนำเกี่ยวกับประเภท
ชื่อ | คำอธิบาย |
---|---|
ไบต์ | ลงชื่อเข้าใช้แบบ 8 บิต |
ยูไบต์ | Int แบบ 8 บิตที่ไม่มีเครื่องหมาย |
วิดีโอสั้น | ลงชื่อเข้าใช้แบบ 16 บิต, Little-endian |
Ushort | Int 16 บิต, Little-endian |
Int | ลงชื่อเข้าใช้ 32 บิต, Little-endian |
Uint | Int 32 บิต, Little-endian |
ยาว | ลงชื่อเข้าใช้แบบ 64 บิต, Little-endian |
อูลอง | Int 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 ถัดไปในไบต์ที่สอง
ไบต์ เป็นต้น ในกรณีของ LEB128 ที่ลงนามแล้ว (sleb128
)
บิตเพย์โหลดที่สำคัญที่สุดของไบต์สุดท้ายในลำดับคือ
เพิ่มเติมเพื่อสร้างค่าสุดท้าย ในเคสที่ไม่ได้ลงนาม
(uleb128
) บิตใดๆ ที่ไม่ได้แสดงไว้อย่างชัดแจ้งคือ
ตีความเป็น 0
แผนภาพบิตไวส์ของค่า LEB128 แบบ 2 ไบต์ | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ไบต์แรก | ไบต์ที่สอง | ||||||||||||||
1 |
บิต6 | บิต5 | บิต4 | บิต3 | บิต2 | บิต1 | บิต0 | 0 |
บิต13 | บิต12 | บิต11 | บิต10 | บิต9 | บิต8 | บิต7 |
ตัวแปร uleb128p1
ใช้เพื่อแสดงสัญลักษณ์
โดยที่ค่าที่นำเสนอเป็นค่าบวกหนึ่งที่เข้ารหัส
ในฐานะ uleb128
การดำเนินการนี้จะทำให้การเข้ารหัสของ -1
(หรืออาจเรียกว่าค่า 0xffffffff
ที่ไม่มีเครื่องหมาย)
— แต่ไม่มีจำนวนลบอื่นๆ — ไบต์เดียว และ
มีประโยชน์ในกรณีต่างๆ ที่ตัวเลขที่แสดงต้อง
ไม่ติดลบหรือ -1
(หรือ 0xffffffff
)
และที่ไม่อนุญาตให้ใช้ค่าลบอื่นๆ (หรือที่ไม่มีเครื่องหมายขนาดใหญ่
)
ต่อไปนี้เป็นตัวอย่างของรูปแบบ
ลำดับที่เข้ารหัส | ในชื่อ sleb128 |
ในชื่อ uleb128 |
ในชื่อ uleb128p1 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7F | -128 | 16256 | 16255 |
เลย์เอาต์ของไฟล์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ส่วนหัว | ส่วนหัว_รายการ | ส่วนหัว |
รหัสสตริง | string_id_item[] | รายการตัวระบุสตริง พารามิเตอร์เหล่านี้เป็นตัวระบุสำหรับสตริงทั้งหมด ไฟล์นี้จะใช้ในการตั้งชื่อภายใน (เช่น ข้อบ่งชี้ประเภท) หรือเป็นออบเจ็กต์คงที่ที่โค้ด ใช้อ้างอิง ต้องจัดเรียงรายการนี้ ตามเนื้อหาสตริง โดยใช้ค่าจุดโค้ด UTF-16 (ไม่ใช่ใน ภาษาที่ละเอียดอ่อน) และต้องไม่มีรายการที่ซ้ำกัน |
type_id | type_id_item[] | รายการตัวระบุประเภท สิ่งเหล่านี้เป็นตัวระบุทุกประเภท (คลาส
อาร์เรย์ หรือประเภทพื้นฐาน) ที่อ้างถึงโดยไฟล์นี้ ไม่ว่าจะมีการกำหนด
ในไฟล์หรือไม่ รายการนี้ต้องจัดเรียงตาม string_id
และต้องไม่มีรายการที่ซ้ำกัน
|
รหัสโปรโต | proto_id_item[] | รายการตัวระบุต้นแบบของเมธอด สิ่งเหล่านี้คือตัวระบุสำหรับทุกคน
ต้นแบบที่ไฟล์นี้อ้างถึง รายการนี้ต้องจัดเรียง
ประเภทการคืนสินค้า (ตามดัชนี type_id ) คำสั่งซื้อหลัก จากนั้น
ตามรายการอาร์กิวเมนต์ (การเรียงลำดับแบบพจนานุกรม แต่ละอาร์กิวเมนต์
เรียงลำดับตามดัชนี type_id ) รายการต้องไม่
มีรายการที่ซ้ำกัน
|
รหัสฟิลด์ | Field_id_item[] | รายการตัวระบุได้ รายการเหล่านี้คือตัวระบุสําหรับทุกช่อง
ที่อ้างถึงโดยไฟล์นี้ ไม่ว่าจะระบุไว้ในไฟล์หรือไม่ก็ตาม ช่วงเวลานี้
ต้องจัดเรียงรายการ โดยระบุประเภทที่กำหนด (ภายในวันที่ type_id
ดัชนี) คือลำดับหลัก ชื่อช่อง (ตามดัชนี string_id )
เป็นลำดับขั้นกลางและประเภท (ตามดัชนี type_id )
เป็นลำดับรอง รายการนี้ต้องไม่มีรายการที่ซ้ำกัน
|
รหัสเมธอด | method_id_item[] | รายการตัวระบุเมธอด รายการเหล่านี้คือตัวระบุสําหรับทุกวิธีการ
ที่อ้างถึงโดยไฟล์นี้ ไม่ว่าจะระบุไว้ในไฟล์หรือไม่ก็ตาม ช่วงเวลานี้
ต้องจัดเรียงรายการ โดยระบุประเภทที่กำหนด (ภายในวันที่ type_id
ดัชนี) เป็นลำดับหลัก ชื่อวิธีการ (ตาม string_id
ดัชนี) คือลำดับขั้นกลาง และต้นแบบของเมธอด (โดย
proto_id ) คือลำดับย่อย รายการต้องไม่
มีรายการที่ซ้ำกัน
|
class_defs | class_def_item[] | รายการคำจำกัดความของคลาส คลาสจะต้องได้รับการเรียงลำดับตาม Superclass ของคลาสและอินเทอร์เฟซที่นำไปใช้จะปรากฏใน ก่อนหน้าคลาสที่อ้างอิง นอกจากนี้ ไม่ถูกต้องสำหรับ คำจำกัดความของคลาสที่มีชื่อเดียวกันจะปรากฏมากกว่า 1 ครั้งใน รายการ |
รหัสไซต์การโทร | call_site_id_item[] | เรียกรายการตัวระบุเว็บไซต์ ข้อมูลเหล่านี้เป็นตัวระบุสำหรับเว็บไซต์การโทรทั้งหมด
ที่อ้างถึงโดยไฟล์นี้ ไม่ว่าจะระบุไว้ในไฟล์หรือไม่ก็ตาม รายการนี้
ต้องจัดเรียงตาม call_site_off จากน้อยไปหามาก
|
แฮนเดิลเมธอด | method_handle_item[] | เมธอดจัดการเมธอด รายการแฮนเดิลเมธอดทั้งหมดที่ไฟล์นี้อ้างถึง กำหนดไว้ในไฟล์หรือไม่ รายการนี้ไม่ได้จัดเรียงและอาจมี ซ้ำกันซึ่งจะสอดคล้องกับอินสแตนซ์ที่ใช้จัดการเมธอดที่ต่างกันตามตรรกะ |
ข้อมูล | ยูไบต์[] | พื้นที่ข้อมูล ซึ่งมีข้อมูลการสนับสนุนทั้งหมดสำหรับตารางที่แสดงข้างต้น แต่ละรายการมีข้อกำหนดการตรวจสอบความสอดคล้องที่แตกต่างกัน และ ไบต์ Padding จะถูกแทรกก่อนแต่ละรายการหากจำเป็น การจัดวางที่เหมาะสม |
ข้อมูลลิงก์ | ยูไบต์[] | ข้อมูลที่ใช้ในไฟล์ที่ลิงก์แบบคงที่ รูปแบบของข้อมูลใน ส่วนนี้ไม่ได้ระบุในเอกสารนี้ ส่วนนี้ว่างเปล่าในไฟล์ที่ไม่ได้ลิงก์ และการใช้งานรันไทม์ อาจนำไปใช้ตามความเหมาะสม |
คำจำกัดความของบิตฟิลด์ สตริง และคงที่
DEX_FILE_MAGIC
ฝังใน header_item
อาร์เรย์/สตริงคงที่ DEX_FILE_MAGIC
คือรายการของ
ไบต์ที่ต้องปรากฏที่ตอนต้นของไฟล์ .dex
เพื่อให้จำได้ว่าเป็น มูลค่าที่ตั้งใจ
มีบรรทัดใหม่ ("\n"
หรือ 0x0a
) และ
ไบต์ที่เป็นค่าว่าง ("\0"
หรือ 0x00
) เพื่อช่วย
เพื่อตรวจหาความเสียหายบางรูปแบบ ค่ายัง
จะเข้ารหัสหมายเลขเวอร์ชันของรูปแบบเป็นเลขทศนิยม 3 หลัก ซึ่งเป็น
ซึ่งจะเพิ่มขึ้นเรื่อยๆ เมื่อรูปแบบมีการพัฒนาไปในทิศทางเดียวกัน
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
หมายเหตุ: รองรับเวอร์ชัน 039
ของ
เพิ่มเข้ามาใน Android 9.0 ซึ่งมี
ไบต์โค้ดใหม่ const-method-handle
และ
const-method-type
(แต่ละหัวข้อได้อธิบายไว้ใน
ข้อมูลสรุปของชุดไบต์โค้ด
ตาราง) ใน Android 10 เวอร์ชัน 039
ได้ขยายรูปแบบไฟล์ DEX เพื่อรวมที่ซ่อนอยู่
ข้อมูล API ที่ใช้ได้กับไฟล์ DEX ในเส้นทางคลาสการเปิดเครื่องเท่านั้น
หมายเหตุ: การรองรับเวอร์ชัน
038
ของรูปแบบที่เพิ่มเข้ามาใน Android 8.0
เวอร์ชัน 038
ได้เพิ่มไบต์โค้ดใหม่
(invoke-polymorphic
และ invoke-custom
) และ
สำหรับแฮนเดิลเมธอด
หมายเหตุ: รองรับเวอร์ชัน 037
ของ
รูปแบบนี้มีการเพิ่มไว้ในรุ่น Android 7.0 ก่อนหน้าเวอร์ชัน 037
มากที่สุด
Android เวอร์ชันต่างๆ ใช้รูปแบบ 035
มีเพียง
ความแตกต่างระหว่างเวอร์ชัน 035
และ 037
คือ
เพิ่มเมธอดเริ่มต้นและการปรับเปลี่ยนinvoke
หมายเหตุ: รูปแบบก่อนหน้านี้อย่างน้อย 2-3 รูปแบบ
ใช้ในซอฟต์แวร์รุ่นสาธารณะที่เผยแพร่ในวงกว้าง ตัวอย่างเช่น
มีการใช้เวอร์ชัน 009
สำหรับรุ่น M3 ของ
แพลตฟอร์ม Android (พฤศจิกายน - ธันวาคม 2007)
และมีการใช้เวอร์ชัน 013
สำหรับ Android รุ่น M5
(กุมภาพันธ์ - มีนาคม 2008) ในแง่ต่างๆ ก่อนหน้านี้
ของรูปแบบแตกต่างจากเวอร์ชันที่อธิบายไว้ใน
เอกสาร
ENDIAN_CONSTANT และ REVERSE_ENDIAN_CONSTANT
ฝังใน header_item
ค่า ENDIAN_CONSTANT
คงที่ใช้เพื่อระบุ
Endianness ของไฟล์ที่พบ แม้ว่ามาตรฐาน
รูปแบบ .dex
เป็นเนื้อหาขนาดเล็ก การติดตั้งใช้งานอาจเลือก
ในการสลับไบต์ กรณีที่การติดตั้งใช้งานพบ
ส่วนหัวที่มี endian_tag
เท่ากับ REVERSE_ENDIAN_CONSTANT
แทนที่จะเป็น ENDIAN_CONSTANT
มีการสลับไบต์จากรูปแบบที่คาดไว้
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
ไม่มีดัชนี
ฝังอยู่ใน 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 และ ชั้นเรียนภายใน
Bitfields ของ Flag เหล่านี้ใช้เพื่อระบุการช่วยเหลือพิเศษและ พร็อพเพอร์ตี้โดยรวมของชั้นเรียนและสมาชิกในชั้นเรียน
ชื่อ | ค่า | สำหรับชั้นเรียน (และคำอธิบายประกอบ InnerClass รายการ) |
สำหรับฟิลด์ | สำหรับวิธีการ |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : มองเห็นได้ทุกที่ |
public : มองเห็นได้ทุกที่ |
public : มองเห็นได้ทุกที่ |
ACC_PRIVATE | 0x2 | private : แสดงต่อการกำหนดชั้นเรียนเท่านั้น
|
private : แสดงต่อการกำหนดชั้นเรียนเท่านั้น |
private : แสดงต่อการกำหนดชั้นเรียนเท่านั้น |
ACC_PROTECTED | 0x4 | protected : แสดงแพ็กเกจและคลาสย่อย
|
protected : แสดงต่อแพ็กเกจและคลาสย่อย |
protected : แสดงต่อแพ็กเกจและคลาสย่อย |
สถิติ ACC | 0x8 | static : ไม่ได้สร้างขึ้นด้วยด้านนอก
ข้อมูลอ้างอิง this |
static : ส่วนกลางเป็นคลาสที่กำหนด |
static : ไม่รับอาร์กิวเมนต์ this |
ACC_FINAL | 10x | final : จัดประเภทย่อยไม่ได้ |
final : เปลี่ยนแปลงไม่ได้หลังการก่อสร้าง |
final : ลบล้างไม่ได้ |
ซิงค์ ACC | 20x20 | synchronized : ได้รับล็อกที่เกี่ยวข้องโดยอัตโนมัติ
กับวิธีการนี้ หมายเหตุ: คุณจะใช้การตั้งค่าได้เฉพาะในกรณีที่
ก็ตั้งค่า |
||
ACC_VOLATILE | 0x40 | volatile : กฎสิทธิ์เข้าถึงพิเศษเพื่อช่วยเรื่องชุดข้อความ
ได้คะแนนเซฟตี้ |
||
ACC_BRIDGE | 0x40 | Bridge Method ที่เพิ่มเข้ามาโดยอัตโนมัติโดยคอมไพเลอร์เป็น type-safe สะพาน | ||
ACC_TRANSIENT | 0x80 | transient : ไม่ให้บันทึกโดยค่าเริ่มต้น |
||
ACC_VARARGS | 0x80 | ควรถือว่าอาร์กิวเมนต์สุดท้ายเป็น "ส่วนที่เหลือ" อาร์กิวเมนต์โดยคอมไพเลอร์ | ||
ACC_NATIVE | 0x100 | native : ใช้งานในโค้ดแบบเนทีฟ |
||
อินเทอร์เฟซ ACC | 0x200 | interface : คลาสนามธรรมที่นำมาใช้ได้แบบทวีคูณ |
||
ACC_ABSTRACT | 0x400 | abstract : สร้างอินสแตนซ์โดยตรงไม่ได้ |
abstract : ไม่ได้ใช้โดยคลาสนี้ |
|
ACC_STRICT | 0x800 | strictfp : กฎที่เข้มงวดสำหรับเลขคณิตที่มีจุดลอยตัว |
||
ACC ระบบ | 0x1000 | ไม่ได้กำหนดโดยตรงในซอร์สโค้ด | ไม่ได้กำหนดโดยตรงในซอร์สโค้ด | ไม่ได้กำหนดโดยตรงในซอร์สโค้ด |
ACC_ANNOTATION | 0x2000 | ประกาศว่าเป็นคลาสคำอธิบายประกอบ | ||
ACC_ENUM | 0x4000 | ประกาศเป็นประเภทที่แจกแจง | ประกาศเป็นค่าแจกแจง | |
(ไม่ได้ใช้) | 0x8000 | |||
ACC_ผู้สร้าง | 0x10,000 | เมธอดเครื่องมือสร้าง (คลาสหรือเครื่องมือเริ่มต้นอินสแตนซ์) | ||
ACC_DECLARED_ ซิงค์แล้ว |
0x20,000 | ประกาศเป็นsynchronized หมายเหตุ: การดำเนินการนี้ไม่มีผลต่อ (นอกเหนือจากการสะท้อนให้เห็นถึง Flag นี้) |
InnerClass
รายการเท่านั้น
และต้องไม่อยู่ใน class_def_item
การเข้ารหัสแบบ UTF-8 ที่ปรับแล้ว
รูปแบบ .dex
เป็นการลดความซับซ้อนของการสนับสนุนเดิมที่ง่ายขึ้น
เข้ารหัสข้อมูลสตริงในรูปแบบ UTF-8 ที่แก้ไขแล้วตามมาตรฐานโดยปริยาย
เรียกว่า MUTF-8 แบบฟอร์มนี้เหมือนกับ UTF-8 มาตรฐาน ยกเว้น
- ใช้เฉพาะการเข้ารหัสแบบ 1, 2 และ 3 ไบต์เท่านั้น
- Code Point ในช่วง
U+10000
...U+10ffff
มีการเข้ารหัสเป็นคู่ตัวแทน โดยแต่ละ ซึ่งแสดงเป็นค่าที่เข้ารหัสแบบ 3 ไบต์ - จุดโค้ด
U+0000
มีการเข้ารหัสในรูปแบบ 2 ไบต์ - ไบต์ค่า Null ธรรมดา (ค่า
0
) แสดงถึงจุดสิ้นสุดของ สตริง เช่นเดียวกับการตีความภาษา C มาตรฐาน
2 รายการแรกข้างต้นสามารถสรุปเป็น MUTF-8 คือรูปแบบการเข้ารหัสสำหรับ UTF-16 แทนที่จะเป็น รูปแบบการเข้ารหัสสำหรับอักขระ Unicode
รายการ 2 รายการสุดท้ายข้างต้นช่วยให้สามารถรวม
จุดรหัส U+0000
ในสตริง และ ยังคงแก้ไข
แสดงเป็นสตริงค่าว่างแบบ C ในลักษณะ Null
อย่างไรก็ตาม การเข้ารหัสพิเศษของ U+0000
หมายความว่า
UTF-8 ปกติ ผลลัพธ์ของการเรียกใช้ฟังก์ชัน C มาตรฐาน
strcmp()
ในสตริง MUTF-8 เพียง 2 คู่
แสดงผลลัพธ์แบบมีการรับรองที่ถูกต้องของการเปรียบเทียบสตริงที่ไม่เท่ากัน
เมื่อเรียงลำดับ (ไม่ใช่แค่ความเท่าเทียม) สิ่งที่เป็นกังวลคือ
วิธีเปรียบเทียบสตริง MUTF-8 คือการถอดรหัสอักขระทีละอักขระ
และเปรียบเทียบค่าที่ถอดรหัสแล้ว (อย่างไรก็ตาม การติดตั้ง
ที่ชาญฉลาดกว่านั้น
ก็เป็นไปได้)
โปรดดูยูนิโค้ด มาตรฐานสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเข้ารหัสอักขระ อันที่จริง MUTF-8 ใกล้เคียงกับการเข้ารหัส (ซึ่งไม่ค่อยเป็นที่รู้จัก) มากกว่า CESU-8 เมื่อเทียบกับ UTF-8 ต่อบทความ
การเข้ารหัสค่า encrypted_value
ฝังในanalytics_element และ รหัส_array_item
encoded_value
เป็นชิ้นส่วนที่เข้ารหัสของ (เกือบ)
ข้อมูลที่มีโครงสร้างตามลำดับชั้น การเข้ารหัสมีจุดประสงค์เพื่อ
ควรกะทัดรัดและแยกวิเคราะห์ได้ง่าย
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
(ค่า << 5) | ประเภทค่า [value_type] | ยูไบต์ | ไบต์ที่ระบุประเภทของ
value ตาม
ด้วยอาร์กิวเมนต์ที่อธิบายซึ่งไม่บังคับใน 3 บิตที่มีลําดับสูง
โปรดดูคำจำกัดความต่างๆ ของ value ที่ด้านล่าง
ในกรณีส่วนใหญ่ value_arg จะเข้ารหัสความยาวของ
value ลำดับต่อมาเป็นไบต์ตาม
(size - 1) เช่น 0 หมายความว่า
ค่าดังกล่าวต้องใช้ 1 ไบต์ และ 7 หมายความว่าต้องใช้
8 ไบต์ แต่ก็มีข้อยกเว้นดังที่กล่าวไว้ด้านล่างนี้
|
ค่า | ยูไบต์[] | ไบต์ที่แทนค่า ความยาวแปรผัน และตีความ
จะแตกต่างออกไปสำหรับ value_type ไบต์ที่แตกต่างกัน
Little-endian ดูคำจำกัดความของค่าต่างๆ ด้านล่างสำหรับ
รายละเอียด
|
รูปแบบค่า
พิมพ์ชื่อ | value_type |
รูปแบบ value_arg |
รูปแบบ value |
คำอธิบาย |
---|---|---|---|---|
VALUE_ไบต์ | 0x00 | (ไม่มี ต้องเป็น 0 ) |
ยูไบต์[1] | ค่าจำนวนเต็มแบบ 1 ไบต์แบบมีเครื่องหมาย |
สั้นเป็นมูลค่า | 0x02 | ขนาด - 1 (0...1) | ไบต์[size] | ค่าจำนวนเต็มสองไบต์แบบมีเครื่องหมาย, ขยาย |
แผนภูมิมูลค่า | 0x | ขนาด - 1 (0...1) | ไบต์[size] | ค่าจำนวนเต็มสองไบต์ที่ไม่มีการรับรอง, ขยายเป็นศูนย์ |
VALUE_INT | 0x | ขนาด - 1 (0...3) | ไบต์[size] | ค่าจำนวนเต็ม 4 ไบต์แบบมีเครื่องหมาย, ขยาย |
VALUE_ยาว | 0x06 | ขนาด - 1 (0...7) | ไบต์[size] | ค่าจำนวนเต็ม 8 ไบต์แบบมีเครื่องหมาย, ขยาย |
มูลค่า FLOAT | 10x | ขนาด - 1 (0...3) | ไบต์[size] | รูปแบบบิต 4 ไบต์ขยายเป็น 0 ทางขวา และ ตีความว่าเป็นค่าทศนิยม 32 บิต IEEE754 |
VALUE_ทวีคูณ | 11 x | ขนาด - 1 (0...7) | ไบต์[size] | รูปแบบบิตแปดไบต์ ขยายเป็นศูนย์ ไปทางขวา และ ตีความว่าเป็นค่าทศนิยม 64 บิต IEEE754 |
ประเภทวิธี {1}VALUE_METHOD_TYPE | 0x15 | ขนาด - 1 (0...3) | ไบต์[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็นศูนย์)
ได้รับการแปลค่าเป็นดัชนีไปยัง
ส่วน proto_ids และแทนค่าประเภทวิธีการ
|
แฮนเดิลของVALUE_METHOD | 16 x | ขนาด - 1 (0...3) | ไบต์[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็นศูนย์)
ได้รับการแปลค่าเป็นดัชนีไปยัง
ส่วน method_handles และแทนค่าแฮนเดิลเมธอด
|
สตริงมูลค่า | 0x17 | ขนาด - 1 (0...3) | ไบต์[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็นศูนย์)
ได้รับการแปลค่าเป็นดัชนีไปยัง
ส่วน string_ids และแทนค่าสตริง
|
ประเภทVALUE | 18 x | ขนาด - 1 (0...3) | ไบต์[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็นศูนย์)
ได้รับการแปลค่าเป็นดัชนีไปยัง
ส่วน type_ids และแสดงถึงการสะท้อนความรู้สึก
ค่าประเภท/คลาส
|
ฟิลด์VALUE_ | 19 x | ขนาด - 1 (0...3) | ไบต์[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็นศูนย์)
ได้รับการแปลค่าเป็นดัชนีไปยัง
ส่วน field_ids และแสดงถึงการสะท้อนความรู้สึก
ค่าในช่อง
|
วิธีมูลค่า | 0x1a | ขนาด - 1 (0...3) | ไบต์[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็นศูนย์)
ได้รับการแปลค่าเป็นดัชนีไปยัง
ส่วน method_ids และแสดงถึงการสะท้อนความรู้สึก
ค่าเมธอด
|
มูลค่า | 0x1b | ขนาด - 1 (0...3) | ไบต์[size] | ค่าจำนวนเต็ม 4 ไบต์ที่ไม่มีเครื่องหมาย (ขยายเป็นศูนย์)
ได้รับการแปลค่าเป็นดัชนีไปยัง
ส่วน field_ids และแสดงถึงค่าของ
ค่าคงที่ของประเภทแจกแจง
|
VALUE_ARRAY | 0x1ค | (ไม่มี ต้องเป็น 0 ) |
อาร์เรย์ที่เข้ารหัส | อาร์เรย์ของค่า ในรูปแบบที่ระบุโดย
"รูปแบบ encoded_array " ที่ด้านล่าง ขนาด
ของ value เป็นการเข้ารหัสโดยนัย
|
Conv. | 0x1 วัน | (ไม่มี ต้องเป็น 0 ) |
คำอธิบายประกอบที่เข้ารหัส | คำอธิบายประกอบย่อย ในรูปแบบที่ระบุโดย
"รูปแบบ encoded_annotation " ที่ด้านล่าง ขนาด
ของ value เป็นการเข้ารหัสโดยนัย
|
ค่าว่าง | 0X1E | (ไม่มี ต้องเป็น 0 ) |
(ไม่มี) | ค่าอ้างอิง null |
บูลีน | 0X1F | บูลีน (0...1) | (ไม่มี) | ค่าหนึ่งบิต 0 สำหรับ false และ
1 ในราคา true ส่วนบิตจะแสดงใน
value_arg
|
รูปแบบอาร์เรย์ที่เข้ารหัส
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | Uleb128 | จำนวนองค์ประกอบในอาร์เรย์ |
ค่า | เข้ารหัส_ค่า[size] | ชุดขนาด size encoded_value ไบต์
ลำดับต่างๆ ในรูปแบบที่ส่วนนี้ระบุไว้แบบต่อกัน
ตามลำดับ
|
รูปแบบคำอธิบายประกอบที่เข้ารหัส
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
type_idx | Uleb128 | ของคำอธิบายประกอบ ต้องเป็นคลาส (ไม่ใช่อาร์เรย์หรือค่าดั้งเดิม) ประเภท |
ขนาด | Uleb128 | จำนวนการแมปชื่อ-ค่าในคำอธิบายประกอบนี้ |
องค์ประกอบ | description_element[size] [ขนาด] | ของคำอธิบายประกอบ ซึ่งแสดงในบรรทัดโดยตรง (ไม่ใช่
ตำแหน่งพิเศษ) ต้องจัดเรียงองค์ประกอบตามลำดับที่เพิ่มขึ้น
ดัชนีของ string_id
|
รูปแบบ description_element
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
name_idx | Uleb128 | ชื่อองค์ประกอบ ซึ่งแสดงเป็นดัชนีลงใน
string_ids สตริงต้องเป็นไปตาม
ของ MemberName ตามคำจำกัดความด้านบน
|
ค่า | ค่า_เข้ารหัส | ค่าธาตุ |
ไวยากรณ์สตริง
ไฟล์ .dex
มีรายการอยู่หลายประเภทซึ่ง
สุดท้ายคือสตริง คำจำกัดความแบบ BNF ต่อไปนี้
จะระบุไวยากรณ์ที่ยอมรับได้สำหรับสตริงเหล่านี้
ชื่อแบบง่าย
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 → | |
ชื่อแบบง่าย | |
| | '<' ชื่อแบบง่าย '>' |
ชื่อเต็มของชั้นเรียน
FullClassName คือชื่อคลาสที่มีคุณสมบัติครบถ้วน ซึ่งรวมถึง ตัวระบุแพ็กเกจที่ไม่บังคับตามด้วยชื่อที่ต้องระบุ
FullClassName → | |
OptionalPackagePrefix ชื่ออย่างง่าย | |
OptionalPackagePrefix → | |
(ชื่ออย่างง่าย '/' )* |
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 ';' |
คำอธิบายแบบย่อ
ใช้โดย 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 |
โดยสมบูรณ์/ผ่านการรับรอง/ชื่อ | ชั้นเรียน fully.qualified.Name |
[ข้อบ่งชี้ | อาร์เรย์ของ descriptor ซึ่งสามารถใช้ซ้ำได้สำหรับ
อาร์เรย์ของอาร์เรย์ แม้จะไม่สามารถมีมากกว่า 255 ได้
|
รายการและโครงสร้างที่เกี่ยวข้อง
ส่วนนี้ประกอบด้วยคำจำกัดความของรายการระดับบนสุดแต่ละรายการที่
อาจปรากฏในไฟล์ .dex
ส่วนหัว_รายการ
ปรากฏในส่วนหัว
การจัดข้อความ: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
มายากล | uไบต์[8] = DEX_FILE_MAGIC | มูลค่าเวทมนตร์ ดูการสนทนาด้านบนภายใต้ "DEX_FILE_MAGIC "
เพื่อดูรายละเอียดเพิ่มเติม
|
การตรวจสอบข้อผิดพลาด | Uint | adler32 checksum ของไฟล์ที่เหลือ (ทุกอย่างยกเว้น
magic และฟิลด์นี้) ใช้เพื่อตรวจหาความเสียหายของไฟล์
|
ลายเซ็น | ยูไบต์[20] | ลายเซ็น SHA-1 (แฮช) ส่วนที่เหลือของไฟล์ (ทุกอย่างยกเว้น
magic , checksum และช่องนี้) ใช้แล้ว
เพื่อระบุไฟล์โดยไม่ซ้ำกัน
|
ขนาดไฟล์ | Uint | ขนาดของทั้งไฟล์ (รวมถึงส่วนหัว) ในหน่วยไบต์ |
ขนาดส่วนหัว | uint = 0x70 | (ทั้งส่วนนี้) ในหน่วยไบต์ ซึ่งทำให้สามารถ ความเข้ากันได้แบบย้อนหลัง/ไปข้างหน้าอย่างจำกัดโดยไม่มี ทำให้รูปแบบเป็นโมฆะ |
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
รูปแบบของข้อมูลที่ชี้ไปไม่ได้ระบุไว้โดยเอกสารนี้
ฟิลด์ส่วนหัวนี้ (และฟิลด์ก่อนหน้า) จะถูกทิ้งไว้เป็นฮุกสำหรับใช้งาน
การติดตั้งใช้งานรันไทม์
|
ปิดแผนที่ | Uint | หักลบจากจุดเริ่มต้นของไฟล์ไปยังรายการแผนที่ ออฟเซ็ตซึ่งต้อง
ไม่เป็น 0 ควรเป็นค่าออฟเซ็ตในส่วน data
และข้อมูลควรอยู่ในรูปแบบที่ระบุโดย "map_list "
ที่ด้านล่าง
|
รหัสสตริงขนาด [string_id_size] | Uint | จำนวนสตริงในรายการตัวระบุสตริง |
รหัสสตริงปิด | 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
|
รหัสโปรโต_id_size | Uint | จำนวนองค์ประกอบในรายการตัวระบุต้นแบบมากที่สุด 65535 รายการ |
รหัสโปรโต_ปิด | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุต้นแบบ หรือ
0 หาก proto_ids_size == 0 (เป็น
ตัวพิมพ์เล็กที่มีขอบแปลกไป) ออฟเซ็ตหากไม่ใช่ 0
ควรอยู่ต้น proto_ids
|
รหัสฟิลด์_ขนาด_ของฟิลด์ | Uint | จำนวนองค์ประกอบในรายการตัวระบุช่อง |
รหัสฟิลด์_ปิด | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุช่อง หรือ
0 หากเป็น field_ids_size == 0 ออฟเซ็ต
ไม่ใช่ 0 ควรอยู่จุดเริ่มต้นของ field_ids
|
ขนาดรหัสเมธอด | Uint | จำนวนองค์ประกอบในรายการตัวระบุเมธอด |
method_id_off | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการตัวระบุเมธอด หรือ
0 หากเป็น method_ids_size == 0 ออฟเซ็ต
ไม่ใช่ 0 ควรอยู่จุดเริ่มต้นของ method_ids
|
class_defs_size | Uint | จำนวนองค์ประกอบในรายการคำจำกัดความของคลาส |
class_defs_off | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการการกำหนดคลาส หรือ
0 หาก class_defs_size == 0 (เป็น
ตัวพิมพ์เล็กที่มีขอบแปลกไป) ออฟเซ็ตหากไม่ใช่ 0
ควรอยู่ที่จุดเริ่มต้นของส่วน class_defs
|
ขนาดข้อมูล [data_size] | Uint | ขนาดของส่วน data ในหน่วยไบต์ ต้องเป็นเลขคู่
หลายขนาดของ(uint) |
ปิดอินเทอร์เน็ต | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ถึงจุดเริ่มต้น
data
|
รายการแผนที่
ปรากฏในส่วนข้อมูล
อ้างอิงจาก header_item
การจัดข้อความ: 4 ไบต์
ซึ่งเป็นรายการเนื้อหาทั้งหมดของไฟล์ตามลำดับ ทั้งนี้
มีความซ้ำซ้อนเกี่ยวกับ header_item
แต่มีจุดมุ่งหมายเพื่อให้อยู่ในรูปแบบที่ง่าย
สำหรับการปรับปรุง
ประเภทที่กำหนดต้องปรากฏมากที่สุดพร้อมกันในแผนที่ แต่จะไม่มี
ข้อจำกัดเกี่ยวกับประเภทคำสั่งซื้อที่จะปรากฏในประเภทอื่นนอกเหนือจาก
ของรูปแบบโฆษณาที่เหลือ (เช่น
ส่วน header
ต้องปรากฏก่อน ตามด้วย
string_ids
ฯลฯ) นอกจากนี้ รายการแผนที่จะต้อง
เรียงลำดับตามออฟเซ็ตเริ่มต้นและต้องไม่ทับซ้อนกัน
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | Uint | ขนาดของรายการ ในรายการ |
ลิสต์ | [size] [ขนาด] | องค์ประกอบของรายการ |
รูปแบบรายการแมป [map_item]
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ประเภท | Ushort | ประเภทของรายการ ดูตารางด้านล่าง |
unused | Ushort | (ไม่ได้ใช้) |
ขนาด | Uint | จำนวนรายการที่จะพบในออฟเซ็ตที่ระบุ |
หักลบ | Uint | หักลบจากจุดเริ่มต้นของไฟล์ไปยังรายการที่ต้องการ |
พิมพ์รหัส
ประเภทรายการ | ค่าคงที่ | ค่า | ขนาดรายการเป็นไบต์ |
---|---|---|---|
ส่วนหัว_รายการ | TYPE_HEADER_ITEM | 0x0000 | 0x70 |
string_id_item | TYPE_STRING_ID_ITEM | 0x0001 | 0x |
type_id_item | TYPE_TYPE_ID_ITEM | 0x0002 | 0x |
โปรโตคอล_รหัส_รายการ | TYPE_PROTO_ID_ITEM | 0x0003 | 0x0c |
ฟิลด์_รหัส_รายการ | TYPE_FIELD_ID_ITEM | 0x0004 | 0x08 |
method_id_item | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
class_def_item | TYPE_CLASS_DEF_ITEM | 0x0006 | 20x20 |
รหัสเว็บไซต์การโทร [call_site_id_item] | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x |
method_handle_item | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
รายการแผนที่ | ประเภทรายการแผนที่ | 0x1000 | 4 + (item.size * 12) |
รายชื่อประเภท [type_list] | รายชื่อประเภท TYPE_TYPE_ | 0x1001 | 4 + (item.size * 2) |
ชุดคำอธิบายประกอบ [description_set_ref_list] | TYPE_ANNOTATION_SET_REF_LIST | 0x1002 | 4 + (item.size * 4) |
ชุดคำอธิบายประกอบ [description_set_item] | รายการประเภท | 0x1003 | 4 + (item.size * 4) |
class_data_item | ข้อมูล TYPE_CLASS_DATA_ITEM | 0x2000 | implicit; ต้องแยกวิเคราะห์ |
code_item | TYPE_CODE_ITEM | 0x2001 | implicit; ต้องแยกวิเคราะห์ |
ข้อมูลสตริง | TYPE_STRING_DATA_ITEM | 0x2002 | implicit; ต้องแยกวิเคราะห์ |
debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | implicit; ต้องแยกวิเคราะห์ |
สินค้าคำอธิบายประกอบ | รายการประเภท | 0x2004 | implicit; ต้องแยกวิเคราะห์ |
รายการอาร์เรย์ที่เข้ารหัส | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | implicit; ต้องแยกวิเคราะห์ |
ไดเรกทอรีคำอธิบายประกอบ [description_directory_item] | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | implicit; ต้องแยกวิเคราะห์ |
hideapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | implicit; ต้องแยกวิเคราะห์ |
string_id_item
ปรากฏในส่วน string_ids
การจัดข้อความ: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ปิดข้อมูลสตริง | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์เป็นข้อมูลสตริงสำหรับ
รายการ ออฟเซ็ตควรอยู่ที่ตำแหน่ง
ในส่วน data และข้อมูลควรอยู่ในส่วน
รูปแบบที่ระบุโดย "string_data_item " ที่ด้านล่าง
ไม่มีข้อกำหนดในการปรับแนวสำหรับออฟเซ็ต
|
ข้อมูลสตริง
ปรากฏในส่วนข้อมูล
การจัดข้อความ: ไม่มี (จัดข้อความแบบไบต์)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
utf16_size | Uleb128 | ขนาดของสตริงนี้ ในหน่วยโค้ด UTF-16 (ซึ่งก็คือ "สตริง
ความยาวสระ" ในหลายระบบ) นั่นคือ นี่คือความยาวถอดรหัสของ
สตริง (ความยาวที่เข้ารหัสจะแสดงโดยนัยด้วยตำแหน่งของ
ไบต์ 0 ) |
ข้อมูล | ยูไบต์[] | ชุดของหน่วยโค้ด MUTF-8 (หรืออ็อกเท็ตหรือไบต์อื่นๆ)
ตามด้วยไบต์ของค่า 0 โปรดดู
"การเข้ารหัส MUTF-8 (การแก้ไข UTF-8)" ด้านบนเพื่อดูรายละเอียดและ
พูดคุยเกี่ยวกับรูปแบบข้อมูล
หมายเหตุ: เรายอมรับสตริงที่ประกอบด้วย
(รูปแบบที่เข้ารหัส) หน่วยโค้ดสำหรับแทน UTF-16 (ซึ่งก็คือ
|
type_id_item
ปรากฏในส่วน type_ids
การจัดข้อความ: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
descriptor_idx | Uint | ดัชนีลงในรายการ string_ids สำหรับข้อบ่งชี้
สตริงประเภทนี้ สตริงต้องสอดคล้องกับไวยากรณ์สำหรับ
TypeDescriptor ตามที่ระบุไว้ข้างต้น
|
โปรโตคอล_รหัส_รายการ
ปรากฏในส่วน protocol_ids
การจัดข้อความ: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
รหัสย่อ | Uint | จัดทำดัชนีลงในรายการ string_ids สำหรับคอนเทนต์แบบสั้น
สตริงข้อบ่งชี้ของต้นแบบนี้ สตริงต้องเป็นไปตาม
ไวยากรณ์สำหรับ ShortyDescriptor ตามที่ระบุข้างต้น และต้องสอดคล้อง
ประเภทการคืนสินค้าและพารามิเตอร์ของสินค้านี้
|
ประเภทรหัสการคืนสินค้า [return_type_idx] | Uint | ดัชนีลงในรายการ type_ids สำหรับประเภทผลลัพธ์
ของต้นแบบนี้
|
พารามิเตอร์ปิดอยู่ | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการประเภทพารามิเตอร์
สำหรับต้นแบบนี้ หรือ 0 หากต้นแบบนี้ไม่มี
พารามิเตอร์ หากไม่ใช่ศูนย์ ออฟเซ็ตนี้ควรอยู่ใน
data และข้อมูลที่ควรอยู่ในส่วน
รูปแบบที่ระบุโดย "type_list" ด้านล่าง นอกจากนี้ ยังมี
ไม่ควรมีการอ้างอิงไปยังประเภท void ในรายการ
|
ฟิลด์_รหัส_รายการ
ปรากฏในส่วน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 สำหรับ Superclass หรือ
ค่าคงที่ NO_INDEX หากคลาสนี้ไม่มี
Superclass (เช่น เป็นคลาสรูท เช่น Object )
หากมี ค่านี้ต้องเป็นประเภทคลาส ไม่ใช่อาร์เรย์หรือประเภทพื้นฐาน
|
อินเทอร์เฟซ_ปิด | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการอินเทอร์เฟซ หรือ
0 ถ้าไม่มีเลย ออฟเซ็ตนี้
ควรอยู่ในส่วนdata และข้อมูล
ควรอยู่ในรูปแบบที่ระบุโดย
"type_list " ที่ด้านล่าง องค์ประกอบแต่ละรายการของรายการ
ต้องเป็นประเภทคลาส (ไม่ใช่อาร์เรย์หรือประเภทพื้นฐาน) และ
ต้องไม่ซ้ำกัน
|
source_file_idx | Uint | ดัชนีลงในรายการ string_ids สำหรับชื่อของ
ที่มีแหล่งที่มาต้นฉบับสำหรับคลาสนี้ (อย่างน้อย ส่วนใหญ่)
หรือค่าพิเศษ NO_INDEX เพื่อแสดงการขาด
ข้อมูลนี้ debug_info_item ของเมธอดที่กำหนด
อาจแทนที่ไฟล์แหล่งข้อมูลนี้ แต่คาดไว้ว่าคลาสส่วนใหญ่
จะมาจากไฟล์ต้นฉบับเพียงไฟล์เดียวเท่านั้น
|
ปิดคำอธิบายประกอบ | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์เป็นโครงสร้างคำอธิบายประกอบ
สำหรับชั้นเรียนนี้ หรือ 0 หากไม่มีคำอธิบายประกอบ
ชั้นเรียนนี้ หากไม่ใช่ศูนย์ ออฟเซ็ตนี้ควรอยู่ใน
data และข้อมูลที่ควรอยู่ใน
รูปแบบที่ระบุโดย "annotations_directory_item " ด้านล่าง
โดยทุกรายการที่อ้างอิงคลาสนี้เป็นตัวกำหนด
|
ปิดใช้ข้อมูลของชั้นเรียน | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยัง
ข้อมูลคลาสสำหรับรายการนี้ หรือ 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 คือ คีย์การเข้ารหัส_array_itemซึ่งมีองค์ประกอบที่สอดคล้องกับอาร์กิวเมนต์ ให้กับเมธอด Bootstrap Linker อาร์กิวเมนต์ 3 รายการแรก ได้แก่
- แฮนเดิลเมธอดที่แสดงเมธอด Bootstrap Linker (VALUE_METHOD_HANDLE)
- ชื่อเมธอดที่ Bootstrap Linker ควรระบุ (VALUE_STRING)
- ประเภทเมธอดที่สอดคล้องกับประเภทของชื่อเมธอดที่จะแปลง (VALUE_METHOD_TYPE)
อาร์กิวเมนต์เพิ่มเติมคือค่าคงที่ที่ส่งผ่านไปยังเมธอด Bootstrap Linker อาร์กิวเมนต์เหล่านี้คือ ส่งผ่านตามลำดับ และไม่มี Conversion ประเภทใดๆ
แฮนเดิลเมธอดที่แสดงเมธอด Bootstrap Linker ต้องมีประเภทการแสดงผล java.lang.invoke.CallSite
พารามิเตอร์ 3 ประเภทแรกได้แก่
java.lang.invoke.Lookup
java.lang.String
java.lang.invoke.MethodType
ประเภทพารามิเตอร์ของอาร์กิวเมนต์เพิ่มเติมจะกำหนดจากค่าคงที่
method_handle_item
ปรากฏในส่วน method_handles
การจัดข้อความ: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ประเภทแฮนเดิลของวิธีการ | Ushort | ของแฮนเดิลเมธอด ดูตารางด้านล่าง |
unused | Ushort | (ไม่ได้ใช้) |
รหัสฟิลด์หรือวิธีการ | Ushort | ช่องหรือรหัสเมธอดขึ้นอยู่กับว่าประเภทแฮนเดิลของเมธอดเป็นผู้เข้าถึงหรือผู้เรียกใช้เมธอด |
unused | Ushort | (ไม่ได้ใช้) |
โค้ดประเภทแฮนเดิลของเมธอด
ค่าคงที่ | ค่า | คำอธิบาย |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0x00 | แฮนเดิลเมธอดคือตัวตั้งค่าช่องแบบคงที่ (ตัวเข้าถึง) |
METHOD_HANDLE_TYPE_STATIC_GET | 0x | แฮนเดิลเมธอดคือ Getter ฟิลด์แบบคงที่ (ตัวเข้าถึง) |
เมธอด_มือจับประเภท_INSTANCE_PUT | 0x02 | แฮนเดิลเมธอดเป็นตัวตั้งค่าฟิลด์อินสแตนซ์ (ตัวเข้าถึง) |
Method_HANDLE_TYPE_INSTANCE_GET | 0x | แฮนเดิลเมธอดคือ Getter ฟิลด์อินสแตนซ์ (ตัวเข้าถึง) |
Method_HANDLE_TYPE_INVOKE_STATIC | 0x | แฮนเดิลเมธอดเป็นผู้เรียกใช้เมธอดแบบคงที่ |
วิธีการ_ใช้มือจับประเภท_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
ปรากฏในส่วนข้อมูล
การจัดข้อความ: ไม่มี (จัดข้อความแบบไบต์)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาดฟิลด์คงที่ | Uleb128 | จำนวนช่องแบบคงที่ที่กำหนดไว้ในรายการนี้ |
ขนาดฟิลด์อินสแตนซ์ | Uleb128 | จำนวนฟิลด์อินสแตนซ์ที่กำหนดไว้ในรายการนี้ |
Direct_methods_size | Uleb128 | จำนวนวิธีโดยตรงที่กำหนดไว้ในรายการนี้ |
ขนาดวิธีการเสมือน | Uleb128 | จำนวนเมธอดเสมือนจริงที่กำหนดไว้ในรายการนี้ |
static_fields | คีย์การเข้ารหัส_[static_fields_size] | ช่องแบบคงที่ที่กำหนดไว้ ซึ่งแสดงเป็นลำดับ
หลายองค์ประกอบที่เข้ารหัส โดยต้องจัดเรียงช่องตาม
field_idx ตามลำดับเพิ่มขึ้น
|
ฟิลด์อินสแตนซ์ | Encrypt_field[instance_fields_size] | ฟิลด์อินสแตนซ์ที่กำหนดไว้ ซึ่งแสดงเป็นลำดับ
หลายองค์ประกอบที่เข้ารหัส โดยต้องจัดเรียงช่องตาม
field_idx ตามลำดับเพิ่มขึ้น
|
วิธีการโดยตรง | วิธีเข้ารหัส [direct_methods_size] | โดยตรงที่กำหนดไว้ (static , private
หรือเครื่องมือสร้าง) เป็นลำดับ
หลายองค์ประกอบที่เข้ารหัส โดยจะต้องจัดเรียงเมธอดตาม
method_idx ตามลำดับเพิ่มขึ้น
|
วิธีการ_เสมือน | Encrypt_method[virtual_methods_size] | เสมือนที่กำหนดไว้ (ไม่มี static , private
หรือเครื่องมือสร้าง) เป็นลำดับ
หลายองค์ประกอบที่เข้ารหัส รายการนี้ไม่ควรรับค่าเดิม
เว้นแต่จะถูกลบล้างโดยคลาสที่รายการนี้แสดง
ต้องจัดเรียงตาม method_idx ตามลำดับที่เพิ่มขึ้น
method_idx ของเมธอดเสมือนต้องไม่เหมือนกัน
เป็นวิธีทางตรงอื่นๆ
|
หมายเหตุ: องค์ประกอบทั้งหมด field_id
และ
อินสแตนซ์ method_id
รายการต้องอ้างอิงถึงคลาสที่กำหนดเดียวกัน
รูปแบบฟิลด์ที่เข้ารหัส
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่าต่างของฟิลด์_รหัสx | Uleb128 | ดัชนีลงในรายการ field_ids สำหรับข้อมูลประจำตัวของข้อมูลนี้
(รวมถึงชื่อและข้อบ่งชี้) ซึ่งแสดงเป็นความแตกต่าง
จากดัชนีขององค์ประกอบก่อนหน้าในรายการ ดัชนีของ
องค์ประกอบแรกในรายการจะแสดงโดยตรง
|
Access_flags | Uleb128 | เข้าถึงแฟล็กสำหรับช่อง (public , final ,
เป็นต้น) ดู "คำจำกัดความ access_flags " เพื่อดูรายละเอียด
|
รูปแบบ Encrypted_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
อ้างอิงจาก Encrypt_method
ปรากฏในส่วนข้อมูล
การจัดข้อความ: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาดที่ลงทะเบียน | Ushort | จำนวนการลงทะเบียนที่โค้ดนี้ใช้ |
ins_size [ขนาด] | Ushort | จำนวนคำของอาร์กิวเมนต์ขาเข้าที่ใช้วิธีนี้ รหัสมีไว้สำหรับ |
เกินขนาด [outs_size] | Ushort | จำนวนคำของพื้นที่อาร์กิวเมนต์ขาออกที่จำเป็นต้องใช้ รหัสสำหรับการเรียกใช้เมธอด |
ขนาดการลอง | Ushort | จำนวน try_item สำหรับอินสแตนซ์นี้ หากไม่ใช่ 0
ค่าเหล่านี้จะปรากฏเป็นอาร์เรย์ tries หลัง
insns ในอินสแตนซ์นี้
|
ปิดข้อมูลแก้ไขข้อบกพร่อง [debug_info_off] | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปที่ข้อมูลการแก้ไขข้อบกพร่อง (หมายเลขบรรทัด +
ข้อมูลตัวแปรภายใน) ลำดับสำหรับโค้ดนี้ หรือ 0 หาก
ก็ไม่มีข้อมูลใดๆ เลย ออฟเซ็ตหากไม่ใช่ศูนย์ควรเป็น
ไปยังตำแหน่งในส่วนdata รูปแบบของ
ข้อมูลนี้ถูกระบุโดย "debug_info_item " ที่ด้านล่าง
|
insns_size | Uint | ขนาดของรายการวิธีการในหน่วยโค้ด 16 บิต |
โรงแรมขนาดเล็ก | ushort[insns_size] | อาร์เรย์ของไบต์โค้ดจริง รูปแบบของโค้ดใน insns
ระบุอาร์เรย์ตามเอกสารที่แสดงร่วม
Dalvik Bytecode หมายเหตุ
แม้ว่าค่านี้จะกำหนดเป็นอาร์เรย์ของ ushort
เป็นโครงสร้างภายในบางส่วนที่ต้องการใช้การจัดแนวแบบ 4 ไบต์ และ
หากข้อผิดพลาดนี้อยู่ในไฟล์ที่สลับแบบปลายทางแล้ว การสลับจะเป็น
เท่านั้นในอินสแตนซ์ ushort แต่ละรายการ และไม่ใช่ในอินสแตนซ์
โครงสร้างภายในที่มีขนาดใหญ่ขึ้น
|
padding | ushort (ไม่บังคับ) = 0 | ระยะห่างจากขอบ 2 ไบต์เพื่อทำให้ tries สอดคล้องกัน 4 ไบต์
องค์ประกอบนี้จะปรากฏต่อเมื่อ tries_size ไม่ใช่ 0
และ insns_size เป็นเลขคี่
|
พยายาม | Try_item[tries_size] (ไม่บังคับ) | อาร์เรย์ที่ระบุตำแหน่งที่จับข้อยกเว้นของโค้ด
วิธีจัดการ องค์ประกอบของอาร์เรย์ต้องไม่ทับซ้อนกันใน
และเรียงลำดับจากที่อยู่ต่ำไปสูง องค์ประกอบนี้
ปรากฏหาก tries_size ไม่ใช่ 0
|
ตัวแฮนเดิล | encrypted_catch_handler_list (ไม่บังคับ) | ไบต์ที่แสดงรายการประเภทคำสั่งและที่เชื่อมโยง
เครื่องจัดการที่อยู่ try_item แต่ละรายการมีออฟเซ็ตแบบไบต์ไว
ในโครงสร้างนี้ องค์ประกอบนี้จะปรากฏต่อเมื่อ
tries_size ไม่ใช่ 0
|
รูปแบบtry_item
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
Start_addr | Uint | ที่อยู่เริ่มต้นของบล็อกโค้ดที่รายการนี้ครอบคลุม ที่อยู่ คือจำนวนหน่วยของโค้ด 16 บิตจนถึงจุดเริ่มต้นของหน่วยแรกที่ครอบคลุม วิธีการ |
จำนวน insn_count | Ushort | จำนวนหน่วยของโค้ด 16 บิตที่รายการนี้ครอบคลุม โค้ดล่าสุด
หน่วยโฆษณาที่ครอบคลุม (รวม) คือ start_addr + insn_count - 1
|
ปิดตัวแฮนเดิล | Ushort | เป็นไบต์จากจุดเริ่มต้นของ
encoded_catch_hander_list เป็น
encoded_catch_handler สำหรับรายการนี้ ค่านี้ต้องเป็น
ชดเชยจุดเริ่มต้นของ encoded_catch_handler
|
รูปแบบรายการเข้ารหัส_ที่จับ_มือ
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | Uleb128 | ขนาดของรายการนี้ ในรายการ |
ลิสต์ | เข้ารหัส_มือจับ[ขนาด_มือจับ] | รายการตัวแฮนเดิลจริงที่แสดงโดยตรง (ไม่ใช่ออฟเซ็ต) และเรียงต่อกันตามลำดับ |
รูปแบบแฮนเดิลที่เข้ารหัส_เข้ารหัส
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | Sleb128 | จำนวนประเภทการส่งในรายการนี้ หากไม่ใช่ค่าบวก ค่านี้จะเป็น
ค่าลบของจำนวนประเภทการส่ง และการติดตามการดักจับ
ด้วยตัวแฮนเดิลแบบรับทั้งหมด เช่น size จาก 0
หมายความว่ามีการรับทั้งหมด แต่ไม่มีที่พิมพ์ไว้อย่างชัดเจน
size ของ 2 หมายความว่ามี
แบบที่พิมพ์ไว้ แต่ไม่มีที่อยู่ที่รับทั้งหมด และ size จาก -1
หมายความว่า มีข้อความค้นหาที่ถูกพิมพ์ 1 รายการพร้อมด้วย "แคชทั้งหมด"
|
ตัวแฮนเดิล | เข้ารหัส_ประเภท_เพิ่ม_คู่[abs(size)] | สตรีมของรายการที่เข้ารหัส abs(size) รายการ แต่ละรายการต่อรายการที่ถูกจับได้
ตามลำดับที่ควรทดสอบประเภทนั้นๆ
|
Keep_all_addr | uleb128 (ไม่บังคับ) | ที่อยู่ไบต์โค้ดของเครื่องจัดการแบบรับทั้งหมด องค์ประกอบนี้
ปรากฏหาก size ไม่เป็นบวก
|
รูปแบบ encrypted_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
ส่วนหัวจะเป็นดังต่อไปนี้
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
เริ่มบรรทัด | Uleb128 | ค่าเริ่มต้นสำหรับการลงทะเบียน line ของเครื่องมีสถานะ
ไม่ได้แสดงถึงรายการตำแหน่งจริง
|
ขนาดพารามิเตอร์ | Uleb128 | จำนวนชื่อพารามิเตอร์ที่เข้ารหัส ควรมี
1 รายการต่อพารามิเตอร์เมธอด ยกเว้น this ของวิธีอินสแตนซ์
หากมี
|
ชื่อพารามิเตอร์ | uleb128p1[parameters_size] | ดัชนีสตริงของชื่อพารามิเตอร์เมธอด ค่าที่เข้ารหัสของ
NO_INDEX ระบุว่าไม่มีชื่อ
ใช้ได้กับพารามิเตอร์ที่เกี่ยวข้อง ตัวบอกประเภท
และลายเซ็นจะแสดงโดยนัยจากข้อบ่งชี้เมธอดและลายเซ็น
|
ค่าโค้ดไบต์มีดังนี้
ชื่อ | ค่า | รูปแบบ | อาร์กิวเมนต์ | คำอธิบาย |
---|---|---|---|---|
DBG_END_SEQUENCE | 0x00 | (ไม่มี) | สิ้นสุดลำดับข้อมูลการแก้ไขข้อบกพร่องของ code_item |
|
DBG_ADVANCE_PC | 0x | uleb128 addr_diff | addr_diff : จำนวนที่จะเพิ่มลงในการจดทะเบียนที่อยู่ |
ดำเนินการลงทะเบียนที่อยู่ล่วงหน้าโดยไม่มีการระบุตำแหน่ง |
บรรทัด DBG | 0x02 | sleb128line_diff | line_diff : จำนวนเงินที่จะเปลี่ยนสายลงทะเบียนภายใน |
นำเครื่องหมายออกจากเส้นชัยโดยไม่ส่งตำแหน่ง |
DBG_START_LOCAL | 0x | uleb128register_num uleb128p1 name_idx uleb128p1 type_idx |
register_num : ลงทะเบียนที่จะมีคำว่าname_idx : ดัชนีสตริงของชื่อtype_idx : ดัชนีประเภทประเภท
|
จะแนะนำตัวแปรในเครื่องในที่อยู่ปัจจุบัน อย่างใดอย่างหนึ่ง
name_idx หรือ type_idx อาจมีลักษณะดังนี้
NO_INDEX เพื่อระบุว่าไม่รู้จักค่านั้น
|
DBG_START_LOCAL_EXTENDED | 0x | uleb128register_num uleb128p1 name_idx uleb128p1 type_idx uleb128p1sig_idx |
register_num : ลงทะเบียนที่จะมีคำว่าname_idx : ดัชนีสตริงของชื่อtype_idx : ดัชนีประเภท sig_idx : ดัชนีสตริงของลายเซ็นประเภท
|
แนะนำ Local ที่มีลายเซ็นประเภทที่ที่อยู่ปัจจุบัน
name_idx , type_idx หรือ
sig_idx อาจเป็น NO_INDEX
เพื่อระบุว่าไม่รู้จักค่านั้น (หาก sig_idx คือ
-1 อย่างไรก็ตาม ข้อมูลเดียวกันอาจแสดงมากกว่า
อย่างมีประสิทธิภาพโดยใช้รหัสดำเนินการ DBG_START_LOCAL )
หมายเหตุ: ดูการสนทนาภายใต้
" |
DBG_END_LOCAL | 0x05 | uleb128register_num | register_num : การลงทะเบียนที่อยู่ในพื้นที่ |
จะทำเครื่องหมายตัวแปรในเครื่องที่ใช้อยู่ว่าอยู่นอกขอบเขต ที่อยู่ |
DBG_RESTART_LOCAL | 0x06 | uleb128register_num | register_num : ลงทะเบียนเพื่อรีสตาร์ท |
จะแนะนำตัวแปรภายในอีกครั้งในที่อยู่ปัจจุบัน ชื่อ และประเภทตรงกับในเครื่องล่าสุดที่ใช้งานอยู่ใน ลงทะเบียน |
DBG_SET_PROLOGUE_END | 0x07 | (ไม่มี) | ตั้งค่าการลงทะเบียนเครื่องสถานะ prologue_end
ซึ่งระบุว่ารายการตำแหน่งถัดไปที่เพิ่มควร
ถือเป็นการสิ้นสุดอารัมภบทของเมธอด (สถานที่ที่เหมาะสมสำหรับ
เบรกพอยท์ของเมธอด) การจดทะเบียน prologue_end คือ
ล้างโดยรหัสพิเศษ (>= 0x0a ) ใดๆ
|
|
DBG_SET_EPILOGUE_BEGIN | 0x08 | (ไม่มี) | ตั้งค่าการลงทะเบียนเครื่องสถานะ epilogue_begin
ซึ่งระบุว่ารายการตำแหน่งถัดไปที่เพิ่มควร
ถือเป็นจุดเริ่มต้นของบทส่งท้ายวิธีการ (สถานที่ที่เหมาะสม
เพื่อระงับการดำเนินการก่อนออกจากเมธอด)
ล้างการจดทะเบียน epilogue_begin ออกตามกรณีพิเศษ
(>= 0x0a ) รหัสการดำเนินการ
|
|
ไฟล์ DBG | 0x09 | uleb128p1 name_idx | name_idx : ดัชนีสตริงของชื่อไฟล์ต้นฉบับ;
NO_INDEX หากไม่ทราบ
|
ระบุว่ารายการหมายเลขบรรทัดต่อๆ มาทั้งหมดอ้างอิงถึง
ชื่อไฟล์ต้นฉบับ แทนชื่อเริ่มต้นที่ระบุใน
code_item
|
โอกาสพิเศษ | 0x0ก... 0xff | (ไม่มี) | ได้ทำการขึ้นทะเบียน line และ address แล้ว
แสดงรายการตำแหน่ง และล้าง prologue_end และ
epilogue_begin โปรดดูคำอธิบายด้านล่าง
|
รหัสการดำเนินการพิเศษ
Opcode ที่มีค่าระหว่าง 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)
ไดเรกทอรีคำอธิบายประกอบ [description_directory_item]
อ้างอิงจาก class_def_item
ปรากฏในส่วนข้อมูล
การจัดข้อความ: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ปิดคำอธิบายประกอบคลาส | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังคำอธิบายประกอบที่ทำโดยตรง
ในชั้นเรียน หรือ 0 หากชั้นเรียนไม่มีคำอธิบายประกอบโดยตรง
หากไม่ใช่ 0 ของออฟเซ็ต ควรอยู่ที่ตำแหน่งใน
data ระบุรูปแบบของข้อมูลแล้ว
โดย "annotation_set_item " ที่ด้านล่าง
|
ขนาดฟิลด์ | Uint | จำนวนช่องที่มีคำอธิบายประกอบโดยรายการนี้ |
ขนาด_คำอธิบายประกอบ | Uint | จำนวนเมธอดที่มีคำอธิบายประกอบโดยรายการนี้ |
พารามิเตอร์ขนาดคำอธิบายประกอบ | Uint | จำนวนรายการพารามิเตอร์เมธอดที่รายการนี้มีคำอธิบายประกอบ |
ช่องคำอธิบายประกอบ | ฟิลด์_คำอธิบายประกอบ[fields_size] (ไม่บังคับ) | รายการคำอธิบายประกอบช่องที่เกี่ยวข้อง องค์ประกอบของรายการจะต้อง
จัดเรียงตามลําดับเพิ่มขึ้นตาม field_idx
|
วิธีการเขียนคำอธิบายประกอบ | method_annotation[methods_size] (ไม่บังคับ) | รายการคำอธิบายประกอบเมธอดที่เกี่ยวข้อง องค์ประกอบของรายการจะต้อง
จัดเรียงตามลําดับเพิ่มขึ้นตาม method_idx
|
คำอธิบายประกอบพารามิเตอร์ | parameter_annotation[parameters_size] (ไม่บังคับ) | รายการคำอธิบายประกอบพารามิเตอร์เมธอดที่เกี่ยวข้อง องค์ประกอบของ
ต้องจัดเรียงลำดับเพิ่มขึ้นตาม method_idx
|
หมายเหตุ: องค์ประกอบทั้งหมด field_id
และ
อินสแตนซ์ method_id
รายการต้องอ้างอิงถึงคลาสที่กำหนดเดียวกัน
รูปแบบช่องคำอธิบายประกอบ
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
Field_idx | Uint | ดัชนีลงในรายการ field_ids สำหรับข้อมูลประจำตัวของ
ช่องที่มีคำอธิบายประกอบ
|
ปิดคำอธิบายประกอบ | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับ
ด้วย ออฟเซ็ตควรอยู่ที่ตำแหน่งใน data
รูปแบบของข้อมูลจะกำหนดโดย
"annotation_set_item " ที่ด้านล่าง
|
รูปแบบคำอธิบายประกอบของเมธอด
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
method_idx | Uint | ดัชนีลงในรายการ method_ids สำหรับข้อมูลประจำตัวของ
วิธีที่มีคำอธิบายประกอบ
|
ปิดคำอธิบายประกอบ | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับ
เมธอด ออฟเซ็ตควรอยู่ที่ตำแหน่งใน
data รูปแบบของข้อมูลจะกำหนดโดย
"annotation_set_item " ที่ด้านล่าง
|
รูปแบบคำอธิบายประกอบ "พารามิเตอร์_"
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
method_idx | Uint | ดัชนีลงในรายการ method_ids สำหรับข้อมูลประจำตัวของ
เมธอดที่มีพารามิเตอร์กำลังถูกใส่คำอธิบายประกอบ
|
ปิดคำอธิบายประกอบ | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังรายการคำอธิบายประกอบสำหรับ
พารามิเตอร์เมธอด ออฟเซ็ตควรอยู่ที่ตำแหน่งใน
data รูปแบบของข้อมูลจะกำหนดโดย
"annotation_set_ref_list " ที่ด้านล่าง
|
ชุดคำอธิบายประกอบ [description_set_ref_list]
อ้างอิงจาก parameter_annotations_item
ปรากฏในส่วนข้อมูล
การจัดข้อความ: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | Uint | ขนาดของรายการ ในรายการ |
ลิสต์ | Anthos_set_ref_item[size] | องค์ประกอบของรายการ |
รูปแบบคำอธิบายประกอบ_set_ref_item
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ปิดคำอธิบายประกอบ | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังชุดคำอธิบายประกอบที่อ้างอิง
หรือ 0 หากไม่มีคำอธิบายประกอบสำหรับองค์ประกอบนี้
หากไม่ใช่ 0 ของออฟเซ็ต ควรอยู่ที่ตำแหน่งใน data
รูปแบบของข้อมูลจะกำหนดโดย
"annotation_set_item " ที่ด้านล่าง
|
ชุดคำอธิบายประกอบ [description_set_item]
อ้างอิงจาก description_directory_item, field_annotations_item, method_annotations_item และ description_set_ref_item
ปรากฏในส่วนข้อมูล
การจัดข้อความ: 4 ไบต์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | Uint | ขนาดของชุด ในรายการ |
รายการ | Anthos_off_item[size] | ในเซ็ตได้ด้วย องค์ประกอบต้องจัดเรียงตามลำดับที่เพิ่มขึ้น
โดย type_idx
|
รูปแบบ description_off_item
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ปิดคำอธิบายประกอบ | Uint | ออฟเซ็ตจากจุดเริ่มต้นของไฟล์ไปยังคำอธิบายประกอบ
ออฟเซ็ตควรอยู่ที่ตำแหน่งในส่วน data
และรูปแบบของข้อมูล ณ ตำแหน่งนั้นจะกำหนดโดย
"annotation_item " ที่ด้านล่าง
|
สินค้าคำอธิบายประกอบ
อ้างอิงจาก description_set_item
ปรากฏในส่วนข้อมูล
การจัดข้อความ: ไม่มี (จัดข้อความแบบไบต์)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
การเปิดเผย | ยูไบต์ | ระดับการมองเห็นคำอธิบายประกอบนี้ (ดูด้านล่าง) |
หมายเหตุ | คำอธิบายประกอบที่เข้ารหัส | เนื้อหาคำอธิบายประกอบที่เข้ารหัสในรูปแบบที่อธิบายโดย
"รูปแบบ encoded_annotation " ต่ำกว่า
"การเข้ารหัส encoded_value " ที่ด้านบน
|
ค่าระดับการเข้าถึง
ตัวเลือกเหล่านี้เป็นตัวเลือกสำหรับช่อง visibility
ใน
annotation_item
:
ชื่อ | ค่า | คำอธิบาย |
---|---|---|
การสร้างเป้าหมาย | 0x00 | ซึ่งควรมองเห็นได้เฉพาะในเวลาสร้าง (เช่น ระหว่างการคอมไพล์ จากโค้ดอื่น) |
VISIBILITY_RUNTIME | 0x | ที่ต้องการให้แสดงขณะรันไทม์ |
ระบบการมองเห็น | 0x02 | ต้องปรากฏขณะรันไทม์ แต่มีเฉพาะระบบเบื้องหลังเท่านั้น (และไม่ใช่รหัสผู้ใช้ทั่วไป) |
รายการอาร์เรย์ที่เข้ารหัส
อ้างอิงจาก class_def_item
ปรากฏในส่วนข้อมูล
การจัดข้อความ: ไม่มี (จัดข้อความแบบไบต์)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | อาร์เรย์ที่เข้ารหัส | ไบต์ที่แทนค่าอาร์เรย์ที่เข้ารหัสในรูปแบบที่ระบุ
โดย "รูปแบบ encoded_array " ภายใต้ "encoded_value
การเข้ารหัส" ที่ด้านบน
|
hideapi_class_data_item
ส่วนนี้ประกอบด้วยข้อมูลเกี่ยวกับอินเทอร์เฟซที่จำกัดซึ่งแต่ละชั้นเรียนใช้
หมายเหตุ เราเปิดตัวฟีเจอร์ API ที่ซ่อนอยู่ใน Android 10.0 และใช้ได้เฉพาะกับไฟล์ DEX ของคลาสในเส้นทางคลาสการเปิดเครื่อง รายการ Flag ที่อธิบายไว้ด้านล่างอาจขยายการให้บริการในอนาคต ของ Android สำหรับข้อมูลเพิ่มเติม โปรดดู ข้อจำกัดในอินเทอร์เฟซที่ไม่ใช่ SDK
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ขนาด | Uint | ขนาดโดยรวมของส่วน |
ออฟเซ็ต | Uint[] | อาร์เรย์ของออฟเซ็ตที่จัดทำดัชนีโดย class_idx
รายการอาร์เรย์เป็นศูนย์ที่ดัชนี class_idx หมายความว่า
ไม่มีข้อมูลสำหรับ class_idx นี้ หรือ API ที่ซ่อนอยู่ทั้งหมด
ค่าสถานะเป็นศูนย์
มิฉะนั้น รายการอาร์เรย์จะไม่เป็น 0 และมีออฟเซ็ตจาก
จุดเริ่มต้นของส่วนนี้ไปยังอาร์เรย์ของ Flag API ที่ซ่อนอยู่
สำหรับ class_idx นี้
|
Flag | Uleb128[] | อาร์เรย์การเชื่อมต่อของ Flag API ที่ซ่อนอยู่สำหรับแต่ละคลาส โปรดดูคำอธิบายค่าแฟล็กที่เป็นไปได้ในตารางด้านล่าง ระบบจะเข้ารหัสแฟล็กในลำดับเดียวกับช่องและเมธอด เข้ารหัสในข้อมูลคลาส |
ประเภทแฟล็กข้อจำกัด:
ชื่อ | ค่า | คำอธิบาย |
---|---|---|
รายการที่อนุญาตพิเศษ | 0 | อินเทอร์เฟซที่ใช้ได้อย่างอิสระและได้รับการสนับสนุนในฐานะส่วนหนึ่งของ เฟรมเวิร์กของ Android ที่จัดทำเป็นเอกสารอย่างเป็นทางการ ดัชนีแพ็กเกจ |
รายการที่ต้องสงสัย | 1 | อินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งใช้ไม่ว่าแอปพลิเคชันจะเป็นแบบใดก็ตาม ระดับ API เป้าหมาย |
รายการที่ไม่อนุญาต | 2 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่ไม่สามารถใช้ได้ไม่ว่าแอปพลิเคชัน ระดับ API เป้าหมาย การเข้าถึงอินเทอร์เฟซใดอินเทอร์เฟซหนึ่งเหล่านี้ก่อให้เกิด ข้อผิดพลาดรันไทม์ |
รายการสีเทา-max‐o | 3 | อินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งใช้ได้สำหรับ Android 8.x หรือต่ำกว่า เว้นแต่จะถูกจำกัด |
รายการสีเทา-max‐p | 4 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่ใช้กับ Android 9.x ได้ เว้นแต่จะถูกจำกัด |
รายการสีเทา-สูงสุด-q | 5 | อินเทอร์เฟซที่ไม่ใช่ SDK ที่ใช้กับ Android 10.x ได้ เว้นแต่จะถูกจำกัด |
รายการสีเทา-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.Memberส่วนย่อย
ปรากฏในชั้นเรียน
แนบคำอธิบายประกอบ MemberClasses
ไว้กับแต่ละชั้นเรียน
ซึ่งจะประกาศคลาสของสมาชิก (ชั้นเรียนสมาชิกคือชั้นเรียนในชั้นโดยตรง
ที่มีชื่อ)
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | ชั้นเรียน[] | อาร์เรย์ของคลาสสมาชิก |
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[] | แฟล็กการเข้าถึงของพารามิเตอร์อย่างเป็นทางการสำหรับเมธอดที่เกี่ยวข้อง
อาร์เรย์ต้องไม่เป็น Null แต่ต้องว่างเปล่าถ้าไม่มีพารามิเตอร์ที่เป็นทางการ ค่านี้จะเป็นมาสก์บิตที่มีค่าต่อไปนี้
java.lang.reflect.MalformedParametersException ระหว่างรันไทม์
|
dalvik.annotation.Signature
ปรากฏในชั้นเรียน ฟิลด์ และเมธอด
มีคำอธิบายประกอบ Signature
แนบอยู่กับชั้นเรียนแต่ละชั้น
หรือ Method ที่กำหนดไว้ในแง่ของประเภทที่ซับซ้อนมากขึ้น
แทนด้วย type_id_item
รูปแบบ .dex
ไม่ได้กำหนดรูปแบบของลายเซ็น รายการดังกล่าว
มีไว้เพื่อแสดงลายเซ็นต้นฉบับ
เพื่อให้การนำภาษานั้นๆ ไปใช้ได้ประสบความสำเร็จ
อรรถศาสตร์ ด้วยเหตุนี้ โดยทั่วไปลายเซ็นจึงไม่ได้รับการแยกวิเคราะห์ (หรือได้รับการยืนยัน)
ตามการใช้งานเครื่องเสมือน ลายเซ็นจะส่งถึงมือลูกค้าได้ง่ายๆ
ไปจนถึง API และเครื่องมือระดับสูง (เช่น โปรแกรมแก้ไขข้อบกพร่อง) การใช้งาน
ดังนั้น ควรเขียนลายเซ็นเพื่อไม่ให้
สมมติฐานเกี่ยวกับการรับเฉพาะลายเซ็นที่ถูกต้อง การป้องกันโดยชัดแจ้ง
กับความเป็นไปได้ที่จะพบเนื้อหาต่างๆ ในเชิงไวยากรณ์
ลายเซ็นไม่ถูกต้อง
เนื่องจากสตริงลายเซ็นมักจะมี
เนื้อหาที่ซ้ำกันอยู่มากมาย
คำอธิบายประกอบ Signature
ได้รับการระบุเป็นอาร์เรย์ของ
สตริง โดยที่องค์ประกอบที่ซ้ำกันจะหมายถึงสตริงเดียวกัน
ข้อมูลที่สำคัญ และลายเซ็นจะนำมาใช้เป็นการเชื่อมโยงของ
ทุกสตริงในอาร์เรย์ ไม่มีกฎในการดึง
แยกลายเซ็นออกเป็นสตริงต่างๆ ที่ขึ้นอยู่กับ
เครื่องมือที่สร้างไฟล์ .dex
ไฟล์
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | String[] | ลายเซ็นของคลาสหรือสมาชิกนี้ เป็นอาร์เรย์ของสตริงที่ ต่อกัน |
dalvik.annotation.Throws
ปรากฏในเมธอด
คำอธิบายประกอบ Throws
จะแนบอยู่กับแต่ละวิธี
ที่ประกาศให้มีประเภทข้อยกเว้นอย่างน้อยหนึ่งประเภท
ชื่อ | รูปแบบ | คำอธิบาย |
---|---|---|
ค่า | ชั้นเรียน[] | อาร์เรย์ของประเภทข้อยกเว้นที่ส่ง |