Định dạng thực thi Dalvik

Tài liệu này mô tả bố cục và nội dung của các tệp .dex , được sử dụng để chứa một tập hợp các định nghĩa lớp và dữ liệu bổ sung liên quan của chúng.

Hướng dẫn các loại

Tên Sự miêu tả
byte int có chữ ký 8 bit
ubyte Số nguyên không dấu 8 bit
ngắn int có chữ ký 16 bit, endian nhỏ
ngắn gọn Int không dấu 16-bit, endian nhỏ
int int có chữ ký 32-bit, endian nhỏ
uint Int không dấu 32-bit, endian nhỏ
dài int có chữ ký 64-bit, endian nhỏ
ulong Int không dấu 64-bit, endian nhỏ
sleb128 đã ký LEB128, có độ dài thay đổi (xem bên dưới)
uleb128 LEB128 không dấu, có độ dài thay đổi (xem bên dưới)
uleb128p1 unsigned LEB128 plus 1 , có độ dài thay đổi (xem bên dưới)

LEB128

LEB128 (" L ittle- E ndian B ase 128 ") là mã hóa có độ dài thay đổi cho số lượng số nguyên có dấu hoặc không dấu tùy ý. Định dạng được mượn từ đặc tả DWARF3 . Trong tệp .dex , LEB128 chỉ được sử dụng để mã hóa số lượng 32 bit.

Mỗi giá trị được mã hóa LEB128 bao gồm từ một đến năm byte, cùng biểu thị một giá trị 32 bit duy nhất. Mỗi byte có tập hợp bit quan trọng nhất ngoại trừ byte cuối cùng trong chuỗi có bit rõ ràng nhất. Bảy bit còn lại của mỗi byte là tải trọng, với bảy bit có ý nghĩa nhỏ nhất trong byte đầu tiên, bảy bit tiếp theo trong byte thứ hai, v.v. Trong trường hợp LEB128 có chữ ký ( sleb128 ), bit tải trọng quan trọng nhất của byte cuối cùng trong chuỗi được mở rộng dấu để tạo ra giá trị cuối cùng. Trong trường hợp không dấu ( uleb128 ), mọi bit không được biểu thị rõ ràng sẽ được hiểu là 0 .

Sơ đồ bitwise của giá trị LEB128 hai byte
Byte đầu tiên Byte thứ hai
1 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 0 bit 13 bit 12 bit 11 chút 10 bit 9 bit 8 bit 7

Biến thể uleb128p1 được sử dụng để biểu thị một giá trị đã ký, trong đó biểu diễn là giá trị cộng với một được mã hóa dưới dạng uleb128 . Điều này làm cho mã hóa -1 (cách khác được coi là giá trị không dấu 0xffffffff ) - nhưng không có số âm nào khác - một byte đơn và hữu ích trong chính xác những trường hợp mà số được biểu thị phải không âm hoặc -1 (hoặc 0xffffffff ) và không cho phép các giá trị âm khác (hoặc khi không cần đến các giá trị không dấu lớn).

Dưới đây là một số ví dụ về các định dạng:

Trình tự được mã hóa Như sleb128 Như uleb128 Như uleb128p1
00 0 0 -1
01 1 1 0
7f -1 127 126
80 7f -128 16256 16255

Bố cục tập tin

Tên Định dạng Sự miêu tả
tiêu đề tiêu đề_item tiêu đề
chuỗi_ids chuỗi_id_item[] danh sách định danh chuỗi. Đây là các mã định danh cho tất cả các chuỗi được tệp này sử dụng, để đặt tên nội bộ (ví dụ: mô tả kiểu) hoặc dưới dạng các đối tượng không đổi được tham chiếu bằng mã. 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 nhập trùng lặp nào.
loại_ids loại_id_item[] danh sách định danh loại. Đây là các mã định danh cho tất cả các loại (lớp, mảng hoặc kiểu nguyên thủy) được tham chiếu bởi tệp này, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp theo chỉ mục string_id và không được chứa bất kỳ mục trùng lặp nào.
proto_ids proto_id_item[] danh sách định danh nguyên mẫu phương thức. Đây là các mã định danh cho tất cả các nguyên mẫu được tham chiếu bởi tệp này. Danh sách này phải được sắp xếp theo thứ tự chính của loại trả về (theo chỉ mục type_id ), sau đó theo danh sách đối số (thứ tự từ điển, các đối số riêng lẻ được sắp xếp theo chỉ mục type_id ). Danh sách không được chứa bất kỳ mục trùng lặp nào.
trường_ids trường_id_item[] danh sách định danh trường. Đây là các mã định danh cho tất cả các trường được tệp này tham chiếu, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp, trong đó loại xác định (theo chỉ mục type_id ) là thứ tự chính, tên trường (theo chỉ mục string_id ) là thứ tự trung gian và loại (theo chỉ mục type_id ) là thứ tự phụ. Danh sách không được chứa bất kỳ mục trùng lặp nào.
phương thức_ids phương thức_id_item[] danh sách định danh phương thức. Đây là các mã định danh cho tất cả các phương thức được tệp này tham chiếu, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp, trong đó loại xác định (theo chỉ mục type_id ) là thứ tự chính, tên phương thức (theo chỉ mục string_id ) là thứ tự trung gian và nguyên mẫu phương thức (theo chỉ mục proto_id ) là thứ tự phụ. Danh sách không được chứa bất kỳ mục trùng lặp nào.
lớp_defs lớp_def_item[] danh sách định nghĩa lớp Các lớp phải được sắp xếp sao cho siêu lớp của một lớp nhất định và các giao diện được triển khai xuất hiện trong danh sách sớm hơn lớp tham chiếu. Hơn nữa, việc định nghĩa một lớp có cùng tên xuất hiện nhiều lần trong danh sách là không hợp lệ.
call_site_ids call_site_id_item[] gọi danh sách định danh trang web. Đây là các mã định danh cho tất cả các trang gọi được tham chiếu bởi tệp này, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp theo thứ tự tăng dần của call_site_off .
phương thức_handles phương thức_handle_item[] danh sách xử lý phương thức. Danh sách tất cả các thẻ điều khiển phương thức được tham chiếu bởi tệp này, cho dù được xác định trong tệp hay không. Danh sách này không được sắp xếp và có thể chứa các bản sao sẽ tương ứng một cách hợp lý với các trường hợp xử lý phương thức khác nhau.
dữ liệu ubyte[] vùng dữ liệu, chứa tất cả dữ liệu hỗ trợ cho các bảng được liệt kê ở trên. Các mục khác nhau có yêu cầu căn chỉnh khác nhau và các byte đệm được chèn trước mỗi mục nếu cần thiết để đạt được sự căn chỉnh phù hợp.
link_data ubyte[] dữ liệu được sử dụng trong các tập tin liên kết tĩnh. Định dạng của dữ liệu trong phần này không được chỉ định trong tài liệu này. Phần này trống trong các tệp đã hủy liên kết và việc triển khai thời gian chạy có thể sử dụng phần này khi thấy phù hợp.

Định nghĩa bitfield, 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 các byte phải xuất hiện ở đầu tệp .dex để nó được nhận dạng như vậy. Giá trị này có chủ ý 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 tham nhũng nhất định. Giá trị này cũng mã hóa 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 đều đặ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 ý: Hỗ trợ cho phiên bản 039 của định dạng đã được thêm vào trong bản phát hành Android 9.0, giới thiệu hai mã byte mới, const-method-handleconst-method-type . (Từng điều này được mô tả trong bảng Tóm tắt bộ mã byte .) Trong Android 10, phiên bản 039 mở rộng định dạng tệp DEX để bao gồm thông tin API ẩn chỉ áp dụng cho các tệp DEX trên đường dẫn lớp khởi động.

