Tài liệu này mô tả bố cục và nội dung của .dex
tệp này được dùng để lưu trữ một tập hợp các định nghĩa về lớp và
dữ liệu bổ trợ.
Hướng dẫn về các loại
Tên | Mô tả |
---|---|
byte | Int đã đăng nhập 8 bit |
ubyte | Số nguyên 8 bit không dấu |
ngắn | Int đã đăng nhập 16 bit, Little-endian |
CANNOT TRANSLATE | Int không dấu 16 bit, Little-endian |
int | Int đã đăng nhập 32 bit, Little-endian |
CANNOT TRANSLATE | Int không dấu 32 bit, Little-endian |
long | Int đã đăng nhập 64 bit, Little-endian |
châu Long | Int không dấu 64 bit, Little-endian |
sleb128 | LEB128 đã ký, độ dài thay đổi (xem bên dưới) |
uleb128 | LEB128 không dấu, độ dài thay đổi (xem bên dưới) |
uleb128p1 | LEB128 không dấu cộng với 1 , độ dài biến (xem bên dưới) |
128 euro
LEB128 ("Little-Endian Base 128") là
phương pháp mã hoá có độ dài biến thiên cho
đại lượng số nguyên tuỳ ý đã ký hoặc chưa ký. Định dạng là
mượn từ DWARF3
đặc điểm kỹ thuật. Trong một tệp .dex
, LEB128 chỉ được dùng để
mã hoá số lượng 32 bit.
Mỗi giá trị được mã hoá LEB128 bao gồm từ một đến năm
byte, cùng nhau đại diện cho một giá trị 32 bit duy nhất. Một
byte có tập hợp bit quan trọng nhất ngoại trừ byte cuối cùng trong
mà có ý nghĩa rõ ràng nhất. Phần còn lại
7 bit của mỗi byte là tải trọng, trong đó 7 bit có ý nghĩa nhỏ nhất
bit số lượng trong byte đầu tiên, bảy bit tiếp theo trong byte thứ hai
byte, 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 là
mở rộng để 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
được diễn giải là 0
.
Sơ đồ bitwise của giá trị LEB128 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 để đại diện cho một biến thể đã ký
giá trị, trong đó đại diện là giá trị cộng một được mã hoá
dưới dạng uleb128
. Thao tác này khiến quá trình mã hoá -1
(thường được coi là giá trị không dấu 0xffffffff
)
— nhưng không có số âm nào khác — một byte và là
hữu ích chính xác trong những trường hợp mà số được đại diện phải
không được là số âm hoặc -1
(hoặc 0xffffffff
),
và không cho phép giá trị âm nào khác (hoặc khi không có dấu lớn
không có khả năng cần thiết).
Dưới đây là một số ví dụ về các định dạng:
Trình tự được mã hóa | Dưới tên sleb128 |
Dưới tên uleb128 |
Dưới tên uleb128p1 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 giây | -128 | 16256 | 16255 |
Bố cục tệp
Tên | Định dạng | Mô tả |
---|---|---|
tiêu đề | tiêu_đề_mục_hàng | tiêu đề |
string_ids (mã_chuỗi) | string_id_item[] | danh sách giá trị nhận dạng chuỗi. Đây là các giá trị nhận dạng cho tất cả các chuỗi mà tệp này sử dụng, để đặt tên nội bộ (ví dụ: mã mô tả loại) hoặc dưới dạng đối tượng không đổi đượ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 giá trị điểm mã UTF-16 (không phải ở dạng phân biệt theo ngôn ngữ) và không được chứa bất kỳ mục nhập trùng lặp nào. |
id_loại | loại_mã_mặt_hàng[] | danh sách mã 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 hàm) được tham chiếu bởi tệp này, dù đã được định nghĩa
trong tệp hay không. Danh sách này phải được sắp xếp theo string_id
chỉ mục và chỉ mục không được chứa bất kỳ mục nhập trùng lặp nào.
|
proto_id | proto_id_item[] | danh sách giá trị nhận dạng nguyên mẫu của phương thức. Đây là các giá trị nhận dạng cho tất 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 loại trả về (theo chỉ mục type_id ), sau đó
theo danh sách đối số (thứ tự từ điển, đố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.
|
mã_trường | trường_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
tham chiếu đến tệp này, dù có được xác định trong tệp hay không. Chiến dịch này
danh sách phải được sắp xếp, trong đó loại xác định (theo type_id
chỉ mục) là đơn đặt hàng 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à đơn đặt hàng phụ. Danh sách này không được chứa bất kỳ mục nhập trùng lặp nào.
|
mã_phương_ thức | method_id_item[] | danh sách giá trị nhận dạng phương thức. Đây là các giá trị nhận dạng cho tất cả phương thức
tham chiếu đến tệp này, dù có được xác định trong tệp hay không. Chiến dịch này
danh sách phải được sắp xếp, trong đó loại xác định (theo type_id
chỉ mục) là thứ tự chính, tên phương thức (theo string_id
chỉ mục) là thứ tự trung gian và nguyên mẫu phương thức (theo
Chỉ mục proto_id ) là thứ tự nhỏ. Danh sách không được
chứa bất kỳ mục nhập trùng lặp nào.
|
lớp_def | class_def_item[] | danh sách định nghĩa lớp. Các lớp phải được sắp xếp sao cho một giá trị lớp cấp cao của lớp và giao diện đã triển khai sẽ xuất hiện trong sớm hơn lớp giới thiệu. Ngoài ra, URL này không hợp lệ đối với một định nghĩa cho lớp cùng tên xuất hiện nhiều lần trong danh sách. |
call_site_ids (mã_trang_web) | call_site_id_item[] cho mã_trang_web[] | danh sách giá trị nhận dạng trang web cuộc gọi. Đây là những giá trị nhận dạng cho tất cả các trang web cuộc gọi
tham chiếu đến tệp này, 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 call_site_off .
|
method_handles | method_handle_item[] | phương thức xử lý danh sách. Danh sách tất cả các tên người dùng phương thức được tệp này tham chiếu đến, 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 bản sao sẽ tương ứng về mặt logic với các thực thể xử lý phương thức khác nhau. |
data | 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ó yêu cầu căn chỉnh khác nhau và các byte khoảng đệm sẽ được chèn trước mỗi mục nếu cần để đạt được căn chỉnh thích hợp. |
dữ liệu_đường_liên_kết | ubyte[] | dùng trong các tệp được liên kết tĩnh. Định dạng của dữ liệu trong phần này chưa được tài liệu này chỉ định. Phần này bị trống trong các tệp chưa liên kết và các phương thức triển khai thời gian chạy có thể sử dụng nếu thấy phù hợp. |
Định nghĩa trường bit, chuỗi và hằng số
DEX_FILE_MAGIC
Được nhúng trong header_item
Mảng/chuỗi không đổi DEX_FILE_MAGIC
là danh sách
byte phải xuất hiện ở đầu tệp .dex
để được công nhận như vậy. Giá trị được thiết kế một cách có chủ đích
chứa một dòng mới ("\n"
hoặc 0x0a
) và một
byte rỗng ("\0"
hoặc 0x00
) để trợ giúp
trong việc phát hiện một số hình thức tham nhũng nhất định. Giá trị cũng
mã hoá số phiên bản định dạng dưới dạng ba chữ số thập phân, tức là
dự kiến sẽ tăng đơn điệu theo thời gian khi định dạng này phát triển.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
Lưu ý: Hỗ trợ cho phiên bản 039
của
đã được thêm vào bản phát hành Android 9.0, giới thiệu hai định dạng
mã byte mới, const-method-handle
và
const-method-type
. (Thông tin này được mô tả trong
Tóm tắt về bộ mã byte
.) Trong Android 10, phiên bản 039
mở rộng định dạng tệp DEX để bao gồm định dạng tệp ẩn
Thông tin API chỉ áp dụng cho tệp DEX trên đường dẫn lớp khởi động.
Lưu ý: Hỗ trợ dành cho phiên bản
038
của định dạng này đã được thêm vào Android 8.0
bản phát hành. Phiên bản 038
đã thêm mã byte mới
(invoke-polymorphic
và invoke-custom
) và
cho các ô điều khiển phương thức.
Lưu ý: Hỗ trợ cho 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
phần lớn
các phiên bản Android đã sử dụng phiên bản 035
của định dạng này. Chỉ
Sự khác biệt giữa phiên bản 035
và 037
là
thêm 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 cũ của định dạng này có
được sử dụng trong các bản phát hành phần mềm công khai 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 Android
Google (Tháng 2–Tháng 3 năm 2008). Theo một số khía cạnh, những quy tắc này
các phiên bản 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.
ENDIAN_CONSTANT và REVERSE_ENDIAN_CONSTANT
Được nhúng trong header_item
Hằng số ENDIAN_CONSTANT
dùng để cho biết
có đuôi của tệp mà nó được tìm thấy. Mặc dù, tiêu chuẩn
Định dạng .dex
là Little-endian, các cách triển khai có thể chọn
để thực hiện hoán đổi byte. Nếu quá trình triển khai gặp phải
tiêu đề có endian_tag
là REVERSE_ENDIAN_CONSTANT
thay vì ENDIAN_CONSTANT
, hệ thống sẽ biết rằng tệp
đã được hoán đổi byte từ dạng dự kiến.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
NO_INDEX
Được nhúng vào class_def_item và debug_info_item
Hằng số NO_INDEX
dùng để cho biết rằng
không có giá trị chỉ mụ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ị được chọn cho NO_INDEX
là
có thể biểu thị dưới dạng một byte đơn trong bộ 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, encrypted_field, encrypted_method và Lớp bên trong
Trường bit của những cờ này dùng để biểu thị khả năng truy cập và thuộc tính chung của các lớp và thành phần trong lớp.
Tên | Giá trị | Đối với Lớp (và chú giải InnerClass ) |
Cho trường | Đối với phương thức |
---|---|---|---|---|
ACC_ CÔNG KHAI | 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ị khi xác định lớp
|
private : chỉ hiển thị khi xác định lớp |
private : chỉ hiển thị khi xác định lớp |
ĐÃ_ BẢO VỆ | 0x4 | protected : hiển thị với gói và lớp con
|
protected : hiển thị cho gói và lớp con |
protected : hiển thị cho gói và lớp con |
Hàm ACC_StatIC | 0x8 | static : không được tạo bằng lớp ngoài
Tham chiếu this |
static : chung để xác định lớp |
static : không nhận đối số this |
ACC_FINAL | 0x10 | final : không thể phân lớp con |
final : không thể thay đổi sau khi tạo |
final : không thể ghi đè |
ACC_SYNCHRONIZED | 0x20 | synchronized : khoá được liên kết đã được tự động thu nạp
liên quan đến lệnh gọi phương thức này. Lưu ý: Giá trị này chỉ hợp lệ để đặt khi
Tôi cũng đã đặt |
||
ACC_VOLATILE | 0x40 | volatile : quy tắc truy cập đặc biệt để trợ giúp về chuỗi
ghi điểm phòng thủ |
||
ACC_bridge | 0x40 | cầu nối, được trình biên dịch thêm tự động dưới dạng một kiểu an toàn cái cầu | ||
Hàm ACC_TRANSIENT | 0x80 | transient : không được lưu theo chuỗi tuần tự mặc định |
||
ACC_VARARGS | 0x80 | đối số cuối cùng nên được coi là "phần còn lại" đối số của trình biên dịch | ||
ACC_NATIVE | 0x100 | native : được triển khai trong mã gốc |
||
GIAO DIỆN | 0x200 | interface : lớp trừu tượng có thể triển khai nhân |
||
Hàm 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 |
|
Hàm ACC_STRICT | 0x800 | strictfp : các quy tắc nghiêm ngặt đối với số học dấu phẩy động |
||
TỔNG HỢP_ACC | 0 x 1.000 | 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_ lưu | 0x2000 | đã khai báo là lớp chú giải | ||
ACC_ENUM | 0x4000 | được khai báo dưới dạng loại liệt kê | đã khai báo dưới dạng giá trị được liệt kê | |
(không sử dụng) | 0x8.000 | |||
Hàm ACC_CONSTRUCTOR | 0x10.000 | 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_ ĐỒNG BỘ HOÁ |
0x20.000 | đã khai báo là synchronized . Lưu ý: Việc này không ảnh hưởng đến thực thi (ngoài sự phản ánh của cờ này). |
InnerClass
,
và không được ở trên class_def_item
.
Đã sửa đổi phương thức mã hoá UTF-8
Để giảm bớt việc hỗ trợ phiên bản cũ dễ dàng hơn, định dạng .dex
mã hoá dữ liệu chuỗi theo dạng UTF-8 được sửa đổi theo tiêu chuẩn trên thực tế, sau đây là
được gọi là MUTF-8. Biểu mẫu này giống với UTF-8 tiêu chuẩn, ngoại trừ:
- Chỉ sử dụng phương thức mã hoá 1, 2 và 3 byte.
- Các điểm mã trong phạm vi
U+10000
...U+10ffff
được mã hoá dưới dạng cặp thay thế, mỗi cặp được biểu thị dưới dạng giá trị mã hoá ba byte. - Điểm mã
U+0000
được mã hoá ở dạng 2 byte. - Một byte rỗng thuần tuý (giá trị
0
) cho biết phần cuối của chuỗi, như cách diễn giải ngôn ngữ C chuẩn.
Có thể tóm tắt hai mục đầu tiên ở trên là: MUTF-8 là một định dạng mã hoá cho UTF-16, thay vì là một định dạng trực tiếp định dạng mã hoá cho các ký tự Unicode.
Hai mục cuối cùng ở trên giúp bạn có thể đưa đồng thời vào
điểm mã U+0000
trong một chuỗi và vẫn thao tác
dưới dạng chuỗi kết thúc 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 bình 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 vậy
cho biết kết quả được ký phù hợp của việc so sánh các chuỗi không bằng nhau.
Khi sắp xếp thứ tự (không chỉ sự bình đẳng) là vấn đề đáng quan tâm, thì
cách so sánh các chuỗi MUTF-8 là giải mã các chuỗi này theo từng ký tự,
và so sánh các giá trị được giải mã. (Tuy nhiên, bạn có thể sử dụng các phương pháp triển khai thông minh hơn
cũng có thể có.)
Vui lòng tham khảo The Unicode Tiêu chuẩn để biết thêm thông tin về phương thức mã hoá ký tự. MUTF-8 thực sự gần hơn với mã hoá (tương đối ít được biết đến hơn) CESU-8 so với UTF-8 mỗi lần.
mã hoá giá trị được mã hoá
Được nhúng trong callout_element và encrypted_array_item
encoded_value
là một phần được mã hoá của (gần)
dữ liệu có cấu trúc phân cấp tuỳ ý. Phương thức mã hoá này nhằm
vừa nhỏ gọn vừa dễ phân tích cú pháp.
Tên | Định dạng | Mô tả |
---|---|---|
(giá_trị_arg << 5) | loại_giá_trị | ubyte | byte cho biết loại mã
value dọc theo
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 các định nghĩa khác nhau về value ở bên dưới.
Trong hầu hết các trường hợp, value_arg mã hoá độ dài của
value tiếp theo ngay sau tính bằng byte, như
(size - 1) , ví dụ: 0 có nghĩa là
giá trị yêu cầu một byte và 7 có nghĩa là nó yêu cầu
tám byte; tuy nhiên, vẫn có những ngoại lệ như được nêu bên dưới.
|
value | ubyte[] | byte biểu thị giá trị, độ dài biến và được diễn giải
khác nhau cho value_type byte khác nhau, mặc dù
luôn luôn là Little-endian. Xem các định nghĩa khác nhau về giá trị bên dưới cho
chi tiết.
|
Định dạng giá trị
Loại tên | value_type |
Định dạng value_arg |
Định dạng value |
Mô tả |
---|---|---|---|---|
GIÁ TRỊ_BYTE | 0x00 | (không có; phải là 0 ) |
ubyte[1] | giá trị số nguyên 1 byte có dấu |
VIDEO NGẮN GIÁ TRỊ | 0x02 | kích thước - 1 (0...1) | ubyte[kích thước] | giá trị số nguyên 2 byte đã ký, đăng nhập mở rộng |
GIÁ TRỊ | 0x03 | kích thước - 1 (0...1) | ubyte[kích thước] | giá trị số nguyên hai byte chưa ký, mở rộng bằng 0 |
GIÁ TRỊ_INT | 0x04 | kích thước - 1 (0...3) | ubyte[kích thước] | giá trị số nguyên 4 byte đã ký, mở rộng ký |
GIÁ TRỊ_DÀI | 0x06 | kích thước - 1 (0...7) | ubyte[kích thước] | giá trị số nguyên 8 byte đã ký, mở rộng ký |
GIÁ TRỊ_FLOAT | 0x10 | kích thước - 1 (0...3) | ubyte[kích thước] | mẫu bit 4 byte, mở rộng bằng 0 ở bên phải và được diễn giải là giá trị dấu phẩy động 32 bit IEEE754 |
GIÁ TRỊ_ ĐÔI | 0x11 | kích thước - 1 (0...7) | ubyte[kích thước] | mẫu bit 8 byte, mở rộng bằng 0 ở bên phải và được diễn giải là giá trị dấu phẩy động 64 bit IEEE754 |
GIÁ TRỊ_METHOD_TYPE | 0x15 | kích thước - 1 (0...3) | ubyte[kích thước] | giá trị số nguyên bốn byte không dấu (mở rộng)
được diễn giải là một chỉ mục thành
phần proto_ids và biểu thị một giá trị của loại phương thức
|
GIÁ TRỊ_PHƯƠNG PHÁP_HANDLE | 0x16 | kích thước - 1 (0...3) | ubyte[kích thước] | giá trị số nguyên bốn byte không dấu (mở rộng)
được diễn giải là một chỉ mục thành
phần method_handles và biểu thị một giá trị xử lý phương thức
|
GIÁ TRỊ | 0x17 | kích thước - 1 (0...3) | ubyte[kích thước] | giá trị số nguyên bốn byte không dấu (mở rộng)
được diễn giải là một chỉ mục thành
phần string_ids và biểu thị một giá trị chuỗi
|
GIÁ TRỊ | 0x18 | kích thước - 1 (0...3) | ubyte[kích thước] | giá trị số nguyên bốn byte không dấu (mở rộng)
được diễn giải là một chỉ mục thành
phần type_ids và thể hiện phần phản chiếu
giá trị loại/lớp
|
GIÁ TRỊ_Trường | 0x19 | kích thước - 1 (0...3) | ubyte[kích thước] | giá trị số nguyên bốn byte không dấu (mở rộng)
được diễn giải là một chỉ mục thành
phần field_ids và thể hiện phần phản chiếu
giá trị trường
|
GIÁ TRỊ | 0x1a | kích thước - 1 (0...3) | ubyte[kích thước] | giá trị số nguyên bốn byte không dấu (mở rộng)
được diễn giải là một chỉ mục thành
phần method_ids và thể hiện phần phản chiếu
giá trị phương thức
|
GIÁ TRỊ_ENUM | 0x1b | kích thước - 1 (0...3) | ubyte[kích thước] | giá trị số nguyên bốn byte không dấu (mở rộng)
được diễn giải là một chỉ mục thành
phần field_ids và biểu thị giá trị của
một hằng số kiểu được liệt kê
|
GIÁ TRỊ_ARRAY | 0x1c | (không có; phải là 0 ) |
mảng_mã_ hoá | một mảng giá trị, theo định dạng được chỉ định bởi
"Định dạng encoded_array " bên dưới. Kích thước
của value được ngầm ẩn trong quá trình mã hoá.
|
LƯỢT CHUYỂN ĐỔI | 0x1 ngày | (không có; phải là 0 ) |
chú_ thích được mã hoá | một chú thích phụ, ở định dạng được chỉ định bởi
"Định dạng encoded_annotation " bên dưới. Kích thước
của value được ngầm ẩn trong quá trình mã hoá.
|
GIÁ_ TRỊ_RỜI KHỎI | 0x1e | (không có; phải là 0 ) |
(không có) | Giá trị tham chiếu null |
GIÁ TRỊ_BOOLEAN | 0x1f | boolean (0...1) | (không có) | giá trị một bit; 0 cho false và
1 với giá true . Bit được biểu thị trong
value_arg .
|
định dạng mảng được mã hoá
Tên | Định dạng | Mô tả |
---|---|---|
size | uleb128 | số phần tử trong mảng |
giá trị | giá_trị_được_mã_ hoá[size] | một chuỗi size encoded_value byte
các chuỗi theo định dạng được chỉ định bởi phần này, được nối với nhau
tuần tự.
|
định dạng mã_chú thích
Tên | Định dạng | Mô tả |
---|---|---|
loại_idx | uleb128 | loại chú thích. Đây phải là một lớp (không phải là mảng hoặc dữ liệu gốc) loại. |
size | uleb128 | số lượng ánh xạ tên-giá trị trong chú thích này |
phần tử | phần tử chú thích[size] | các phần tử chú thích, được trình bày trực tiếp trong dòng (không phải dưới dạng
chênh 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 phần tử_chú thích
Tên | Định dạng | Mô tả |
---|---|---|
Tên_idx | uleb128 | được biểu thị dưới dạng chỉ mục trong
string_ids . Chuỗi này phải tuân theo
cú pháp cho membershipsName, được xác định ở trên.
|
value | giá_trị_được_mã_ hoá | giá trị phần tử |
Cú pháp chuỗi
Có nhiều loại mục trong tệp .dex
cuối cùng tham chiếu đến một chuỗi. Các định nghĩa kiểu BNF sau đây
chỉ ra cú pháp được chấp nhận cho các chuỗi này.
Tên đơn giản
SimpleName là cơ sở cho cú pháp tên của các từ khoá khác
của bạn. Định dạng .dex
cho phép vĩ độ tương đối
ở đâ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, việc đơn giản
bao gồm bất kỳ ký tự bảng 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 được
phím Ctrl, dấu cách hoặc ký tự đặc biệt. Bắt đầu từ phiên bản 040
định dạng này cũng cho phép sử dụng thêm ký tự khoảng trắng (Unicode Zs
danh mục). Xin lưu ý rằng điểm mã thay thế
(trong phạm vi U+d800
... U+dfff
) không
được coi là các ký tự tên hợp lệ, mỗi ký tự, nhưng phần bổ sung Unicode
các ký tự có hợp lệ (được biểu thị bằng ký tự cuối cùng
lựa chọn thay thế cho quy tắc cho SimpleNameChar) và chúng phải là
được trình bày trong tệp dưới dạng các cặp điểm mã thay thế trong MUTF-8
mã hoá.
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 sử dụng bởi trường_id_item và method_id_item
membershipsName là tên của một thành viên trong một lớp học, các thành viên là trường, phương thức và lớp bên trong.
membershipsName → | |
SimpleName | |
| | '<' SimpleName '>' |
Tên lớp đầy đủ
FullClassName là một tên lớp đủ điều kiện, bao gồm cả thông số gói không bắt buộc theo sau là tên bắt buộc.
FullClassName → | |
optionalPackagePrefix SimpleName | |
CustomPackagePrefix (Tiền tố gói tuỳ chọn) → | |
(SimpleName '/' )* |
Mô tả kiểu dữ liệu
Được type_id_item sử dụng
TypeDescriptor là đại diện của bất kỳ loại nào, bao gồm
dữ liệu nguyên gốc, lớp, mảng và void
. Xem bên dưới để biết
ý nghĩa của các phiên bản khác nhau.
TypeDescriptor → | |
'V' |
|
| | FieldTypeDescriptor |
FieldTypeDescriptor → | |
NonArrayFieldTypeDescriptor | |
| | ('[' * 1...255)
NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor→ | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' FullClassName ';' |
ShortyDescriptor (Mô tả ngắn gọn)
Được proto_id_item sử dụng
ShortyDescriptor là cách diễn đạt ngắn gọn của một phương thức
nguyên mẫu, bao gồm dữ liệu trả về và các loại tham số, ngoại trừ có
không có sự khác biệt giữa các loại tham chiếu khác nhau (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'
duy nhất.
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ệ đối với loại dữ liệu trả lại |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long |
T6 | float |
D | double |
Đủ điều kiện/Tên; | lớp fully.qualified.Name |
[phần mô tả | mảng descriptor , có thể sử dụng theo cách đệ quy cho
mảng- của mảng, mặc dù nếu lớn hơn 255 thì sẽ không hợp lệ
thứ nguyê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 mà
có thể xuất hiện trong tệp .dex
.
tiêu_đề_mục_hàng
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ị kỳ diệu. Xem thảo luận phía trên trong "DEX_FILE_MAGIC "
để biết thêm chi tiết.
|
giá trị tổng kiểm | CANNOT TRANSLATE | adler32 tổng kiểm tra 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 (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
để xác định chính xác tệp
|
kích thước tệp | CANNOT TRANSLATE | kích thước của toàn bộ tệp (bao gồm cả tiêu đề), tính bằng byte |
kích_ thước_tiêu_đề | uint = 0x70 | 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ại ở mức hạn chế về khả năng tương thích ngược/chuyển tiếp mà không cần làm mất hiệu lực định dạng. |
thẻ_endian | uint = ENDIAN_CONSTANT | thẻ nội dung. Xem thảo luận phía trên bên dưới "ENDIAN_CONSTANT
và REVERSE_ENDIAN_CONSTANT inch để biết thêm chi tiết.
|
kích_ thước_đường_liên_kết | CANNOT TRANSLATE | 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 |
tắt_đường_liên_kết | CANNOT TRANSLATE | phần chênh lệch từ đầu tệp sang phần liên kết, hoặc
0 nếu link_size == 0 . Độ lệch, nếu khác 0,
phải là một giá trị bù trừ vào phần link_data . Chiến lược phát hành đĩa đơn
định dạng của dữ liệu trỏ đến không được tài liệu này chỉ định;
trường tiêu đề này (và trường trước đó) được để lại dưới dạng nội dung hấp dẫn để
thời gian chạy.
|
tắt_bản_đồ | CANNOT TRANSLATE | bù trừ từ đầu tệp đến mục bản đồ. Giá trị bù trừ, phải
khác 0, phải là một giá trị bù trừ 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 | CANNOT TRANSLATE | số lượng chuỗi trong danh sách giá trị nhận dạng chuỗi |
string_ids_off | CANNOT TRANSLATE | độ 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 (được phép là
trường hợp hiếm gặp). Độ lệch, nếu khác 0,
phải ở đầu phần string_ids .
|
type_ids_size | CANNOT TRANSLATE | số lượng phần tử trong danh sách mã nhận dạng loại, tối đa là 65535 |
type_ids_off | CANNOT TRANSLATE | vị trí bù trừ từ đầu tệp đến danh sách mã nhận dạng loại, hoặc
0 nếu type_ids_size == 0 (được phép là
trường hợp hiếm gặp). Độ lệch, nếu khác 0,
phải ở đầu type_ids
.
|
proto_ids_size | CANNOT TRANSLATE | 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 | CANNOT TRANSLATE | giá trị bù trừ 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 (được phép là
trường hợp hiếm gặp). Độ lệch, nếu khác 0,
phải ở đầu proto_ids
.
|
Kích_ thước_mã_trường_trường | CANNOT TRANSLATE | số lượng phần tử trong danh sách giá trị nhận dạng trường |
trường_id_tắt | CANNOT TRANSLATE | giá trị bù trừ 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 . Độ lệch, nếu
khác 0, phải ở đầu field_ids
. |
method_ids_size | CANNOT TRANSLATE | số lượng phần tử trong danh sách giá trị nhận dạng phương thức |
method_ids_off (tắt_mã_phương_pháp) | CANNOT TRANSLATE | độ lệch từ đầu tệp sang danh sách giá trị nhận dạng phương thức, hoặc
0 nếu method_ids_size == 0 . Độ lệch, nếu
khác 0, phải ở đầu method_ids
. |
class_defs_size | CANNOT TRANSLATE | số lượng phần tử trong danh sách định nghĩa lớp |
lớp_defs_off | CANNOT TRANSLATE | chênh lệch từ đầu tệp sang danh sách định nghĩa lớp, hoặc
0 nếu class_defs_size == 0 (được phép là
trường hợp hiếm gặp). Độ lệch, nếu khác 0,
phải ở đầu phần class_defs .
|
kích_ thước_dữ_liệu | CANNOT TRANSLATE | Kích thước của phần data tính bằng byte. Phải là số chẵn
bội số của sizeof(uint). |
tắt_dữ_liệu | CANNOT TRANSLATE | độ lệch từ đầu tệp đến đầu tệp
data .
|
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ự. Nó
chứa một số phần thừa đối với header_item
nhưng nhằm mục đích trở thành một biểu mẫu dễ sử dụng để lặp lại toàn bộ
. Một loại dữ liệu nhất định phải xuất hiện tối đa một lần trên bản đồ, nhưng sẽ không có
hạn chế về loại đơn đặt hàng có thể xuất hiện, ngoài
những hạn chế được ngụ ý trong phần còn lại của định dạng (ví dụ:
Phần header
phải xuất hiện đầu tiên, theo sau là phần
string_ids
, v.v.). Ngoài ra, mục nhập bản đồ phải
được sắp xếp theo mức bù trừ ban đầu và không được trùng lặp.
Tên | Định dạng | Mô tả |
---|---|---|
size | CANNOT TRANSLATE | kích thước của danh sách, trong các mục nhập |
danh sách | mục_bản_đồ[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 | CANNOT TRANSLATE | loại mặt hàng; xem bảng bên dưới |
unused | CANNOT TRANSLATE | (không sử dụng) |
size | CANNOT TRANSLATE | số lượng mục được tìm thấy tại độ lệch được chỉ định |
bù trừ | CANNOT TRANSLATE | bù trừ từ đầu tệp đến các mục liên quan |
Mã loại
Loại mục | Hằng số | Giá trị | Kích thước mục tính bằng byte |
---|---|---|---|
tiêu_đề_mục_hàng | TYPE_TIÊU_MỤC | 0x0000 | 0x70 |
chuỗi_id_mục_hàng | Hàm TYPE_STRING_ID_ITEM | 0x0001 | 0x04 |
loại_mã_mặt_hàng | TYPE_TYPE_ID_ITEM | 0x0002 | 0x04 |
proto_id_item | TYPE_PROTO_ID_ITEM | 0x0003 | 0x0c |
trường_id_item | TYPE_FIELD_ID_ITEM | 0x0004 | 0x08 |
mã_phương_ thức | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
lớp_def_item | TYPE_CLASS_DEF_ITEM | 0x0006 | 0x20 |
gọi_mục_id_trang_web | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x04 |
mục_xử_lý_phương_ thức | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
danh_sách_bản_đồ | TYPE_MAP_LIST | 0 x 1.000 | 4 + (item.size * 12) |
danh_sách_loại_loại | DANH SÁCH_TYPE_TYPE_ | 0x1001 | 4 + (item.size * 2) |
danh_sách_tham_mục_chú_thích | TYPE_ đổi _ DANH SÁCH TÂM LÝ | 0x1002 | 4 + (item.size * 4) |
mục_set_chú_ thích | TYPE_FORMATTED_SET_ITEM | 0x1003 | 4 + (item.size * 4) |
mục dữ_liệu_lớp | TYPE_CLASS_DATA_ITEM | 0x2000 | ngầm ẩn; phải phân tích cú pháp |
mặt_hàng_mã | TYPE_CODE_ITEM | 0x2001 | ngầm ẩn; phải phân tích cú pháp |
mục dữ liệu_chuỗi | TYPE_STRING_DATA_ITEM | 0x2002 | ngầm ẩn; phải phân tích cú pháp |
gỡ_tin_mục_thông_tin | TYPE_DEBUG_INFO_ITEM | 0x2003 | ngầm ẩn; phải phân tích cú pháp |
mục_chú thích | TYPE_ đổi_ITEM | 0x2004 | ngầm ẩn; phải phân tích cú pháp |
mục_mảng_được_mã_ hoá | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | ngầm ẩn; phải phân tích cú pháp |
chú_mục_thư_mục_chú thích | TYPE_PARAMS_DIRECTORY_ITEM | 0x2006 | ngầm ẩn; phải phân tích cú pháp |
mục dữ liệu_dữ_liệu_lớp_API ẩn | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | ngầm ẩn; phải phân tích cú pháp |
chuỗi_id_mục_hàng
Xuất hiện trong phần string_ids
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
chuỗi_dữ_liệu_tắt | CANNOT TRANSLATE | bù trừ từ đầu tệp sang dữ liệu chuỗi cho
mục. Giá trị bù phải là một vị trí
trong phần data và dữ liệu sẽ nằm trong
định dạng do "string_data_item " chỉ định bên dưới.
Không có yêu cầu căn chỉnh cho độ lệch.
|
mục dữ liệu_chuỗi
Xuất hiện trong phần dữ liệu
Căn chỉnh: không (căn chỉnh theo byte)
Tên | Định dạng | Mô tả |
---|---|---|
kích thước_tự_tf16 | uleb128 | kích thước của chuỗi này, bằng đơn vị mã UTF-16 (là "chuỗi
chiều dài" trong nhiều hệ thống). Điều này là độ dài được giải mã của
chuỗi. (Độ dài mã hoá được ngụ ý bởi vị trí của
0 byte.) |
data | ubyte[] | một chuỗi đơn vị mã MUTF-8 (còn gọi là octet, a.k.a. byte)
theo sau là một byte giá trị 0 . Xem
"Mã hoá MUTF-8 (UTF-8 đã sửa đổi)" bên 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ể dùng một chuỗi bao gồm
(dạng mã hoá của) đơn vị mã thay thế UTF-16 (nghĩa là
|
loại_mã_mặt_hàng
Xuất hiện trong phần type_ids
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
mô_tả_idx | CANNOT TRANSLATE | lập chỉ mục vào danh sách string_ids cho phần mô tả
thuộc loại này. Chuỗi này phải tuân thủ cú pháp cho
TypeDescriptor, đã được định nghĩa ở 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 | CANNOT TRANSLATE | chỉ mục vào danh sách string_ids cho định dạng ngắn
chuỗi mã mô tả của nguyên mẫu này. Chuỗi này phải tuân theo
cú pháp cho ShortyDescriptor, được xác định ở trên và phải tương ứng
cho loại dữ liệu trả về và các thông số của mục này.
|
giá trị trả về (dữ liệu trả về) | CANNOT TRANSLATE | lập 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
|
thông số_tắt | CANNOT TRANSLATE | độ lệch từ đầu tệp sang 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ó
tham số. Độ lệch này, nếu khác 0, phải nằm trong
data và dữ liệu trong đó
định dạng do "type_list" chỉ định bên dưới. Ngoài ra, có
không được tham chiếu đến loại void trong danh sách.
|
trường_id_item
Xuất hiện trong mục trường_id
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
lớp_idx | CANNOT TRANSLATE | chỉ mục vào danh sách type_ids cho phần định nghĩa của thuộc tính này.
. Đây phải là loại lớp chứ không phải là kiểu mảng hoặc kiểu dữ liệu nguyên thuỷ.
|
loại_idx | CANNOT TRANSLATE | chỉ mục vào danh sách type_ids cho loại
trường này
|
Tên_idx | CANNOT TRANSLATE | chỉ mục vào danh sách string_ids cho tên của chỉ mục này
. Chuỗi này phải tuân thủ cú pháp cho memberName,
xác định ở trên.
|
mã_phương_ thức
Xuất hiện trong phần method_ids
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
lớp_idx | CANNOT TRANSLATE | chỉ mục vào danh sách type_ids cho phần định nghĩa của thuộc tính này.
. Đây phải là một loại mảng hoặc lớp chứ không phải là loại nguyên gốc.
|
proto_idx | CANNOT TRANSLATE | chỉ mục vào danh sách proto_ids cho nguyên mẫu
phương thức này
|
Tên_idx | CANNOT TRANSLATE | chỉ mục vào danh sách string_ids cho tên của chỉ mục này
. Chuỗi này phải tuân thủ cú pháp cho memberName,
xác định ở trên.
|
lớp_def_item
Xuất hiện trong phần class_defs
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
lớp_idx | CANNOT TRANSLATE | 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 là kiểu mảng hoặc kiểu dữ liệu nguyên thuỷ.
|
cờ_truy_cập | CANNOT TRANSLATE | cờ truy cập cho lớp (public , final ,
v.v). Xem "Định nghĩa access_flags " để biết thông tin chi tiết.
|
lớp_siêu_class_idx | CANNOT TRANSLATE | chỉ mục vào danh sách type_ids cho lớp cấp cao, hoặc
là giá trị không đổi NO_INDEX nếu lớp này không có
siêu lớp (tức là lớp gốc như Object ).
Nếu có thì đây phải là loại lớp chứ không phải là kiểu mảng hoặc kiểu dữ liệu nguyên thuỷ.
|
giao diện_tắt | CANNOT TRANSLATE | độ lệch từ đầu tệp đến danh sách giao diện, hoặc
0 nếu không có. Mức chênh lệch này
sẽ nằm trong phần data và dữ liệu
phải ở định dạng được chỉ định bởi
"type_list " bên dưới. Từng phần tử của danh sách
phải là loại lớp (không phải là mảng hoặc loại nguyên hàm) và ở đó
không được trùng lặp.
|
source_file_idx | CANNOT TRANSLATE | chỉ mục vào danh sách string_ids cho tên của
tệp chứa nguồn ban đầu của (ít nhất là hầu hết) lớp này,
hoặc giá trị đặc biệt NO_INDEX để thể hiện việc thiếu
thông tin này. debug_info_item của phương thức bất kỳ
có thể ghi đè tệp nguồn này, nhưng kỳ vọng là hầu hết các lớp
sẽ chỉ đến từ một tệp nguồn.
|
tắt_chú thích | CANNOT TRANSLATE | độ lệch từ đầu tệp đến cấu trúc chú giải
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
data và dữ liệu cần có trong
định dạng do "annotations_directory_item " chỉ định bên dưới
với tất cả các mục đều tham chiếu lớp này làm phần định nghĩa.
|
lớp_dữ_liệu_tắt | CANNOT TRANSLATE | từ đầu tệp đến giá trị được liên kết
dữ liệu lớp cho mục này hoặc 0 nếu không có lớp
dữ liệu của lớp này. (Đây có thể là trường hợp, chẳng hạn như 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
data và dữ liệu trong đó
đị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à phần định nghĩa.
|
static_values_off | CANNOT TRANSLATE | độ lệch từ đầu tệp đến danh sách tên viết tắt
giá trị cho các trường static hoặc 0 nếu có
không có (và tất cả các trường static đều sẽ được khởi tạo bằng
0 hoặc null ). Mức chênh lệch này phải nằm trong
data và dữ liệu sẽ có trong
định dạng được chỉ định bởi "encoded_array_item " bên dưới. Kích thước
của mảng không được lớn hơn số static
các trường được khai báo bởi lớp này và các phần tử tương ứng với
Trường static theo cùng thứ tự như được khai báo trong
field_list tương ứng. Loại của mỗi mảng
phải phù hợp với loại đã khai báo của trường tương ứng.
Nếu mảng có ít phần tử hơn số phần tử có
static trường, sau đó những trường còn lại sẽ được khởi động
có 0 hoặc null phù hợp với loại.
|
gọi_mục_id_trang_web
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 | CANNOT TRANSLATE | bù trừ ở đầu tệp để gọi định nghĩa trang web. Độ lệch sẽ nằm trong phần dữ liệu và dữ liệu phải ở định dạng được chỉ định theo "call_site_item" bên dưới. |
gọi_mục_trang_web
Xuất hiện trong phần dữ liệu
Căn chỉnh: không (căn chỉnh byte)
call_site_item là một mảng_mảng được mã hoá 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 tự động khởi động. Ba đối số đầu tiên là:
- Một trình xử lý phương thức biểu thị phương thức trình liên kết tự khởi động (VALUE_METHOD_HANDLE).
- Tên phương thức mà trình liên kết 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 được giải quyết (VALUE_METHOD_TYPE).
Mọi đối số bổ sung đều là các giá trị không đổi được truyền đến phương thức trình liên kết tự khởi động. Các đối số này là được chuyển theo thứ tự và không có bất kỳ loại chuyển đổi nào.
Trình xử lý phương thức biểu thị phương thức trình liên kết tự động khởi động phải có loại dữ liệu trả về java.lang.invoke.CallSite
. Ba loại thông số đầu tiên là:
java.lang.invoke.Lookup
java.lang.String
java.lang.invoke.MethodType
Loại tham số của bất kỳ đối số bổ sung nào được xác định từ giá trị hằng số của chúng.
mục_xử_lý_phương_ thức
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 [loại_xử_lý_phương_pháp] | CANNOT TRANSLATE | loại xử lý phương thức; xem bảng bên dưới |
unused | CANNOT TRANSLATE | (không sử dụng) |
trường_hoặc_phương_pháp_id | CANNOT TRANSLATE | Mã trường hoặc phương thức tuỳ thuộc vào việc loại xử lý phương thức là trình truy cập hay trình gọi phương thức |
unused | CANNOT TRANSLATE | (không sử dụng) |
Mã loại xử lý phương thức
Hằng số | Giá trị | Mô tả |
---|---|---|
METHOD_HANDLE_TYPE_STATUSIC_PUT | 0x00 | Xử lý phương thức là một phương thức setter trường tĩnh (trình truy cập) |
METHOD_HANDLE_TYPE_StatIC_GET | 0x01 | Xử lý phương thức là một phương thức getter (trình truy cập) trường tĩnh |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | Xử lý phương thức là một phương thức setter 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 phương thức getter (trình truy cập) của 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 | Trình xử lý phương thức là một trình gọi phương thức thực thể |
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR | 0x06 | Xử lý phương thức là một hàm gọi phương thức hàm khởi tạo |
METHOD_HANDLE_TYPE_INVOKE_DIRECT | 0x07 | Ô điều khiển phương thức là một hàm gọi phương thức trực tiếp |
METHOD_HANDLE_TYPE_INVOKE_INTERFACE | 0x08 | Trình xử lý phương thức là một trình gọi phương thức giao diện |
mục dữ_liệu_lớp
Đượ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ăn chỉnh theo byte)
Tên | Định dạng | Mô tả |
---|---|---|
kích_ thước_trường_tĩnh | uleb128 | số trường tĩnh được xác định trong mục này |
kích thước trường_thực thể | uleb128 | số trường thực thể được xác định trong mục này |
kích_ thước_phương_pháp_trực_tiếp | uleb128 | số phương thức trực tiếp được xác định trong mục này |
kích_ thước_phương_pháp_ảo | uleb128 | số phương thức ảo được xác định trong mục này |
trường_tĩnh | trường được mã hoá[static_fields_size] | các trường tĩnh xác định, được biểu diễn dưới dạng một chuỗi
các phần tử được mã hóa. Các trường phải được sắp xếp theo
field_idx theo thứ tự tăng dần.
|
trường_thực_thể | trường_mã_ hoá[instance_fields_size] | các trường đối tượng đã khai báo, được biểu diễn dưới dạng một chuỗi
các phần tử được mã hóa. Các trường phải được sắp xếp theo
field_idx theo thứ tự tăng dần.
|
phương_pháp_trực_tiếp | phương thức mã hoá [direct_methods_size] | giá trị trực tiếp đã xác định (bất kỳ giá trị 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ã hóa. Các phương thức phải được sắp xếp theo
method_idx theo thứ tự tăng dần.
|
phương_pháp_ảo | phương_pháp_mã_hoá[virtual_methods_size] | ảo được xác định (không có 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ã hóa. Danh sách này không được bao gồm dữ liệu kế thừa
trừ phi bị lớp mà mục này đại diện ghi đè. Chiến lược phát hành đĩa đơn
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 giống nhau
như bất kỳ phương thức trực tiếp nào.
|
Lưu ý: Tất cả các phần tử field_id
và
Các thực thể method_id
phải tham chiếu đến cùng một lớp xác định.
định dạng trường được_mã hoá
Tên | Định dạng | Mô tả |
---|---|---|
trường_idx_diff | uleb128 | chỉ mục vào danh sách field_ids để biết danh tính của thuộc tính này
(bao gồm tên và nội dung mô tả), được thể hiện như một sự khác biệt
từ 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.
|
cờ_truy_cập | uleb128 | cờ truy cập cho trường (public , final ,
v.v). Xem "Định nghĩa access_flags " để biết thông tin chi tiết.
|
định dạng encrypted_method
Tên | Định dạng | Mô tả |
---|---|---|
phương thức_idx_diff | uleb128 | chỉ mục vào danh sách method_ids để biết danh tính của thuộc tính này
phương thức (bao gồm tên và phần mô tả), được thể hiện dưới dạng sự khác biệt
từ 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.
|
cờ_truy_cập | uleb128 | cờ truy cập cho phương thức (public , final ,
v.v). Xem "Định nghĩa access_flags " để biết thông tin chi tiết.
|
mã_tắt | uleb128 | độ lệch từ đầu tệp đến cấu trúc mã cho
hoặc 0 nếu phương thức này là abstract
hoặc native . Giá trị bù phải là một vị trí trong
data . Định dạng của dữ liệu được chỉ định bởi
"code_item " bên dưới.
|
danh_sách_loại_loại
Đượ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 | CANNOT TRANSLATE | kích thước của danh sách, trong các mục nhập |
danh sách | loại_mặt_hàng[size] | các phần tử của danh sách |
định dạng type_item
Tên | Định dạng | Mô tả |
---|---|---|
loại_idx | CANNOT TRANSLATE | chỉ mục vào danh sách type_ids |
mặt_hàng_mã
Được tham chiếu từ encrypted_method
Xuất hiện trong phần dữ liệu
Căn chỉnh: 4 byte
Tên | Định dạng | Mô tả |
---|---|---|
kích_ thước_thanh_toán | CANNOT TRANSLATE | số lượng thanh ghi mà mã này sử dụng |
kích thước ins | CANNOT TRANSLATE | số từ của đối số đến cho phương thức này mã dành cho |
kích_ thước_ngoài | CANNOT TRANSLATE | số từ của không gian đối số đi được yêu cầu bởi mã gọi phương thức |
kích_ thước_thử | CANNOT TRANSLATE | số lượng try_item cho phiên bản này. Nếu khác 0,
thì chúng sẽ xuất hiện dưới dạng mảng tries ngay sau
insns trong trường hợp này.
|
gỡ_ lỗi_thông_tin_tắt | CANNOT TRANSLATE | bù trừ từ đầu tệp đến thông tin gỡ lỗi (số dòng +
chuỗi thông tin về biến cục bộ cho mã này hoặc 0 nếu
đơn giản là không có thông tin. Độ lệch, nếu khác 0, phải là
vào một vị trí trong phần data . Định dạng của
dữ liệu do "debug_info_item " chỉ định bên dưới.
|
kích_ thước_Insns | CANNOT TRANSLATE | kích thước của danh sách lệnh, theo đơn vị mã 16 bit |
nhà trọ | ushort[insns_size] | mảng mã byte thực tế. Định dạng mã trong insns
do tài liệu đồng hành chỉ định
Mã byte Dalvik. Ghi chú
mặc dù đoạn mã này được định nghĩa là một mảng ushort , nhưng
là một số cấu trúc nội bộ thích căn chỉnh 4 byte. Ngoài ra,
nếu điều này xảy ra trong một tệp hoán đổi kết thúc, thì hoán đổi sẽ
chỉ được thực hiện trên từng thực thể ushort chứ không phải trên
các cấu trúc bên trong lớn hơn.
|
padding | ushort (không bắt buộc) = 0 | hai byte khoảng đệm để căn chỉnh tries 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í phát hiện các ngoại lệ trong mã và
cách xử lý. Các phần tử của mảng không được chồng chéo trong
dải ô và theo thứ tự từ thấp đến cao. Phần tử này chỉ
sẽ xuất hiện nếu tries_size khác 0.
|
trình xử lý | được mã hoá_catch_handler_list (không bắt buộc) | các byte đại diện cho danh sách các loại dữ liệu khai thác và các byte được liên kết
địa chỉ của trình xử lý. Mỗi try_item có một giá trị bù 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ả |
---|---|---|
địa_chỉ_bắt_đầu | CANNOT TRANSLATE | địa chỉ bắt đầu của khối mã được đề cập trong mục nhập này. Địa chỉ là số lượng đơn vị mã 16 bit tính đến đầu của đơn vị mã chỉ dẫn. |
số_số_lượng_trong | CANNOT TRANSLATE | số đơn vị mã 16 bit được đề cập trong mục này. Đoạn mã cuối cùng
đơn vị được bao gồm (bao gồm) là start_addr + insn_count - 1 .
|
xử_lý_tắt | CANNOT TRANSLATE | theo byte tính từ đầu
encoded_catch_hander_list vào
encoded_catch_handler cho mục nhập này. Đây phải là
độ lệch ở đầu encoded_catch_handler .
|
định dạng mã hoá_catch_handler_list
Tên | Định dạng | Mô tả |
---|---|---|
size | uleb128 | kích thước của danh sách này, trong mục nhập |
danh sách | mã hoá_catch_handler[handlers_size] | danh sách thực tế gồm các danh sách trình xử lý, được trình bày trực tiếp (không phải dưới dạng giá trị bù trừ), và được nối tuần tự |
định dạng mã hoá_catch_handler
Tên | Định dạng | Mô tả |
---|---|---|
size | sleb128 | số loại sản phẩm đánh bắt trong danh sách này. Nếu không có kết quả tích cực thì đây là
giá trị âm của số loại sản phẩm đánh bắt và số sản phẩm bắt được sẽ theo sau
bởi một trình xử lý nhận toàn bộ. Ví dụ: size trong số 0
có nghĩa là có tất cả nhưng không có nội dung săn bắt được nhập rõ ràng.
size của 2 có nghĩa là có hai luồng rõ ràng
những nội dung săn bắt được nhập và không nhận tất cả. Và một size -1
có nghĩa là có một nội dung tóm tắt được nhập cùng với nội dung "tóm tắt".
|
trình xử lý | mã hoá_type_addr_pair[abs(size)] | luồng abs(size) mục đã mã hoá, mỗi mục cho một mục
loại, theo thứ tự loại cần được kiểm tra.
|
địa chỉ nhận_tất_cả | uleb128 (không bắt buộc) | địa chỉ mã byte của trình xử lý nhận toàn bộ. Phần tử này chỉ
xuất hiện nếu size không dương tính.
|
định dạngized_type_addr_pair
Tên | Định dạng | Mô tả |
---|---|---|
loại_idx | uleb128 | chỉ mục vào danh sách type_ids cho loại
ngoại lệ để phát hiện
|
địa chỉ | uleb128 | địa chỉ mã byte của trình xử lý ngoại lệ được liên kết |
gỡ_tin_mục_thông_tin
Được tham chiếu từ code_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: không (căn chỉnh theo byte)
Mỗi debug_info_item
xác định một byte được mã hoá bằng byte lấy cảm hứng từ DWARF3
máy trạng thái mà khi được diễn giải sẽ phát ra các vị trí
và (có thể) thông tin biến cục bộ cho
code_item
Chuỗi số bắt đầu bằng một biến có độ dài thay đổi
tiêu đề (độ dài của tiêu đề phụ thuộc vào số lượng phương thức
tham số), theo sau là các mã byte 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 năm thanh ghi. Chiến lược phát hành đĩa đơn
Thanh ghi address
biểu thị độ lệch lệnh trong
insns_item
được liên kết trong đơn vị mã 16 bit. Chiến lược phát hành đĩa đơn
Thanh ghi address
bắt đầu lúc 0
ở đầu mỗi
Chuỗi debug_info
và chỉ được tăng đơn điệu.
Thanh ghi line
đại diện cho số dòng nguồn
phải được liên kết với mục nhập bảng vị trí tiếp theo được đưa ra bởi
máy trạng thái. Lệnh này được khởi tạo trong tiêu đề trình tự và có thể
thay đổi theo chiều tích cực hoặc tiêu cực nhưng không bao giờ được nhỏ hơn
1
. Thanh ghi source_file
biểu thị
tệp nguồn mà các mục nhập số dòng tham chiếu đến. Công cụ này được khởi tạo để
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ó được phát ra hay không
nên được coi là phần mở đầu hoặc lời kết của phương pháp. 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ộ cuối cùng trực tiếp
mỗi thanh ghi cho mã DBG_RESTART_LOCAL
.
Tiêu đề như sau:
Tên | Định dạng | Mô tả |
---|---|---|
bắt_đầu_dòng_ | 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ế.
|
thông số_kích thước | uleb128 | số lượng tên thông số được mã hoá. Nên có
một lần cho mỗi tham số phương thức, ngoại trừ this của một phương thức thực thể,
nếu có.
|
tên_thông_số | uleb128p1[parameter_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 rằng không có tên nào
có sẵn cho thông số liên quan. Chỉ số mô tả loại
và chữ ký được ngụ ý từ phần mô tả và chữ ký của phương thức.
|
Giá trị mã byte như sau:
Tên | Giá trị | Định dạng | Đối số | Mô tả |
---|---|---|---|---|
DBG_END_SEQUENCE (DBG_END_SEQUENCE) | 0x00 | (không có) | chấm dứ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 sổ đăng ký đị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ố tiền thay đổi đăng ký dòng trước |
chuyển thanh ghi dòng mà không phát ra lệnh nhập vị trí |
DBG_START_LOCAL | 0x03 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx |
register_num : thanh ghi chứa bản địa 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 biến cục bộ tại địa chỉ hiện tại. Một trong hai
name_idx hoặc type_idx có thể
NO_INDEX để cho biết rằng 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 chứa bản địa name_idx : chỉ mục chuỗi của têntype_idx : chỉ mục loại sig_idx : chỉ mục chuỗi của chữ ký kiểu
|
giới thiệu một tệp cục bộ có chữ ký kiểu 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 có thể là NO_INDEX
để cho biết rằng giá trị đó là chưa biết. (Nếu sig_idx là
Tuy nhiên, -1 cùng một dữ liệu có thể được thể hiện nhiều hơn
hiệu quả bằng cách sử dụng mã hoạt động DBG_START_LOCAL .)
Lưu ý: Xem nội dung thảo luận trong
" |
DBG_END_LOCAL | 0x05 | uleb128 register_num | register_num : đăng ký chứa các |
đánh dấu một biến cục bộ đang hoạt động là nằm ngoài phạm vi hiện tại địa chỉ |
DBG_RESTART_LOCAL | 0x06 | uleb128 register_num | register_num : đăng ký để khởi động lại |
giới thiệu lại biến cục bộ tại địa chỉ hiện tại. Tên và type giống với địa chỉ cục bộ mới nhất hoạt động tại thanh ghi. |
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 sẽ là
được coi là điểm kết thúc của phần mở đầu về phương pháp (một nơi thích hợp để
điểm ngắt phương thức). Thanh ghi prologue_end là
bị xoá bởi bất kỳ mã hoạt động đặc biệt (>= 0x0a ) nào.
|
|
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 sẽ là
được xem là phần mở đầu của phần kết về phương pháp (vị trí thích hợp
tạm ngưng việc thực thi trước khi thoát phương thức).
Thanh ghi epilogue_begin bị xoá bởi bất kỳ giá trị đặc biệt nào
(>= 0x0a ).
|
|
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
|
chỉ ra rằng tất cả các mục nhập số dòng tiếp theo tham chiếu đến chỉ số này
tên tệp nguồn thay vì tên mặc định được chỉ định trong
code_item
|
Mã vận hành đặc biệt | 0x0a...0xff | (không có) | nâng cao 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 bên dưới để biết nội dung mô tả.
|
Mã hoạt động đặc biệt
Mã Opa có các giá trị từ 0x0a
đến 0xff
(bao gồm) di chuyển cả line
và address
đăng ký một lượng nhỏ rồi phát ra một mục nhập bảng vị trí mới.
Sau đây là công thức tính các số gia:
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)
chú_mục_thư_mục_chú thích
Đượ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ả |
---|---|---|
lớp_chú thích_tắt | CANNOT TRANSLATE | bù trừ từ đầu tệp sang các chú thích được tạo trực tiếp
trên lớp hoặc 0 nếu lớp không có chú giải trực tiếp.
Giá trị bù trừ, nếu khác 0, phải là một vị trí trong
data . Định dạng của dữ liệu được chỉ định
của "annotation_set_item " bên dưới.
|
kích_ thước_trường | CANNOT TRANSLATE | số lượng trường được chú thích bởi mục này |
kích_ thước_phương_pháp_chú giải | CANNOT TRANSLATE | số lượng phương thức được chú thích bởi mục này |
kích_ thước_tham_số_chú_thích | CANNOT TRANSLATE | số lượng danh sách tham số phương thức được chú thích bởi mục này |
chú_ thích cho trường | trường_chú thích[fields_size] (không bắt buộc) | danh sách chú thích trường 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ú_ giải_phương_ thức | method_annotation[methods_size] (không bắt buộc) | danh sách chú giải phương thứ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ú_ giải thông số | Thông số_chú thích[parameters_size] (không bắt buộc) | danh sách chú giải tham số phương thứ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 phần tử field_id
và
Các thực thể method_id
phải tham chiếu đến cùng một lớp xác định.
định dạng trường_chú thích
Tên | Định dạng | Mô tả |
---|---|---|
trường_idx | CANNOT TRANSLATE | chỉ mục vào danh sách field_ids để biết danh tính của
trường đang được chú thích
|
tắt_chú thích | CANNOT TRANSLATE | bù trừ từ đầu tệp sang danh sách các chú thích cho
trường này. Giá trị bù trừ phải là một vị trí trong data
. Định dạng của dữ liệu được chỉ định bởi
"annotation_set_item " bên dưới.
|
định dạng method_annotation
Tên | Định dạng | Mô tả |
---|---|---|
phương_ thức_idx | CANNOT TRANSLATE | chỉ mục vào danh sách method_ids để biết danh tính của
phương thức được chú giải
|
tắt_chú thích | CANNOT TRANSLATE | bù trừ từ đầu tệp sang danh sách các chú thích cho
phương thức. Giá trị bù phải là một vị trí trong
data . Định dạng của dữ liệu được chỉ định bởi
"annotation_set_item " bên dưới.
|
định dạng Thông số_chú thích
Tên | Định dạng | Mô tả |
---|---|---|
phương_ thức_idx | CANNOT TRANSLATE | chỉ mục vào danh sách method_ids để biết danh tính của
phương thức có các tham số được chú thích
|
tắt_chú thích | CANNOT TRANSLATE | bù trừ từ đầu tệp sang danh sách các chú thích cho
các tham số của phương thức. Giá trị bù phải là một vị trí trong
data . Định dạng của dữ liệu được chỉ định bởi
"annotation_set_ref_list " bên dưới.
|
danh_sách_tham_mục_chú_thích
Được tham chiếu từ notification_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 | CANNOT TRANSLATE | kích thước của danh sách, trong các mục nhập |
danh sách | chú thích_set_ref_item[kích thước] | các phần tử của danh sách |
định dạng callout_set_ref_item
Tên | Định dạng | Mô tả |
---|---|---|
tắt_chú thích | CANNOT TRANSLATE | độ lệch từ đầu tệp đến tập hợp chú giải được tham chiếu
hoặc 0 nếu không có chú thích cho phần tử này.
Giá trị bù trừ (nếu khác 0) phải là một vị trí trong data
. Định dạng của dữ liệu được chỉ định bởi
"annotation_set_item " bên dưới.
|
mục_set_chú_ thích
Được tham chiếu từ shortcuts_directory_item, event_annotations_item, method_annotations_item và callout_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 | CANNOT TRANSLATE | kích thước của tập hợp, trong các phần tử |
bài viết | chú_thích_ngoài_mặt_hàng[size] | là 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,
của type_idx .
|
định dạng callout_off_item
Tên | Định dạng | Mô tả |
---|---|---|
tắt_chú thích | CANNOT TRANSLATE | bù trừ từ đầu tệp vào một chú giải.
Mức chênh lệch phải là một vị trí trong phần data ,
và định dạng của dữ liệu ở vị trí đó được chỉ định bởi
"annotation_item " bên dưới.
|
mục_chú thích
Được tham chiếu từ callout_set_item
Xuất hiện trong phần dữ liệu
Căn chỉnh: không (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 | chú_ thích được mã hoá | nội dung chú thích được mã hoá, theo định dạng được mô tả bằng
"Định dạng encoded_annotation " dưới
"Mã hoá encoded_value " ở trên.
|
Giá trị chế độ hiển thị
Đây là các tuỳ chọn cho trường visibility
trong
annotation_item
:
Tên | Giá trị | Mô tả |
---|---|---|
XÂY DỰNG TRỰC QUAN | 0x00 | chỉ hiển thị tại thời điểm xây dựng (ví dụ: trong quá trình biên dịch) của mã khác) |
LƯỢT XEM HIỂN THỊ | 0x01 | dự định hiển thị trong thời gian chạy |
HỆ THỐNG HIỂN THỊ | 0x02 | nhằm hiển thị trong thời gian chạy, nhưng chỉ cho hệ thống cơ bản (và không sử dụng mã người dùng thông thường) |
mục_mảng_được_mã_ hoá
Đượ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ăn chỉnh theo byte)
Tên | Định dạng | Mô tả |
---|---|---|
value | mảng_mã_ hoá | byte đại diện cho giá trị mảng được mã hoá, theo định dạng được chỉ định
theo "Định dạng encoded_array " trong "encoded_value
Mã hoá" ở trên.
|
mục dữ liệu_dữ_liệu_lớp_API ẩn
Phần này chứa dữ liệu về các giao diện bị hạn chế mà từng lớp sử dụng.
Lưu ý: Tính năng API ẩn đã ra mắt trong Android 10.0 và chỉ áp dụng cho 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 sau này Android. Để 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 | CANNOT TRANSLATE | tổng kích thước của phần này |
bù trừ | uint[] | mảng độ lệch được class_idx lập chỉ mục.
Mục nhập mả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ả API bị ẩn
cờ đều bằng 0.
Nếu không, mục nhập mảng khác 0 và chứa giá trị bù trừ từ
phần đầu của phần đó cho một mảng các cờ API bị ẩn
cho class_idx này.
|
flags | uleb128[] | các mảng nối gồm các cờ API bị ẩn cho từng lớp. Các giá trị cờ có thể được mô tả trong bảng bên dưới. 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 trắng | 0 | Những giao diện có thể sử dụng thoải mái và được hỗ trợ như một phần của khung Android được lập tài liệu chính thức Package Index (Chỉ mục gói). |
danh sách xám | 1 | Giao diện không phải SDK có thể sử dụng được bất kể ứng dụng cấp độ API mục tiêu. |
chặn quyền truy cập | 2 | Giao diện không phải SDK không thể sử dụng được bất kể ứng dụng cấp độ API mục tiêu. Việc truy cập một trong các giao diện này sẽ gây ra lỗi thời gian chạy. |
danh sách xám-max-o | 3 | Giao diện không phải SDK có thể dùng cho Android 8.x trở xuống trừ khi bị hạn chế. |
danh sách xám-max-p | 4 | Giao diện không phải SDK có thể dùng cho Android 9.x trừ khi bị hạn chế. |
danh sách xám-max-q | 5 | Giao diện không phải SDK có thể dùng cho Android 10.x trừ khi bị hạn chế. |
danh sách xám-max-r | 6 | Giao diện không phải SDK có thể dùng cho Android 11.x trừ khi bị hạn chế. |
Chú thích hệ thống
Chú giải hệ thống được dùng để biểu diễn nhiều phần phản chiếu thông tin về lớp (cũng như phương thức và trường). Thông tin này thường chỉ được truy cập gián tiếp bằng mã ứng dụng (không phải hệ thống).
Chú giải hệ thống được thể hiện trong tệp .dex
dưới dạng
các chú giải 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 đường dẫn
giao diện chú giải 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 thể hiện dưới dạng chú thích thuộc loại này. Chú thích không cần bao gồm tất cả tên được xác định bằng chú thích; đơn giản là không có tên mặc định. |
dalvik.annotation.En bao hiệnClass
Xuất hiện trong lớp học
Chú giải EnclosingClass
được đính kèm cho mỗi lớp
được định nghĩa là một thành phần của một lớp khác riêng hoặc là
ẩn danh nhưng không được xác định trong nội dung phương thức (ví dụ: một mã tổng hợp
lớp bên trong). Mọi lớp có chú thích này cũng phải có một
Chú giải InnerClass
. Ngoài ra, lớp không được có
cả EnclosingClass
và
Chú thích EnclosingMethod
.
Tên | Định dạng | Mô tả |
---|---|---|
value | Lớp | lớp có phạm vi từ vựng gần nhất trong lớp này |
dalvik.annotation.En bao gồmphương thức
Xuất hiện trong lớp học
Chú giải EnclosingMethod
được đính kèm cho 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ó tính năng này
chú thích cũng phải có chú giải InnerClass
.
Ngoài ra, một lớp không được có cả EnclosingClass
và một chú giải EnclosingMethod
.
Tên | Định dạng | Mô tả |
---|---|---|
value | Phương thức | phương thức phạm vi gần nhất từ vựng của lớp này |
dalvik.annotation.innerClass
Xuất hiện trong lớp học
Chú giải InnerClass
được đính kèm cho mỗi lớp
được xác định trong phạm vi từ vựng của định nghĩa một lớp khác.
Bất kỳ lớp nào có chú thích này cũng phải có
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ỳ tên nào
tiền tố của gói). Nếu lớp này ở chế độ ẩn danh, thì tên là
null .
|
cờ truy cập | int | cờ truy cập được khai báo ban đầu của lớp (có thể khác nhau từ các cờ có hiệu lực do sự không khớp giữa các lần thực thi mô hình ngôn ngữ nguồn và máy ảo đích) |
dalvik.annotation.membershipsClasses
Xuất hiện trong lớp học
Chú giải MemberClasses
được đính kèm cho mỗi lớp
Tệp này khai báo các lớp thành viê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 | Hạng[] | mảng của các lớp thành phầ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ự kiện này sẽ bị bỏ qua trong các bản phát hành Android trước đây.
Chú giải MethodParameters
là không bắt buộc và có thể dùng để
cung cấp siêu dữ liệu của thông số như tên thông số và đối tượng sửa đổi.
Bạn có thể bỏ qua chú thích khỏi một phương thức hoặc hàm khởi tạo một cách an toàn khi
không cần siêu dữ liệu của tham số trong thời gian chạy.
Bạn có thể dùng java.lang.reflect.Parameter.isNamePresent()
để kiểm tra
liệu siêu dữ liệu có xuất hiện cho một tham số hay không và phản ánh có liên quan
các phương thức như java.lang.reflect.Parameter.getName()
sẽ giảm
quay lại hành vi mặc định trong thời gian chạy nếu không có thông tin.
Khi thêm siêu dữ liệu tham số, trình biên dịch phải cung cấp thông tin cho các lớp được tạo như enum, vì siêu dữ liệu tham số bao gồm việc một thông số có phải là thông số tổng hợp hay bắt buộc hay không.
Chú giải MethodParameters
chỉ mô tả từng phương thức
tham số. Do đó, trình biên dịch có thể bỏ qua chú giải hoàn toàn
cho những hàm khởi tạo và phương thức không có tham số nhằm mục đích giảm kích thước mã
và hiệu quả thời gian chạy.
Các mảng được ghi trong tài liệu dưới đây 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
một 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ả mọi phương thức chính thức
tham số, ngay cả những tham số không được khai báo rõ ràng hoặc ngầm ẩn trong mã nguồn,
kích thước của các mảng có thể khác với Chữ ký hoặc siêu dữ liệu khác
thông tin chỉ dựa trên các tham số rõ ràng đã khai báo trong nguồn
. MethodParameters
cũng sẽ không bao gồm bất kỳ thông tin nào về
tham số trình nhận chú giải kiểu không tồn tại trong phương thức thực tế
của bạn.
Tên | Định dạng | Mô tả |
---|---|---|
tên | String[] | Tên của các tham số hình thức cho phương thức được liên kết. Mảng
không được để trống nhưng phải để trống nếu không có tham số chính thức. Một giá trị trong
mảng phải có giá trị rỗng nếu tham số hì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ì a java.lang.reflect.MalformedParametersException sẽ được gửi vào
thời gian chạy.
|
cờ truy cập | 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. Chiến lược phát hành đĩa đơn
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 chữ ký
Xuất hiện trên các lớp, trường và phương thức
Chú giải Signature
được đính kèm vào mỗi lớp,
trường hoặc phương pháp được xác định theo loại phức tạp hơn
có thể biểu thị bằng type_id_item
. Chiến lược phát hành đĩa đơn
Định dạng .dex
không xác định định dạng của chữ ký; nó
chỉ đơn giản là có thể đại diện cho bất kỳ chữ ký nào mà nguồn
ngôn ngữ yêu cầu để triển khai thành công
ngữ nghĩa. Do đó, chữ ký thường không được phân tích cú pháp (hoặc được xác minh)
bằng cách triển khai máy ảo. Đơn giản là người khác nhận được chữ ký
sang các API và công cụ cấp cao hơn (chẳng hạn như trình gỡ lỗi). Bất kỳ việc sử dụng nào
chữ ký nên được viết ra để không làm
giả định về việc chỉ nhận chữ ký hợp lệ, bảo vệ một cách rõ ràng
chống lại khả năng gặp phải theo cú pháp
chữ ký không hợp lệ.
Do chuỗi chữ ký thường có nhiều nội dung trùng lặp,
chú giải Signature
được định nghĩa là một mảng của
chuỗi, trong đó các phần tử trùng lặp tự nhiên tham chiếu đến cùng một chuỗi
dữ liệu cơ bản và chữ ký được coi là kết hợp của
tất cả các chuỗi trong mảng. Không có quy tắc nào về cách lấy
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ô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 phần này, dưới dạng một mảng chuỗi là nối với nhau |
dalvik.annotation.Throw
Xuất hiện trên các phương thức
Chú giải Throws
được đính kèm vào mỗi phương thứ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 | Hạng[] | mảng các loại ngoại lệ được gửi |