Tài liệu này mô tả bố cục và nội dung của các tệp .dex
. Các tệp này được dùng để lưu giữ một tập hợp các định nghĩa lớp và dữ liệu bổ trợ được liên kết của chúng.
Hướng dẫn về các loại
Tên | Mô tả |
---|---|
byte | Số nguyên 8 bit có dấu |
ubyte | Số nguyên không dấu 8 bit |
ngắn | Số nguyên 16 bit có dấu, little-endian |
ushort | Số nguyên không dấu 16 bit, little-endian |
int | Số nguyên có dấu 32 bit, little-endian |
uint | Số nguyên không dấu 32 bit, little-endian |
long | Số nguyên có dấu 64 bit, little-endian |
trà ô long | Số nguyên không dấu 64 bit, little-endian |
sleb128 | LEB128 có dấu, độ dài thay đổi (xem bên dưới) |
uleb128 | LEB128 không có dấu, độ dài thay đổi (xem bên dưới) |
uleb128p1 | LEB128 không có dấu cộng với 1 , độ dài thay đổi (xem bên dưới) |
LEB128
LEB128 ("Little-Endian Base 128") là một phương thức mã hoá có độ dài thay đổi cho số lượng số nguyên có dấu hoặc không dấu tuỳ ý. Định dạng này được mượn từ quy cách DWARF3. Trong tệp .dex
, LEB128 chỉ được dùng để mã hoá các số lượng 32 bit.
Mỗi giá trị được mã hoá LEB128 bao gồm từ 1 đến 5 byte, cùng nhau biểu thị một giá trị 32 bit duy nhất. Mỗi byte đều có bit quan trọng nhất được đặt, ngoại trừ byte cuối cùng trong chuỗi có bit quan trọng nhất bị xoá. 7 bit còn lại của mỗi byte là tải trọng, với 7 bit ít quan trọng nhất của số lượng trong byte đầu tiên, 7 bit tiếp theo trong byte thứ hai, v.v. Trong trường hợp LEB128 đã ký (sleb128
), bit tải trọng quan trọng nhất của byte cuối cùng trong chuỗi được mở rộng dấu để tạo ra giá trị cuối cùng. Trong trường hợp chưa ký (uleb128
), mọi bit không được biểu thị rõ ràng đều được diễn giải là 0
.
Sơ đồ theo bit của giá trị LEB128 gồm 2 byte | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Byte đầu tiên | Byte thứ hai | ||||||||||||||
1 |
bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | 0 |
bit13 | bit12 | bit11 | bit10 | bit9 | bit8 | bit7 |
Biến thể uleb128p1
được dùng để biểu thị một giá trị đã ký, trong đó giá trị biểu thị là giá trị cộng một được mã hoá dưới dạng uleb128
. Điều này giúp mã hoá -1
(hoặc có thể coi là giá trị không có dấu 0xffffffff
) – nhưng không có số âm nào khác – thành một byte duy nhất và hữu ích trong chính những trường hợp mà số được biểu thị phải là số không âm hoặc -1
(hoặc 0xffffffff
) và không được phép có giá trị âm nào khác (hoặc khi không cần đến các giá trị không có dấu lớn).
Dưới đây là một số ví dụ về các định dạng:
Trình tự được mã hoá | Như sleb128 |
Như uleb128 |
Như uleb128p1 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
Bố cục tệp
Tên | Định dạng | Mô tả |
---|---|---|
tiêu đề | header_item | tiêu đề |
string_ids | string_id_item[] | danh sách giá trị nhận dạng chuỗi. Đây là giá trị nhận dạng cho tất cả các chuỗi mà tệp này sử dụng, cho mục đích đặt tên nội bộ (ví dụ: bộ mô tả loại) hoặc dưới dạng các đối tượng hằng số mà mã tham chiếu đến. Danh sách này phải được sắp xếp theo nội dung chuỗi, sử dụng các giá trị điểm mã UTF-16 (không theo cách phụ thuộc vào ngôn ngữ) và không được chứa bất kỳ mục nào trùng lặp. |
type_ids | type_id_item[] | danh sách giá trị nhận dạng loại. Đây là giá trị nhận dạng cho tất cả các loại (lớp, mảng hoặc loại nguyên thuỷ) mà tệp này tham chiếu đến, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp theo chỉ mục string_id và không được chứa bất kỳ mục nhập trùng lặp nào.
|
proto_ids | proto_id_item[] | danh sách giá trị nhận dạng nguyên mẫu phương thức. Đây là số nhận dạng cho tất cả các nguyên mẫu mà tệp này tham chiếu. Danh sách này phải được sắp xếp theo thứ tự chính của return-type (theo chỉ mục type_id ), sau đó theo danh sách đối số (sắp xếp theo từ điển, các đối số riêng lẻ được sắp xếp theo chỉ mục type_id ). Danh sách không được chứa bất kỳ mục nhập trùng lặp nào.
|
field_ids | field_id_item[] | danh sách giá trị nhận dạng trường. Đây là giá trị nhận dạng cho tất cả các trường mà tệp này đề cập đến, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp, trong đó loại xác định (theo chỉ mục type_id ) là thứ tự chính, tên trường (theo chỉ mục string_id ) là thứ tự trung gian và loại (theo chỉ mục type_id ) là thứ tự phụ. Danh sách không được chứa bất kỳ mục nhập trùng lặp nào.
|
method_ids | method_id_item[] | danh sách giá trị nhận dạng phương thức. Đây là giá trị nhận dạng cho tất cả các phương thức mà tệp này tham chiếu đến, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp, trong đó loại xác định (theo chỉ mục type_id ) là thứ tự chính, tên phương thức (theo chỉ mục string_id ) là thứ tự trung gian và nguyên mẫu phương thức (theo chỉ mục proto_id ) là thứ tự phụ. Danh sách không được chứa bất kỳ mục nhập trùng lặp nào.
|
class_defs | class_def_item[] | danh sách định nghĩa lớp học. Các lớp phải được sắp xếp sao cho siêu lớp và các giao diện đã triển khai của một lớp nhất định xuất hiện trong danh sách trước lớp tham chiếu. Ngoài ra, bạn không được phép xác định một lớp có cùng tên nhiều lần trong danh sách. |
call_site_ids | call_site_id_item[] | danh sách giá trị nhận dạng trang web gọi. Đây là mã nhận dạng cho tất cả các trang web gọi được tệp này tham chiếu đến, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp theo thứ tự tăng dần của call_site_off .
|
method_handles | method_handle_item[] | danh sách xử lý phương thức. Danh sách tất cả các đối tượng xử lý phương thức mà tệp này tham chiếu đến, cho dù được xác định trong tệp hay không. Danh sách này không được sắp xếp và có thể chứa các bản sao trùng lặp sẽ tương ứng một cách hợp lý với các thực thể xử lý phương thức khác nhau. |
dữ liệu | ubyte[] | vùng dữ liệu, chứa tất cả dữ liệu hỗ trợ cho các bảng được liệt kê ở trên. Các mục khác nhau có các yêu cầu khác nhau về việc căn chỉnh và các byte đệm sẽ được chèn trước mỗi mục nếu cần để đạt được việc căn chỉnh thích hợp. |
link_data | ubyte[] | dữ liệu được dùng trong các tệp được liên kết tĩnh. Định dạng dữ liệu trong phần này không được tài liệu này chỉ định. Phần này trống trong các tệp chưa liên kết và các hoạt động triển khai thời gian chạy có thể sử dụng phần này nếu thấy phù hợp. |
Định dạng vùng chứa
Phiên bản 41 giới thiệu một định dạng vùng chứa mới cho dữ liệu DEX nhằm mục đích tiết kiệm dung lượng. Định dạng vùng chứa này cho phép kết hợp một số tệp DEX logic thành một tệp vật lý duy nhất. Định dạng mới chủ yếu chỉ là sự kết hợp đơn giản của các tệp ở định dạng cũ, với một số điểm khác biệt:
file_size
là kích thước của tệp logic, chứ không phải tệp thực. Bạn có thể dùng phương thức này để lặp lại tất cả các tệp logic trong vùng chứa.- Các tệp dex logic có thể tham chiếu đến mọi dữ liệu sau này trong vùng chứa (nhưng không phải dữ liệu trước đó). Điều này cho phép các tệp dex chia sẻ dữ liệu (chẳng hạn như chuỗi) giữa chúng.
- Tất cả các độ lệch đều liên quan đến tệp thực. Không có độ lệch nào so với tiêu đề. Điều này đảm bảo rằng các phần có độ lệch có thể được chia sẻ giữa các tệp logic.
- Tiêu đề này thêm 2 trường mới để mô tả các điều kiện ràng buộc của vùng chứa. Đây là một bước kiểm tra tính nhất quán bổ sung và giúp việc chuyển mã sang định dạng mới dễ dàng hơn.
data_size
vàdata_off
hiện không được dùng nữa. Dữ liệu có thể được trải rộng trên nhiều tệp logic và không nhất thiết phải liền kề.
Định nghĩa về trường bit, chuỗi và hằng số
DEX_FILE_MAGIC
Được nhúng trong header_item
Mảng/chuỗi hằng số DEX_FILE_MAGIC
là danh sách các byte phải xuất hiện ở đầu tệp .dex
để được nhận dạng là tệp đó. Giá trị này cố ý chứa một dòng mới ("\n"
hoặc 0x0a
) và một byte rỗng ("\0"
hoặc 0x00
) để giúp phát hiện một số dạng hỏng dữ liệu. Giá trị này cũng mã hoá số phiên bản định dạng dưới dạng 3 chữ số thập phân, dự kiến sẽ tăng đơn điệu theo thời gian khi định dạng phát triển.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
Lưu ý: Chúng tôi đã thêm tính năng hỗ trợ phiên bản 041
của định dạng này trong bản phát hành Android 16, hỗ trợ định dạng vùng chứa.
Lưu ý: Chúng tôi đã thêm tính năng hỗ trợ phiên bản 040
của định dạng này trong bản phát hành Android 10.0, giúp mở rộng tập hợp các ký tự được phép trong SimpleNames.
Lưu ý: Chúng tôi đã thêm tính năng hỗ trợ cho phiên bản 039
của định dạng này trong bản phát hành Android 9.0. Bản phát hành này giới thiệu 2 mã byte mới là const-method-handle
và const-method-type
. (Mỗi loại được mô tả trong bảng Tóm tắt bộ mã byte.) Trong Android 10, phiên bản 039
mở rộng định dạng tệp DEX để bao gồm thông tin API ẩn chỉ áp dụng cho các tệp DEX trên đường dẫn lớp khởi động.
Lưu ý: Chúng tôi đã thêm tính năng hỗ trợ phiên bản 038
của định dạng này trong bản phát hành Android 8.0. Phiên bản 038
đã thêm các mã byte mới (invoke-polymorphic
và invoke-custom
) và dữ liệu cho các hàm xử lý phương thức.
Lưu ý: Chúng tôi đã thêm tính năng hỗ trợ phiên bản 037
của định dạng này trong bản phát hành Android 7.0. Trước phiên bản 037
, hầu hết các phiên bản Android đều sử dụng phiên bản 035
của định dạng này. Điểm khác biệt duy nhất giữa phiên bản 035
và 037
là việc bổ sung các phương thức mặc định và điều chỉnh invoke
.
Lưu ý: Ít nhất một vài phiên bản trước của định dạng này đã được dùng trong các bản phát hành phần mềm công khai có sẵn rộng rãi. Ví dụ: phiên bản 009
được dùng cho các bản phát hành M3 của nền tảng Android (tháng 11 – tháng 12 năm 2007) và phiên bản 013
được dùng cho các bản phát hành M5 của nền tảng Android (tháng 2 – tháng 3 năm 2008). Ở một số khía cạnh, các phiên bản trước của định dạng này khác biệt đáng kể so với phiên bản được mô tả trong tài liệu này.
ENDIAN_CONSTANT và REVERSE_ENDIAN_CONSTANT
Được nhúng trong header_item
Hằng số ENDIAN_CONSTANT
được dùng để cho biết thứ tự byte của tệp mà hằng số này xuất hiện. Mặc dù định dạng .dex
tiêu chuẩn là little-endian, nhưng các hoạt động triển khai có thể chọn thực hiện việc hoán đổi byte. Nếu quá trình triển khai gặp phải một tiêu đề có endian_tag
là REVERSE_ENDIAN_CONSTANT
thay vì ENDIAN_CONSTANT
, thì quá trình triển khai đó sẽ biết rằng tệp đã được hoán đổi byte từ dạng thức dự kiến.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
NO_INDEX
Được nhúng trong class_def_item và debug_info_item
Hằng số NO_INDEX
được dùng để cho biết rằng giá trị chỉ mục không có.
Lưu ý: Giá trị này không được xác định là 0
, vì trên thực tế, đó thường là một chỉ mục hợp lệ.
Giá trị đã chọn cho NO_INDEX
có thể biểu thị dưới dạng một byte duy nhất trong phương thức mã hoá uleb128p1
.
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
Định nghĩa access_flags
Được nhúng trong class_def_item, encoded_field, encoded_method và InnerClass
Bitfield của các cờ này được dùng để cho biết khả năng tiếp cận và các thuộc tính tổng thể của các lớp và thành viên lớp.
Tên | Giá trị | Đối với các lớp học (và chú giải InnerClass ) |
Đối với các trường | Đối với phương thức |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : xuất hiện ở mọi nơi |
public : xuất hiện ở mọi nơi |
public : xuất hiện ở mọi nơi |
ACC_PRIVATE | 0x2 | private : chỉ lớp xác định mới nhìn thấy
|
private : chỉ hiển thị cho lớp xác định |
private : chỉ hiển thị cho lớp xác định |
ACC_PROTECTED | 0x4 | protected : hiển thị cho gói và các lớp con
|
protected : hiển thị cho gói và các lớp con |
protected : hiển thị cho gói và các lớp con |
ACC_STATIC | 0x8 | static : không được tạo bằng một tham chiếu this bên ngoài |
static : toàn cục đến lớp xác định |
static : không lấy đối số this |
ACC_FINAL | 0x10 | final : không thể phân lớp |
final : bất biến sau khi tạo |
final : không ghi đè được |
ACC_SYNCHRONIZED | 0x20 | synchronized : khoá được liên kết sẽ tự động thu được khi gọi phương thức này. Lưu ý: Bạn chỉ có thể đặt thông số này khi |
||
ACC_VOLATILE | 0x40 | volatile : các quy tắc truy cập đặc biệt để giúp đảm bảo an toàn cho luồng |
||
ACC_BRIDGE | 0x40 | phương thức cầu nối, do trình biên dịch tự động thêm dưới dạng cầu nối an toàn về kiểu | ||
ACC_TRANSIENT | 0x80 | transient : không được lưu theo quá trình chuyển đổi tuần tự hoá mặc định |
||
ACC_VARARGS | 0x80 | đối số cuối cùng sẽ được trình biên dịch coi là đối số "còn lại" | ||
ACC_NATIVE | 0x100 | native : được triển khai trong mã gốc |
||
ACC_INTERFACE | 0x200 | interface : lớp trừu tượng có thể triển khai nhiều lần |
||
ACC_ABSTRACT | 0x400 | abstract : không thể tạo thực thể trực tiếp |
abstract : chưa được lớp này triển khai |
|
ACC_STRICT | 0x800 | strictfp : các quy tắc nghiêm ngặt cho số học dấu phẩy động |
||
ACC_SYNTHETIC | 0x1000 | không được xác định trực tiếp trong mã nguồn | không được xác định trực tiếp trong mã nguồn | không được xác định trực tiếp trong mã nguồn |
ACC_ANNOTATION | 0x2000 | được khai báo dưới dạng một lớp chú giải | ||
ACC_ENUM | 0x4000 | được khai báo là một kiểu liệt kê | được khai báo dưới dạng giá trị được liệt kê | |
(unused) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | phương thức khởi tạo (trình khởi tạo lớp hoặc thực thể) | ||
ACC_DECLARED_ SYNCHRONIZED |
0x20000 | đã khai báo synchronized . Lưu ý: Điều này không ảnh hưởng đến quá trình thực thi (ngoài việc phản ánh chính cờ này). |
InnerClass
và không được xuất hiện trong class_def_item
.
Phương thức mã hoá UTF-8 đã sửa đổi
Để dễ dàng hỗ trợ các phiên bản cũ, định dạng .dex
sẽ mã hoá dữ liệu chuỗi của mình ở dạng UTF-8 đã sửa đổi theo tiêu chuẩn thực tế, sau đây gọi là MUTF-8. Biểu mẫu này giống hệt với UTF-8 tiêu chuẩn, ngoại trừ:
- Chỉ sử dụng các phương thức mã hoá một, hai và ba byte.
- Các điểm mã trong dải
U+10000
…U+10ffff
được mã hoá dưới dạng một cặp thay thế, mỗi cặp được biểu thị dưới dạng một giá trị được mã hoá gồm 3 byte. - Điểm mã
U+0000
được mã hoá ở dạng 2 byte. - Một byte rỗng đơn giản (giá trị
0
) cho biết phần cuối của một chuỗi, theo cách diễn giải tiêu chuẩn của ngôn ngữ C.
Hai mục đầu tiên ở trên có thể được tóm tắt như sau: MUTF-8 là một định dạng mã hoá cho UTF-16, thay vì là một định dạng mã hoá trực tiếp hơn cho các ký tự Unicode.
Hai mục cuối cùng ở trên giúp bạn có thể đồng thời đưa điểm mã U+0000
vào một chuỗi và vẫn thao tác với chuỗi đó dưới dạng chuỗi kết thúc bằng giá trị rỗng theo kiểu C.
Tuy nhiên, phương thức mã hoá đặc biệt của U+0000
có nghĩa là không giống như UTF-8 thông thường, kết quả của việc gọi hàm C tiêu chuẩn strcmp()
trên một cặp chuỗi MUTF-8 không phải lúc nào cũng cho biết kết quả được ký đúng cách của việc so sánh các chuỗi không bằng nhau.
Khi thứ tự (không chỉ là sự bình đẳng) là một vấn đề, cách đơn giản nhất để so sánh các chuỗi MUTF-8 là giải mã chúng từng ký tự và so sánh các giá trị đã giải mã. (Tuy nhiên, bạn cũng có thể triển khai theo cách thông minh hơn.)
Vui lòng tham khảo Tiêu chuẩn Unicode để biết thêm thông tin về hệ thống mã hoá ký tự. MUTF-8 thực sự gần với phương thức mã hoá CESU-8 (tương đối ít người biết đến) hơn là UTF-8.
mã hoá encoded_value
Được nhúng trong annotation_element và encoded_array_item
encoded_value
là một phần được mã hoá của dữ liệu có cấu trúc phân cấp (gần như) tuỳ ý. Mục đích của việc mã hoá là để vừa nhỏ gọn vừa dễ phân tích cú pháp.
Tên | Định dạng | Mô tả |
---|---|---|
(value_arg << 5) | value_type | ubyte | byte cho biết loại value ngay sau đó cùng với một đối số làm rõ không bắt buộc trong 3 bit có thứ tự cao.
Hãy xem bên dưới để biết các định nghĩa về value .
Trong hầu hết các trường hợp, value_arg mã hoá độ dài của value ngay sau đó theo byte, dưới dạng (size - 1) , ví dụ: 0 có nghĩa là giá trị yêu cầu 1 byte và 7 có nghĩa là giá trị yêu cầu 8 byte; tuy nhiên, có những trường hợp ngoại lệ như được lưu ý bên dưới.
|
value | ubyte[] | byte đại diện cho giá trị, độ dài thay đổi và được diễn giải khác nhau đối với các byte value_type khác nhau, mặc dù luôn là little-endian. Hãy xem các định nghĩa về giá trị bên dưới để biết thông tin chi tiết.
|
Định dạng giá trị
Nhập tên | value_type |
value_arg Định dạng |
value Định dạng |
Mô tả |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (không có; phải là 0 ) |
ubyte[1] | giá trị số nguyên một byte có dấu |
VALUE_SHORT | 0x02 | kích thước – 1 (0…1) | ubyte[size] | giá trị số nguyên 2 byte có dấu, được mở rộng dấu |
VALUE_CHAR | 0x03 | kích thước – 1 (0…1) | ubyte[size] | giá trị số nguyên chưa ký gồm 2 byte, được mở rộng thành 0 |
VALUE_INT | 0x04 | kích thước – 1 (0…3) | ubyte[size] | giá trị số nguyên có dấu gồm 4 byte, được mở rộng dấu |
VALUE_LONG | 0x06 | size – 1 (0…7) | ubyte[size] | giá trị số nguyên có dấu 8 byte, được mở rộng dấu |
VALUE_FLOAT | 0x10 | kích thước – 1 (0…3) | ubyte[size] | mẫu bit 4 byte, mở rộng thành 0 sang phải và được diễn giải dưới dạng giá trị dấu phẩy động 32 bit IEEE754 |
VALUE_DOUBLE | 0x11 | size – 1 (0…7) | ubyte[size] | mẫu bit 8 byte, mở rộng thành 0 sang phải và được diễn giải dưới dạng giá trị dấu phẩy động 64 bit IEEE754 |
VALUE_METHOD_TYPE | 0x15 | kích thước – 1 (0…3) | ubyte[size] | giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần proto_ids và biểu thị một giá trị kiểu phương thức
|
VALUE_METHOD_HANDLE | 0x16 | kích thước – 1 (0…3) | ubyte[size] | giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần method_handles và biểu thị một giá trị xử lý phương thức
|
VALUE_STRING | 0x17 | kích thước – 1 (0…3) | ubyte[size] | giá trị số nguyên 4 byte không dấu (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần string_ids và biểu thị một giá trị chuỗi
|
VALUE_TYPE | 0x18 | kích thước – 1 (0…3) | ubyte[size] | giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần type_ids và biểu thị một giá trị loại/lớp phản chiếu
|
VALUE_FIELD | 0x19 | kích thước – 1 (0…3) | ubyte[size] | giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần field_ids và biểu thị một giá trị trường phản chiếu
|
VALUE_METHOD | 0x1a | kích thước – 1 (0…3) | ubyte[size] | giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần method_ids và biểu thị một giá trị phương thức phản chiếu
|
VALUE_ENUM | 0x1b | kích thước – 1 (0…3) | ubyte[size] | giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần field_ids và biểu thị giá trị của một hằng số kiểu được liệt kê
|
VALUE_ARRAY | 0x1c | (không có; phải là 0 ) |
encoded_array | một mảng giá trị, theo định dạng được chỉ định bằng "định dạng encoded_array " bên dưới. Kích thước của value được ngầm hiểu trong quá trình mã hoá.
|
VALUE_ANNOTATION | 0x1d | (không có; phải là 0 ) |
encoded_annotation | một chú thích phụ, theo định dạng do "định dạng encoded_annotation " bên dưới chỉ định. Kích thước của value được ngầm hiểu trong quá trình mã hoá.
|
VALUE_NULL | 0x1e | (không có; phải là 0 ) |
(không có) | Giá trị tham chiếu null |
VALUE_BOOLEAN | 0x1f | boolean (0…1) | (không có) | giá trị một bit; 0 cho false và 1 cho true . Bit này được biểu thị trong value_arg .
|
định dạng encoded_array
Tên | Định dạng | Mô tả |
---|---|---|
size | uleb128 | số lượng phần tử trong mảng |
giá trị | encoded_value[size] | một chuỗi gồm các chuỗi byte size encoded_value theo định dạng do phần này chỉ định, được nối tuần tự.
|
định dạng encoded_annotation
Tên | Định dạng | Mô tả |
---|---|---|
type_idx | uleb128 | loại chú thích. Đây phải là một lớp (không phải mảng hoặc kiểu nguyên thuỷ). |
size | uleb128 | số lượng mối liên kết tên-giá trị trong chú thích này |
phần tử | annotation_element[size] | các phần tử của chú thích, được biểu thị trực tiếp trong dòng (không phải dưới dạng độ lệch). Các phần tử phải được sắp xếp theo thứ tự tăng dần theo chỉ mục string_id .
|
định dạng annotation_element
Tên | Định dạng | Mô tả |
---|---|---|
name_idx | uleb128 | tên phần tử, được biểu thị dưới dạng một chỉ mục trong phần string_ids . Chuỗi phải tuân thủ cú pháp của MemberName, được xác định ở trên.
|
value | encoded_value | giá trị phần tử |
Cú pháp chuỗi
Có một số loại mục trong tệp .dex
, cuối cùng sẽ tham chiếu đến một chuỗi. Các định nghĩa theo kiểu BNF sau đây cho biết cú pháp chấp nhận được cho các chuỗi này.
SimpleName
SimpleName là cơ sở cho cú pháp của tên của những thứ khác. Định dạng .dex
cho phép một lượng lớn khoảng trống ở đây (nhiều hơn hầu hết các ngôn ngữ nguồn phổ biến). Nói tóm lại, tên đơn giản bao gồm mọi ký tự chữ cái hoặc chữ số ASCII thấp, một số ký hiệu ASCII thấp cụ thể và hầu hết các điểm mã không phải ASCII không phải là ký tự điều khiển, khoảng trắng hoặc ký tự đặc biệt. Kể từ phiên bản 040
, định dạng này cũng cho phép các ký tự dấu cách (danh mục Unicode Zs
). Xin lưu ý rằng các điểm mã thay thế (trong phạm vi U+d800
… U+dfff
) không được coi là ký tự tên hợp lệ, nhưng các ký tự bổ sung Unicode là hợp lệ (được biểu thị bằng lựa chọn thay thế cuối cùng của quy tắc cho SimpleNameChar) và chúng phải được biểu thị trong một tệp dưới dạng các cặp điểm mã thay thế trong mã hoá MUTF-8.
SimpleName → | ||
SimpleNameChar (SimpleNameChar)* | ||
SimpleNameChar → | ||
'A' … 'Z' |
||
| | 'a' … 'z' |
|
| | '0' … '9' |
|
| | ' ' |
kể từ phiên bản DEX 040 |
| | '$' |
|
| | '-' |
|
| | '_' |
|
| | U+00a0 |
kể từ phiên bản DEX 040 |
| | U+00a1 … U+1fff |
|
| | U+2000 … U+200a |
kể từ phiên bản DEX 040 |
| | U+2010 … U+2027 |
|
| | U+202f |
kể từ phiên bản DEX 040 |
| | U+2030 … U+d7ff |
|
| | U+e000 … U+ffef |
|
| | U+10000 … U+10ffff |
Tên thành viên
được dùng bởi field_id_item và method_id_item
MemberName là tên của một thành viên trong lớp, các thành viên là trường, phương thức và lớp bên trong.
MemberName → | |
SimpleName | |
| | '<' SimpleName '>' |
FullClassName
FullClassName là tên lớp đủ điều kiện, bao gồm một bộ chỉ định gói không bắt buộc, theo sau là một tên bắt buộc.
FullClassName → | |
OptionalPackagePrefix SimpleName | |
OptionalPackagePrefix → | |
(SimpleName '/' )* |
TypeDescriptor
Được dùng bởi type_id_item
TypeDescriptor là biểu thị của mọi loại, bao gồm cả các kiểu dữ liệu nguyên thuỷ, lớp, mảng và void
. Xem bên dưới để biết ý nghĩa của các phiên bản.
TypeDescriptor → | |
'V' |
|
| | FieldTypeDescriptor |
FieldTypeDescriptor → | |
NonArrayFieldTypeDescriptor | |
| | ('[' * 1…255)
NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor→ | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' FullClassName ';' |
ShortyDescriptor
Được dùng bởi proto_id_item
ShortyDescriptor là dạng biểu diễn ngắn của một nguyên mẫu phương thức, bao gồm cả các loại dữ liệu trả về và tham số, ngoại trừ việc không có sự phân biệt giữa nhiều loại tham chiếu (lớp hoặc mảng). Thay vào đó, tất cả các loại tham chiếu đều được biểu thị bằng một ký tự 'L'
.
ShortyDescriptor → | |
ShortyReturnType (ShortyFieldType)* | |
ShortyReturnType → | |
'V' |
|
| | ShortyFieldType |
ShortyFieldType → | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
Ngữ nghĩa TypeDescriptor
Đây là ý nghĩa của từng biến thể của TypeDescriptor.
Cú pháp | Ý nghĩa |
---|---|
V | void ; chỉ hợp lệ cho các loại trả lại |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long |
T6 | float |
D | double |
Lfully/qualified/Name; | lớp fully.qualified.Name |
[descriptor | mảng descriptor , có thể dùng đệ quy cho mảng gồm các mảng, mặc dù không hợp lệ nếu có hơn 255 phương diện.
|
Các mục và cấu trúc liên quan
Phần này bao gồm các định nghĩa cho từng mục cấp cao nhất có thể xuất hiện trong tệp .dex
.
header_item
Xuất hiện trong phần đầu trang
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
ma thuật | ubyte[8] = DEX_FILE_MAGIC | giá trị ma thuật. Hãy xem phần thảo luận ở trên trong mục "DEX_FILE_MAGIC " để biết thêm thông tin chi tiết.
|
giá trị tổng kiểm | uint | tổng kiểm adler32 của phần còn lại của tệp (mọi thứ trừ magic và trường này); dùng để phát hiện tệp bị hỏng
|
Chữ ký | ubyte[20] | Chữ ký SHA-1 (hàm băm) của phần còn lại của tệp (mọi thứ trừ magic , checksum và trường này); dùng để nhận dạng duy nhất các tệp
|
file_size | uint |
kích thước của toàn bộ tệp (bao gồm cả tiêu đề), tính bằng byte (phiên bản 40 trở xuống) khoảng cách tính bằng byte từ đầu tiêu đề này đến tiêu đề tiếp theo hoặc đến cuối toàn bộ tệp (vùng chứa). (phiên bản 41 trở lên) |
header_size | uint |
kích thước của tiêu đề (toàn bộ phần này), tính bằng byte. Điều này cho phép có ít nhất một lượng tương thích ngược/xuôi hạn chế mà không làm định dạng trở nên không hợp lệ. phải là 0x70 (112) byte (phiên bản 40 trở xuống) phải là 0x78 (120) byte (v41 trở lên) |
endian_tag | uint = ENDIAN_CONSTANT | thẻ endianness. Hãy xem phần thảo luận ở trên trong mục "ENDIAN_CONSTANT và REVERSE_ENDIAN_CONSTANT " để biết thêm thông tin chi tiết.
|
link_size | uint | kích thước của phần liên kết hoặc 0 nếu tệp này không được liên kết tĩnh |
link_off | uint | độ lệch từ đầu tệp đến phần liên kết hoặc 0 nếu link_size == 0 . Khoảng bù (nếu khác 0) phải là khoảng bù vào phần link_data . Định dạng của dữ liệu được chỉ ra là không được chỉ định trong tài liệu này; trường tiêu đề này (và trường trước đó) được để lại dưới dạng các hook để sử dụng bằng cách triển khai thời gian chạy.
|
map_off | uint | độ lệch từ đầu tệp đến mục trên bản đồ. Độ lệch (phải khác 0) phải là độ lệch vào phần data và dữ liệu phải ở định dạng do "map_list " chỉ định bên dưới.
|
string_ids_size | uint | số lượng chuỗi trong danh sách giá trị nhận dạng chuỗi |
string_ids_off | uint | độ lệch từ đầu tệp đến danh sách giá trị nhận dạng chuỗi hoặc 0 nếu string_ids_size == 0 (thừa nhận là một trường hợp biên kỳ lạ). Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần string_ids .
|
type_ids_size | uint | số lượng phần tử trong danh sách giá trị nhận dạng loại, tối đa là 65535 |
type_ids_off | uint | độ lệch từ đầu tệp đến danh sách giá trị nhận dạng loại hoặc 0 nếu type_ids_size == 0 (thừa nhận là một trường hợp biên kỳ lạ). Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần type_ids .
|
proto_ids_size | uint | số lượng phần tử trong danh sách giá trị nhận dạng nguyên mẫu, tối đa là 65535 |
proto_ids_off | uint | độ lệch so với đầu tệp đến danh sách giá trị nhận dạng nguyên mẫu hoặc 0 nếu proto_ids_size == 0 (thừa nhận là một trường hợp biên kỳ lạ). Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần proto_ids .
|
field_ids_size | uint | số lượng phần tử trong danh sách giá trị nhận dạng trường |
field_ids_off | uint | độ lệch từ đầu tệp đến danh sách giá trị nhận dạng trường hoặc 0 nếu field_ids_size == 0 . Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần field_ids . |
method_ids_size | uint | số lượng phần tử trong danh sách giá trị nhận dạng phương thức |
method_ids_off | uint | độ lệch từ đầu tệp đến danh sách giá trị nhận dạng phương thức hoặc 0 nếu method_ids_size == 0 . Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần method_ids . |
class_defs_size | uint | số lượng phần tử trong danh sách định nghĩa lớp |
class_defs_off | uint | độ lệch từ đầu tệp đến danh sách định nghĩa lớp hoặc 0 nếu class_defs_size == 0 (mặc dù đây là một trường hợp biên kỳ lạ). Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần class_defs .
|
data_size | uint |
Kích thước của phần Không dùng (v41 trở lên) |
data_off | uint |
độ lệch từ đầu tệp đến đầu phần Không dùng (v41 trở lên) |
container_size | uint |
trường này không tồn tại. Bạn có thể giả định rằng giá trị này bằng kích thước của toàn bộ tệp (bao gồm cả các tiêu đề dex khác và dữ liệu của chúng). (phiên bản 41 trở lên) |
header_offset | uint |
trường này không tồn tại. Bạn có thể giả định rằng giá trị này bằng độ lệch từ đầu tệp đến đầu tiêu đề này. (phiên bản 41 trở lên) |
map_list
Xuất hiện trong phần dữ liệu
Được tham chiếu từ header_item
Căn chỉnh: 4 byte
Đây là danh sách toàn bộ nội dung của một tệp, theo thứ tự. Nó chứa một số thông tin dư thừa liên quan đến header_item
nhưng được dự định là một biểu mẫu dễ sử dụng để lặp lại toàn bộ tệp. Một loại nhất định chỉ được xuất hiện tối đa một lần trong bản đồ, nhưng không có hạn chế nào về thứ tự xuất hiện của các loại, ngoài những hạn chế ngụ ý theo phần còn lại của định dạng (ví dụ: phần header
phải xuất hiện trước, theo sau là phần string_ids
, v.v.). Ngoài ra, các mục nhập bản đồ phải được sắp xếp theo độ lệch ban đầu và không được trùng lặp.
Tên | Định dạng | Mô tả |
---|---|---|
size | uint | kích thước của danh sách, tính bằng số mục |
danh sách | map_item[size] | các phần tử của danh sách |
Định dạng map_item
Tên | Định dạng | Mô tả |
---|---|---|
loại | ushort | loại mặt hàng; xem bảng bên dưới |
unused | ushort | (unused) |
size | uint | số lượng mục cần tìm tại khoảng cách đã chỉ định |
bù trừ | uint | độ lệch so với đầu tệp đến các mục có liên quan |
Mã loại
Loại mặt hàng | Hằng số | Giá trị | Kích thước của mặt hàng tính bằng byte |
---|---|---|---|
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 | ngầm ẩn; phải phân tích cú pháp |
code_item | TYPE_CODE_ITEM | 0x2001 | ngầm ẩn; phải phân tích cú pháp |
string_data_item | TYPE_STRING_DATA_ITEM | 0x2002 | ngầm ẩn; phải phân tích cú pháp |
debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | ngầm ẩn; phải phân tích cú pháp |
annotation_item | TYPE_ANNOTATION_ITEM | 0x2004 | ngầm ẩn; phải phân tích cú pháp |
encoded_array_item | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | ngầm ẩn; phải phân tích cú pháp |
annotations_directory_item | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | ngầm ẩn; phải phân tích cú pháp |
hiddenapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | ngầm ẩn; phải phân tích cú pháp |
string_id_item
Xuất hiện trong phần string_ids
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
string_data_off | uint | độ lệch từ đầu tệp đến dữ liệu chuỗi cho mục này. Khoảng bù phải là một vị trí trong phần data và dữ liệu phải ở định dạng do "string_data_item " chỉ định bên dưới.
Không có yêu cầu nào về việc căn chỉnh độ lệch.
|
string_data_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: không có (căn chỉnh theo byte)
Tên | Định dạng | Mô tả |
---|---|---|
utf16_size | uleb128 | kích thước của chuỗi này, tính bằng đơn vị mã UTF-16 (đây là "độ dài chuỗi" trong nhiều hệ thống). Tức là đây là độ dài đã giải mã của chuỗi. (Độ dài được mã hoá được ngầm hiểu theo vị trí của byte 0 .) |
dữ liệu | ubyte[] | một chuỗi các đơn vị mã MUTF-8 (còn gọi là octet, còn gọi là byte) theo sau là một byte có giá trị 0 . Hãy xem phần "Mã hoá MUTF-8 (UTF-8 đã sửa đổi)" ở trên để biết thông tin chi tiết và nội dung thảo luận về định dạng dữ liệu.
Lưu ý: Bạn có thể dùng một chuỗi bao gồm các đơn vị mã thay thế UTF-16 (dạng mã hoá) (tức là |
type_id_item
Xuất hiện trong phần type_ids
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
descriptor_idx | uint | chỉ mục vào danh sách string_ids cho chuỗi mô tả thuộc loại này. Chuỗi phải tuân thủ cú pháp của TypeDescriptor, được xác định ở trên.
|
proto_id_item
Xuất hiện trong phần proto_ids
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
shorty_idx | uint | chỉ mục vào danh sách string_ids cho chuỗi mô tả dạng ngắn của nguyên mẫu này. Chuỗi này phải tuân thủ cú pháp của ShortyDescriptor (được xác định ở trên) và phải tương ứng với kiểu dữ liệu trả về và các tham số của mục này.
|
return_type_idx | uint | chỉ mục vào danh sách type_ids cho kiểu trả về của nguyên mẫu này
|
parameters_off | uint | độ lệch từ đầu tệp đến danh sách các loại tham số cho nguyên mẫu này hoặc 0 nếu nguyên mẫu này không có tham số. Khoảng bù này (nếu khác 0) phải nằm trong phần data và dữ liệu ở đó phải ở định dạng do "type_list" chỉ định bên dưới. Ngoài ra, không được có tham chiếu đến loại void trong danh sách.
|
field_id_item
Xuất hiện trong phần field_ids
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
class_idx | ushort | chỉ mục vào danh sách type_ids cho người xác định trường này. Đây phải là một kiểu lớp chứ không phải là một mảng hoặc kiểu cơ bản.
|
type_idx | ushort | chỉ mục vào danh sách type_ids cho loại trường này
|
name_idx | uint | chỉ mục vào danh sách string_ids để biết tên của trường này. Chuỗi phải tuân thủ cú pháp của MemberName, được xác định ở trên.
|
method_id_item
Xuất hiện trong phần method_ids
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
class_idx | ushort | chỉ mục vào danh sách type_ids cho trình xác định phương thức này. Đây phải là một lớp hoặc kiểu mảng, chứ không phải kiểu nguyên thuỷ.
|
proto_idx | ushort | chỉ mục vào danh sách proto_ids cho nguyên mẫu của phương thức này
|
name_idx | uint | chỉ mục vào danh sách string_ids cho tên của phương thức này. Chuỗi phải tuân thủ cú pháp của MemberName, được xác định ở trên.
|
class_def_item
Xuất hiện trong phần class_defs
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
class_idx | uint | chỉ mục vào danh sách type_ids cho lớp này.
Đây phải là một kiểu lớp chứ không phải là một mảng hoặc kiểu cơ bản.
|
access_flags | uint | cờ truy cập cho lớp (public , final , v.v.). Hãy xem phần "access_flags Định nghĩa" để biết thông tin chi tiết.
|
superclass_idx | uint | chỉ mục vào danh sách type_ids cho lớp mẹ hoặc giá trị hằng số NO_INDEX nếu lớp này không có lớp mẹ (tức là đây là một lớp gốc như Object ). Nếu có, đây phải là một loại lớp chứ không phải là một mảng hoặc loại nguyên thuỷ.
|
interfaces_off | uint | độ lệch từ đầu tệp đến danh sách giao diện hoặc 0 nếu không có giao diện nào. Khoảng bù này phải nằm trong phần data và dữ liệu ở đó phải ở định dạng do "type_list " chỉ định bên dưới. Mỗi phần tử của danh sách phải là một kiểu lớp (không phải là mảng hoặc kiểu nguyên thuỷ) và không được có bất kỳ phần tử nào trùng lặp.
|
source_file_idx | uint | chỉ mục vào danh sách string_ids cho tên của tệp chứa nguồn ban đầu cho (ít nhất là hầu hết) lớp này hoặc giá trị đặc biệt NO_INDEX để biểu thị việc thiếu thông tin này. debug_info_item của bất kỳ phương thức nào có thể ghi đè tệp nguồn này, nhưng dự kiến hầu hết các lớp sẽ chỉ đến từ một tệp nguồn.
|
annotations_off | uint | độ lệch từ đầu tệp đến cấu trúc chú thích cho lớp này hoặc 0 nếu không có chú thích nào trên lớp này. Nếu khác 0, độ lệch này phải nằm trong phần data và dữ liệu ở đó phải có định dạng do "annotations_directory_item " chỉ định bên dưới, với tất cả các mục tham chiếu đến lớp này làm trình xác định.
|
class_data_off | uint | độ lệch so với đầu tệp đến dữ liệu lớp được liên kết cho mục này hoặc 0 nếu không có dữ liệu lớp cho lớp này. (Ví dụ: điều này có thể xảy ra nếu lớp này là một giao diện đánh dấu.) Nếu khác 0, độ lệch phải nằm trong phần data và dữ liệu ở đó phải có định dạng do "class_data_item " chỉ định bên dưới, với tất cả các mục tham chiếu đến lớp này làm trình xác định.
|
static_values_off | uint | độ lệch từ đầu tệp đến danh sách các giá trị ban đầu cho các trường static hoặc 0 nếu không có giá trị nào (và tất cả các trường static sẽ được khởi tạo bằng 0 hoặc null ). Độ lệch này phải nằm trong phần data và dữ liệu ở đó phải ở định dạng do "encoded_array_item " chỉ định bên dưới. Kích thước của mảng không được lớn hơn số lượng trường static do lớp này khai báo và các phần tử tương ứng với các trường static theo cùng một thứ tự như được khai báo trong field_list tương ứng. Loại của mỗi phần tử mảng phải khớp với loại đã khai báo của trường tương ứng.
Nếu có ít phần tử trong mảng hơn số trường static , thì các trường còn lại sẽ được khởi tạo bằng 0 hoặc null phù hợp với loại.
|
call_site_id_item
Xuất hiện trong mục call_site_ids
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
call_site_off | uint | độ lệch từ đầu tệp đến định nghĩa vị trí gọi. Độ lệch phải nằm trong phần dữ liệu và dữ liệu ở đó phải có định dạng do "call_site_item" chỉ định bên dưới. |
call_site_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: không có (căn chỉnh theo byte)
call_site_item là một encoded_array_item có các phần tử tương ứng với các đối số được cung cấp cho một phương thức liên kết khởi động. Ba đối số đầu tiên là:
- Một phương thức xử lý đại diện cho phương thức liên kết khởi động (VALUE_METHOD_HANDLE).
- Tên phương thức mà trình liên kết khởi động cần phân giải (VALUE_STRING).
- Một loại phương thức tương ứng với loại tên phương thức cần phân giải (VALUE_METHOD_TYPE).
Mọi đối số bổ sung đều là các giá trị hằng số được truyền đến phương thức liên kết khởi động. Các đối số này được truyền theo thứ tự và không có bất kỳ lượt chuyển đổi loại nào.
Phương thức xử lý đại diện cho phương thức liên kết khởi động phải có kiểu trả về là java.lang.invoke.CallSite
. Ba loại tham số đầu tiên là:
java.lang.invoke.Lookup
java.lang.String
java.lang.invoke.MethodType
Các loại tham số của mọi đối số bổ sung được xác định từ các giá trị hằng số của chúng.
method_handle_item
Xuất hiện trong phần method_handles
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
method_handle_type | ushort | loại của hàm xử lý phương thức; xem bảng bên dưới |
unused | ushort | (unused) |
field_or_method_id | ushort | Mã nhận dạng trường hoặc phương thức, tuỳ thuộc vào việc loại xử lý phương thức là một phương thức truy cập hay một phương thức gọi phương thức |
unused | ushort | (unused) |
Mã loại xử lý phương thức
Hằng số | Giá trị | Mô tả |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0x00 | Xử lý phương thức là trình thiết lập (trình truy cập) trường tĩnh |
METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | Xử lý phương thức là một trình truy cập (getter) trường tĩnh |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | Xử lý phương thức là trình thiết lập trường thực thể (trình truy cập) |
METHOD_HANDLE_TYPE_INSTANCE_GET | 0x03 | Xử lý phương thức là một getter (trình truy cập) trường thực thể |
METHOD_HANDLE_TYPE_INVOKE_STATIC | 0x04 | Xử lý phương thức là một trình gọi phương thức tĩnh |
METHOD_HANDLE_TYPE_INVOKE_INSTANCE | 0x05 | Xử lý phương thức là một trình gọi phương thức của thực thể |
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR | 0x06 | Xử lý phương thức là một trình gọi phương thức của hàm khởi tạo |
METHOD_HANDLE_TYPE_INVOKE_DIRECT | 0x07 | Xử lý phương thức là một trình gọi phương thức trực tiếp |
METHOD_HANDLE_TYPE_INVOKE_INTERFACE | 0x08 | Xử lý phương thức là một trình gọi phương thức giao diện |
class_data_item
Được tham chiếu từ class_def_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: không có (căn chỉnh theo byte)
Tên | Định dạng | Mô tả |
---|---|---|
static_fields_size | uleb128 | số lượng trường tĩnh được xác định trong mục này |
instance_fields_size | uleb128 | số lượng trường thực thể được xác định trong mục này |
direct_methods_size | uleb128 | số lượng phương thức trực tiếp được xác định trong mục này |
virtual_methods_size | uleb128 | số lượng phương thức ảo được xác định trong mục này |
static_fields | encoded_field[static_fields_size] | các trường tĩnh được xác định, được biểu thị dưới dạng một chuỗi các phần tử được mã hoá. Bạn phải sắp xếp các trường theo field_idx theo thứ tự tăng dần.
|
instance_fields | encoded_field[instance_fields_size] | các trường thực thể được xác định, được biểu thị dưới dạng một chuỗi các phần tử được mã hoá. Bạn phải sắp xếp các trường theo field_idx theo thứ tự tăng dần.
|
direct_methods | encoded_method[direct_methods_size] | các phương thức trực tiếp đã xác định (bất kỳ phương thức nào trong số static , private hoặc hàm khởi tạo), được biểu thị dưới dạng một chuỗi các phần tử được mã hoá. Bạn phải sắp xếp các phương thức theo method_idx theo thứ tự tăng dần.
|
virtual_methods | encoded_method[virtual_methods_size] | các phương thức ảo đã xác định (không có static , private hoặc hàm dựng), được biểu thị dưới dạng một chuỗi các phần tử được mã hoá. Danh sách này không được bao gồm các phương thức kế thừa, trừ phi bị lớp mà mục này đại diện ghi đè. Các phương thức phải được sắp xếp theo method_idx theo thứ tự tăng dần.
method_idx của một phương thức ảo không được trùng với bất kỳ phương thức trực tiếp nào.
|
Lưu ý: Tất cả các thực thể field_id
và method_id
của phần tử đều phải tham chiếu đến cùng một lớp xác định.
Định dạng encoded_field
Tên | Định dạng | Mô tả |
---|---|---|
field_idx_diff | uleb128 | chỉ mục vào danh sách field_ids cho danh tính của trường này (bao gồm tên và giá trị mô tả), được biểu thị dưới dạng một điểm khác biệt so với chỉ mục của phần tử trước đó trong danh sách. Chỉ mục của phần tử đầu tiên trong danh sách được biểu thị trực tiếp.
|
access_flags | uleb128 | cờ truy cập cho trường (public , final , v.v.). Hãy xem phần "access_flags Định nghĩa" để biết thông tin chi tiết.
|
Định dạng encoded_method
Tên | Định dạng | Mô tả |
---|---|---|
method_idx_diff | uleb128 | chỉ mục vào danh sách method_ids cho danh tính của phương thức này (bao gồm tên và giá trị mô tả), được biểu thị dưới dạng chênh lệch so với chỉ mục của phần tử trước đó trong danh sách. Chỉ mục của phần tử đầu tiên trong danh sách được biểu thị trực tiếp.
|
access_flags | uleb128 | cờ truy cập cho phương thức (public , final , v.v.). Hãy xem phần "access_flags Định nghĩa" để biết thông tin chi tiết.
|
code_off | uleb128 | độ lệch từ đầu tệp đến cấu trúc mã cho phương thức này hoặc 0 nếu phương thức này là abstract hoặc native . Khoảng bù phải là một vị trí trong phần data . Định dạng của dữ liệu được chỉ định bằng "code_item " bên dưới.
|
type_list
Được tham chiếu từ class_def_item và proto_id_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
size | uint | kích thước của danh sách, tính bằng số mục |
danh sách | type_item[size] | các phần tử của danh sách |
định dạng type_item
Tên | Định dạng | Mô tả |
---|---|---|
type_idx | ushort | chỉ mục vào danh sách type_ids |
code_item
Được tham chiếu từ encoded_method
Xuất hiện trong phần dữ liệu
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
registers_size | ushort | số lượng thanh ghi mà mã này sử dụng |
ins_size | ushort | số lượng từ của các đối số đến phương thức mà mã này dành cho |
outs_size | ushort | số lượng từ của khoảng trống đối số đi cần thiết cho mã này để gọi phương thức |
tries_size | ushort | số lượng try_item cho phiên bản này. Nếu khác 0, thì các giá trị này sẽ xuất hiện dưới dạng mảng tries ngay sau insns trong phiên bản này.
|
debug_info_off | uint | độ lệch từ đầu tệp đến trình tự thông tin gỡ lỗi (số dòng + thông tin biến cục bộ) cho mã này hoặc 0 nếu không có thông tin. Khoảng bù, nếu khác 0, phải là vị trí trong phần data . Định dạng của dữ liệu được chỉ định bằng "debug_info_item " bên dưới.
|
insns_size | uint | kích thước của danh sách chỉ dẫn, tính bằng đơn vị mã 16 bit |
insns | ushort[insns_size] | mảng mã byte thực tế. Định dạng của mã trong một mảng insns được chỉ định theo tài liệu đồng hành mã byte Dalvik. Lưu ý rằng mặc dù được xác định là một mảng ushort , nhưng có một số cấu trúc nội bộ ưu tiên căn chỉnh 4 byte. Ngoài ra, nếu điều này xảy ra trong một tệp có thứ tự byte đảo ngược, thì việc đảo ngược chỉ được thực hiện trên các thực thể ushort riêng lẻ chứ không phải trên các cấu trúc nội bộ lớn hơn.
|
padding | ushort (không bắt buộc) = 0 | hai byte đệm để tries được căn chỉnh 4 byte.
Phần tử này chỉ xuất hiện nếu tries_size khác 0 và insns_size là số lẻ.
|
cố gắng | try_item[tries_size] (không bắt buộc) | mảng cho biết vị trí trong mã mà các ngoại lệ được phát hiện và cách xử lý các ngoại lệ đó. Các phần tử của mảng không được trùng lặp trong phạm vi và theo thứ tự từ địa chỉ thấp đến địa chỉ cao. Phần tử này chỉ xuất hiện nếu tries_size khác 0.
|
trình xử lý | encoded_catch_handler_list (không bắt buộc) | byte đại diện cho danh sách các danh sách loại bắt và địa chỉ trình xử lý được liên kết. Mỗi try_item có một độ lệch theo byte vào cấu trúc này. Phần tử này chỉ xuất hiện nếu tries_size khác 0.
|
Định dạng try_item
Tên | Định dạng | Mô tả |
---|---|---|
start_addr | uint | địa chỉ bắt đầu của khối mã do mục này bao gồm. Địa chỉ là số lượng đơn vị mã 16 bit cho đến khi bắt đầu chỉ dẫn được đề cập đầu tiên. |
insn_count | ushort | số lượng đơn vị mã 16 bit được mục này đề cập. Đơn vị mã cuối cùng được đề cập (bao gồm) là start_addr + insn_count - 1 .
|
handler_off | ushort | độ lệch tính bằng byte từ đầu encoded_catch_hander_list được liên kết đến encoded_catch_handler cho mục này. Đây phải là một độ lệch so với điểm bắt đầu của encoded_catch_handler .
|
định dạng encoded_catch_handler_list
Tên | Định dạng | Mô tả |
---|---|---|
size | uleb128 | kích thước của danh sách này, tính bằng số mục |
danh sách | encoded_catch_handler[handlers_size] | danh sách thực tế của danh sách trình xử lý, được biểu thị trực tiếp (không phải dưới dạng độ lệch) và được nối tuần tự |
định dạng encoded_catch_handler
Tên | Định dạng | Mô tả |
---|---|---|
size | sleb128 | số lượng loại bắt trong danh sách này. Nếu không dương, thì đây là số âm của số loại bắt và các loại bắt sẽ được theo sau bởi một trình xử lý bắt tất cả. Ví dụ: size của 0 có nghĩa là có một catch-all nhưng không có catch được nhập rõ ràng.
size của 2 có nghĩa là có 2 lệnh bắt lỗi được nhập rõ ràng và không có lệnh bắt lỗi chung. Và size của -1 có nghĩa là có một lệnh bắt có kiểu cùng với một lệnh bắt tất cả.
|
trình xử lý | encoded_type_addr_pair[abs(size)] | luồng gồm các mục abs(size) được mã hoá, mỗi mục cho một loại đã bắt, theo thứ tự mà các loại cần được kiểm thử.
|
catch_all_addr | uleb128 (không bắt buộc) | địa chỉ mã byte của trình xử lý nhận toàn bộ thư. Phần tử này chỉ xuất hiện nếu size không phải là số dương.
|
định dạng encoded_type_addr_pair
Tên | Định dạng | Mô tả |
---|---|---|
type_idx | uleb128 | chỉ mục vào danh sách type_ids cho loại ngoại lệ cần bắt
|
addr | uleb128 | địa chỉ mã byte của trình xử lý ngoại lệ được liên kết |
debug_info_item
Được tham chiếu từ code_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: không có (căn chỉnh theo byte)
Mỗi debug_info_item
xác định một máy trạng thái được mã hoá theo byte lấy cảm hứng từ DWARF3. Khi được diễn giải, máy này sẽ phát ra bảng vị trí và (có thể) thông tin biến cục bộ cho một code_item
. Trình tự này bắt đầu bằng một tiêu đề có độ dài thay đổi (độ dài phụ thuộc vào số lượng tham số phương thức), theo sau là mã byte của máy trạng thái và kết thúc bằng một byte DBG_END_SEQUENCE
.
Máy trạng thái bao gồm 5 thanh ghi. Thanh ghi address
biểu thị độ lệch lệnh trong insns_item
được liên kết theo đơn vị mã 16 bit. Thanh ghi address
bắt đầu từ 0
ở đầu mỗi chuỗi debug_info
và chỉ được tăng đơn điệu.
Thanh ghi line
biểu thị số dòng nguồn cần được liên kết với mục nhập bảng vị trí tiếp theo do máy trạng thái phát ra. Tham số này được khởi tạo trong tiêu đề chuỗi và có thể thay đổi theo hướng dương hoặc âm nhưng không bao giờ được nhỏ hơn 1
. Thanh ghi source_file
đại diện cho tệp nguồn mà các mục số dòng tham chiếu đến. Biến này được khởi tạo thành giá trị của source_file_idx
trong class_def_item
.
Hai biến còn lại, prologue_end
và epilogue_begin
, là các cờ boolean (được khởi tạo thành false
) cho biết liệu vị trí tiếp theo được phát ra có được coi là phần mở đầu hay phần kết của phương thức hay không. Máy trạng thái cũng phải theo dõi tên và loại của biến cục bộ gần đây nhất trong mỗi thanh ghi cho mã DBG_RESTART_LOCAL
.
Tiêu đề như sau:
Tên | Định dạng | Mô tả |
---|---|---|
line_start | uleb128 | giá trị ban đầu cho thanh ghi line của máy trạng thái.
Không phải là một mục nhập vị trí thực tế.
|
parameters_size | uleb128 | số lượng tên tham số được mã hoá. Phải có một tham số cho mỗi phương thức, không bao gồm this của phương thức thực thể (nếu có).
|
parameter_names | uleb128p1[parameters_size] | chỉ mục chuỗi của tên tham số phương thức. Giá trị được mã hoá của NO_INDEX cho biết không có tên nào cho tham số được liên kết. Trình mô tả loại và chữ ký được ngụ ý từ trình mô tả và chữ ký phương thức.
|
Các giá trị mã byte như sau:
Tên | Giá trị | Định dạng | Đối số | Mô tả |
---|---|---|---|---|
DBG_END_SEQUENCE | 0x00 | (không có) | kết thúc một chuỗi thông tin gỡ lỗi cho code_item |
|
DBG_ADVANCE_PC | 0x01 | uleb128 addr_diff | addr_diff : số tiền cần thêm vào sổ đăng ký địa chỉ |
tăng thanh ghi địa chỉ mà không phát ra một mục vị trí |
DBG_ADVANCE_LINE | 0x02 | sleb128 line_diff | line_diff : số tiền cần thay đổi trong sổ đăng ký dòng |
chuyển thanh ghi dòng mà không phát ra một mục nhập vị trí |
DBG_START_LOCAL | 0x03 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx |
register_num : đăng ký sẽ chứa localname_idx : chỉ mục chuỗi của têntype_idx : chỉ mục loại của loại
|
giới thiệu một biến cục bộ tại địa chỉ hiện tại. name_idx hoặc type_idx có thể là NO_INDEX để cho biết giá trị đó là không xác định.
|
DBG_START_LOCAL_EXTENDED | 0x04 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx uleb128p1 sig_idx |
register_num : thanh ghi sẽ chứa cục bộ name_idx : chỉ mục chuỗi của tên type_idx : chỉ mục loại của loại sig_idx : chỉ mục chuỗi của chữ ký loại
|
giới thiệu một địa phương có chữ ký loại tại địa chỉ hiện tại.
name_idx , type_idx hoặc sig_idx có thể là NO_INDEX để cho biết giá trị đó là không xác định. (Tuy nhiên, nếu sig_idx là -1 , thì bạn có thể biểu thị cùng một dữ liệu một cách hiệu quả hơn bằng cách sử dụng mã lệnh DBG_START_LOCAL .)
Lưu ý: Hãy xem phần thảo luận trong " |
DBG_END_LOCAL | 0x05 | uleb128 register_num | register_num : đăng ký có chứa nội dung cục bộ |
đánh dấu một biến cục bộ hiện đang hoạt động là nằm ngoài phạm vi tại địa chỉ hiện tại |
DBG_RESTART_LOCAL | 0x06 | uleb128 register_num | register_num : đăng ký khởi động lại |
giới thiệu lại một biến cục bộ tại địa chỉ hiện tại. Tên và loại giống với tên và loại của biến cục bộ cuối cùng hoạt động trong sổ đăng ký được chỉ định. |
DBG_SET_PROLOGUE_END | 0x07 | (không có) | đặt thanh ghi máy trạng thái prologue_end , cho biết rằng mục nhập vị trí tiếp theo được thêm sẽ được coi là phần cuối của phần mở đầu phương thức (một vị trí thích hợp cho điểm ngắt phương thức). Mọi mã lệnh đặc biệt (>= 0x0a ) đều xoá thanh ghi prologue_end .
|
|
DBG_SET_EPILOGUE_BEGIN | 0x08 | (không có) | đặt thanh ghi trạng thái máy epilogue_begin , cho biết rằng mục nhập vị trí tiếp theo được thêm sẽ được coi là phần đầu của phần kết của phương thức (một vị trí thích hợp để tạm dừng thực thi trước khi thoát phương thức).
Mọi mã lệnh đặc biệt (>= 0x0a ) đều xoá thanh ghi epilogue_begin .
|
|
DBG_SET_FILE | 0x09 | uleb128p1 name_idx | name_idx : chỉ mục chuỗi của tên tệp nguồn; NO_INDEX nếu không xác định được
|
cho biết rằng tất cả các mục nhập số dòng tiếp theo đều tham chiếu đến tên tệp nguồn này, thay vì tên mặc định được chỉ định trong code_item
|
Opcodes đặc biệt | 0x0a…0xff | (không có) | tăng các thanh ghi line và address , phát ra một mục nhập vị trí và xoá prologue_end và epilogue_begin . Xem phần mô tả bên dưới.
|
Mã lệnh đặc biệt
Các mã lệnh có giá trị từ 0x0a
đến 0xff
(bao gồm cả 0x0a
và 0xff
) sẽ di chuyển cả các thanh ghi line
và address
một chút rồi phát ra một mục nhập bảng vị trí mới.
Công thức cho các mức tăng như sau:
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
Được tham chiếu từ class_def_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
class_annotations_off | uint | độ lệch so với đầu tệp đến chú thích được thực hiện trực tiếp trên lớp hoặc 0 nếu lớp không có chú thích trực tiếp.
Nếu khác 0, độ lệch phải là vị trí trong phần data . Định dạng của dữ liệu được chỉ định bằng "annotation_set_item " bên dưới.
|
fields_size | uint | số lượng trường được chú thích bởi mục này |
annotated_methods_size | uint | số lượng phương thức được chú thích theo mục này |
annotated_parameters_size | uint | số lượng danh sách tham số phương thức được chú thích bằng mục này |
field_annotations | field_annotation[fields_size] (không bắt buộc) | danh sách chú thích trường được liên kết. Các phần tử của danh sách phải được sắp xếp theo thứ tự tăng dần, theo field_idx .
|
method_annotations | method_annotation[methods_size] (không bắt buộc) | danh sách các chú thích phương thức được liên kết. Các phần tử của danh sách phải được sắp xếp theo thứ tự tăng dần, theo method_idx .
|
parameter_annotations | parameter_annotation[parameters_size] (không bắt buộc) | danh sách chú thích tham số phương thức được liên kết. Các phần tử của danh sách phải được sắp xếp theo thứ tự tăng dần, theo method_idx .
|
Lưu ý: Tất cả các thực thể field_id
và method_id
của phần tử đều phải tham chiếu đến cùng một lớp xác định.
định dạng field_annotation
Tên | Định dạng | Mô tả |
---|---|---|
field_idx | uint | chỉ mục vào danh sách field_ids cho danh tính của trường đang được chú thích
|
annotations_off | uint | độ lệch từ đầu tệp đến danh sách chú thích cho trường. Khoảng bù phải là một vị trí trong phần data . Định dạng của dữ liệu được chỉ định bằng "annotation_set_item " bên dưới.
|
định dạng method_annotation
Tên | Định dạng | Mô tả |
---|---|---|
method_idx | uint | chỉ mục vào danh sách method_ids cho danh tính của phương thức đang được chú thích
|
annotations_off | uint | độ lệch từ đầu tệp đến danh sách chú thích cho phương thức. Khoảng bù phải là một vị trí trong phần data . Định dạng của dữ liệu được chỉ định bằng "annotation_set_item " bên dưới.
|
định dạng parameter_annotation
Tên | Định dạng | Mô tả |
---|---|---|
method_idx | uint | chỉ mục vào danh sách method_ids cho danh tính của phương thức có các tham số đang được chú thích
|
annotations_off | uint | độ lệch từ đầu tệp đến danh sách chú thích cho các tham số phương thức. Khoảng bù phải là một vị trí trong phần data . Định dạng của dữ liệu được chỉ định bằng "annotation_set_ref_list " bên dưới.
|
annotation_set_ref_list
Được tham chiếu từ parameter_annotations_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
size | uint | kích thước của danh sách, tính bằng số mục |
danh sách | annotation_set_ref_item[size] | các phần tử của danh sách |
định dạng annotation_set_ref_item
Tên | Định dạng | Mô tả |
---|---|---|
annotations_off | uint | độ lệch từ đầu tệp đến tập hợp chú thích được tham chiếu hoặc 0 nếu không có chú thích nào cho phần tử này.
Khoảng bù (nếu khác 0) phải là vị trí trong phần data . Định dạng của dữ liệu được chỉ định bằng "annotation_set_item " bên dưới.
|
annotation_set_item
Được tham chiếu từ annotations_directory_item, field_annotations_item, method_annotations_item và annotation_set_ref_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
size | uint | kích thước của tập hợp, tính bằng số mục |
mục nhập | annotation_off_item[size] | các phần tử của tập hợp. Các phần tử phải được sắp xếp theo thứ tự tăng dần, theo type_idx .
|
định dạng annotation_off_item
Tên | Định dạng | Mô tả |
---|---|---|
annotation_off | uint | độ lệch từ đầu tệp đến một chú thích.
Độ lệch phải là một vị trí trong phần data và định dạng của dữ liệu tại vị trí đó được chỉ định bằng "annotation_item " bên dưới.
|
annotation_item
Được tham chiếu từ annotation_set_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: không có (căn chỉnh theo byte)
Tên | Định dạng | Mô tả |
---|---|---|
mức hiển thị | ubyte | mức độ hiển thị dự kiến của chú thích này (xem bên dưới) |
chú thích | encoded_annotation | nội dung chú thích được mã hoá, ở định dạng được mô tả bằng "định dạng encoded_annotation " trong phần "mã hoá encoded_value " ở trên.
|
Giá trị chế độ hiển thị
Đây là các lựa chọn cho trường visibility
trong annotation_item
:
Tên | Giá trị | Mô tả |
---|---|---|
VISIBILITY_BUILD | 0x00 | chỉ được hiển thị tại thời điểm tạo (ví dụ: trong quá trình biên dịch mã khác) |
VISIBILITY_RUNTIME | 0x01 | dự kiến sẽ hiển thị trong thời gian chạy |
VISIBILITY_SYSTEM | 0x02 | dự kiến sẽ hiển thị trong thời gian chạy, nhưng chỉ đối với hệ thống cơ bản (chứ không phải đối với mã người dùng thông thường) |
encoded_array_item
Được tham chiếu từ class_def_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: không có (căn chỉnh theo byte)
Tên | Định dạng | Mô tả |
---|---|---|
value | encoded_array | byte đại diện cho giá trị mảng được mã hoá, ở định dạng do "Định dạng encoded_array " chỉ định trong phần "Mã hoá encoded_value " ở trên.
|
hiddenapi_class_data_item
Phần này chứa dữ liệu về các giao diện bị hạn chế mà mỗi lớp sử dụng.
Lưu ý: Tính năng API ẩn được giới thiệu trong Android 10.0 và chỉ áp dụng cho các tệp DEX của các lớp trong đường dẫn lớp khởi động. Danh sách cờ được mô tả bên dưới có thể được mở rộng trong các bản phát hành Android trong tương lai. Để biết thêm thông tin, hãy xem các hạn chế đối với giao diện không phải SDK.
Tên | Định dạng | Mô tả |
---|---|---|
size | uint | tổng kích thước của phần |
offsets | uint[] | mảng gồm các độ lệch được lập chỉ mục theo class_idx .
Một mục nhập mảng bằng 0 tại chỉ mục class_idx có nghĩa là không có dữ liệu cho class_idx này hoặc tất cả cờ API ẩn đều bằng 0.
Nếu không, mục nhập mảng sẽ khác 0 và chứa một độ lệch từ đầu phần đến một mảng cờ API ẩn cho class_idx này.
|
flags | uleb128[] | các mảng được nối của cờ API ẩn cho mỗi lớp. Các giá trị cờ có thể có được mô tả trong bảng dưới đây. Các cờ được mã hoá theo cùng thứ tự như các trường và phương thức được mã hoá trong dữ liệu lớp. |
Các loại cờ hạn chế:
Tên | Giá trị | Mô tả |
---|---|---|
danh sách cho phép | 0 | Những giao diện có thể sử dụng thoải mái và được hỗ trợ trong Chỉ mục gói (Package Index) trong tài liệu chính thức của khung Android. |
danh sách xám | 1 | Những giao diện không phải SDK có thể được sử dụng bất kể cấp độ API mục tiêu của ứng dụng. |
chặn quyền truy cập | 2 | Những giao diện không phải SDK mà bạn không thể sử dụng, bất kể cấp độ API mục tiêu của ứng dụng. Việc truy cập vào một trong những giao diện này sẽ gây ra lỗi thời gian chạy. |
greylist‑max‑o | 3 | Những giao diện không phải SDK có thể dùng cho Android 8.x trở xuống, trừ phi chúng bị hạn chế. |
greylist‑max‑p | 4 | Các giao diện không phải SDK có thể dùng cho Android 9.x, trừ phi chúng bị hạn chế. |
greylist‑max‑q | 5 | Các giao diện không phải SDK có thể dùng cho Android 10.x, trừ phi chúng bị hạn chế. |
greylist‑max‑r | 6 | Các giao diện không phải SDK có thể dùng cho Android 11.x, trừ phi bị hạn chế. |
Chú thích hệ thống
Chú thích hệ thống được dùng để biểu thị nhiều phần thông tin phản chiếu về các lớp (cũng như phương thức và trường). Thông thường, mã ứng dụng (không phải hệ thống) chỉ truy cập gián tiếp vào thông tin này.
Chú thích hệ thống được biểu thị trong các tệp .dex
dưới dạng chú thích có chế độ hiển thị được đặt thành VISIBILITY_SYSTEM
.
dalvik.annotation.AnnotationDefault
Xuất hiện trên các phương thức trong giao diện chú giải
Chú thích AnnotationDefault
được đính kèm vào mỗi giao diện chú thích muốn cho biết các liên kết mặc định.
Tên | Định dạng | Mô tả |
---|---|---|
value | Annotation | các liên kết mặc định cho chú thích này, được biểu thị dưới dạng một chú thích thuộc loại này. Chú thích không cần bao gồm tất cả các tên do chú thích xác định; những tên bị thiếu sẽ không có giá trị mặc định. |
dalvik.annotation.EnclosingClass
Xuất hiện trên các lớp học
Chú thích EnclosingClass
được đính kèm vào mỗi lớp được xác định là thành phần của một lớp khác, hoặc là ẩn danh nhưng không được xác định trong phần nội dung phương thức (ví dụ: một lớp bên trong giả tạo). Mọi lớp có chú giải này cũng phải có chú giải InnerClass
. Ngoài ra, một lớp không được có cả chú giải EnclosingClass
và EnclosingMethod
.
Tên | Định dạng | Mô tả |
---|---|---|
value | Lớp | lớp có phạm vi từ vựng gần nhất với lớp này |
dalvik.annotation.EnclosingMethod
Xuất hiện trên các lớp học
Chú thích EnclosingMethod
được đính kèm vào mỗi lớp được xác định bên trong phần nội dung phương thức. Mọi lớp có chú giải này cũng phải có chú giải InnerClass
.
Ngoài ra, một lớp không được có cả chú giải EnclosingClass
và EnclosingMethod
.
Tên | Định dạng | Mô tả |
---|---|---|
value | Phương thức | phương thức có phạm vi từ vựng gần nhất với lớp này |
dalvik.annotation.InnerClass
Xuất hiện trên các lớp học
Chú thích InnerClass
được đính kèm vào mỗi lớp được xác định trong phạm vi từ vựng của định nghĩa lớp khác.
Mọi lớp có chú thích này cũng phải có một trong hai chú thích EnclosingClass
hoặc chú thích EnclosingMethod
.
Tên | Định dạng | Mô tả |
---|---|---|
tên | Chuỗi | tên đơn giản được khai báo ban đầu của lớp này (không bao gồm tiền tố gói nào). Nếu lớp này là lớp ẩn danh, thì tên sẽ là null .
|
accessFlags | int | cờ truy cập được khai báo ban đầu của lớp (có thể khác với cờ hiệu quả do sự không khớp giữa các mô hình thực thi của ngôn ngữ nguồn và máy ảo đích) |
dalvik.annotation.MemberClasses
Xuất hiện trên các lớp học
Chú thích MemberClasses
được đính kèm vào mỗi lớp khai báo các lớp thành phần. (Lớp thành viên là một lớp bên trong trực tiếp có tên.)
Tên | Định dạng | Mô tả |
---|---|---|
value | Class[] | mảng của các lớp thành viên |
dalvik.annotation.MethodParameters
Xuất hiện trên các phương thức
Lưu ý: Chú thích này được thêm sau Android 7.1. Sự hiện diện của nó trên các bản phát hành Android trước đó sẽ bị bỏ qua.
Chú thích MethodParameters
là không bắt buộc và có thể dùng để cung cấp siêu dữ liệu tham số, chẳng hạn như tên tham số và đối tượng sửa đổi.
Bạn có thể bỏ qua chú giải này một cách an toàn trong một phương thức hoặc hàm khởi tạo khi không cần siêu dữ liệu tham số trong thời gian chạy.
Bạn có thể dùng java.lang.reflect.Parameter.isNamePresent()
để kiểm tra xem một tham số có siêu dữ liệu hay không, và các phương thức phản chiếu được liên kết (chẳng hạn như java.lang.reflect.Parameter.getName()
) sẽ quay lại hành vi mặc định trong thời gian chạy nếu không có thông tin.
Khi đưa siêu dữ liệu tham số vào, trình biên dịch phải đưa thông tin vào các lớp được tạo, chẳng hạn như enum, vì siêu dữ liệu tham số bao gồm cả việc một tham số có phải là tham số tổng hợp hay bắt buộc hay không.
Chú thích MethodParameters
chỉ mô tả các tham số phương thức riêng lẻ. Do đó, trình biên dịch có thể bỏ qua hoàn toàn chú thích cho các hàm khởi tạo và phương thức không có tham số, vì mục đích kích thước mã và hiệu quả thời gian chạy.
Các mảng được ghi lại bên dưới phải có cùng kích thước với cấu trúc dex method_id_item
được liên kết với phương thức, nếu không, java.lang.reflect.MalformedParametersException
sẽ được truyền trong thời gian chạy.
Tức là: method_id_item.proto_idx
-> proto_id_item.parameters_off
-> type_list.size
phải giống với names().length
và accessFlags().length
.
Vì MethodParameters
mô tả tất cả các tham số phương thức chính thức, ngay cả những tham số không được khai báo rõ ràng hoặc ngầm định trong mã nguồn, kích thước của các mảng có thể khác với Chữ ký hoặc thông tin siêu dữ liệu khác chỉ dựa trên các tham số rõ ràng được khai báo trong mã nguồn. MethodParameters
cũng sẽ không bao gồm bất kỳ thông tin nào về các tham số của đối tượng nhận chú thích kiểu không tồn tại trong chữ ký phương thức thực tế.
Tên | Định dạng | Mô tả |
---|---|---|
tên | String[] | Tên của các tham số chính thức cho phương thức được liên kết. Mảng không được rỗng nhưng phải trống nếu không có tham số chính thức. Giá trị trong mảng phải là giá trị rỗng nếu tham số chính thức có chỉ mục đó không có tên. Nếu chuỗi tên tham số bị trống hoặc chứa ".", ";", "[" hoặc "/" thì java.lang.reflect.MalformedParametersException sẽ được truyền tại thời gian chạy.
|
accessFlags | int[] | Cờ truy cập của các tham số chính thức cho phương thức được liên kết. Mảng không được rỗng nhưng phải trống nếu không có tham số chính thức. Giá trị là một mặt nạ bit có các giá trị sau:
java.lang.reflect.MalformedParametersException sẽ được gửi trong thời gian chạy.
|
dalvik.annotation.Signature
Xuất hiện trên các lớp, trường và phương thức
Chú thích Signature
được đính kèm vào mỗi lớp, trường hoặc phương thức được xác định theo một loại phức tạp hơn so với loại có thể biểu thị bằng type_id_item
. Định dạng .dex
không xác định định dạng cho chữ ký; định dạng này chỉ nhằm mục đích có thể biểu thị bất kỳ chữ ký nào mà ngôn ngữ nguồn yêu cầu để triển khai thành công ngữ nghĩa của ngôn ngữ đó. Do đó, các chữ ký thường không được các hoạt động triển khai máy ảo phân tích cú pháp (hoặc xác minh). Các chữ ký chỉ được chuyển cho các API và công cụ cấp cao hơn (chẳng hạn như trình gỡ lỗi). Do đó, mọi hoạt động sử dụng chữ ký đều phải được viết sao cho không đưa ra bất kỳ giả định nào về việc chỉ nhận được chữ ký hợp lệ, đồng thời tự bảo vệ một cách rõ ràng trước khả năng gặp phải chữ ký không hợp lệ về mặt cú pháp.
Vì chuỗi chữ ký có xu hướng có nhiều nội dung trùng lặp, nên chú thích Signature
được xác định là một mảng gồm các chuỗi, trong đó các phần tử trùng lặp tự nhiên đề cập đến cùng một dữ liệu cơ bản và chữ ký được coi là sự nối kết của tất cả các chuỗi trong mảng. Không có quy tắc nào về cách tách chữ ký thành các chuỗi riêng biệt; điều đó hoàn toàn tuỳ thuộc vào các công cụ tạo tệp .dex
.
Tên | Định dạng | Mô tả |
---|---|---|
value | String[] | chữ ký của lớp hoặc thành viên này, dưới dạng một mảng gồm các chuỗi sẽ được nối với nhau |
dalvik.annotation.Throws
Xuất hiện trên các phương thức
Chú thích Throws
được đính kèm vào mỗi phương thức được khai báo để truyền một hoặc nhiều loại ngoại lệ.
Tên | Định dạng | Mô tả |
---|---|---|
value | Class[] | mảng các loại ngoại lệ được gửi |