Lưu ý: Hỗ trợ cho 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-polymorphicinvoke-custom ) và dữ liệu cho các phương thức xử lý.

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 hầu hết các phiên bản Android đều sử dụng định dạng phiên bản 035 . Sự khác biệt duy nhất giữa phiên bản 035037 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 cộng được phổ biến rộng rãi. Ví dụ: phiên bản 009 được sử dụng cho các bản phát hành M3 của nền tảng Android (tháng 11 đến tháng 12 năm 2007) và phiên bản 013 được sử dụng cho các bản phát hành M5 của nền tảng Android (tháng 2 đến tháng 3 năm 2008). Ở một số khía cạnh, các phiên bản định dạng trước đâ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 sử dụng để biểu thị độ bền của tệp chứa nó. Mặc dù định dạng .dex tiêu chuẩn là endian nhỏ nhưng việc 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_tagREVERSE_ENDIAN_CONSTANT thay vì ENDIAN_CONSTANT thì nó sẽ biết rằng tệp đã được hoán đổi byte so với biểu mẫu 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 sử dụng để chỉ ra rằng giá trị chỉ mục không có.

Lưu ý: Giá trị này không được xác định là 0 vì trên thực tế đó thường là một chỉ mục hợp lệ.

Giá trị được chọn cho NO_INDEX có thể biểu thị dưới dạng một byte trong mã hóa uleb128p1 .

uint NO_INDEX = 0xffffffff;    // == -1 if treated as a signed int

định nghĩa access_flags

Được nhúng trong class_def_item, mã hóa_field, mã hóa_method và InnerClass

Trường bit của các cờ này được sử dụng để biểu thị khả năng truy cập và thuộc tính tổng thể của các lớp và thành viên lớp.

Tên Giá trị Dành cho Lớp học (và chú thích InnerClass ) Dành cho trường Đối với phương pháp
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ị 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
ACC_PROTECTED 0x4 * protected : hiển thị với gói và các lớp con protected : hiển thị với gói và các lớp con protected : hiển thị với gói và các lớp con
ACC_STATIC 0x8 * static : không được xây dựng với tham chiếu this bên ngoài static : toàn cục để xác định lớp static : không lấy đối số this
ACC_FINAL 0x10 final : không thể phân lớp final : bất biến sau khi xây dựng final : không thể ghi đè
ACC_ĐỒNG BỘ HÓA 0x20 synchronized : khóa liên quan được tự động thu thập xung quanh lệnh gọi đến phương thức này.

Lưu ý: Điều này chỉ hợp lệ khi đặt khi ACC_NATIVE cũng được đặt.

ACC_VOLATILE 0x40 volatile : các quy tắc truy cập đặc biệt để giúp đảm bảo an toàn cho luồng
ACC_BRIDGE 0x40 phương thức cầu nối, được trình biên dịch tự động thêm vào dưới dạng cầu nối an toàn kiểu
ACC_TRANSIENT 0x80 transient : không được lưu theo tuần tự hóa mặc định
ACC_VAARGS 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 bằng mã gốc
ACC_INTERFACE 0x200 interface : lớp trừu tượng có thể thực hiện được nhiều lần
ACC_ABSTRACT 0x400 abstract : không thể thực hiện trực tiếp abstract : chưa được thực hiện bởi lớp này
ACC_STRICT 0x800 strictfp : quy tắc nghiêm ngặt cho số học dấu phẩy động
ACC_TỔNG HỢP 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à một lớp chú thích
ACC_ENUM 0x4000 được khai báo là kiểu liệt kê được khai báo là một giá trị liệt kê
(không sử dụng) 0x8000
ACC_CONSTRUCTOR 0x10000 phương thức xây dựng (trình khởi tạo lớp hoặc thể hiện)
ACC_DECLARED_
ĐỒNG BỘ HÓA
0x20000 được khai báo synchronized .

Lưu ý: Điều này không ảnh hưởng đến việc thực thi (ngoài việc phản ánh cờ này).

* Chỉ được phép bật đối với chú thích InnerClass và không bao giờ được bật trong class_def_item .

Mã hóa UTF-8 đã sửa đổi

Như một sự nhượng bộ để hỗ trợ kế thừa dễ dàng hơn, định dạng .dex mã hóa dữ liệu chuỗi của nó ở dạng UTF-8 được sửa đổi tiêu chuẩn trên thực tế, sau đây được gọi là MUTF-8. Biểu mẫu này giống hệt với UTF-8 tiêu chuẩn, ngoại trừ:

  • Chỉ sử dụng mã hóa một, hai và ba byte.
  • Các điểm mã trong phạm vi U+10000U+10ffff được mã hóa dưới dạng cặp thay thế, mỗi cặp được biểu thị dưới dạng giá trị được mã hóa ba byte.
  • Điểm mã U+0000 được mã hóa ở dạng hai byte.
  • Một byte rỗng đơn giản (giá trị 0 ) biểu thị sự kết thúc của một chuỗi, cũng như cách diễn giải ngôn ngữ C tiêu chuẩn.

Hai mục đầu tiên ở trên có thể được tóm tắt là: MUTF-8 là định dạng mã hóa cho UTF-16, thay vì là định dạng mã hóa trực tiếp hơn cho các ký tự Unicode.

Hai mục cuối cùng ở trên giúp có thể đồng thời bao gồm điểm mã U+0000 trong một chuỗi vẫn thao tác nó dưới dạng chuỗi kết thúc null kiểu C.

Tuy nhiên, mã hóa đặc biệt của U+0000 có nghĩa là, không giống như UTF-8 thông thường, kết quả của việc gọi hàm C tiêu chuẩn strcmp() trên một cặp chuỗi MUTF-8 không phải lúc nào cũng chỉ ra kết quả được ký chính xác của việc so sánh các chuỗi không bằng nhau . Khi cần quan tâm đến thứ tự (không chỉ sự bình đẳng), cách đơn giản nhất để so sánh các chuỗi MUTF-8 là giải mã chúng theo từng ký tự và so sánh các giá trị được giải mã. (Tuy nhiên, cũng có thể triển khai thông minh hơn.)

Vui lòng tham khảo Tiêu chuẩn Unicode để biết thêm thông tin về mã hóa ký tự. MUTF-8 thực sự gần với mã hóa CESU-8 (tương đối ít được biết đến hơn) hơn là UTF-8.

mã hóa mã hóa_giá trị

Được nhúng trong chú thích_element và mã hóa_array_item

encoded_value là một đoạn dữ liệu được mã hóa (gần như) có cấu trúc phân cấp tùy ý. Mã hóa có nghĩa là vừa nhỏ gọn vừa dễ phân tích cú pháp.

Tên Định dạng Sự miêu tả
(value_arg << 5) | giá trị_loại ubyte byte cho biết loại value tiếp theo ngay lập tức cùng với đối số làm rõ tùy chọn trong ba bit bậc cao. Xem bên dưới để biết các định nghĩa value khác nhau. Trong hầu hết các trường hợp, value_arg mã hóa độ dài của value ngay sau đó theo byte, vì (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 trường hợp ngoại lệ như được nêu dưới đây.
giá trị ubyte[] các byte biểu thị giá trị, có độ dài thay đổi và được diễn giải khác nhau đối với các byte value_type khác nhau, mặc dù luôn luôn ở dạng endian nhỏ. Xem các định nghĩa giá trị khác nhau dưới đây để biết chi tiết.

Định dạng giá trị

Tên loại value_type Định dạng value_arg định dạng value Sự miêu 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[kích thước] giá trị số nguyên hai byte đã ký, mở rộng dấu
VALUE_CHAR 0x03 kích thước - 1 (0…1) ubyte[kích thước] giá trị số nguyên hai byte không dấu, mở rộng bằng 0
VALUE_INT 0x04 kích thước - 1 (0…3) ubyte[kích thước] giá trị số nguyên bốn byte đã ký, mở rộng dấu
VALUE_LONG 0x06 kích thước - 1 (0…7) ubyte[kích thước] giá trị số nguyên tám byte đã ký, mở rộng dấu
VALUE_FLOAT 0x10 kích thước - 1 (0…3) ubyte[kích thước] mẫu bit bốn byte, được mở rộng bằng 0 ở bên phải và được hiểu là giá trị dấu phẩy động 32 bit IEEE754
VALUE_DOUBLE 0x11 kích thước - 1 (0…7) ubyte[kích thước] mẫu bit tám byte, được mở rộng bằng 0 ở bên phải và được hiểu là giá trị dấu phẩy động 64 bit IEEE754
VALUE_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 (không mở rộng), được hiểu là một chỉ mục trong phần proto_ids và biểu thị giá trị loại phương thức
VALUE_METHOD_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 (không mở rộng), được hiểu là một chỉ mục trong phần method_handles và biểu thị giá trị điều khiển phương thức
VALUE_STRING 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 (không mở rộng), được hiểu là một chỉ mục trong phần string_ids và biểu thị một giá trị chuỗi
VALUE_TYPE 0x18 kích thước - 1 (0…3) ubyte[kích thước] Giá trị số nguyên bốn byte không dấu (không mở rộng), được hiểu là một chỉ mục trong phần type_ids và biểu thị giá trị loại/lớp phản ánh
VALUE_FIELD 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 (không mở rộng), được hiểu là một chỉ mục trong phần field_ids và biểu thị giá trị trường phản ánh
VALUE_METHOD 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 (không mở rộng), được hiểu là một chỉ mục trong phần method_ids và biểu thị giá trị phương thức phản chiếu
VALUE_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 (không mở rộng), được hiểu là một chỉ mục trong 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 ) mã hóa_mảng một mảng các giá trị, ở đị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 ẩn trong mã hóa.
VALUE_ANNOTATION 0x1d (không có; phải là 0 ) được mã hóa_annotation 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 ẩn trong mã hóa.
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 false1 cho true . Bit được biểu diễn trong value_arg .

