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 dùng để lưu giữ một tập hợp các định nghĩa lớp và dữ liệu bổ trợ liên quan.
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 8 bit không dấu |
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 32 bit có dấu, little-endian |
uint | Số nguyên 32 bit không dấu, little-endian |
long | Số nguyên có dấu 64 bit, little-endian |
ulong | Số nguyên không dấu 64 bit, little-endian |
sleb128 | LEB128 đã ký, có độ dài biến (xem bên dưới) |
uleb128 | LEB128 chưa ký, có độ dài biến đổi (xem bên dưới) |
uleb128p1 | LEB128 chưa ký cộng với 1 , có độ dài biến đổi (xem bên dưới) |
LEB128
LEB128 ("Little-Endian Base 128") là một mã hoá có độ dài biến đổi cho các số lượng số nguyên có dấu hoặc không dấu tuỳ ý. Định dạng này được lấy 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. Mỗi byte có bit quan trọng nhất được đặt, ngoại trừ byte cuối cùng trong trình tự, byte này có bit quan trọng nhất được xoá. 7 bit còn lại của mỗi byte là tải trọng, với 7 bit có giá trị í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 trình tự đượ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 sẽ được diễn giải là 0
.
Sơ đồ bit của giá trị LEB128 hai 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à cộng một được mã hoá dưới dạng uleb128
. Điều này làm cho quá trình mã hoá -1
(còn được gọi là giá trị chưa ký 0xffffffff
) – nhưng không có số âm nào khác – một byte duy nhất và rất 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 cho phép giá trị âm nào khác (hoặc không cần đến các giá trị lớn chưa ký).
Dưới đây là một số ví dụ về định dạng:
Trình tự đã mã hoá | Dưới dạng sleb128 |
Dưới dạng uleb128 |
Dưới dạng 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 việc đặt tên nội bộ (ví dụ: chỉ số kiểu) hoặc dưới dạng đối tượng hằng số được 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 nhạy cảm với ngôn ngữ) và không được chứa bất kỳ mục trùng lặp nào. |
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, آرایه hoặc loại gố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 theo chỉ mục string_id và không được chứa mục nhập trùng lặp.
|
proto_ids | proto_id_item[] | danh sách giá trị nhận dạng nguyên mẫu phương thức. Đây là giá trị nhận dạng cho tất cả các nguyên mẫu mà tệp này tham chiếu đến. Danh sách này phải được sắp xếp theo thứ tự chính là loại dữ liệu trả về (theo chỉ mục type_id ), sau đó là theo danh sách đối số (sắp xếp theo thứ tự từ vựng, 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 mục nhập trùng lặp.
|
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 tham chiếu đến, cho dù có đượ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 mục trùng lặp.
|
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ó đượ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 mục nhập trùng lặp.
|
class_defs | class_def_item[] | danh sách định nghĩa lớp. Các lớp phải được sắp xếp sao cho lớp cha và giao diện đã triển khai của một lớp nhất định xuất hiện trong danh sách sớm hơn lớp tham chiếu. Hơn nữa, một định nghĩa cho lớp có cùng tên không được xuất hiệ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 vị trí gọi. Đây là giá trị nhận dạng cho tất cả các vị trí gọi mà tệp này tham chiếu đến, cho dù có đượ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 phương thức xử lý. Danh sách tất cả các tay điều khiển phương thức được tệp này tham chiếu, cho dù có đượ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 mục trùng lặp tương ứng về mặt logic với các thực thể xử lý phương thức khác nhau. |
khác | 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 căn chỉnh khác nhau và các byte khoảng đệm được chèn trước mỗi mục nếu cần để đạt đượ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. Tài liệu này không chỉ định định dạng của dữ liệu trong phần này. Phần này trống trong các tệp chưa được 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 khi 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 với mục tiêu 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 thực tế. Định dạng mới chủ yếu chỉ là nối các tệp theo định dạng trướ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 hàm này để lặp lại trên tất cả các tệp logic trong vùng chứa.- Tệp dex logic có thể tham chiếu đến bất kỳ dữ liệu nào 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 các tệp.
- Tất cả các độ dời đều tương ứng với tệp thực. Không có độ dời nào tương ứng với tiêu đề. Điều này đảm bảo rằng các phần có độ dời có thể được chia sẻ giữa các tệp logic.
- Tiêu đề thêm hai trường mới để mô tả các giới hạn 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 bạn dễ dàng chuyển mã sang định dạng mới.
data_size
vàdata_off
hiện không được sử dụng. Dữ liệu có thể được phân bổ trên nhiều tệp logic và không nhất thiết phải liền nhau.
Đị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 hóc nhất định. Giá trị này cũng mã hoá số phiên bản định dạng dưới dạng ba chữ số thập phân, dự kiến sẽ tăng dần 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 ý: Tính năng hỗ trợ phiên bản 040
của định dạng này đã được thêm vào bản phát hành Android 10.0, mở rộng tập hợp các ký tự được phép trong SimpleNames.
Lưu ý: Tính năng hỗ trợ phiên bản 039
của định dạng này đã được thêm vào bản phát hành Android 9.0, trong đó giới thiệu hai 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 tập hợp 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 ý: Tính năng hỗ trợ phiên bản 038
của định dạng này đã được thêm vào bản phát hành Android 8.0. Phiên bản 038
đã thêm mã byte mới (invoke-polymorphic
và invoke-custom
) và dữ liệu cho các tay cầm phương thức.
Lưu ý: Tính năng hỗ trợ phiên bản 037
của định dạng này đã được thêm vào 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 sử 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 định dạng trước đó 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 chứa hằng số đó. Mặc dù định dạng .dex
tiêu chuẩn là little-endian, nhưng các phương thức triển khai có thể chọn thực hiện hoán đổi byte. Nếu một quá trình triển khai gặp phải 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ừ hình 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 bị thiếu.
Lưu ý: Giá trị này không được xác định là 0
, vì thực tế đó thường là một chỉ mục hợp lệ.
Giá trị đã chọn cho NO_INDEX
có thể được biểu thị dưới dạng một byte trong quá trình 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
Các trường bit của các cờ này được dùng để cho biết khả năng hỗ trợ 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 Lớp (và chú thích InnerClass ) |
Đối với trường | Đối với phương thức |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : hiển thị ở mọi nơi |
public : hiển thị ở mọi nơi |
public : hiển thị ở mọi nơi |
ACC_PRIVATE | 0x2 | private : chỉ hiển thị với lớp xác định
|
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ị với gói và lớp con
|
protected : hiển thị với gói và lớp con |
protected : hiển thị với gói và lớp con |
ACC_STATIC | 0x8 | static : không được tạo bằng tham chiếu this bên ngoài |
static : toàn cục để xác định lớp |
static : không nhận đối số this |
ACC_FINAL | 0x10 | final : không thể tạo lớp con |
final : không thể thay đổi sau khi tạo |
final : không thể ghi đè |
ACC_SYNCHRONIZED | 0x20 | synchronized : khoá liên kết được tự động thu nạp trong lệnh gọi đến phương thức này. Lưu ý: Bạn chỉ có thể đặt thuộc tính này khi cũng đặt |
||
ACC_VOLATILE | 0x40 | volatile : 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, được trình biên dịch tự động thêm vào dưới dạng một cầu nối an toàn về loại | ||
ACC_TRANSIENT | 0x80 | transient : không được lưu theo quy trình chuyển đổi tuần tự mặc định |
||
ACC_VARARGS | 0x80 | đối số cuối cùng phải được trình biên dịch coi là đối số "phần 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 bản sao trực tiếp |
abstract : lớp này chưa triển khai |
|
ACC_STRICT | 0x800 | strictfp : quy tắc nghiêm ngặt đối với phép tính 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 là lớp chú giải | ||
ACC_ENUM | 0x4000 | được khai báo là loại liệt kê | được khai báo dưới dạng giá trị liệt kê | |
(không dùng) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | phương thức hàm 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 việc thực thi (ngoại trừ việc phản ánh cờ này). |
InnerClass
và tuyệt đối không được bật trong class_def_item
.
Mã hoá UTF-8 đã sửa đổi
Để hỗ trợ dễ dàng hơn cho các phiên bản cũ, định dạng .dex
sẽ mã hoá dữ liệu chuỗi của nó ở 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 với UTF-8 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 phạm vi
U+10000
…U+10ffff
được mã hoá dưới dạng một cặp đại diện, mỗi cặp đại diện đượ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 hai byte. - Một byte rỗng thuần tuý (giá trị
0
) cho biết cuối chuỗi, cũng như cách diễn giải ngôn ngữ C chuẩn.
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 cho phép bạn đồng thời đưa điểm mã U+0000
vào một chuỗi và vẫn thao tác với điểm mã đó dưới dạng chuỗi kết thúc bằng ký tự rỗng kiểu C.
Tuy nhiên, việ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 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ả ký đúng cách của việc so sánh các chuỗi không bằng nhau.
Khi bạn quan tâm đến thứ tự (không chỉ là tính bằng nhau), cách đơn giản nhất để so sánh các chuỗi MUTF-8 là giải mã 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 một 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ề cách mã hoá ký tự. MUTF-8 thực sự gần với bộ mã hoá CESU-8 (tương đối ít được 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 dữ liệu có cấu trúc phân cấp (gần như) tuỳ ý được mã hoá. Mã hoá phải 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 của value ngay sau đó cùng với một đối số làm rõ không bắt buộc trong ba bit thứ tự cao.
Hãy xem bên dưới để biết các định nghĩa khác nhau của 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ó một số trường hợp ngoại lệ như được ghi chú bên dưới.
|
value | ubyte[] | byte đại diện cho giá trị, biến theo chiều dài và được diễn giải khác nhau cho 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 |
Định dạng value_arg |
Định dạng value |
Mô tả |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (không có; phải là 0 ) |
ubyte[1] | giá trị số nguyên một byte đã ký |
VALUE_SHORT | 0x02 | kích thước – 1 (0…1) | ubyte[size] | giá trị số nguyên hai byte có dấu, mở rộng dấu |
VALUE_CHAR | 0x03 | kích thước – 1 (0…1) | ubyte[size] | giá trị số nguyên hai byte chưa ký, mở rộng bằng 0 |
VALUE_INT | 0x04 | kích thước – 1 (0…3) | ubyte[size] | giá trị số nguyên có dấu 4 byte, mở rộng dấu |
VALUE_LONG | 0x06 | kích thước – 1 (0…7) | ubyte[size] | giá trị số nguyên 8 byte có dấu, mở rộng dấu |
VALUE_FLOAT | 0x10 | kích thước – 1 (0…3) | ubyte[size] | mẫu bit 4 byte, được mở rộng bằng 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 | kích thước – 1 (0…7) | ubyte[size] | mẫu bit 8 byte, mở rộng bằng 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 bốn byte chưa ký (mở rộng bằng 0), được hiểu là một chỉ mục vào phần proto_ids và đại diện cho giá trị loại phương thức
|
VALUE_METHOD_HANDLE | 0x16 | kích thước – 1 (0…3) | ubyte[size] | giá trị số nguyên bốn byte chưa ký (mở rộng bằng 0), được hiểu là một chỉ mục vào phần method_handles và đại diện cho giá trị tay cầm phương thức
|
VALUE_STRING | 0x17 | 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 hiểu là một chỉ mục vào 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 bốn byte chưa ký (mở rộng bằng 0), được hiểu là chỉ mục vào phần type_ids và đại diện cho 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 bốn byte chưa ký (mở rộng bằng 0), được hiểu là chỉ mục vào phần field_ids và đại diện cho 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 bốn byte chưa ký (mở rộng bằng 0), được hiểu là một chỉ mục vào phần method_ids và đại diện cho 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 bốn byte chưa ký (mở rộng bằng 0), được hiểu là chỉ mục vào phần field_ids và biểu thị giá trị của hằng số kiểu liệt kê
|
VALUE_ARRAY | 0x1c | (không có; phải là 0 ) |
encoded_array | một mảng các giá trị, ở định dạng do "định dạng encoded_array " chỉ định bên dưới. Kích thước của value được ngầm ẩn trong quá trình mã hoá.
|
VALUE_ANNOTATION | 0x1d | (không có; phải là 0 ) |
chú thích_đã_mã hoá | chú thích phụ, ở định dạng do "định dạng encoded_annotation " chỉ định bên dưới. Kích thước của value được ngầm ẩn 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 loạt trình tự size encoded_value theo định dạng do phần này chỉ định, được nối theo tuần tự.
|
định dạng chú thích được mã hoá
Tên | Định dạng | Mô tả |
---|---|---|
type_idx | uleb128 | loại chú thích. Đây phải là loại lớp (không phải mảng hoặc loại gốc). |
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ủa chú thích, được biểu thị trực tiếp cùng dòng (không phải dưới dạng độ dời). 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 chỉ mục vào phần string_ids . Chuỗi này 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 kiểu BNF sau đây cho biết cú pháp được chấp nhận cho các chuỗi này.
SimpleName
SimpleName là cơ sở cho cú pháp của tên các thành phần khác. Định dạng .dex
cho phép một lượng lớn thông tin ở đây (nhiều hơn nhiều so với hầu hết các ngôn ngữ nguồn phổ biến). Tóm lại, tên đơn giản bao gồm bất kỳ ký tự chữ cái hoặc chữ số ASCII thấp nào, một vài 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 Zs
của Unicode). 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 phương án thay thế cuối cùng của quy tắc cho SimpleNameChar) và các ký tự này phải được biểu thị trong tệp dưới dạng cặp điểm mã thay thế trong bộ 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 |
MemberName
do field_id_item và method_id_item sử dụng
MemberName là tên của một thành phần của lớp, thành phần là các 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 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 type_id_item sử dụng
TypeDescriptor (Loại dữ liệu) là đại diện cho bất kỳ loại nào, bao gồm cả các loại dữ liệu gốc, lớp, mảng và void
. Hãy xem phần 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 proto_id_item sử dụng
ShortyDescriptor là dạng ngắn gọn của 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ự khác biệt giữa các loại tham chiếu (lớp hoặc mảng). Thay vào đó, tất cả các loại tham chiế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 củ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 dữ liệu trả về |
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ể sử dụng đệ quy cho mảng-của-mảng, mặc dù không hợp lệ khi có nhiều hơn 255 phương diện.
|
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 tiêu đề
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 phần "DEX_FILE_MAGIC " để biết thêm chi tiết.
|
giá trị tổng kiểm | uint | Checksum adler32 của phần còn lại của tệp (mọi thứ ngoại 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ứ ngoại 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 ít nhất một số khả năng tương thích ngược/tương thích tiến bị hạn chế mà không làm mất hiệu lực của định dạng. phải là 0x70 (112) byte (phiên bản 40 trở xuống) phải là 0x78 (120) byte (phiên bản 41 trở lên) |
endian_tag | uint = ENDIAN_CONSTANT | thẻ endianness. Hãy xem phần thảo luận ở trên trong phần "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 | độ dời từ đầu tệp đến phần đường liên kết hoặc 0 nếu link_size == 0 . Độ lệch, nếu khác 0, phải là độ lệch vào phần link_data . Tài liệu này không chỉ định định dạng của dữ liệu được trỏ đến; trường tiêu đề này (và trường trước đó) được để lại dưới dạng các móc để các hoạt động triển khai thời gian chạy sử dụng.
|
map_off | uint | độ dời từ đầu tệp đến mục bản đồ. Độ lệch, phải là số 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 | độ dời 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 (công nhận là một trường hợp hiếm gặp). Độ dời, nếu khác 0, phải là ở đầu 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 | độ dời 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 (công nhận là một trường hợp hiếm gặp). Độ dời, nếu khác 0, phải là ở đầu 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 | độ dời từ đầ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 (chắc chắn là một trường hợp hiếm gặp). Độ dời, nếu khác 0, phải là ở đầu 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 | độ dời 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 . Độ dời, nếu không bằng 0, phải là ở đầu 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 | độ dời 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 . Độ dời, nếu không bằng 0, phải là ở đầu 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 | độ dời từ đầu tệp đến danh sách định nghĩa lớp hoặc 0 nếu class_defs_size == 0 (chắc chắn là một trường hợp hiếm gặp). Độ dời, nếu khác 0, phải là ở đầu phần class_defs .
|
data_size | uint |
Kích thước của phần Không dùng đến (phiên bản 41 trở lên) |
data_off | uint |
độ dời từ đầu tệp đến đầu mục Không dùng đến (phiên bản 41 trở lên) |
container_size | uint |
trường này không tồn tại. Bạn có thể giả định 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 các tiêu đề đó). (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 giá trị này bằng độ dời từ đầu tệp đến đầu tiêu đề này. (phiên bản 41 trở lên) |
danh_sách_bản_đồ
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ự. Phương thức này chứa một số thông tin dư thừa liên quan đến header_item
nhưng được thiết kế để trở thành một dạng thức dễ sử dụng nhằm lặp lại toàn bộ tệp. Một loại nhất định phải xuất hiện tối đa một lần trong một bản đồ, nhưng không có giới hạn nào về loại thứ tự có thể xuất hiện, ngoài các giới hạn ngụ ý của phần còn lại của định dạng (ví dụ: mục header
phải xuất hiện trước, theo sau là mục string_ids
, v.v.). Ngoài ra, các mục nhập bản đồ phải được sắp xếp theo độ dời 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 mục nhập |
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 của các mục; xem bảng bên dưới |
unused | ushort | (không dùng) |
size | uint | số lượng mục sẽ được tìm thấy tại độ dời đã chỉ định |
độ lệch | uint | độ dời từ đầu tệp đến các mục có liên quan |
Nhập mã
Loại mặt hàng | Hằng số | Giá trị | Kích thước 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 |
danh_sách_bản_đồ | 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 mục string_ids
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
string_data_off | uint | độ dời từ đầu tệp đến dữ liệu chuỗi cho mục này. Độ lệch 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 căn chỉnh nào đối với độ dời.
|
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 (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 đã mã hoá được ngụ ý theo vị trí của
bit 0 .) |
khác | ubyte[] | một loạt 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à thảo luận về định dạng dữ liệu.
Lưu ý: Bạn có thể chấp nhận một chuỗi chứa (biểu thức đã mã hoá của) các đơn vị mã thay thế UTF-16 (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 này 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à tham số của mục này.
|
return_type_idx | uint | chỉ mục vào danh sách type_ids cho loại dữ liệu trả về của nguyên mẫu này
|
parameters_off | uint | độ dời từ đầu tệp đến danh sách các loại thông số cho nguyên mẫu này hoặc 0 nếu nguyên mẫu này không có thông số. Độ lệch 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 nên có tham chiếu đến loại void trong danh sách.
|
field_id_item
Xuất hiện trong mục 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 đối tượng xác định của trường này. Đây phải là loại lớp chứ không phải mảng hoặc loại gốc.
|
type_idx | ushort | chỉ mục vào danh sách type_ids cho loại trường này
|
name_idx | uint | lập chỉ mục vào danh sách string_ids cho tên của trường này. Chuỗi này 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 mục 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 đối tượng xác định phương thức này. Đây phải là loại lớp hoặc mảng chứ không phải loại gốc.
|
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 này 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 | lập chỉ mục vào danh sách type_ids cho lớp này.
Đây phải là loại lớp chứ không phải mảng hoặc loại gốc.
|
access_flags | uint | cờ truy cập cho lớp (public , final , v.v.). Hãy xem phần "Định nghĩa access_flags " để 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à lớp này là lớp gốc, chẳng hạn như Object ). Nếu có, đây phải là loại lớp chứ không phải mảng hoặc loại gốc.
|
interfaces_off | uint | độ dời từ đầu tệp đến danh sách giao diện hoặc 0 nếu không có giao diện nào. Độ lệch này phải nằm trong mục 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 loại lớp (không phải mảng hoặc loại gốc) và không được có 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 gốc 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 | độ dời 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. Độ lệch 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 "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 định nghĩa.
|
class_data_off | uint | độ dời từ đầu tệp đến dữ liệu lớp 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ụ: trường hợp này có thể xảy ra nếu lớp này là một giao diện điểm đánh dấu.) Độ lệch, nếu khác 0, phải nằm trong phần data và dữ liệu ở đó phải ở đị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 định nghĩa.
|
static_values_off | uint | độ dời từ đầu tệp đến danh sách giá trị ban đầu cho các trường static hoặc 0 nếu không có (và tất cả các trường static sẽ được khởi tạo bằng 0 hoặc null ). Độ dời này phải nằm trong mục 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 mà lớp này khai báo và các phần tử tương ứng với các trường static theo thứ tự đã 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ử hơn số trường static trong mảng, 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 phần call_site_ids
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
call_site_off | uint | độ dời từ đầu tệp đến định nghĩa vị trí gọi. Độ lệch phải nằm trong mục dữ liệu và dữ liệu ở đó phải ở đị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 phương thức trình liên kết khởi động. Ba đối số đầu tiên là:
- Một tay cầm phương thức đại diện cho phương thức trình 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 sẽ phân giải (VALUE_STRING).
- 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à giá trị không đổi được truyền đến phương thức trình 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.
Tên phương thức đại diện cho phương thức trình liên kết khởi động phải có loại dữ liệ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
Loại tham số của mọi đối số bổ sung được xác định từ giá trị không đổi của các đối số đó.
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 tay cầm phương thức; xem bảng bên dưới |
unused | ushort | (không dùng) |
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 tên người dùng của phương thức là phương thức truy cập hay phương thức gọi |
unused | ushort | (không dùng) |
Mã loại phương thức xử lý
Hằng số | Giá trị | Mô tả |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0x00 | Phương thức xử lý là phương thức setter (truy cập) trường tĩnh |
METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | Phương thức xử lý là phương thức getter (truy cập) trường tĩnh |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | Phương thức xử lý là phương thức setter (truy cập) trường thực thể |
METHOD_HANDLE_TYPE_INSTANCE_GET | 0x03 | Phương thức xử lý là phương thức getter (truy cập) trường thực thể |
METHOD_HANDLE_TYPE_INVOKE_STATIC | 0x04 | Tay cầm phương thức là một phương thức gọi phương thức tĩnh |
METHOD_HANDLE_TYPE_INVOKE_INSTANCE | 0x05 | Phương thức xử lý là một phương thức gọi phương thức thực thể |
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR | 0x06 | Tay cầm phương thức là trình gọi phương thức hàm khởi tạo |
METHOD_HANDLE_TYPE_INVOKE_DIRECT | 0x07 | Phương thức xử lý là một phương thức gọi phương thức trực tiếp |
METHOD_HANDLE_TYPE_INVOKE_INTERFACE | 0x08 | Phương thức xử lý là một phương thức 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 đã xác định, được biểu thị dưới dạng một chuỗi các phần tử đã mã hoá. Các trường phải được sắp xếp theo field_idx theo thứ tự tăng dần.
|
instance_fields | trường_đã_mã_hoá[kích_thước_trường_của_phiên_bản] | các trường thực thể đã xác định, được biểu thị dưới dạng một chuỗi các phần tử đã mã hoá. Các trường phải được sắp xếp 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 static , private hoặc hàm khởi tạo nào), được biểu thị dưới dạng một trình tự các phần tử đã mã hoá. Các phương thức phải được sắp xếp 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 phải static , private hoặc hàm khởi tạo), được biểu thị dưới dạng một trình tự các phần tử đã mã hoá. Danh sách này không được bao gồm các phương thức kế thừa, trừ phi lớp mà mục này đại diện ghi đè các phương thức đó. 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 phương thức ảo phải không giố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ử phải tham chiếu đến cùng một lớp xác định.
định dạng trườ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à chỉ số mô tả), được biểu thị dưới dạng sự 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 "Định nghĩa access_flags " để 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à chỉ số mô tả), được biểu thị dưới dạng sự khác biệt 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 "Định nghĩa access_flags " để biết thông tin chi tiết.
|
code_off | uleb128 | độ dời 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 . Độ lệch 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 mục nhập |
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ố từ của đối số đến phương thức mà mã này dành cho |
outs_size | ushort | số từ của không gian đối số gửi đi mà mã này yêu cầu để gọi phương thức |
tries_size | ushort | số lượng try_item cho thực thể này. Nếu không bằng 0, thì các giá trị này sẽ xuất hiện dưới dạng mảng tries ngay sau insns trong thực thể 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 nào. Độ lệch, nếu khác 0, phải là một 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 hướng 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 mã trong mảng insns được chỉ định bởi 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 bốn byte. Ngoài ra, nếu tệp này nằm trong tệp hoán đổi endian, thì việc hoán đổi sẽ 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 khoảng đệm để căn chỉnh tries thà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ẻ.
|
thử | try_item[tries_size] (không bắt buộc) | mảng cho biết vị trí trong mã 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 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 catch và địa chỉ trình xử lý liên kết. Mỗi try_item có một độ dời 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ã được bao phủ bởi mục nhập này. Địa chỉ là số lượng đơn vị mã 16 bit tính từ đầu lệnh được bao phủ đầu tiên. |
insn_count | ushort | số lượng đơn vị mã 16 bit được mục nhập này bao gồm. Đơn vị mã cuối cùng được bao phủ (bao gồm) là start_addr + insn_count - 1 .
|
handler_off | ushort | độ dời tính bằng byte từ đầu encoded_catch_hander_list được liên kết đến encoded_catch_handler cho mục nhập này. Đây phải là một độ dời đến đầu 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 mục |
danh sách | encoded_catch_handler[handlers_size] | danh sách thực tế của các danh sách trình xử lý, được biểu thị trực tiếp (không phải là độ dời) 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 catch trong danh sách này. Nếu không dương, thì đây là số lượng loại catch âm và các catch sẽ theo sau một trình xử lý catch-all. Ví dụ: size của 0 có nghĩa là có một hàm xử lý tất cả nhưng không có hàm xử lý được nhập rõ ràng.
size của 2 có nghĩa là có hai lệnh bắt được nhập rõ ràng và không có lệnh bắt tất cả. Và size của -1 có nghĩa là có một phương thức xử lý ngoại lệ được nhập cùng với một phương thức xử lý ngoại lệ chung.
|
trình xử lý | encoded_type_addr_pair[abs(size)] | luồng các mục được mã hoá abs(size) , mỗi mục cho một loại được phát hiện, theo thứ tự 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ý tổng hợp. 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 phát hiện
|
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á bằng byte lấy cảm hứng từ DWARF3. Khi được diễn giải, máy trạng thái này sẽ phát ra bảng vị trí và (có thể) thông tin biến cục bộ cho code_item
. Trình tự bắt đầu bằng một tiêu đề có độ dài biến đổ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ị độ dời 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 trình tự debug_info
và chỉ được tăng dần.
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. Giá trị này được khởi tạo trong tiêu đề trình tự và có thể thay đổi theo hướng dương hoặc âm nhưng không được nhỏ hơn 1
. Thanh ghi source_file
đại diện cho tệp nguồn mà các mục nhập 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ờ boolean (được khởi tạo thành false
) cho biết liệu vị trí tiếp theo được phát có được coi là lời mở đầu hay lời 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 đại diện cho mục nhập vị trí thực tế.
|
kích_thước_tham_ số | uleb128 | số lượng tên tham số được mã hoá. Mỗi tham số phương thức phải có một tham số, ngoại trừ 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ị đã 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ó) | chấm dứt một trình tự 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 thanh ghi địa chỉ |
chuyển tiếp thanh ghi địa chỉ mà không phát ra mục nhập vị trí |
DBG_ADVANCE_LINE | 0x02 | sleb128 line_diff | line_diff : số lượng thay đổi đăng ký dòng |
chuyển tiếp thanh ghi dòng mà không phát ra 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ứacục bộ name_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ị đó không xác định.
|
DBG_START_LOCAL_EXTENDED | 0x04 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx uleb128p1 sig_idx |
register_num : đăng ký sẽ chứacục bộ name_idx : chỉ mục chuỗi của têntype_idx : chỉ mục loại của loạisig_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.
Bất kỳ giá trị nào trong số name_idx , type_idx hoặc sig_idx đều có thể là NO_INDEX để cho biết giá trị đó không xác định. (Tuy nhiên, nếu sig_idx là -1 , thì cùng một dữ liệu có thể được biểu thị hiệu quả hơn bằng cách sử dụng mã opcode 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ý chứa địa phương |
đánh dấu một biến cục bộ đ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 địa phương gần đây nhất đang hoạt động trong vùng đă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 vào phải được coi là phần cuối của lời mở đầu phương thức (một vị trí thích hợp cho điểm ngắt phương thức). Bất kỳ mã opcode đặc biệt (>= 0x0a ) nào cũng sẽ xoá thanh ghi prologue_end .
|
|
DBG_SET_EPILOGUE_BEGIN | 0x08 | (không có) | đặt thanh ghi máy trạng thái epilogue_begin , cho biết rằng mục nhập vị trí tiếp theo được thêm vào phải đượ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 ngưng thực thi trước khi thoát phương thức).
Bất kỳ mã opcode đặc biệt (>= 0x0a ) nào cũng 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
|
cho biết 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
|
Mã opcode đặc biệt | 0x0a…0xff | (không có) | chuyển tiếp các thanh ghi line và address , phát một mục nhập vị trí và xoá prologue_end và epilogue_begin . Hãy xem phần mô tả bên dưới.
|
Mã opcode đặc biệt
Mã opcode có giá trị từ 0x0a
đến 0xff
(bao gồm cả) sẽ di chuyển cả thanh ghi line
và address
một lượng nhỏ, sau đó phát một mục nhập bảng vị trí mới.
Công thức cho các giá trị gia 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 | độ dời từ đầu tệp đến các 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.
Độ lệch, nếu khác 0, 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.
|
fields_size | uint | số lượng trường được chú thích bằng mục này |
annotated_methods_size | uint | số lượng phương thức được chú thích bằng 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 các 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 .
|
chú thích_phương_thức | method_annotation[methods_size] (không bắt buộc) | danh sách 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 .
|
chú thích_tham số | 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ử 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 | độ dời từ đầu tệp đến danh sách chú thích cho trường. Độ lệch 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 chú thích_phương_thức
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 | độ dời từ đầu tệp đến danh sách chú thích cho phương thức. Độ lệch 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ó tham số đang được chú giải
|
annotations_off | uint | độ dời từ đầu tệp đến danh sách chú thích cho các tham số phương thức. Độ lệch 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 mục nhập |
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 | độ dời 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.
Độ lệch, nếu khác 0, 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.
|
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] | 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 | độ dời 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 | chế độ hiển thị dự kiến của chú thích này (xem bên dưới) |
chú thích | chú thích_đã_mã hoá | nội dung chú thích đã 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ị
Dưới đây là các tuỳ 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 bản dựng (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ự định hiển thị trong thời gian chạy, nhưng chỉ cho hệ thống cơ bản (và không phải cho 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 đã mã hoá, ở định dạng do "encoded_array Format" (Định dạng encoded_array ) chỉ định trong phần "encoded_value Encoding" (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 |
độ dời | uint[] | mảng các độ dời được lập chỉ mục bằng class_idx .
Mục nhập mảng rỗng 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 độ dời từ đầu phần đến một mảng cờ API ẩn cho class_idx này.
|
flags | uleb128[] | các mảng 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 thứ tự giống 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 trắng | 0 | Các giao diện có thể sử dụng thoải mái và được hỗ trợ trong khung Chỉ mục gói (Package Index) trong tài liệu chính thức của 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 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 các giao diện này sẽ gây ra lỗi thời gian chạy. |
greylist‑max‑o | 3 | Các giao diện không phải SDK có thể dùng cho Android 8.x trở xuống, trừ phi các giao diện đó 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 các giao diện đó bị hạn chế. |
greylist‑max‑q | 5 | Các giao diện không phải SDK có thể được sử dụng cho Android 10.x, trừ phi các giao diện đó bị hạn chế. |
greylist‑max‑r | 6 | Các giao diện không phải SDK có thể được sử dụng cho Android 11.x, trừ phi các giao diện đó 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 ánh về các lớp (và phương thức và trường). Thông tin này thường chỉ được mã ứng dụng (không phải hệ thống) truy cập gián tiếp.
Chú thích hệ thống được biểu thị trong 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ú thích
Chú thích AnnotationDefault
được đính kèm vào mỗi giao diện chú thích muốn chỉ định 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ả tên do chú thích xác định; các tên bị thiếu chỉ đơn giản là không có giá trị mặc định. |
dalvik.annotation.EnclosingClass
Xuất hiện trên các lớp
Chú thích EnclosingClass
được đính kèm vào mỗi lớp được xác định là thành viên của một lớp khác hoặc là lớp ẩn danh nhưng không được xác định trong phần nội dung của phương thức (ví dụ: lớp bên trong tổng hợp). Mọi lớp có chú thích này cũng phải có chú thích InnerClass
. Ngoài ra, một lớp không được có cả chú thích 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
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 của 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ú thích 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
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 của một lớp khác.
Mọi lớp có chú thích này cũng phải có một 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 bất kỳ tiền tố gói nào). Nếu lớp này là ẩn danh, thì tên lớp sẽ là null .
|
accessFlags | int | cờ truy cập ban đầu được khai báo của lớp (có thể khác với cờ hiệu lực do 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 mục tiêu) |
dalvik.annotation.MemberClasses
Xuất hiện trên các lớp
Chú thích MemberClasses
được đính kèm vào mỗi lớp khai báo các lớp thành viên. (Lớp thành phần là một lớp bên trong trực tiếp có tên.)
Tên | Định dạng | Mô tả |
---|---|---|
value | Lớp[] | mảng 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 vào sau Android 7.1. Sự hiện diện của tệp này 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ể được dùng để cung cấp siêu dữ liệu tham số như tên tham số và đối tượng sửa đổi.
Bạn có thể bỏ qua chú giải khỏi một phương thức hoặc hàm khởi tạo một cách an toàn khi siêu dữ liệu tham số không bắt buộc trong thời gian chạy.
Bạn có thể dùng java.lang.reflect.Parameter.isNamePresent()
để kiểm tra xem siêu dữ liệu có tồn tại cho một tham số hay không và các phương thức phản chiếu liên quan 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 cho các lớp được tạo như enum, vì siêu dữ liệu tham số cho biết liệu một tham số có phải là 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ì kích thước mã và hiệu suất 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
liên kết với phương thức, nếu không, java.lang.reflect.MalformedParametersException
sẽ được gửi vào 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 ẩn trong mã nguồn, nê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 trình nhận chú thích loại 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 آرایه phải là 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ố trống hoặc chứa ".", ";', "[" hoặc "/", thì java.lang.reflect.MalformedParametersException sẽ được gửi trong 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ị này 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 sang 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 trường hợp sử dụng chữ ký đều phải được viết để không đưa ra bất kỳ giả định nào về việc chỉ nhận được chữ ký hợp lệ, bảo vệ rõ ràng bản thân khỏi khả năng gặp phải chữ ký không hợp lệ về cú pháp.
Vì các chuỗi chữ ký thườ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 các chuỗi, trong đó các phần tử trùng lặp tự nhiên tham chiếu đến cùng một dữ liệu cơ bản và chữ ký được coi là chuỗi nối 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 một chữ ký thành các chuỗi riêng biệt; điều đó hoàn toàn phụ 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 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 để gửi một hoặc nhiều loại ngoại lệ.
Tên | Định dạng | Mô tả |
---|---|---|
value | Lớp[] | mảng các loại ngoại lệ được gửi |