định dạng mã hóa_array

Tên Định dạng Sự miêu tả
kích cỡ uleb128 số phần tử trong mảng
giá trị được mã hóa_value[kích thước] một chuỗi các chuỗi byte encoded_value size theo định dạng được chỉ định bởi phần này, được nối một cách tuần tự.

định dạng mã hóa_annotation

Tên Định dạng Sự miêu tả
loại_idx uleb128 loại chú thích. Đây phải là loại lớp (không phải mảng hoặc nguyên thủy).
kích cỡ uleb128 số lượng ánh xạ tên-giá trị trong chú thích này
yếu tố chú thích_element[kích thước] các phần tử của chú thích, được biểu thị trực tiếp trong dòng (không phải dưới dạng phần bù). Các phần tử phải được sắp xếp theo thứ tự tăng dần theo chỉ số string_id .

định dạng phần tử chú thích

Tên Định dạng Sự miêu tả
tên_idx uleb128 tên phần tử, được biểu diễn dưới dạng chỉ mục trong phần string_ids . Chuỗi phải tuân theo cú pháp của MemberName , được xác định ở trên.
giá trị giá trị được mã hóa 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 đề cập đế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 những thứ khác. Định dạng .dex cho phép một lượng vừa phải ở đây (nhiều hơn hầu hết các ngôn ngữ nguồn phổ biến). Tóm lại, một tên đơn giản bao gồm bất kỳ ký tự hoặc chữ số có mức ASCII thấp nào, một vài ký hiệu cụ thể có mức ASCII thấp 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, 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òn cho phép thêm các ký tự khoảng trắng (danh mục Unicode Zs ). Lưu ý rằng các điểm mã thay thế (trong phạm vi U+d800U+dfff ) không được coi là ký tự tên hợp lệ, nhưng các ký tự bổ sung Unicode hợp lệ (được biểu thị bằng thay thế cuối cùng của quy tắc cho SimpleNameChar ) và chúng phải được biểu diễn trong tệp dưới dạng cặp điểm mã thay thế trong mã hóa MUTF-8.

Tên đơn giản
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+00a1U+1fff
| U+2000U+200a kể từ phiên bản DEX 040
| U+2010U+2027
| U+202f kể từ phiên bản DEX 040
| U+2030U+d7ff
| U+e000U+ffef
| U+10000U+10ffff

Tên thành viên

được sử dụng bởi field_id_item và Method_id_item

MemberName là tên của thành viên của một lớp, các thành viên là trường, phương thức và lớp bên trong.

Tên thành viên
Tên đơn giản
| '<' Tên đơn giản '>'

Tên lớp đầy đủ

FullClassName là tên lớp đủ điều kiện, bao gồm mã xác định gói tùy chọn theo sau là tên bắt buộc.

Tên lớp đầy đủ
Tùy chọnPackagePrefix SimpleName
Tiền tố gói tùy chọn
( Tên đơn giản '/' )*

Bộ mô tả kiểu

Được sử dụng bởi type_id_item

TypeDescriptor là sự biểu diễn của bất kỳ loại nào, bao gồm cả kiểu nguyên thủy, 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.

Bộ mô tả kiểu
'V'
| Bộ mô tả kiểu trường
Bộ mô tả FieldType
Bộ mô tả NonArrayFieldType
| ( '[' * 1…255) NonArrayFieldTypeDescriptor
NonArrayFieldTypeDescriptor
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L' FullClassName ';'

Bộ mô tả ngắn

Được sử dụng bởi proto_id_item

ShortyDescriptor là biểu diễn dạng ngắn của nguyên mẫu phương thức, bao gồm kiểu trả về và kiểu tham số, ngoại trừ việc không có sự phân biệt giữa các kiểu tham chiếu (lớp hoặc mảng) khác nhau. Thay vào đó, tất cả các loại tham chiếu được biểu thị bằng một ký tự 'L' .

Bộ mô tả ngắn
ShortyReturnType ( ShortyFieldType )*
ShortyReturnType
'V'
| Loại trường ngắn
ShortyFieldType
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L'

Ngữ nghĩa của bộ mô tả kiểu

Đây là ý nghĩa của từng biến thể của TypeDescriptor .

Cú pháp Nghĩa
V. void ; chỉ hợp lệ cho các loại trả về
Z boolean
B byte
S short
C char
TÔI int
J long
F float
D double
L đầy đủ/đủ điều kiện/Tên ; lớp fully.qualified.Name
[ mô tả mảng descriptor , có thể sử dụng đệ quy cho mảng mảng, mặc dù nó không hợp lệ nếu có nhiều hơn 255 chiều.

Các hạng 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 .

tiêu đề_item

Xuất hiện trong phần tiêu đề

Căn chỉnh: 4 byte

Tên Định dạng Sự miêu tả
ảo thuật ubyte[8] = DEX_FILE_MAGIC giá trị thần kỳ. Xem cuộc thảo luận ở trên trong phần " DEX_FILE_MAGIC " để biết thêm chi tiết.
tổng kiểm tra uint tổng kiểm tra adler32 của phần còn lại của tệp (mọi thứ trừ magic và trường này); được sử dụng để phát hiện tập tin 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); được sử dụng để nhận dạng duy nhất các tập tin
Kích thước tập tin uint 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 nhất một mức độ tương thích ngược/tiến có giới hạn mà không làm mất hiệu lực định dạng.
endian_tag uint = ENDIAN_CONSTANT thẻ độ bền. Xem cuộc thảo luận ở trên trong phần " ENDIAN_CONSTANTREVERSE_ENDIAN_CONSTANT " để biết thêm 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
liên kết_tắt uint bù từ đầu tệp đến phần liên kết hoặc 0 nếu link_size == 0 . Phần bù, nếu khác 0, phải bằng phần bù trong phần link_data . Định dạng của dữ liệu được chỉ định không được chỉ định trong tài liệu này; trường tiêu đề này (và trường trước đó) được để lại dưới dạng móc nối để sử dụng khi triển khai thời gian chạy.
bản đồ_off uint bù đắp từ đầu tệp đến mục bản đồ. Phần bù, phải khác 0, phải bằng phần bù trong phần data và dữ liệu phải ở định dạng được chỉ định bởi " map_list " bên dưới.
chuỗi_ids_size uint số lượng chuỗi trong danh sách định danh chuỗi
chuỗi_ids_off uint offset từ đầu tệp vào danh sách định danh chuỗi hoặc 0 nếu string_ids_size == 0 (phải thừa nhận là trường hợp Edge lạ). Phần bù, nếu khác 0, phải ở đầu phần string_ids .
loại_ids_size uint số phần tử trong danh sách định danh loại, tối đa là 65535
gõ_ids_off uint offset từ đầu tệp vào danh sách định danh loại hoặc 0 nếu type_ids_size == 0 (phải thừa nhận là trường hợp Edge lạ). Phần bù, nếu khác 0, phải ở đầu phần type_ids .
proto_ids_size uint số phần tử trong danh sách định danh nguyên mẫu, nhiều nhất là 65535
proto_ids_off uint offset từ đầu tệp vào danh sách số nhận dạng nguyên mẫu hoặc 0 nếu proto_ids_size == 0 (phải thừa nhận là trường hợp Edge lạ). Phần bù, nếu khác 0, phải ở đầu phần proto_ids .
trường_ids_size uint số phần tử trong danh sách định danh trường
trường_ids_off uint bù từ đầu tệp vào danh sách số nhận dạng trường hoặc 0 nếu field_ids_size == 0 . Phần bù, nếu khác 0, phải ở đầu phần field_ids .
phương thức_ids_size uint số phần tử trong danh sách định danh phương thức
phương thức_ids_off uint offset từ đầu tệp vào danh sách định danh phương thức hoặc 0 nếu method_ids_size == 0 . Giá trị offset, nếu khác 0, sẽ ở đầu phần method_ids .
class_defs_size uint số phần tử trong danh sách định nghĩa lớp
class_defs_off uint offset từ đầu tệp vào danh sách định nghĩa lớp hoặc 0 nếu class_defs_size == 0 (phải thừa nhận là một trường hợp Edge lạ). Phần bù, nếu khác 0, phải ở đầu phần class_defs .
kích thước dữ liệu uint Kích thước của phần data bằng byte. Phải là bội số chẵn của sizeof(uint).
tắt dữ liệu uint offset từ đầu file đến đầu phần data .

bản đồ_danh sách

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 tin, theo thứ tự. Nó chứa một số phần dư thừa đối với header_item nhưng được dự định là một dạng dễ sử dụng để 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 trên bản đồ, nhưng không có hạn chế về loại thứ tự nào có thể xuất hiện, ngoài các hạn chế được ngụ ý bởi 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à string_ids phần, v.v.). Ngoài ra, các mục bản đồ phải được sắp xếp theo độ lệch ban đầu và không được trùng nhau.

Tên Định dạng Sự miêu tả
kích cỡ uint kích thước của danh sách, trong các mục
danh sách bản đồ_item[kích thước] các phần tử của danh sách

định dạng bản đồ_item

Tên Định dạng Sự miêu tả
kiểu ngắn gọn loại mặt hàng; xem bảng dưới đây
chưa sử dụng ngắn gọn (không sử dụng)
kích cỡ uint đếm số lượng mục được tìm thấy ở phần bù được chỉ định
bù lại uint bù đắp từ đầu tệp đến các mục được đề cập

Mã loại

Loại sản phẩm Không thay đổi Giá trị Kích thước mục tính bằng byte
tiêu đề_item TYPE_HEADER_ITEM 0x0000 0x70
chuỗi_id_item TYPE_STRING_ID_ITEM 0x0001 0x04
loại_id_item 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
phương thức_id_item TYPE_METHOD_ID_ITEM 0x0005 0x08
lớp_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
call_site_id_item TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
phương thức_handle_item TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
bản đồ_danh sách TYPE_MAP_LIST 0x1000 4 + (item.size * 12)
danh sách loại TYPE_TYPE_LIST 0x1001 4 + (item.size * 2)
chú thích_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (item.size * 4)
chú thích_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (item.size * 4)
lớp_data_item TYPE_CLASS_DATA_ITEM 0x2000 ngầm định; phải phân tích
mã_item TYPE_CODE_ITEM 0x2001 ngầm định; phải phân tích
chuỗi_data_item TYPE_STRING_DATA_ITEM 0x2002 ngầm định; phải phân tích
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 ngầm định; phải phân tích
chú thích_item TYPE_ANNOTATION_ITEM 0x2004 ngầm định; phải phân tích
mã hóa_array_item TYPE_ENCODED_ARRAY_ITEM 0x2005 ngầm định; phải phân tích
chú thích_thư mục_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 ngầm định; phải phân tích
Hiddenapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 ngầm định; phải phân tích

chuỗi_id_item

Xuất hiện trong phần string_ids

Căn chỉnh: 4 byte

Tên Định dạng Sự miêu tả
chuỗi_data_off uint offset từ đầu tệp sang dữ liệu chuỗi cho mục này. Phần bù phải ở một vị trí trong phần data và dữ liệu phải ở định dạng được chỉ định bởi " string_data_item " bên dưới. Không có yêu cầu căn chỉnh cho phần bù.

chuỗi_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 Sự miêu 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 được giải mã của chuỗi. (Độ dài được mã hóa được ngụ ý bởi vị trí của byte 0 )
dữ liệu ubyte[] một chuỗi các đơn vị mã MUTF-8 (còn gọi là octet, hay còn gọi là byte) theo sau là một byte có giá trị 0 . Xem "Mã hóa MUTF-8 (UTF-8 đã sửa đổi)" ở trên để biết chi tiết và thảo luận về định dạng dữ liệu.

Lưu ý: Có thể chấp nhận có một chuỗi bao gồm (dạng được mã hóa của) các đơn vị mã thay thế UTF-16 (nghĩa là U+d800U+dfff ) ở dạng tách biệt hoặc không theo thứ tự đối với mã hóa thông thường Unicode sang UTF-16. Tùy thuộc vào việc sử dụng chuỗi ở cấp độ cao hơn để từ chối các mã hóa không hợp lệ như vậy, nếu thích hợp.

loại_id_item

Xuất hiện trong phần type_ids

Căn chỉnh: 4 byte

Tên Định dạng Sự miêu tả
mô tả_idx uint lập chỉ mục vào danh sách string_ids cho chuỗi mô tả thuộc loại này. Chuỗi phải tuân theo 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 Sự miêu tả
shorty_idx uint lập 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 phải tuân theo cú pháp của ShortyDescriptor được xác định ở trên và phải tương ứng với kiểu trả về cũng như các tham số của mục này.
return_type_idx uint lập chỉ mục vào danh sách type_ids cho kiểu trả về của nguyên mẫu này
tham số_tắt uint offset từ đầu tệp vào danh sách các loại tham số cho nguyên mẫu này hoặc 0 nếu nguyên mẫu này không có tham số. Phần bù này, nếu khác 0, phải nằm trong phần data và dữ liệu ở đó phải ở định dạng được chỉ định bởi "type_list" bên dưới. Ngoài ra, không nên có tham chiếu đến loại void trong danh sách.

trường_id_item

Xuất hiện trong phần field_ids

Căn chỉnh: 4 byte

Tên Định dạng Sự miêu tả
lớp_idx ngắn gọn lập chỉ mục vào danh sách type_ids cho bộ xác định trường này. Đây phải là kiểu lớp chứ không phải kiểu mảng hoặc kiểu nguyên thủy.
loại_idx ngắn gọn lập chỉ mục vào danh sách type_ids cho loại trường này
tên_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 phải tuân theo cú pháp của MemberName , được xác định ở trên.

phương thức_id_item

Xuất hiện trong phần Method_ids

Căn chỉnh: 4 byte

Tên Định dạng Sự miêu tả
lớp_idx ngắn gọn lập chỉ mục vào danh sách type_ids cho bộ định nghĩa của phương thức này. Đây phải là kiểu lớp hoặc kiểu mảng chứ không phải kiểu nguyên thủy.
proto_idx ngắn gọn lập chỉ mục vào danh sách proto_ids cho nguyên mẫu của phương thức này
tên_idx uint lập chỉ mục vào danh sách string_ids cho tên của phương thức này. Chuỗi phải tuân theo cú pháp của MemberName , được 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 Sự miêu tả
lớp_idx uint lập chỉ mục vào danh sách type_ids cho lớp này. Đây phải là kiểu lớp chứ không phải kiểu mảng hoặc kiểu nguyên thủy.
access_flags uint cờ truy cập cho lớp ( public , final , v.v.). Xem "Định nghĩa access_flags " để biết chi tiết.
siêu lớp_idx uint lập chỉ mục vào danh sách type_ids cho siêu lớp hoặc giá trị không đổi NO_INDEX nếu lớp này không có siêu lớp (tức là nó là lớp gốc chẳng hạn như Object ). Nếu có thì đây phải là kiểu lớp chứ không phải kiểu mảng hay kiểu nguyên thủy.
giao diện_off uint offset từ đầu tệp vào danh sách giao diện hoặc 0 nếu không có. Phần bù này phải 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. Mỗi phần tử của danh sách phải là một kiểu lớp (không phải là kiểu mảng hoặc kiểu nguyên thủy) và không được có bất kỳ bản sao nào.
nguồn_file_idx uint lập 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 cụ thể nào cũng 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.
chú thích_off uint offset từ đầu tệp sang 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. Phần bù này, nếu khác 0, phải nằm trong phần data và dữ liệu ở đó phải có định dạng được chỉ định bởi " annotations_directory_item " bên dưới, với tất cả các mục tham chiếu đến lớp này làm bộ định nghĩa.
lớp_data_off uint offset từ đầu tệp đến dữ liệu lớp được liên kết cho mục này hoặc 0 nếu không có dữ liệu lớp cho lớp này. (Ví dụ: đây có thể là trường hợp nếu lớp này là giao diện điểm đánh dấu.) Phần bù, nếu khác 0, phải nằm trong phần data và dữ liệu ở đó phải ở định dạng được chỉ định bởi " class_data_item " bên dưới, với tất cả các mục đề cập đến lớp này như là bộ định nghĩa.
static_values_off uint offset từ đầu tệp vào danh sách các 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 phải được khởi tạo bằng 0 hoặc null ). Phần bù này phải nằm trong phần data và dữ liệu ở đó phải ở đị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ố lượng trường static được khai báo bởi lớp này và các phần tử tương ứng với các trường static theo thứ tự như được khai báo trong field_list tương ứng. Loại của mỗi phần tử mảng phải khớp với loại được khai báo trong trường tương ứng của nó. Nếu có ít phần tử trong mảng hơn số trường static thì các trường còn lại sẽ được khởi tạo bằng 0 hoặc null phù hợp với loại.

call_site_id_item

Xuất hiện trong phần call_site_ids

Căn chỉnh: 4 byte

Tên Định dạng Sự miêu tả
gọi_site_off uint offset từ đầu tệp để gọi định nghĩa trang. Phần bù phải nằm trong phần dữ liệu và dữ liệu ở đó phải ở định dạng được chỉ định bởi "call_site_item" 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 byte)

call_site_item là một mã hóa_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 liên kết bootstrap. Ba đối số đầu tiên là:

  1. Một phương thức xử lý đại diện cho phương thức trình liên kết khởi động (VALUE_METHOD_HANDLE).
  2. Tên phương thức mà trình liên kết khởi động sẽ phân giải (VALUE_STRING).
  3. 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).

Bất kỳ đối số bổ sung nào đều là các giá trị không đổi được truyền cho phương thức trình liên kết bootstrap. Các đối số này được truyền theo thứ tự và không có bất kỳ chuyển đổi loại nào.

Trình xử lý phương thức đại diện cho phương thức liên kết bootstrap phải có kiểu trả về java.lang.invoke.CallSite . Ba loại tham số đầu tiên là:

  1. java.lang.invoke.Lookup
  2. java.lang.String
  3. java.lang.invoke.MethodType

Các loại tham số của bất kỳ đối số bổ sung nào được xác định từ các giá trị không đổi của chúng.

phương thức_handle_item

Xuất hiện trong phần Method_handles

Căn chỉnh: 4 byte

Tên Định dạng Sự miêu tả
phương thức_handle_type ngắn gọn loại xử lý phương thức; xem bảng dưới đây
không sử dụng Ushort (không sử dụng)
field_or_method_id Ushort ID trường hoặc phương thức tùy thuộc vào loại xử lý phương thức là người truy cập hay phương thức Invoker
không sử dụng Ushort (không sử dụng)

Phương pháp xử lý mã loại

Không thay đổi Giá trị Sự miêu tả
Phương thức_handle_type_static_put 0x00 Xử lý phương thức là một setter trường tĩnh (accessor)
Phương thức_Handle_Type_Static_get 0x01 Xử lý phương thức là một getter trường tĩnh (người truy cập)
Phương thức_handle_type_instance_put 0x02 Xử lý phương thức là một setter trường thể hiện (người phụ kiện)
Phương thức_handle_type_instance_get 0x03 Xử lý phương thức là một trường thể hiện Getter (excessor)
Phương thức_Handle_Type_invoke_static 0x04 Xử lý phương pháp là một phương pháp tĩnh Invoker
Phương thức_handle_type_invoke_instance 0x05 Xử lý phương pháp là một phương pháp Invoker
Phương thức_handle_type_invoke_constructor 0x06 Xử lý phương pháp là một phương thức xây dựng Invoker
Phương thức_Handle_Type_Invoke_Direct 0x07 Xử lý phương pháp là một phương pháp trực tiếp Invoker
Phương thức_handle_type_invoke_interface 0x08 Phương pháp xử lý là một phương thức giao diện Invoker

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ó (liên kết byte)

Tên Định dạng Sự miêu 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ể hiện được xác định trong mục này
Direct_methods_size ULEB128 số lượng các phương thức trực tiếp được xác định trong mục này
Virtual_methods_size ULEB128 số lượng các phương thức ảo được xác định trong mục này
Static_fields Encoded_field [static_fields_size] Các trường tĩnh được xác định, được biểu thị dưới dạng một chuỗi các phần tử được mã hóa. Các trường phải được sắp xếp theo field_idx theo thứ tự tăng lên.
Instance_fields Encoded_field [instance_fields_size] Các trường thể hiện được xác định, được biểu thị 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 lên.
Direct_methods Encoded_method [Direct_methods_size] Các phương thức trực tiếp được xác định (bất kỳ phương thức static , private hoặc hàm 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 bằng method_idx theo thứ tự tăng.
Virtual_methods Encoded_method [Virtual_methods_size] Các phương thức ảo (không có static , private hoặc hàm tạo)), được biểu thị dưới dạng chuỗi các phần tử được mã hóa. Danh sách này không nên bao gồm các phương thức kế thừa trừ khi được ghi đè bởi lớp mà mục này đại diện. Các phương thức phải được sắp xếp bằng method_idx theo thứ tự tăng. method_idx của một phương thức ảo không được giống như bất kỳ phương thức trực tiếp nào.

Lưu ý: Tất cả các phiên bản của field_idmethod_id phải tham khảo cùng một lớp xác định.

Định dạng mã hóa_FIELD

Tên Định dạng Sự miêu 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à mô tả), được biểu thị dưới dạng sự khác biệt so với chỉ số của phần tử trước đó trong danh sách. Chỉ số của phần tử đầu tiên trong danh sách được biểu diễn trực tiếp.
Access_flags ULEB128 Cờ truy cập cho trường ( public , final , v.v.). Xem "Định nghĩa access_flags " để biết chi tiết.

Định dạng mã hóa_method

Tên Định dạng Sự miêu tả
Phương thức_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à mô tả), được biểu thị như một sự khác biệt so với chỉ mục của phần tử trước đó trong danh sách. Chỉ số của phần tử đầu tiên trong danh sách được biểu diễn trực tiếp.
Access_flags ULEB128 Cờ truy cập cho phương thức ( public , final , v.v.). Xem "Định nghĩa access_flags " để biết chi tiết.
code_off ULEB128 Bỏ ra 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 . Phần bù phải là một vị trí trong phần data . Định dạng của dữ liệu được chỉ định bởi " 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 Sự miêu tả
kích cỡ uint Kích thước của danh sách, trong các mục nhập
danh sách type_item [kích thước] các yếu tố của danh sách

Kiểu_Item định dạng

Tên Định dạng Sự miêu 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 Sự miêu tả
Đăng ký_size Ushort số lượng thanh ghi được sử dụng bởi mã này
ins_size Ushort số lượng từ của các đối số đến với phương thức mà mã này dành cho
Outs_size Ushort số lượng từ của không gian đối số đi theo yêu cầu của mã này cho việc gọi phương thức
TRIES_SIZE Ushort Số lượng try_item s cho trường hợp này. Nếu không khác, thì những thứ này xuất hiện dưới dạng mảng tries ngay sau khi insns trong trường hợp này.
DEBUG_INFO_OFF uint Bỏ ra 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 đơn giản là không có thông tin. Phần bù, nếu khác không, nên đến một vị trí trong phần data . Định dạng của dữ liệu được chỉ định bởi " debug_info_item " bên dưới.
Insns_Size uint Kích thước của danh sách hướng dẫn, trong các đơn vị mã 16 bit
Insns ushort [insns_size] Mảng thực tế của mã byte. Định dạng mã trong một mảng insns được chỉ định bởi tài liệu đồng hành Dalvik Bytecode . Lưu ý rằng mặc dù điều này được định nghĩa là một mảng của ushort , nhưng có một số cấu trúc bên trong thích sự liên kết bốn byte. Ngoài ra, nếu điều này xảy ra trong một tệp hoán đổi endian, thì hoán đổi chỉ được thực hiện trên các trường hợp ushort riêng lẻ và không trên các cấu trúc bên trong lớn hơn.
phần đệm ushort (tùy chọn) = 0 Hai byte của đệm để làm cho tries bốn byte được liên kết. Yếu tố này chỉ có mặt nếu tries_size là khác không và insns_size là lẻ.
cố gắng Try_Item [tries_size] (tùy chọn) Mảng cho biết nơi trong các ngoại lệ mã được bắt và cách xử lý chúng. Các yếu tố của mảng phải không chồng chéo trong phạm vi và theo thứ tự từ thấp đến địa chỉ cao. Yếu tố này chỉ có mặt nếu tries_size là không khác.
người xử lý Encoded_catch_handler_list (tùy chọn) Byte đại diện cho một danh sách các danh sách các loại bắt và địa chỉ xử lý liên quan. Mỗi try_item có một phần bù byte khôn ngoan vào cấu trúc này. Yếu tố này chỉ có mặt nếu tries_size là không khác.

Định dạng Try_Item

Tên Định dạng Sự miêu tả
start_addr uint Bắt đầu địa chỉ của khối mã được bao gồm bởi mục này. Địa chỉ là số lượng của các đơn vị mã 16 bit để bắt đầu hướng dẫn được bảo hiểm đầu tiên.
insn_count Ushort Số lượng đơn vị mã 16 bit được bao phủ bởi mục này. Đơn vị mã cuối cùng được bảo hiểm (bao gồm) là start_addr + insn_count - 1 .
Handler_off Ushort Offset trong byte từ khi bắt đầu encoded_catch_hander_list đến encoded_catch_handler cho mục này. Điều này phải là một phần bù để bắt đầu một encoded_catch_handler .

Đã mã hóa_catch_handler_list định dạng

Tên Định dạng Sự miêu tả
kích cỡ ULEB128 Kích thước của danh sách này, trong các mục nhập
danh sách Encoded_catch_handler [Handlers_size] Danh sách thực tế của các danh sách xử lý, được biểu diễn trực tiếp (không phải là bù đắp) và được nối tiếp theo tuần tự

Định dạng mã hóa_catch_handler

Tên Định dạng Sự miêu tả
kích cỡ Sleb128 Số loại đánh bắt trong danh sách này. Nếu không dương tính, thì đây là âm của số lượng loại bắt và các sản phẩm khai thác được theo sau bởi một người xử lý bắt tất cả. Ví dụ: size 0 có nghĩa là có một sự bắt giữ nhưng không có bắt được đánh máy rõ ràng. size 2 có nghĩa là có hai lần bắt được đánh máy rõ ràng và không bắt được tất cả. Và size -1 có nghĩa là có một loại bắt được đánh máy cùng với tất cả.
người xử lý Encoded_type_addr_pair [abs (kích thước)] Luồng abs(size) Các mục được mã hóa, một cho mỗi loại bị bắt, theo thứ tự các loại nên được kiểm tra.
Catch_all_addr ULEB128 (Tùy chọn) Địa chỉ mã byte của trình xử lý bắt tất cả. Yếu tố này chỉ có mặt nếu size không dương.

Đã mã hóa_Type_addr_pair định dạng

Tên Định dạng Sự miêu tả
type_idx ULEB128 chỉ mục vào danh sách type_ids cho loại ngoại lệ để bắt
địa chỉ ULEB128 Địa chỉ mã byte của trình xử lý ngoại lệ liên quan

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ó (liên kết byte)

Mỗi debug_info_item xác định một máy trạng thái được mã hóa bởi lùn3, khi được giải thích, phát ra bảng vị trí và (có khả năng) 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 thay đổi (độ dài phụ thuộc vào số lượng tham số phương thức), được theo sau bởi các byte của máy trạng thái và kết thúc bằng byte DBG_END_SEQUENCE .

Máy nhà nước bao gồm năm thanh ghi. Thanh ghi address đại diện cho phần bù lệnh trong insns_item được liên kết trong các đơn vị mã 16 bit. Thanh ghi address bắt đầu từ 0 khi bắt đầu mỗi chuỗi debug_info và chỉ phải tăng đơn điệu. Thanh ghi line đại diện cho số dòng nguồn nên được liên kết với mục nhập bảng vị trí tiếp theo được phát ra từ máy trạng thái. Nó được khởi tạo trong tiêu đề trình tự và có thể thay đổi theo hướng tích cực hoặc tiêu cực nhưng không bao giờ nhỏ hơn 1 . Thanh ghi source_file đại diện cho tệp nguồn mà các mục số dòng đề cập đến. Nó được khởi tạo theo giá trị của source_file_idx trong class_def_item . Hai biến khác, prologue_endepilogue_begin , là các cờ boolean (khởi tạo thành false ) cho biết liệu vị trí tiếp theo có nên được coi là một phần mở đầu phương pháp hay đoạn kết 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ộ cuối cùng trực tiếp trong mỗi đăng ký cho mã DBG_RESTART_LOCAL .

Tiêu đề như sau:

Tên Định dạng Sự miêu 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ột mục nhập vị trí thực tế.
tham số_size ULEB128 số lượng tên tham số được mã hóa. Cần có một tham số mỗi phương thức, không bao gồm một phương thức thể hiện this , nếu có.
Parameter_names ULEB128P1 [tham số_size] Chỉ mục chuỗi của tên tham số phương thức. Giá trị được mã hóa của NO_INDEX chỉ ra rằng không có tên nào có sẵn cho tham số liên quan. Bộ mô tả loại và chữ ký được ngụ ý từ bộ mô tả phương pháp và chữ ký.

Các giá trị mã byte như sau:

Tên Giá trị Định dạng Tranh luận Sự miêu tả
DBG_END_THERENE 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 để thêm vào thanh ghi địa chỉ thăng tiến 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 thanh ghi theo thăng tiến thanh ghi dòng mà không phát ra mục nhập vị trí
Dbg_start_local 0x03 ULEB128 Đăng ký_num
ULEB128P1 name_idx
ULEB128P1 type_idx
register_num : Đăng ký sẽ chứa cục bộ
name_idx : chỉ mục chuỗi của tên
type_idx : loại chỉ mục của loại
Giới thiệu một biến cục bộ tại địa chỉ hiện tại. Hoặc name_idx hoặc type_idx có thể là NO_INDEX để chỉ ra rằng giá trị đó không rõ.
Dbg_start_local_extends 0x04 ULEB128 Đăng ký_num
ULEB128P1 name_idx
ULEB128P1 type_idx
ULEB128P1 SIG_IDX
register_num : Đăng ký sẽ chứa cục bộ
name_idx : chỉ mục chuỗi của tên
type_idx : loại chỉ mục của loại
sig_idx : chỉ mục chuỗi của chữ ký loại
Giới thiệu một địa phương với một chữ ký loại tại địa chỉ hiện tại. Bất kỳ tên của name_idx , type_idx hoặc sig_idx đều có thể là NO_INDEX để chỉ ra rằng giá trị đó không rõ. sig_idx -1 DBG_START_LOCAL

Lưu ý: Xem cuộc thảo luận trong " dalvik.annotation.Signature " bên dưới để xem xét về việc xử lý các chữ ký.

DBG_END_LOCAL 0x05 ULEB128 Đăng ký_num register_num : Đăng ký có chứa cục bộ Đánh dấu một biến cục bộ hiện đang sống ngoài phạm vi tại địa chỉ hiện tại
DBG_RESTART_LOCAL 0x06 ULEB128 Đăng ký_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 như cục bộ cuối cùng được sống trong thanh ghi được chỉ định.
Dbg_set_prologue_end 0x07 (không có) Đặt thanh ghi máy trạng thái prologue_end , chỉ ra rằng mục nhập vị trí tiếp theo được thêm vào nên được coi là kết thúc của phần mở đầu phương thức (một vị trí thích hợp cho điểm dừng phương thức). Thanh ghi prologue_end được xóa bởi bất kỳ opcode đặ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 , chỉ ra rằng mục nhập vị trí tiếp theo được thêm vào nên được coi là bắt đầu của một phần kết phương thức (một nơi thích hợp để đình chỉ thực thi trước khi thoát phương thức). Thanh ghi epilogue_begin được xóa bởi bất kỳ opcode đặc biệt ( >= 0x0a ) nào.
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 rằng tất cả các mục nhập số dòng tiếp theo sẽ tham chiếu đến tên tệp nguồn này, thay vì tên mặc định được chỉ định trong code_item
Opcodes đặc biệt 0x0a 0xff (không có) tiến bộ các thanh ghi lineaddress , phát ra một mục nhập vị trí và xóa prologue_endepilogue_begin . Xem bên dưới để mô tả.

Opcodes đặc biệt

Các opcodes với các giá trị giữa 0x0a0xff (bao gồm) di chuyển cả thanh ghi lineaddress bằng một lượng nhỏ và sau đó phát ra một mục nhập bảng vị trí mới. Công thức cho các gia số 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 Sự miêu tả
class_annotations_off uint Bồi thường 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. Phần bù, nếu khác không, nên đến một vị trí trong phần data . Định dạng của dữ liệu được chỉ định bởi " annotation_set_item " bên dưới.
trường_size uint Đếm các trường được chú thích bởi mặt hàng này
Chú thích_methods_size uint Đếm các phương thức được chú thích bởi mặt hàng này
Chú thích_parameter_size uint Số lượng danh sách tham số phương thức được chú thích bởi mục này
field_annotations field_annotation [field_size] (tùy chọn) Danh sách các chú thích trường liên kết. Các yếu tố của danh sách phải được sắp xếp theo thứ tự tăng, theo field_idx .
Phương pháp_annotations method_annotation [method_size] (tùy chọn) Danh sách các chú thích phương pháp liên quan. Các yếu tố của danh sách phải được sắp xếp theo thứ tự tăng, bằng method_idx .
tham số_annotations tham số_annotation [tham số_size] (tùy chọn) Danh sách các chú thích tham số phương thức liên quan. Các yếu tố của danh sách phải được sắp xếp theo thứ tự tăng, bằng method_idx .

Lưu ý: Tất cả các phiên bản của field_idmethod_id phải tham khảo cùng một lớp xác định.

Field_annotation định dạng

Tên Định dạng Sự miêu tả
field_idx uint chỉ mục vào danh sách field_ids cho danh tính của trường được chú thích
Annotations_off uint bù từ đầu tệp đến danh sách các chú thích cho trường. Phần bù phải là một vị trí trong phần data . Định dạng của dữ liệu được chỉ định bởi " annotation_set_item " bên dưới.

Phương thức_annotation định dạng

Tên Định dạng Sự miêu tả
Phương thức_idx uint chỉ mục vào danh sách method_ids cho danh tính của phương thức được chú thích
Annotations_off uint bù từ đầu tệp đến danh sách các chú thích cho phương thức. Phần bù phải là một vị trí trong phần data . Định dạng của dữ liệu được chỉ định bởi " annotation_set_item " bên dưới.

Định dạng parameter_annotation

Tên Định dạng Sự miêu tả
Phương thức_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ú thích
Annotations_off uint Bỏ ra từ đầu tệp đến danh sách các chú thích cho các tham số phương thức. Phần bù phải là một vị trí trong phần data . Định dạng của dữ liệu được chỉ định bởi " annotation_set_ref_list " bên dưới.

Annotation_Set_Ref_List

Được tham chiếu từ tham số_annotations_item

Xuất hiện trong phần dữ liệu

Căn chỉnh: 4 byte

Tên Định dạng Sự miêu tả
kích cỡ uint Kích thước của danh sách, trong các mục nhập
danh sách Annotation_Set_Ref_Item [kích thước] các yếu tố của danh sách

Định dạng Annotation_Set_Ref_Item

Tên Định dạng Sự miêu tả
Annotations_off uint Offset từ đầu tệp đến bộ chú thích được tham chiếu hoặc 0 nếu không có chú thích cho phần tử này. Phần bù, nếu khác không, nên đến một vị trí trong phần data . Định dạng của dữ liệu được chỉ định bởi " 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 Sự miêu tả
kích cỡ uint Kích thước của bộ, trong các mục
mục Annotation_Off_Item [kích thước] các yếu tố của tập hợp. Các phần tử phải được sắp xếp theo thứ tự tăng, theo type_idx .

Định dạng Annotation_Off_Item

Tên Định dạng Sự miêu tả
Annotation_off uint bù từ đầu tệp đến một chú thích. Phần bù 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ởi " 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ó (liên kết byte)

Tên Định dạng Sự miêu tả
hiển thị ubyte Khả năng hiển thị của chú thích này (xem bên dưới)
chú thích Đã mã hóa_annotation Nội dung chú thích được mã hóa, ở định dạng được mô tả bởi "Định dạng encoded_annotation " trong "Mã hóa được encoded_value " ở trên.

Giá trị khả năng hiển thị

Đây là những tùy chọn cho trường visibility trong annotation_item :

Tên Giá trị Sự miêu tả
Khả năng hiển thị_build 0x00 chỉ dự định hiển thị tại thời điểm xây dựng (ví dụ: trong quá trình biên dịch mã khác)
Khả năng hiển thị_runtime 0x01 dự định hiển thị trong thời gian chạy
Tầm nhìn_System 0x02 dự định hiển thị trong thời gian chạy, nhưng chỉ đến hệ thống cơ bản (và không phải là mã người dùng thông thường)

Đã mã hóa_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ó (liên kết byte)

Tên Định dạng Sự miêu tả
giá trị Đã mã hóa_array Các byte đại diện cho giá trị mảng được mã hóa, theo định dạng được chỉ định bởi "Định dạng encoded_array " trong "mã hóa encoded_value " ở trên.

hiddenapi_class_data_item

Phần này chứa dữ liệu trên các giao diện bị hạn chế được sử dụng bởi mỗi lớp.

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 cờ được mô tả dưới đây có thể được mở rộng trong các bản phát hành tương lai của Android. Để biết thêm thông tin, hãy xem các hạn chế trên các giao diện không phải SDK .

Tên Định dạng Sự miêu tả
kích cỡ uint Tổng kích thước của phần
bù đắp uint [] Mảng bù trừ được lập chỉ mục bởi class_idx . Mục nhập mảng bằng không tại index class_idx có nghĩa là không có dữ liệu cho class_idx này hoặc tất cả các cờ API ẩn đều bằng không. Nếu không, mục nhập mảng khác không và chứa phần bù từ đầu phần đến một mảng cờ API ẩn cho class_idx này.
cờ ULEB128 [] Các mảng được ghép của các cờ API ẩn cho mỗi lớp. Các giá trị cờ có thể được mô tả trong bảng dưới đây. Cờ được mã hóa theo cùng thứ tự với các trường và phương thức được mã hóa trong dữ liệu lớp.

Các loại cờ hạn chế:

Tên Giá trị Sự miêu tả
danh sách trắng 0 Các giao diện có thể được sử dụng tự do và được hỗ trợ như một phần của Chỉ số gói khung Android được ghi chép chính thức.
greylist 1 Các giao diện không phải SDK có thể được sử dụng bất kể mức API mục tiêu của ứng dụng.
danh sách đen 2 Các giao diện không phải SDK không thể được sử dụng bất kể mức API mục tiêu của ứng dụng. Việc truy cập một trong các giao diện này 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ể được sử dụng cho Android 8.x trở xuống trừ khi chúng bị hạn chế.
greylist - max p 4 Các giao diện không phải SDK có thể được sử dụng cho Android 9.x trừ khi chúng 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ừ khi chúng bị hạn chế.
GREYLIST - MAX 6 Các giao diện không phải SDK có thể được sử dụng cho Android 11.x trừ khi chúng bị hạn chế.

Chú thích hệ thống

Chú thích hệ thống được sử dụng để đại diện cho các phần thông tin phản chiếu khác nhau về các lớp (và phương pháp và trường). Thông tin này thường chỉ được truy cập gián tiếp theo mã của máy khách (không phải hệ thống).

Các chú thích hệ thống được biểu diễn trong các tệp .dex dưới dạng các chú thích với khả năng 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

Một chú thích AnnotationDefault được gắn vào mỗi giao diện chú thích muốn chỉ ra các ràng buộc mặc định.

Tên Định dạng Sự miêu tả
giá trị Chú thích Các ràng buộc mặc định cho chú thích này, được biểu thị dưới dạng chú thích của loại này. Chú thích không cần bao gồm tất cả các tên được xác định bởi chú thích; Thiếu tên chỉ đơn giản là không có mặc định.

dalvik.annotation.enclosingClass

Xuất hiện trên các lớp học

Một chú thích EnclosingClass được gắn vào mỗi lớp được định nghĩa là thành viên của một lớp khác, mỗi lớp hoặc ẩn danh nhưng không được định nghĩa trong một cơ thể 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ó một chú thích InnerClass . Ngoài ra, một lớp không được có cả một EnclosingClass và chú thích EnclosingMethod .

Tên Định dạng Sự miêu tả
giá trị Lớp học lớp mà phạm vi từ vựng gần nhất trong lớp này

dalvik.annotation.enclosingmethod

Xuất hiện trên các lớp học

Một chú thích EnclosingMethod được gắn vào mỗi lớp được xác định bên trong một cơ thể phương pháp. Mỗi lớp có chú thích này cũng phải có một chú thích InnerClass . Ngoài ra, một lớp không được có cả một EnclosingClass và chú thích EnclosingMethod .

Tên Định dạng Sự miêu tả
giá trị Phương pháp Phương pháp gần như phạm vi từ vựng nhất trong lớp này

Dalvik.annotation.innerClass

Xuất hiện trên các lớp học

Một chú thích InnerClass được gắn vào mỗi lớp được xác định trong phạm vi từ vựng của định nghĩa của 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 Sự miêu tả
tên Sợi dây Tên đơn giản được tuyên bố 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 ẩn danh, thì tên là null .
AccessFlags int Các cờ truy cập được khai báo ban đầu của lớp (có thể khác với các cờ hiệu quả vì sự không phù hợp giữa các mô hình thực thi của ngôn ngữ nguồn và máy ảo đích)

Dalvik.annotation.MemberClasses

Xuất hiện trên các lớp học

Một chú thích MemberClasses được gắn vào mỗi lớp tuyên bố các lớp thành viên. (Lớp thành viên là lớp bên trong trực tiếp có tên.)

Tên Định dạng Sự miêu tả
giá trị Lớp học[] Mảng các lớp thành viên

dalvik.annotation.methodparameter

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 nó trên các bản phát hành Android trước đó sẽ bị bỏ qua.

Chú thích MethodParameters là tùy chọn và có thể được sử dụng để cung cấp siêu dữ liệu tham số như tên và sửa đổi tham số.

Chú thích có thể được bỏ qua từ một phương thức hoặc hàm tạo một cách an toàn khi siêu dữ liệu tham số không cần thiết trong thời gian chạy. java.lang.reflect.Parameter.isNamePresent() có thể được sử dụng để kiểm tra xem siêu dữ liệu có mặt cho tham số hay không và các phương thức phản xạ liên quan như java.lang.reflect.Parameter.getName() Nếu thông tin không có mặt.

Khi bao gồm siêu dữ liệu tham số, các trình biên dịch phải bao gồm thông tin cho các lớp được tạo như enum, vì siêu dữ liệu tham số bao gồm liệu tham số có tổng hợp hay bắt buộc hay không.

Một chú thích MethodParameters chỉ mô tả các tham số phương thức riêng lẻ. Do đó, các trình biên dịch có thể bỏ qua việc chú thích hoàn toàn cho các hàm tạo và phương thức không có tham số, vì lợi ích của hiệu quả kích thước mã và thời gian chạy.

Các mảng được ghi lại 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 ném vào thời gian chạy.

Đó là: method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size phải giống như names().lengthaccessFlags().length .

Bởi 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 trong mã nguồn, kích thước của các mảng có thể khác với chữ ký hoặc thông tin siêu dữ liệu khác chỉ dựa trên các tham số rõ ràng được khai báo trong mã nguồn. MethodParameters cũng sẽ không bao gồm bất kỳ thông tin nào về các tham số 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 Sự miêu tả
tên Sợi dây[] Tên của các tham số chính thức cho phương thức liên quan. Mảng không được null 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 là null nếu tham số chính thức với chỉ mục đó không có tên.
Nếu các chuỗi tên tham số trống hoặc chứa '.', ';', '[' Hoặc '/' thì một java.lang.reflect.MalformedParametersException sẽ được ném vào thời gian chạy.
AccessFlags int [] Các cờ truy cập của các tham số chính thức cho phương thức liên quan. Mảng không được null nhưng phải trống nếu không có tham số chính thức.
Giá trị là một chút mặt nạ với các giá trị sau:
  • 0x0010: Cuối cùng, tham số đã được khai báo cuối cùng
  • 0x1000: tổng hợp, tham số được giới thiệu bởi trình biên dịch
  • 0x8000: bắt buộc, tham số là tổng hợp nhưng cũng được ngụ ý bởi đặc tả ngôn ngữ
Nếu bất kỳ bit nào được đặt bên ngoài bộ này thì một java.lang.reflect.MalformedParametersException sẽ được ném vào 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

Một chú thích Signature được gắn vào mỗi lớp, trường hoặc phương thức được định nghĩa theo loại phức tạp hơn so với đại diện bởi một type_id_item . Định dạng .dex không xác định định dạng cho chữ ký; Nó chỉ có nghĩa là có thể đại diện cho bất kỳ chữ ký nào mà một ngôn ngữ nguồn yêu cầu để thực hiện thành công ngữ nghĩa của ngôn ngữ đó. Như vậy, 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. Các chữ ký chỉ đơn giản là được trao cho các API và công cụ cấp cao hơn (chẳng hạn như gỡ lỗi). Do đó, bất kỳ việc sử dụng chữ ký nào cũng nên đượ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ệ, tự bảo vệ rõ ràng trước khả năng bắt gặp một chữ ký không hợp lệ về mặt cú pháp.

Bởi vì các chuỗi chữ ký có xu hướng có nhiều nội dung trùng lặp, một chú thích Signature được định nghĩa là một loạt các chuỗi, trong đó các yếu tố trùng lặp tự nhiên đề cập đến cùng một dữ liệu cơ bản và chữ ký được coi là sự 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 tách một chữ ký thành các chuỗi riêng biệt; Đó là hoàn toàn tùy thuộc vào các công cụ tạo các tệp .dex .

Tên Định dạng Sự miêu tả
giá trị Sợi dây[] Chữ ký của lớp hoặc thành viên này, như một loạt các chuỗi được nối với nhau

dalvik.annotation.throws

Xuất hiện trên các phương pháp

Một chú thích Throws được gắn vào mỗi phương thức được tuyên bố là ném một hoặc nhiều loại ngoại lệ.

Tên Định dạng Sự miêu tả
giá trị Lớp học[] Mảng các loại ngoại lệ ném