Định dạng tệp 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ác tệp này được dùng để lưu giữ một tập hợp các định nghĩa lớp và dữ liệu bổ trợ được liên kết của chúng.

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

Tên Mô tả
byte Số nguyên 8 bit có dấu
ubyte Số nguyên không dấu 8 bit
ngắn Số nguyên 16 bit có dấu, little-endian
ushort Số nguyên không dấu 16 bit, little-endian
int Số nguyên có dấu 32 bit, little-endian
uint Số nguyên không dấu 32 bit, little-endian
long Số nguyên có dấu 64 bit, little-endian
trà ô long Số nguyên không dấu 64 bit, little-endian
sleb128 LEB128 có dấu, độ dài thay đổi (xem bên dưới)
uleb128 LEB128 không có dấu, độ dài thay đổi (xem bên dưới)
uleb128p1 LEB128 không có dấu cộng với 1, độ dài thay đổi (xem bên dưới)

LEB128

LEB128 ("Little-Endian Base 128") là một phương thức mã hoá có độ dài thay đổi cho số lượng số nguyên có dấu hoặc không dấu tuỳ ý. Định dạng này được mượn từ quy cách DWARF3. Trong tệp .dex, LEB128 chỉ được dùng để mã hoá các số lượng 32 bit.

Mỗi giá trị được mã hoá LEB128 bao gồm từ 1 đến 5 byte, cùng nhau biểu thị một giá trị 32 bit duy nhất. Mỗi byte đều có bit quan trọng nhất được đặt, ngoại trừ byte cuối cùng trong chuỗi có bit quan trọng nhất bị xoá. 7 bit còn lại của mỗi byte là tải trọng, với 7 bit ít quan trọng nhất của số lượng trong byte đầu tiên, 7 bit tiếp theo trong byte thứ hai, v.v. Trong trường hợp LEB128 đã ký (sleb128), bit tải trọng quan trọng nhất của byte cuối cùng trong chuỗi được mở rộng dấu để tạo ra giá trị cuối cùng. Trong trường hợp chưa ký (uleb128), mọi bit không được biểu thị rõ ràng đều được diễn giải là 0.

Sơ đồ theo bit của giá trị LEB128 gồm 2 byte
Byte đầu tiên Byte thứ hai
1 bit6 bit5 bit4 bit3 bit2 bit1 bit0 0 bit13 bit12 bit11 bit10 bit9 bit8 bit7

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

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

Trình tự được mã hoá Như sleb128 Như uleb128 Như uleb128p1
0000-1
01110
7f-1127126
80 7f-1281625616255

Bố cục tệp

Tên Định dạng Mô tả
tiêu đề header_item tiêu đề
string_ids string_id_item[] danh sách giá trị nhận dạng chuỗi. Đây là giá trị nhận dạng cho tất cả các chuỗi mà tệp này sử dụng, cho mục đích đặt tên nội bộ (ví dụ: bộ mô tả loại) hoặc dưới dạng các đối tượng hằng số mà mã tham chiếu đến. Danh sách này phải được sắp xếp theo nội dung chuỗi, sử dụng các giá trị điểm mã UTF-16 (không theo cách phụ thuộc vào ngôn ngữ) và không được chứa bất kỳ mục nào trùng lặp.
type_ids type_id_item[] danh sách giá trị nhận dạng loại. Đây là giá trị nhận dạng cho tất cả các loại (lớp, mảng hoặc loại nguyên thuỷ) mà tệp này tham chiếu đến, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp theo chỉ mục string_id và không được chứa bất kỳ mục nhập trùng lặp nào.
proto_ids proto_id_item[] danh sách giá trị nhận dạng nguyên mẫu phương thức. Đây là số nhận dạng cho tất cả các nguyên mẫu mà tệp này tham chiếu. Danh sách này phải được sắp xếp theo thứ tự chính của return-type (theo chỉ mục type_id), sau đó theo danh sách đối số (sắp xếp theo từ điển, các đối số riêng lẻ được sắp xếp theo chỉ mục type_id). Danh sách không được chứa bất kỳ mục nhập trùng lặp nào.
field_ids field_id_item[] danh sách giá trị nhận dạng trường. Đây là giá trị nhận dạng cho tất cả các trường mà tệp này đề cập đến, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp, trong đó loại xác định (theo chỉ mục type_id) là thứ tự chính, tên trường (theo chỉ mục string_id) là thứ tự trung gian và loại (theo chỉ mục type_id) là thứ tự phụ. Danh sách không được chứa bất kỳ mục nhập trùng lặp nào.
method_ids method_id_item[] danh sách giá trị nhận dạng phương thức. Đây là giá trị nhận dạng cho tất cả các phương thức mà tệp này tham chiếu đến, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp, trong đó loại xác định (theo chỉ mục type_id) là thứ tự chính, tên phương thức (theo chỉ mục string_id) là thứ tự trung gian và nguyên mẫu phương thức (theo chỉ mục proto_id) là thứ tự phụ. Danh sách không được chứa bất kỳ mục nhập trùng lặp nào.
class_defs class_def_item[] danh sách định nghĩa lớp học. Các lớp phải được sắp xếp sao cho siêu lớp và các giao diện đã triển khai của một lớp nhất định xuất hiện trong danh sách trước lớp tham chiếu. Ngoài ra, bạn không được phép xác định một lớp có cùng tên nhiều lần trong danh sách.
call_site_ids call_site_id_item[] danh sách giá trị nhận dạng trang web gọi. Đây là mã nhận dạng cho tất cả các trang web gọi được tệp này tham chiếu đến, cho dù được xác định trong tệp hay không. Danh sách này phải được sắp xếp theo thứ tự tăng dần của call_site_off.
method_handles method_handle_item[] danh sách xử lý phương thức. Danh sách tất cả các đối tượng xử lý phương thức mà tệp này tham chiếu đến, cho dù được xác định trong tệp hay không. Danh sách này không được sắp xếp và có thể chứa các bản sao trùng lặp sẽ tương ứng một cách hợp lý với các thực thể xử lý phương thức khác nhau.
dữ liệu ubyte[] vùng dữ liệu, chứa tất cả dữ liệu hỗ trợ cho các bảng được liệt kê ở trên. Các mục khác nhau có các yêu cầu khác nhau về việc căn chỉnh và các byte đệm sẽ được chèn trước mỗi mục nếu cần để đạt được việc căn chỉnh thích hợp.
link_data ubyte[] dữ liệu được dùng trong các tệp được liên kết tĩnh. Định dạng dữ liệu trong phần này không được tài liệu này chỉ định. Phần này trống trong các tệp chưa liên kết và các hoạt động triển khai thời gian chạy có thể sử dụng phần này nếu thấy phù hợp.

Định dạng vùng chứa

Phiên bản 41 giới thiệu một định dạng vùng chứa mới cho dữ liệu DEX nhằm mục đích tiết kiệm dung lượng. Định dạng vùng chứa này cho phép kết hợp một số tệp DEX logic thành một tệp vật lý duy nhất. Định dạng mới chủ yếu chỉ là sự kết hợp đơn giản của các tệp ở định dạng cũ, với một số điểm khác biệt:

  • file_size là kích thước của tệp logic, chứ không phải tệp thực. Bạn có thể dùng phương thức này để lặp lại tất cả các tệp logic trong vùng chứa.
  • Các tệp dex logic có thể tham chiếu đến mọi dữ liệu sau này trong vùng chứa (nhưng không phải dữ liệu trước đó). Điều này cho phép các tệp dex chia sẻ dữ liệu (chẳng hạn như chuỗi) giữa chúng.
  • Tất cả các độ lệch đều liên quan đến tệp thực. Không có độ lệch nào so với tiêu đề. Điều này đảm bảo rằng các phần có độ lệch có thể được chia sẻ giữa các tệp logic.
  • Tiêu đề này thêm 2 trường mới để mô tả các điều kiện ràng buộc của vùng chứa. Đây là một bước kiểm tra tính nhất quán bổ sung và giúp việc chuyển mã sang định dạng mới dễ dàng hơn.
  • data_sizedata_off hiện không được dùng nữa. Dữ liệu có thể được trải rộng trên nhiều tệp logic và không nhất thiết phải liền kề.

Định nghĩa về trường bit, chuỗi và hằng số

DEX_FILE_MAGIC

Được nhúng trong header_item

Mảng/chuỗi hằng số DEX_FILE_MAGIC là danh sách các byte phải xuất hiện ở đầu tệp .dex để được nhận dạng là tệp đó. Giá trị này cố ý chứa một dòng mới ("\n" hoặc 0x0a) và một byte rỗng ("\0" hoặc 0x00) để giúp phát hiện một số dạng hỏng dữ liệu. Giá trị này cũng mã hoá số phiên bản định dạng dưới dạng 3 chữ số thập phân, dự kiến sẽ tăng đơn điệu theo thời gian khi định dạng phát triển.

ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 }
                        = "dex\n039\0"

Lưu ý: Chúng tôi đã thêm tính năng hỗ trợ phiên bản 041 của định dạng này trong bản phát hành Android 16, hỗ trợ định dạng vùng chứa.

Lưu ý: Chúng tôi đã thêm tính năng hỗ trợ phiên bản 040 của định dạng này trong bản phát hành Android 10.0, giúp mở rộng tập hợp các ký tự được phép trong SimpleNames.

Lưu ý: Chúng tôi đã thêm tính năng hỗ trợ cho phiên bản 039 của định dạng này trong bản phát hành Android 9.0. Bản phát hành này giới thiệu 2 mã byte mới là const-method-handleconst-method-type. (Mỗi loại được mô tả trong bảng Tóm tắt bộ mã byte.) Trong Android 10, phiên bản 039 mở rộng định dạng tệp DEX để bao gồm thông tin API ẩn chỉ áp dụng cho các tệp DEX trên đường dẫn lớp khởi động.

Lưu ý: Chúng tôi đã thêm tính năng hỗ trợ phiên bản 038 của định dạng này trong bản phát hành Android 8.0. Phiên bản 038 đã thêm các mã byte mới (invoke-polymorphicinvoke-custom) và dữ liệu cho các hàm xử lý phương thức.

Lưu ý: Chúng tôi đã thêm tính năng hỗ trợ phiên bản 037 của định dạng này trong bản phát hành Android 7.0. Trước phiên bản 037, hầu hết các phiên bản Android đều sử dụng phiên bản 035 của định dạng này. Điểm khác biệt duy nhất giữa phiên bản 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 dùng trong các bản phát hành phần mềm công khai có sẵn rộng rãi. Ví dụ: phiên bản 009 được dùng cho các bản phát hành M3 của nền tảng Android (tháng 11 – tháng 12 năm 2007) và phiên bản 013 được dùng cho các bản phát hành M5 của nền tảng Android (tháng 2 – tháng 3 năm 2008). Ở một số khía cạnh, các phiên bản trước của định dạng này khác biệt đáng kể so với phiên bản được mô tả trong tài liệu này.

ENDIAN_CONSTANT và REVERSE_ENDIAN_CONSTANT

Được nhúng trong header_item

Hằng số ENDIAN_CONSTANT được dùng để cho biết thứ tự byte của tệp mà hằng số này xuất hiện. Mặc dù định dạng .dex tiêu chuẩn là little-endian, nhưng các hoạt động triển khai có thể chọn thực hiện việc hoán đổi byte. Nếu quá trình triển khai gặp phải một tiêu đề có endian_tagREVERSE_ENDIAN_CONSTANT thay vì ENDIAN_CONSTANT, thì quá trình triển khai đó sẽ biết rằng tệp đã được hoán đổi byte từ dạng thức dự kiến.

uint ENDIAN_CONSTANT = 0x12345678;
uint REVERSE_ENDIAN_CONSTANT = 0x78563412;

NO_INDEX

Được nhúng trong class_def_item và debug_info_item

Hằng số NO_INDEX được dùng để cho biết rằng giá trị chỉ mục không có.

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

Giá trị đã chọn cho NO_INDEX có thể biểu thị dưới dạng một byte duy nhất trong phương thức mã hoá uleb128p1.

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

Định nghĩa access_flags

Được nhúng trong class_def_item, encoded_field, encoded_method và InnerClass

Bitfield của các cờ này được dùng để cho biết khả năng tiếp cận và các thuộc tính tổng thể của các lớp và thành viên lớp.

Tên Giá trị Đối với các lớp học (và chú giải InnerClass) Đối với các trường Đối với phương thức
ACC_PUBLIC 0x1 public: xuất hiện ở mọi nơi public: xuất hiện ở mọi nơi public: xuất hiện ở mọi nơi
ACC_PRIVATE 0x2 * private: chỉ lớp xác định mới nhìn thấy private: chỉ hiển thị cho lớp xác định private: chỉ hiển thị cho lớp xác định
ACC_PROTECTED 0x4 * protected: hiển thị cho gói và các lớp con protected: hiển thị cho gói và các lớp con protected: hiển thị cho gói và các lớp con
ACC_STATIC 0x8 * static: không được tạo bằng một tham chiếu this bên ngoài static: toàn cục đến lớp xác định static: không lấy đối số this
ACC_FINAL 0x10 final: không thể phân lớp final: bất biến sau khi tạo final: không ghi đè được
ACC_SYNCHRONIZED 0x20     synchronized: khoá được liên kết sẽ tự động thu được khi gọi phương thức này.

Lưu ý: Bạn chỉ có thể đặt thông số này khi ACC_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, do trình biên dịch tự động thêm dưới dạng cầu nối an toàn về kiểu
ACC_TRANSIENT 0x80   transient: không được lưu theo quá trình chuyển đổi tuần tự hoá mặc định  
ACC_VARARGS 0x80     đối số cuối cùng sẽ được trình biên dịch coi là đối số "còn lại"
ACC_NATIVE 0x100     native: được triển khai trong mã gốc
ACC_INTERFACE 0x200 interface: lớp trừu tượng có thể triển khai nhiều lần    
ACC_ABSTRACT 0x400 abstract: không thể tạo thực thể trực tiếp   abstract: chưa được lớp này triển khai
ACC_STRICT 0x800     strictfp: các quy tắc nghiêm ngặt cho số học dấu phẩy động
ACC_SYNTHETIC 0x1000 không được xác định trực tiếp trong mã nguồn không được xác định trực tiếp trong mã nguồn không được xác định trực tiếp trong mã nguồn
ACC_ANNOTATION 0x2000 được khai báo dưới dạng một lớp chú giải    
ACC_ENUM 0x4000 được khai báo là một kiểu liệt kê được khai báo dưới dạng giá trị được liệt kê  
(unused) 0x8000      
ACC_CONSTRUCTOR 0x10000     phương thức khởi tạo (trình khởi tạo lớp hoặc thực thể)
ACC_DECLARED_
SYNCHRONIZED
0x20000     đã khai báo synchronized.

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

* Chỉ được phép xuất hiện trên chú thích InnerClass và không được xuất hiện trong class_def_item.

Phương thức mã hoá UTF-8 đã sửa đổi

Để dễ dàng hỗ trợ các phiên bản cũ, định dạng .dex sẽ mã hoá dữ liệu chuỗi của mình ở dạng UTF-8 đã sửa đổi theo tiêu chuẩn thực tế, sau đây gọi là MUTF-8. Biểu mẫu này giống hệt với UTF-8 tiêu chuẩn, ngoại trừ:

  • Chỉ sử dụng các phương thức mã hoá một, hai và ba byte.
  • Các điểm mã trong dải U+10000U+10ffff được mã hoá dưới dạng một cặp thay thế, mỗi cặp được biểu thị dưới dạng một giá trị được mã hoá gồm 3 byte.
  • Điểm mã U+0000 được mã hoá ở dạng 2 byte.
  • Một byte rỗng đơn giản (giá trị 0) cho biết phần cuối của một chuỗi, theo cách diễn giải tiêu chuẩn của ngôn ngữ C.

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

Hai mục cuối cùng ở trên giúp bạn có thể đồng thời đưa điểm mã U+0000 vào một chuỗi vẫn thao tác với chuỗi đó dưới dạng chuỗi kết thúc bằng giá trị rỗng theo kiểu C.

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

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

mã hoá encoded_value

Được nhúng trong annotation_element và encoded_array_item

encoded_value là một phần được mã hoá của dữ liệu có cấu trúc phân cấp (gần như) tuỳ ý. Mục đích của việc mã hoá là để vừa nhỏ gọn vừa dễ phân tích cú pháp.

Tên Định dạng Mô tả
(value_arg << 5) | value_type ubyte byte cho biết loại value ngay sau đó cùng với một đối số làm rõ không bắt buộc trong 3 bit có thứ tự cao. Hãy xem bên dưới để biết các định nghĩa về value. Trong hầu hết các trường hợp, value_arg mã hoá độ dài của value ngay sau đó theo byte, dưới dạng (size - 1), ví dụ: 0 có nghĩa là giá trị yêu cầu 1 byte và 7 có nghĩa là giá trị yêu cầu 8 byte; tuy nhiên, có những trường hợp ngoại lệ như được lưu ý bên dưới.
value ubyte[] byte đại diện cho giá trị, độ dài thay đổi và được diễn giải khác nhau đối với các byte value_type khác nhau, mặc dù luôn là little-endian. Hãy xem các định nghĩa về giá trị bên dưới để biết thông tin chi tiết.

Định dạng giá trị

Nhập tên value_type value_arg Định dạng value Định dạng Mô tả
VALUE_BYTE 0x00 (không có; phải là 0) ubyte[1] giá trị số nguyên một byte có dấu
VALUE_SHORT 0x02 kích thước – 1 (0…1) ubyte[size] giá trị số nguyên 2 byte có dấu, được mở rộng dấu
VALUE_CHAR 0x03 kích thước – 1 (0…1) ubyte[size] giá trị số nguyên chưa ký gồm 2 byte, được mở rộng thành 0
VALUE_INT 0x04 kích thước – 1 (0…3) ubyte[size] giá trị số nguyên có dấu gồm 4 byte, được mở rộng dấu
VALUE_LONG 0x06 size – 1 (0…7) ubyte[size] giá trị số nguyên có dấu 8 byte, được mở rộng dấu
VALUE_FLOAT 0x10 kích thước – 1 (0…3) ubyte[size] mẫu bit 4 byte, mở rộng thành 0 sang phải và được diễn giải dưới dạng giá trị dấu phẩy động 32 bit IEEE754
VALUE_DOUBLE 0x11 size – 1 (0…7) ubyte[size] mẫu bit 8 byte, mở rộng thành 0 sang phải và được diễn giải dưới dạng giá trị dấu phẩy động 64 bit IEEE754
VALUE_METHOD_TYPE 0x15 kích thước – 1 (0…3) ubyte[size] giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần proto_ids và biểu thị một giá trị kiểu phương thức
VALUE_METHOD_HANDLE 0x16 kích thước – 1 (0…3) ubyte[size] giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần method_handles và biểu thị một giá trị xử lý phương thức
VALUE_STRING 0x17 kích thước – 1 (0…3) ubyte[size] giá trị số nguyên 4 byte không dấu (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần string_ids và biểu thị một giá trị chuỗi
VALUE_TYPE 0x18 kích thước – 1 (0…3) ubyte[size] giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần type_ids và biểu thị một giá trị loại/lớp phản chiếu
VALUE_FIELD 0x19 kích thước – 1 (0…3) ubyte[size] giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần field_ids và biểu thị một giá trị trường phản chiếu
VALUE_METHOD 0x1a kích thước – 1 (0…3) ubyte[size] giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần method_ids và biểu thị một giá trị phương thức phản chiếu
VALUE_ENUM 0x1b kích thước – 1 (0…3) ubyte[size] giá trị số nguyên 4 byte chưa ký (mở rộng bằng 0), được diễn giải là một chỉ mục trong phần field_ids và biểu thị giá trị của một hằng số kiểu được liệt kê
VALUE_ARRAY 0x1c (không có; phải là 0) encoded_array một mảng giá trị, theo định dạng được chỉ định bằng "định dạng encoded_array" bên dưới. Kích thước của value được ngầm hiểu trong quá trình mã hoá.
VALUE_ANNOTATION 0x1d (không có; phải là 0) encoded_annotation một chú thích phụ, theo định dạng do "định dạng encoded_annotation" bên dưới chỉ định. Kích thước của value được ngầm hiểu trong quá trình mã hoá.
VALUE_NULL 0x1e (không có; phải là 0) (không có) Giá trị tham chiếu null
VALUE_BOOLEAN 0x1f boolean (0…1) (không có) giá trị một bit; 0 cho false1 cho true. Bit này được biểu thị trong value_arg.

định dạng encoded_array

Tên Định dạng Mô tả
size uleb128 số lượng phần tử trong mảng
giá trị encoded_value[size] một chuỗi gồm các chuỗi byte size encoded_value theo định dạng do phần này chỉ định, được nối tuần tự.

định dạng encoded_annotation

Tên Định dạng Mô tả
type_idx uleb128 loại chú thích. Đây phải là một lớp (không phải mảng hoặc kiểu nguyên thuỷ).
size uleb128 số lượng mối liên kết tên-giá trị trong chú thích này
phần tử annotation_element[size] các phần tử của chú thích, được biểu thị trực tiếp trong dòng (không phải dưới dạng độ lệch). Các phần tử phải được sắp xếp theo thứ tự tăng dần theo chỉ mục string_id.

định dạng annotation_element

Tên Định dạng Mô tả
name_idx uleb128 tên phần tử, được biểu thị dưới dạng một chỉ mục trong phần string_ids. Chuỗi phải tuân thủ cú pháp của MemberName, được xác định ở trên.
value encoded_value giá trị phần tử

Cú pháp chuỗi

Có một số loại mục trong tệp .dex, cuối cùng sẽ tham chiếu đến một chuỗi. Các định nghĩa theo kiểu BNF sau đây cho biết cú pháp chấp nhận được cho các chuỗi này.

SimpleName

SimpleName là cơ sở cho cú pháp của tên của những thứ khác. Định dạng .dex cho phép một lượng lớn khoảng trống ở đây (nhiều hơn hầu hết các ngôn ngữ nguồn phổ biến). Nói tóm lại, tên đơn giản bao gồm mọi ký tự chữ cái hoặc chữ số ASCII thấp, một số ký hiệu ASCII thấp cụ thể và hầu hết các điểm mã không phải ASCII không phải là ký tự điều khiển, khoảng trắng hoặc ký tự đặc biệt. Kể từ phiên bản 040, định dạng này cũng cho phép các ký tự dấu cách (danh mục Unicode Zs). Xin lưu ý rằng các điểm mã thay thế (trong phạm vi U+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 lựa chọn thay thế cuối cùng của quy tắc cho SimpleNameChar) và chúng phải được biểu thị trong một tệp dưới dạng các cặp điểm mã thay thế trong mã hoá MUTF-8.

SimpleName
SimpleNameChar (SimpleNameChar)*
SimpleNameChar
'A''Z'
| 'a''z'
| '0''9'
| ' ' kể từ phiên bản DEX 040
| '$'
| '-'
| '_'
| U+00a0 kể từ phiên bản DEX 040
| U+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 dùng bởi field_id_item và method_id_item

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

MemberName
SimpleName
| '<' SimpleName '>'

FullClassName

FullClassName là tên lớp đủ điều kiện, bao gồm một bộ chỉ định gói không bắt buộc, theo sau là một tên bắt buộc.

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(SimpleName '/')*

TypeDescriptor

Được dùng bởi type_id_item

TypeDescriptor là biểu thị của mọi loại, bao gồm cả các kiểu dữ liệu nguyên thuỷ, lớp, mảng và void. Xem bên dưới để biết ý nghĩa của các phiên bản.

TypeDescriptor
'V'
| FieldTypeDescriptor
FieldTypeDescriptor
NonArrayFieldTypeDescriptor
| ('[' * 1…255) NonArrayFieldTypeDescriptor
NonArrayFieldTypeDescriptor
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L' FullClassName ';'

ShortyDescriptor

Được dùng bởi proto_id_item

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

ShortyDescriptor
ShortyReturnType (ShortyFieldType)*
ShortyReturnType
'V'
| ShortyFieldType
ShortyFieldType
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L'

Ngữ nghĩa TypeDescriptor

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

Cú pháp Ý nghĩa
V void; chỉ hợp lệ cho các loại trả lại
Z boolean
B byte
S short
C char
I int
J long
T6 float
D double
Lfully/qualified/Name; lớp fully.qualified.Name
[descriptor mảng descriptor, có thể dùng đệ quy cho mảng gồm các mảng, mặc dù không hợp lệ nếu có hơn 255 phương diện.

Các mục và cấu trúc liên quan

Phần này bao gồm các định nghĩa cho từng mục cấp cao nhất có thể xuất hiện trong tệp .dex.

header_item

Xuất hiện trong phần đầu trang

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
ma thuật ubyte[8] = DEX_FILE_MAGIC giá trị ma thuật. Hãy xem phần thảo luận ở trên trong mục "DEX_FILE_MAGIC" để biết thêm thông tin chi tiết.
giá trị tổng kiểm uint tổng kiểm adler32 của phần còn lại của tệp (mọi thứ trừ magic và trường này); dùng để phát hiện tệp bị hỏng
Chữ ký ubyte[20] Chữ ký SHA-1 (hàm băm) của phần còn lại của tệp (mọi thứ trừ magic, checksum và trường này); dùng để nhận dạng duy nhất các tệp
file_size uint

kích thước của toàn bộ tệp (bao gồm cả tiêu đề), tính bằng byte (phiên bản 40 trở xuống)

khoảng cách tính bằng byte từ đầu tiêu đề này đến tiêu đề tiếp theo hoặc đến cuối toàn bộ tệp (vùng chứa). (phiên bản 41 trở lên)

header_size uint

kích thước của tiêu đề (toàn bộ phần này), tính bằng byte. Điều này cho phép có ít nhất một lượng tương thích ngược/xuôi hạn chế mà không làm định dạng trở nên không hợp lệ.

phải là 0x70 (112) byte (phiên bản 40 trở xuống)

phải là 0x78 (120) byte (v41 trở lên)

endian_tag uint = ENDIAN_CONSTANT thẻ endianness. Hãy xem phần thảo luận ở trên trong mục "ENDIAN_CONSTANTREVERSE_ENDIAN_CONSTANT" để biết thêm thông tin chi tiết.
link_size uint kích thước của phần liên kết hoặc 0 nếu tệp này không được liên kết tĩnh
link_off uint độ lệch từ đầu tệp đến phần liên kết hoặc 0 nếu link_size == 0. Khoảng bù (nếu khác 0) phải là khoảng bù vào phần link_data. Định dạng của dữ liệu được chỉ ra là không được chỉ định trong tài liệu này; trường tiêu đề này (và trường trước đó) được để lại dưới dạng các hook để sử dụng bằng cách triển khai thời gian chạy.
map_off uint độ lệch từ đầu tệp đến mục trên bản đồ. Độ lệch (phải khác 0) phải là độ lệch vào phần data và dữ liệu phải ở định dạng do "map_list" chỉ định bên dưới.
string_ids_size uint số lượng chuỗi trong danh sách giá trị nhận dạng chuỗi
string_ids_off uint độ lệch từ đầu tệp đến danh sách giá trị nhận dạng chuỗi hoặc 0 nếu string_ids_size == 0 (thừa nhận là một trường hợp biên kỳ lạ). Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần string_ids.
type_ids_size uint số lượng phần tử trong danh sách giá trị nhận dạng loại, tối đa là 65535
type_ids_off uint độ lệch từ đầu tệp đến danh sách giá trị nhận dạng loại hoặc 0 nếu type_ids_size == 0 (thừa nhận là một trường hợp biên kỳ lạ). Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần type_ids.
proto_ids_size uint số lượng phần tử trong danh sách giá trị nhận dạng nguyên mẫu, tối đa là 65535
proto_ids_off uint độ lệch so với đầu tệp đến danh sách giá trị nhận dạng nguyên mẫu hoặc 0 nếu proto_ids_size == 0 (thừa nhận là một trường hợp biên kỳ lạ). Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần proto_ids.
field_ids_size uint số lượng phần tử trong danh sách giá trị nhận dạng trường
field_ids_off uint độ lệch từ đầu tệp đến danh sách giá trị nhận dạng trường hoặc 0 nếu field_ids_size == 0. Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần field_ids.
method_ids_size uint số lượng phần tử trong danh sách giá trị nhận dạng phương thức
method_ids_off uint độ lệch từ đầu tệp đến danh sách giá trị nhận dạng phương thức hoặc 0 nếu method_ids_size == 0. Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần method_ids.
class_defs_size uint số lượng phần tử trong danh sách định nghĩa lớp
class_defs_off uint độ lệch từ đầu tệp đến danh sách định nghĩa lớp hoặc 0 nếu class_defs_size == 0 (mặc dù đây là một trường hợp biên kỳ lạ). Nếu khác 0, độ lệch phải là độ lệch so với phần đầu của phần class_defs.
data_size uint

Kích thước của phần data tính bằng byte. Phải là bội số chẵn của sizeof(uint). (v40 trở xuống)

Không dùng (v41 trở lên)

data_off uint

độ lệch từ đầu tệp đến đầu phần data(phiên bản 40 trở xuống)

Không dùng (v41 trở lên)

container_size uint

trường này không tồn tại. Bạn có thể giả định rằng giá trị này bằng file_size. (v40 trở xuống)

kích thước của toàn bộ tệp (bao gồm cả các tiêu đề dex khác và dữ liệu của chúng). (phiên bản 41 trở lên)

header_offset uint

trường này không tồn tại. Bạn có thể giả định rằng giá trị này bằng 0. (v40 trở xuống)

độ lệch từ đầu tệp đến đầu tiêu đề này. (phiên bản 41 trở lên)

map_list

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

Được tham chiếu từ header_item

Căn chỉnh: 4 byte

Đây là danh sách toàn bộ nội dung của một tệp, theo thứ tự. Nó chứa một số thông tin dư thừa liên quan đến header_item nhưng được dự định là một biểu mẫu dễ sử dụng để lặp lại toàn bộ tệp. Một loại nhất định chỉ được xuất hiện tối đa một lần trong bản đồ, nhưng không có hạn chế nào về thứ tự xuất hiện của các loại, ngoài những hạn chế ngụ ý theo phần còn lại của định dạng (ví dụ: phần header phải xuất hiện trước, theo sau là phần string_ids, v.v.). Ngoài ra, các mục nhập bản đồ phải được sắp xếp theo độ lệch ban đầu và không được trùng lặp.

Tên Định dạng Mô tả
size uint kích thước của danh sách, tính bằng số mục
danh sách map_item[size] các phần tử của danh sách

Định dạng map_item

Tên Định dạng Mô tả
loại ushort loại mặt hàng; xem bảng bên dưới
unused ushort (unused)
size uint số lượng mục cần tìm tại khoảng cách đã chỉ định
bù trừ uint độ lệch so với đầu tệp đến các mục có liên quan

Mã loại

Loại mặt hàng Hằng số Giá trị Kích thước của mặt hàng tính bằng byte
header_item TYPE_HEADER_ITEM 0x0000 0x70
string_id_item TYPE_STRING_ID_ITEM 0x0001 0x04
type_id_item TYPE_TYPE_ID_ITEM 0x0002 0x04
proto_id_item TYPE_PROTO_ID_ITEM 0x0003 0x0c
field_id_item TYPE_FIELD_ID_ITEM 0x0004 0x08
method_id_item TYPE_METHOD_ID_ITEM 0x0005 0x08
class_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
call_site_id_item TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
method_handle_item TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
map_list TYPE_MAP_LIST 0x1000 4 + (item.size * 12)
type_list TYPE_TYPE_LIST 0x1001 4 + (item.size * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (item.size * 4)
annotation_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (item.size * 4)
class_data_item TYPE_CLASS_DATA_ITEM 0x2000 ngầm ẩn; phải phân tích cú pháp
code_item TYPE_CODE_ITEM 0x2001 ngầm ẩn; phải phân tích cú pháp
string_data_item TYPE_STRING_DATA_ITEM 0x2002 ngầm ẩn; phải phân tích cú pháp
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 ngầm ẩn; phải phân tích cú pháp
annotation_item TYPE_ANNOTATION_ITEM 0x2004 ngầm ẩn; phải phân tích cú pháp
encoded_array_item TYPE_ENCODED_ARRAY_ITEM 0x2005 ngầm ẩn; phải phân tích cú pháp
annotations_directory_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 ngầm ẩn; phải phân tích cú pháp
hiddenapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 ngầm ẩn; phải phân tích cú pháp

string_id_item

Xuất hiện trong phần string_ids

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
string_data_off uint độ lệch từ đầu tệp đến dữ liệu chuỗi cho mục này. Khoảng bù phải là một vị trí trong phần data và dữ liệu phải ở định dạng do "string_data_item" chỉ định bên dưới. Không có yêu cầu nào về việc căn chỉnh độ lệch.

string_data_item

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

Căn chỉnh: không có (căn chỉnh theo byte)

Tên Định dạng Mô tả
utf16_size uleb128 kích thước của chuỗi này, tính bằng đơn vị mã UTF-16 (đây là "độ dài chuỗi" trong nhiều hệ thống). Tức là đây là độ dài đã giải mã của chuỗi. (Độ dài được mã hoá được ngầm hiểu theo vị trí của byte 0.)
dữ liệu ubyte[] một chuỗi các đơn vị mã MUTF-8 (còn gọi là octet, còn gọi là byte) theo sau là một byte có giá trị 0. Hãy xem phần "Mã hoá MUTF-8 (UTF-8 đã sửa đổi)" ở trên để biết thông tin chi tiết và nội dung thảo luận về định dạng dữ liệu.

Lưu ý: Bạn có thể dùng một chuỗi bao gồm các đơn vị mã thay thế UTF-16 (dạng mã hoá) (tức là U+d800U+dfff) riêng lẻ hoặc không theo thứ tự so với cách mã hoá thông thường của Unicode thành UTF-16. Các ứng dụng cấp cao hơn của chuỗi có quyền từ chối những phương thức mã hoá không hợp lệ như vậy, nếu thích hợp.

type_id_item

Xuất hiện trong phần type_ids

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
descriptor_idx uint chỉ mục vào danh sách string_ids cho chuỗi mô tả thuộc loại này. Chuỗi phải tuân thủ cú pháp của TypeDescriptor, được xác định ở trên.

proto_id_item

Xuất hiện trong phần proto_ids

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
shorty_idx uint chỉ mục vào danh sách string_ids cho chuỗi mô tả dạng ngắn của nguyên mẫu này. Chuỗi này phải tuân thủ cú pháp của ShortyDescriptor (được xác định ở trên) và phải tương ứng với kiểu dữ liệu trả về và các tham số của mục này.
return_type_idx uint chỉ mục vào danh sách type_ids cho kiểu trả về của nguyên mẫu này
parameters_off uint độ lệch từ đầu tệp đến danh sách các loại tham số cho nguyên mẫu này hoặc 0 nếu nguyên mẫu này không có tham số. Khoảng bù này (nếu khác 0) phải nằm trong phần data và dữ liệu ở đó phải ở định dạng do "type_list" chỉ định bên dưới. Ngoài ra, không được có tham chiếu đến loại void trong danh sách.

field_id_item

Xuất hiện trong phần field_ids

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
class_idx ushort chỉ mục vào danh sách type_ids cho người xác định trường này. Đây phải là một kiểu lớp chứ không phải là một mảng hoặc kiểu cơ bản.
type_idx ushort chỉ mục vào danh sách type_ids cho loại trường này
name_idx uint chỉ mục vào danh sách string_ids để biết tên của trường này. Chuỗi phải tuân thủ cú pháp của MemberName, được xác định ở trên.

method_id_item

Xuất hiện trong phần method_ids

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
class_idx ushort chỉ mục vào danh sách type_ids cho trình xác định phương thức này. Đây phải là một lớp hoặc kiểu mảng, chứ không phải kiểu nguyên thuỷ.
proto_idx ushort chỉ mục vào danh sách proto_ids cho nguyên mẫu của phương thức này
name_idx uint chỉ mục vào danh sách string_ids cho tên của phương thức này. Chuỗi phải tuân thủ cú pháp của MemberName, được xác định ở trên.

class_def_item

Xuất hiện trong phần class_defs

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
class_idx uint chỉ mục vào danh sách type_ids cho lớp này. Đây phải là một kiểu lớp chứ không phải là một mảng hoặc kiểu cơ bản.
access_flags uint cờ truy cập cho lớp (public, final, v.v.). Hãy xem phần "access_flags Định nghĩa" để biết thông tin chi tiết.
superclass_idx uint chỉ mục vào danh sách type_ids cho lớp mẹ hoặc giá trị hằng số NO_INDEX nếu lớp này không có lớp mẹ (tức là đây là một lớp gốc như Object). Nếu có, đây phải là một loại lớp chứ không phải là một mảng hoặc loại nguyên thuỷ.
interfaces_off uint độ lệch từ đầu tệp đến danh sách giao diện hoặc 0 nếu không có giao diện nào. Khoảng bù này phải nằm trong phần data và dữ liệu ở đó phải ở định dạng do "type_list" chỉ định bên dưới. Mỗi phần tử của danh sách phải là một kiểu lớp (không phải là mảng hoặc kiểu nguyên thuỷ) và không được có bất kỳ phần tử nào trùng lặp.
source_file_idx uint chỉ mục vào danh sách string_ids cho tên của tệp chứa nguồn ban đầu cho (ít nhất là hầu hết) lớp này hoặc giá trị đặc biệt NO_INDEX để biểu thị việc thiếu thông tin này. debug_info_item của bất kỳ phương thức nào có thể ghi đè tệp nguồn này, nhưng dự kiến hầu hết các lớp sẽ chỉ đến từ một tệp nguồn.
annotations_off uint độ lệch từ đầu tệp đến cấu trúc chú thích cho lớp này hoặc 0 nếu không có chú thích nào trên lớp này. Nếu khác 0, độ lệch này phải nằm trong phần data và dữ liệu ở đó phải có định dạng do "annotations_directory_item" chỉ định bên dưới, với tất cả các mục tham chiếu đến lớp này làm trình xác định.
class_data_off uint độ lệch so với đầu tệp đến dữ liệu lớp được liên kết cho mục này hoặc 0 nếu không có dữ liệu lớp cho lớp này. (Ví dụ: điều này có thể xảy ra nếu lớp này là một giao diện đánh dấu.) Nếu khác 0, độ lệch phải nằm trong phần data và dữ liệu ở đó phải có định dạng do "class_data_item" chỉ định bên dưới, với tất cả các mục tham chiếu đến lớp này làm trình xác định.
static_values_off uint độ lệch từ đầu tệp đến danh sách các giá trị ban đầu cho các trường static hoặc 0 nếu không có giá trị nào (và tất cả các trường static sẽ được khởi tạo bằng 0 hoặc null). Độ lệch này phải nằm trong phần data và dữ liệu ở đó phải ở định dạng do "encoded_array_item" chỉ định bên dưới. Kích thước của mảng không được lớn hơn số lượng trường static do lớp này khai báo và các phần tử tương ứng với các trường static theo cùng một thứ tự như được khai báo trong field_list tương ứng. Loại của mỗi phần tử mảng phải khớp với loại đã khai báo của trường tương ứng. Nếu có ít phần tử trong mảng hơn số trường static, thì các trường còn lại sẽ được khởi tạo bằng 0 hoặc null phù hợp với loại.

call_site_id_item

Xuất hiện trong mục call_site_ids

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
call_site_off uint độ lệch từ đầu tệp đến định nghĩa vị trí gọi. Độ lệch phải nằm trong phần dữ liệu và dữ liệu ở đó phải có định dạng do "call_site_item" chỉ định bên dưới.

call_site_item

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

Căn chỉnh: không có (căn chỉnh theo byte)

call_site_item là một encoded_array_item có các phần tử tương ứng với các đối số được cung cấp cho một phương thức liên kết khởi động. Ba đối số đầu tiên là:

  1. Một phương thức xử lý đại diện cho phương thức liên kết khởi động (VALUE_METHOD_HANDLE).
  2. Tên phương thức mà trình liên kết khởi động cần phân giải (VALUE_STRING).
  3. Một loại phương thức tương ứng với loại tên phương thức cần phân giải (VALUE_METHOD_TYPE).

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

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

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

Các loại tham số của mọi đối số bổ sung được xác định từ các giá trị hằng số của chúng.

method_handle_item

Xuất hiện trong phần method_handles

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
method_handle_type ushort loại của hàm xử lý phương thức; xem bảng bên dưới
unused ushort (unused)
field_or_method_id ushort Mã nhận dạng trường hoặc phương thức, tuỳ thuộc vào việc loại xử lý phương thức là một phương thức truy cập hay một phương thức gọi phương thức
unused ushort (unused)

Mã loại xử lý phương thức

Hằng số Giá trị Mô tả
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 Xử lý phương thức là trình thiết lập (trình truy cập) trường tĩnh
METHOD_HANDLE_TYPE_STATIC_GET 0x01 Xử lý phương thức là một trình truy cập (getter) trường tĩnh
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 Xử lý phương thức là trình thiết lập trường thực thể (trình truy cập)
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 Xử lý phương thức là một getter (trình truy cập) trường thực thể
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 Xử lý phương thức là một trình gọi phương thức tĩnh
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 Xử lý phương thức là một trình gọi phương thức của thực thể
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 Xử lý phương thức là một trình gọi phương thức của hàm khởi tạo
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 Xử lý phương thức là một trình gọi phương thức trực tiếp
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 Xử lý phương thức là một trình gọi phương thức giao diện

class_data_item

Được tham chiếu từ class_def_item

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

Căn chỉnh: không có (căn chỉnh theo byte)

Tên Định dạng Mô tả
static_fields_size uleb128 số lượng trường tĩnh được xác định trong mục này
instance_fields_size uleb128 số lượng trường thực thể được xác định trong mục này
direct_methods_size uleb128 số lượng phương thức trực tiếp được xác định trong mục này
virtual_methods_size uleb128 số lượng phương thức ảo được xác định trong mục này
static_fields encoded_field[static_fields_size] các trường tĩnh được xác định, được biểu thị dưới dạng một chuỗi các phần tử được mã hoá. Bạn phải sắp xếp các trường theo field_idx theo thứ tự tăng dần.
instance_fields encoded_field[instance_fields_size] các trường thực thể được xác định, được biểu thị dưới dạng một chuỗi các phần tử được mã hoá. Bạn phải sắp xếp các trường theo field_idx theo thứ tự tăng dần.
direct_methods encoded_method[direct_methods_size] các phương thức trực tiếp đã xác định (bất kỳ phương thức nào trong số static, private hoặc hàm khởi tạo), được biểu thị dưới dạng một chuỗi các phần tử được mã hoá. Bạn phải sắp xếp các phương thức theo method_idx theo thứ tự tăng dần.
virtual_methods encoded_method[virtual_methods_size] các phương thức ảo đã xác định (không có static, private hoặc hàm dựng), được biểu thị dưới dạng một chuỗi các phần tử được mã hoá. Danh sách này không được bao gồm các phương thức kế thừa, trừ phi bị lớp mà mục này đại diện ghi đè. Các phương thức phải được sắp xếp theo method_idx theo thứ tự tăng dần. method_idx của một phương thức ảo không được trùng với bất kỳ phương thức trực tiếp nào.

Lưu ý: Tất cả các thực thể field_idmethod_id của phần tử đều phải tham chiếu đến cùng một lớp xác định.

Định dạng encoded_field

Tên Định dạng Mô tả
field_idx_diff uleb128 chỉ mục vào danh sách field_ids cho danh tính của trường này (bao gồm tên và giá trị mô tả), được biểu thị dưới dạng một điểm khác biệt so với chỉ mục của phần tử trước đó trong danh sách. Chỉ mục của phần tử đầu tiên trong danh sách được biểu thị trực tiếp.
access_flags uleb128 cờ truy cập cho trường (public, final, v.v.). Hãy xem phần "access_flags Định nghĩa" để biết thông tin chi tiết.

Định dạng encoded_method

Tên Định dạng Mô tả
method_idx_diff uleb128 chỉ mục vào danh sách method_ids cho danh tính của phương thức này (bao gồm tên và giá trị mô tả), được biểu thị dưới dạng chênh lệch so với chỉ mục của phần tử trước đó trong danh sách. Chỉ mục của phần tử đầu tiên trong danh sách được biểu thị trực tiếp.
access_flags uleb128 cờ truy cập cho phương thức (public, final, v.v.). Hãy xem phần "access_flags Định nghĩa" để biết thông tin chi tiết.
code_off uleb128 độ lệch từ đầu tệp đến cấu trúc mã cho phương thức này hoặc 0 nếu phương thức này là abstract hoặc native. Khoảng bù phải là một vị trí trong phần data. Định dạng của dữ liệu được chỉ định bằng "code_item" bên dưới.

type_list

Được tham chiếu từ class_def_item và proto_id_item

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

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
size uint kích thước của danh sách, tính bằng số mục
danh sách type_item[size] các phần tử của danh sách

định dạng type_item

Tên Định dạng Mô tả
type_idx ushort chỉ mục vào danh sách type_ids

code_item

Được tham chiếu từ encoded_method

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

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
registers_size ushort số lượng thanh ghi mà mã này sử dụng
ins_size ushort số lượng từ của các đối số đến phương thức mà mã này dành cho
outs_size ushort số lượng từ của khoảng trống đối số đi cần thiết cho mã này để gọi phương thức
tries_size ushort số lượng try_item cho phiên bản này. Nếu khác 0, thì các giá trị này sẽ xuất hiện dưới dạng mảng tries ngay sau insns trong phiên bản này.
debug_info_off uint độ lệch từ đầu tệp đến trình tự thông tin gỡ lỗi (số dòng + thông tin biến cục bộ) cho mã này hoặc 0 nếu không có thông tin. Khoảng bù, nếu khác 0, phải là vị trí trong phần data. Định dạng của dữ liệu được chỉ định bằng "debug_info_item" bên dưới.
insns_size uint kích thước của danh sách chỉ dẫn, tính bằng đơn vị mã 16 bit
insns ushort[insns_size] mảng mã byte thực tế. Định dạng của mã trong một mảng insns được chỉ định theo tài liệu đồng hành mã byte Dalvik. Lưu ý rằng mặc dù được xác định là một mảng ushort, nhưng có một số cấu trúc nội bộ ưu tiên căn chỉnh 4 byte. Ngoài ra, nếu điều này xảy ra trong một tệp có thứ tự byte đảo ngược, thì việc đảo ngược chỉ được thực hiện trên các thực thể ushort riêng lẻ chứ không phải trên các cấu trúc nội bộ lớn hơn.
padding ushort (không bắt buộc) = 0 hai byte đệm để tries được căn chỉnh 4 byte. Phần tử này chỉ xuất hiện nếu tries_size khác 0 và insns_size là số lẻ.
cố gắng try_item[tries_size] (không bắt buộc) mảng cho biết vị trí trong mã mà các ngoại lệ được phát hiện và cách xử lý các ngoại lệ đó. Các phần tử của mảng không được trùng lặp trong phạm vi và theo thứ tự từ địa chỉ thấp đến địa chỉ cao. Phần tử này chỉ xuất hiện nếu tries_size khác 0.
trình xử lý encoded_catch_handler_list (không bắt buộc) byte đại diện cho danh sách các danh sách loại bắt và địa chỉ trình xử lý được liên kết. Mỗi try_item có một độ lệch theo byte vào cấu trúc này. Phần tử này chỉ xuất hiện nếu tries_size khác 0.

Định dạng try_item

Tên Định dạng Mô tả
start_addr uint địa chỉ bắt đầu của khối mã do mục này bao gồm. Địa chỉ là số lượng đơn vị mã 16 bit cho đến khi bắt đầu chỉ dẫn được đề cập đầu tiên.
insn_count ushort số lượng đơn vị mã 16 bit được mục này đề cập. Đơn vị mã cuối cùng được đề cập (bao gồm) là start_addr + insn_count - 1.
handler_off ushort độ lệch tính bằng byte từ đầu encoded_catch_hander_list được liên kết đến encoded_catch_handler cho mục này. Đây phải là một độ lệch so với điểm bắt đầu của encoded_catch_handler.

định dạng encoded_catch_handler_list

Tên Định dạng Mô tả
size uleb128 kích thước của danh sách này, tính bằng số mục
danh sách encoded_catch_handler[handlers_size] danh sách thực tế của danh sách trình xử lý, được biểu thị trực tiếp (không phải dưới dạng độ lệch) và được nối tuần tự

định dạng encoded_catch_handler

Tên Định dạng Mô tả
size sleb128 số lượng loại bắt trong danh sách này. Nếu không dương, thì đây là số âm của số loại bắt và các loại bắt sẽ được theo sau bởi một trình xử lý bắt tất cả. Ví dụ: size của 0 có nghĩa là có một catch-all nhưng không có catch được nhập rõ ràng. size của 2 có nghĩa là có 2 lệnh bắt lỗi được nhập rõ ràng và không có lệnh bắt lỗi chung. Và size của -1 có nghĩa là có một lệnh bắt có kiểu cùng với một lệnh bắt tất cả.
trình xử lý encoded_type_addr_pair[abs(size)] luồng gồm các mục abs(size) được mã hoá, mỗi mục cho một loại đã bắt, theo thứ tự mà các loại cần được kiểm thử.
catch_all_addr uleb128 (không bắt buộc) địa chỉ mã byte của trình xử lý nhận toàn bộ thư. Phần tử này chỉ xuất hiện nếu size không phải là số dương.

định dạng encoded_type_addr_pair

Tên Định dạng Mô tả
type_idx uleb128 chỉ mục vào danh sách type_ids cho loại ngoại lệ cần bắt
addr uleb128 địa chỉ mã byte của trình xử lý ngoại lệ được liên kết

debug_info_item

Được tham chiếu từ code_item

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

Căn chỉnh: không có (căn chỉnh theo byte)

Mỗi debug_info_item xác định một máy trạng thái được mã hoá theo byte lấy cảm hứng từ DWARF3. Khi được diễn giải, máy này sẽ phát ra bảng vị trí và (có thể) thông tin biến cục bộ cho một code_item. Trình tự này bắt đầu bằng một tiêu đề có độ dài thay đổi (độ dài phụ thuộc vào số lượng tham số phương thức), theo sau là mã byte của máy trạng thái và kết thúc bằng một byte DBG_END_SEQUENCE.

Máy trạng thái bao gồm 5 thanh ghi. Thanh ghi address biểu thị độ lệch lệnh trong insns_item được liên kết theo đơn vị mã 16 bit. Thanh ghi address bắt đầu từ 0 ở đầu mỗi chuỗi debug_info và chỉ được tăng đơn điệu. Thanh ghi line biểu thị số dòng nguồn cần được liên kết với mục nhập bảng vị trí tiếp theo do máy trạng thái phát ra. Tham số này được khởi tạo trong tiêu đề chuỗi và có thể thay đổi theo hướng dương hoặc âm nhưng không bao giờ được nhỏ hơn 1. Thanh ghi source_file đại diện cho tệp nguồn mà các mục số dòng tham chiếu đến. Biến này được khởi tạo thành giá trị của source_file_idx trong class_def_item. Hai biến còn lại, prologue_endepilogue_begin, là các cờ boolean (được khởi tạo thành false) cho biết liệu vị trí tiếp theo được phát ra có được coi là phần mở đầu hay phần kết của phương thức hay không. Máy trạng thái cũng phải theo dõi tên và loại của biến cục bộ gần đây nhất trong mỗi thanh ghi cho mã DBG_RESTART_LOCAL.

Tiêu đề như sau:

Tên Định dạng Mô tả
line_start uleb128 giá trị ban đầu cho thanh ghi line của máy trạng thái. Không phải là một mục nhập vị trí thực tế.
parameters_size uleb128 số lượng tên tham số được mã hoá. Phải có một tham số cho mỗi phương thức, không bao gồm this của phương thức thực thể (nếu có).
parameter_names uleb128p1[parameters_size] chỉ mục chuỗi của tên tham số phương thức. Giá trị được mã hoá của NO_INDEX cho biết không có tên nào cho tham số được liên kết. Trình mô tả loại và chữ ký được ngụ ý từ trình mô tả và chữ ký phương thức.

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

Tên Giá trị Định dạng Đối số Mô tả
DBG_END_SEQUENCE 0x00 (không có) kết thúc một chuỗi thông tin gỡ lỗi cho code_item
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff: số tiền cần thêm vào sổ đăng ký địa chỉ tăng thanh ghi địa chỉ mà không phát ra một mục vị trí
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: số tiền cần thay đổi trong sổ đăng ký dòng chuyển thanh ghi dòng mà không phát ra một mục nhập vị trí
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: đăng ký sẽ chứa local
name_idx: chỉ mục chuỗi của tên
type_idx: chỉ mục loại của loại
giới thiệu một biến cục bộ tại địa chỉ hiện tại. name_idx hoặc type_idx có thể là NO_INDEX để cho biết giá trị đó là không xác định.
DBG_START_LOCAL_EXTENDED 0x04 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
uleb128p1 sig_idx
register_num: thanh ghi sẽ chứa
cục bộ name_idx: chỉ mục chuỗi của tên
type_idx: chỉ mục loại của loại
sig_idx: chỉ mục chuỗi của chữ ký loại
giới thiệu một địa phương có chữ ký loại tại địa chỉ hiện tại. name_idx, type_idx hoặc sig_idx có thể là NO_INDEX để cho biết giá trị đó là không xác định. (Tuy nhiên, nếu sig_idx-1, thì bạn có thể biểu thị cùng một dữ liệu một cách hiệu quả hơn bằng cách sử dụng mã lệnh DBG_START_LOCAL.)

Lưu ý: Hãy xem phần thảo luận trong "dalvik.annotation.Signature" bên dưới để biết các cảnh báo về việc xử lý chữ ký.

DBG_END_LOCAL 0x05 uleb128 register_num register_num: đăng ký có chứa nội dung cục bộ đánh dấu một biến cục bộ hiện đang hoạt động là nằm ngoài phạm vi tại địa chỉ hiện tại
DBG_RESTART_LOCAL 0x06 uleb128 register_num register_num: đăng ký khởi động lại giới thiệu lại một biến cục bộ tại địa chỉ hiện tại. Tên và loại giống với tên và loại của biến cục bộ cuối cùng hoạt động trong sổ đăng ký được chỉ định.
DBG_SET_PROLOGUE_END 0x07 (không có) đặt thanh ghi máy trạng thái prologue_end, cho biết rằng mục nhập vị trí tiếp theo được thêm sẽ được coi là phần cuối của phần mở đầu phương thức (một vị trí thích hợp cho điểm ngắt phương thức). Mọi mã lệnh đặc biệt (>= 0x0a) đều xoá thanh ghi prologue_end.
DBG_SET_EPILOGUE_BEGIN 0x08 (không có) đặt thanh ghi trạng thái máy epilogue_begin, cho biết rằng mục nhập vị trí tiếp theo được thêm sẽ được coi là phần đầu của phần kết của phương thức (một vị trí thích hợp để tạm dừng thực thi trước khi thoát phương thức). Mọi mã lệnh đặc biệt (>= 0x0a) đều xoá thanh ghi epilogue_begin.
DBG_SET_FILE 0x09 uleb128p1 name_idx name_idx: chỉ mục chuỗi của tên tệp nguồn; NO_INDEX nếu không xác định được cho biết rằng tất cả các mục nhập số dòng tiếp theo đều tham chiếu đến tên tệp nguồn này, thay vì tên mặc định được chỉ định trong code_item
Opcodes đặc biệt 0x0a…0xff (không có) tăng các thanh ghi lineaddress, phát ra một mục nhập vị trí và xoá prologue_endepilogue_begin. Xem phần mô tả bên dưới.

Mã lệnh đặc biệt

Các mã lệnh có giá trị từ 0x0a đến 0xff (bao gồm cả 0x0a0xff) sẽ di chuyển cả các thanh ghi lineaddress một chút rồi phát ra một mục nhập bảng vị trí mới. Công thức cho các mức tăng như sau:

DBG_FIRST_SPECIAL = 0x0a  // the smallest special opcode
DBG_LINE_BASE   = -4      // the smallest line number increment
DBG_LINE_RANGE  = 15      // the number of line increments represented

adjusted_opcode = opcode - DBG_FIRST_SPECIAL

line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE)
address += (adjusted_opcode / DBG_LINE_RANGE)

annotations_directory_item

Được tham chiếu từ class_def_item

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

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
class_annotations_off uint độ lệch so với đầu tệp đến chú thích được thực hiện trực tiếp trên lớp hoặc 0 nếu lớp không có chú thích trực tiếp. Nếu khác 0, độ lệch phải là vị trí trong phần data. Định dạng của dữ liệu được chỉ định bằng "annotation_set_item" bên dưới.
fields_size uint số lượng trường được chú thích bởi mục này
annotated_methods_size uint số lượng phương thức được chú thích theo mục này
annotated_parameters_size uint số lượng danh sách tham số phương thức được chú thích bằng mục này
field_annotations field_annotation[fields_size] (không bắt buộc) danh sách chú thích trường được liên kết. Các phần tử của danh sách phải được sắp xếp theo thứ tự tăng dần, theo field_idx.
method_annotations method_annotation[methods_size] (không bắt buộc) danh sách các chú thích phương thức được liên kết. Các phần tử của danh sách phải được sắp xếp theo thứ tự tăng dần, theo method_idx.
parameter_annotations parameter_annotation[parameters_size] (không bắt buộc) danh sách chú thích tham số phương thức được liên kết. Các phần tử của danh sách phải được sắp xếp theo thứ tự tăng dần, theo method_idx.

Lưu ý: Tất cả các thực thể field_idmethod_id của phần tử đều phải tham chiếu đến cùng một lớp xác định.

định dạng field_annotation

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

định dạng method_annotation

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

định dạng parameter_annotation

Tên Định dạng Mô tả
method_idx uint chỉ mục vào danh sách method_ids cho danh tính của phương thức có các tham số đang được chú thích
annotations_off uint độ lệch từ đầu tệp đến danh sách chú thích cho các tham số phương thức. Khoảng bù phải là một vị trí trong phần data. Định dạng của dữ liệu được chỉ định bằng "annotation_set_ref_list" bên dưới.

annotation_set_ref_list

Được tham chiếu từ parameter_annotations_item

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

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
size uint kích thước của danh sách, tính bằng số mục
danh sách annotation_set_ref_item[size] các phần tử của danh sách

định dạng annotation_set_ref_item

Tên Định dạng Mô tả
annotations_off uint độ lệch từ đầu tệp đến tập hợp chú thích được tham chiếu hoặc 0 nếu không có chú thích nào cho phần tử này. Khoảng bù (nếu khác 0) phải là vị trí trong phần data. Định dạng của dữ liệu được chỉ định bằng "annotation_set_item" bên dưới.

annotation_set_item

Được tham chiếu từ annotations_directory_item, field_annotations_item, method_annotations_item và annotation_set_ref_item

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

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
size uint kích thước của tập hợp, tính bằng số mục
mục nhập annotation_off_item[size] các phần tử của tập hợp. Các phần tử phải được sắp xếp theo thứ tự tăng dần, theo type_idx.

định dạng annotation_off_item

Tên Định dạng Mô tả
annotation_off uint độ lệch từ đầu tệp đến một chú thích. Độ lệch phải là một vị trí trong phần data và định dạng của dữ liệu tại vị trí đó được chỉ định bằng "annotation_item" bên dưới.

annotation_item

Được tham chiếu từ annotation_set_item

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

Căn chỉnh: không có (căn chỉnh theo byte)

Tên Định dạng Mô tả
mức hiển thị ubyte mức độ hiển thị dự kiến của chú thích này (xem bên dưới)
chú thích encoded_annotation nội dung chú thích được mã hoá, ở định dạng được mô tả bằng "định dạng encoded_annotation" trong phần "mã hoá encoded_value" ở trên.

Giá trị chế độ hiển thị

Đây là các lựa chọn cho trường visibility trong annotation_item:

Tên Giá trị Mô tả
VISIBILITY_BUILD 0x00 chỉ được hiển thị tại thời điểm tạo (ví dụ: trong quá trình biên dịch mã khác)
VISIBILITY_RUNTIME 0x01 dự kiến sẽ hiển thị trong thời gian chạy
VISIBILITY_SYSTEM 0x02 dự kiến sẽ hiển thị trong thời gian chạy, nhưng chỉ đối với hệ thống cơ bản (chứ không phải đối với mã người dùng thông thường)

encoded_array_item

Được tham chiếu từ class_def_item

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

Căn chỉnh: không có (căn chỉnh theo byte)

Tên Định dạng Mô tả
value encoded_array byte đại diện cho giá trị mảng được mã hoá, ở định dạng do "Định dạng encoded_array" chỉ định trong phần "Mã hoá encoded_value" ở trên.

hiddenapi_class_data_item

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

Lưu ý: Tính năng API ẩn được giới thiệu trong Android 10.0 và chỉ áp dụng cho các tệp DEX của các lớp trong đường dẫn lớp khởi động. Danh sách cờ được mô tả bên dưới có thể được mở rộng trong các bản phát hành Android trong tương lai. Để biết thêm thông tin, hãy xem các hạn chế đối với giao diện không phải SDK.

Tên Định dạng Mô tả
size uint tổng kích thước của phần
offsets uint[] mảng gồm các độ lệch được lập chỉ mục theo class_idx. Một mục nhập mảng bằng 0 tại chỉ mục class_idx có nghĩa là không có dữ liệu cho class_idx này hoặc tất cả cờ API ẩn đều bằng 0. Nếu không, mục nhập mảng sẽ khác 0 và chứa một độ lệch từ đầu phần đến một mảng cờ API ẩn cho class_idx này.
flags uleb128[] các mảng được nối của cờ API ẩn cho mỗi lớp. Các giá trị cờ có thể có được mô tả trong bảng dưới đây. Các cờ được mã hoá theo cùng thứ tự như các trường và phương thức được mã hoá trong dữ liệu lớp.

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

Tên Giá trị Mô tả
danh sách cho phép 0 Những giao diện có thể sử dụng thoải mái và được hỗ trợ trong Chỉ mục gói (Package Index) trong tài liệu chính thức của khung Android.
danh sách xám 1 Những giao diện không phải SDK có thể được sử dụng bất kể cấp độ API mục tiêu của ứng dụng.
chặn quyền truy cập 2 Những giao diện không phải SDK mà bạn không thể sử dụng, bất kể cấp độ API mục tiêu của ứng dụng. Việc truy cập vào một trong những giao diện này sẽ gây ra lỗi thời gian chạy.
greylist‑max‑o 3 Những giao diện không phải SDK có thể dùng cho Android 8.x trở xuống, trừ phi chúng bị hạn chế.
greylist‑max‑p 4 Các giao diện không phải SDK có thể dùng cho Android 9.x, trừ phi chúng bị hạn chế.
greylist‑max‑q 5 Các giao diện không phải SDK có thể dùng cho Android 10.x, trừ phi chúng bị hạn chế.
greylist‑max‑r 6 Các giao diện không phải SDK có thể dùng cho Android 11.x, trừ phi bị hạn chế.

Chú thích hệ thống

Chú thích hệ thống được dùng để biểu thị nhiều phần thông tin phản chiếu về các lớp (cũng như phương thức và trường). Thông thường, mã ứng dụng (không phải hệ thống) chỉ truy cập gián tiếp vào thông tin này.

Chú thích hệ thống được biểu thị trong các tệp .dex dưới dạng chú thích có chế độ hiển thị được đặt thành VISIBILITY_SYSTEM.

dalvik.annotation.AnnotationDefault

Xuất hiện trên các phương thức trong giao diện chú giải

Chú thích AnnotationDefault được đính kèm vào mỗi giao diện chú thích muốn cho biết các liên kết mặc định.

Tên Định dạng Mô tả
value Annotation các liên kết mặc định cho chú thích này, được biểu thị dưới dạng một chú thích thuộc loại này. Chú thích không cần bao gồm tất cả các tên do chú thích xác định; những tên bị thiếu sẽ không có giá trị mặc định.

dalvik.annotation.EnclosingClass

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

Chú thích EnclosingClass được đính kèm vào mỗi lớp được xác định là thành phần của một lớp khác, hoặc là ẩn danh nhưng không được xác định trong phần nội dung phương thức (ví dụ: một lớp bên trong giả tạo). Mọi lớp có chú giải này cũng phải có chú giải InnerClass. Ngoài ra, một lớp không được có cả chú giải EnclosingClassEnclosingMethod.

Tên Định dạng Mô tả
value Lớp lớp có phạm vi từ vựng gần nhất với lớp này

dalvik.annotation.EnclosingMethod

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

Chú thích EnclosingMethod được đính kèm vào mỗi lớp được xác định bên trong phần nội dung phương thức. Mọi lớp có chú giải này cũng phải có chú giải InnerClass. Ngoài ra, một lớp không được có cả chú giải EnclosingClassEnclosingMethod.

Tên Định dạng Mô tả
value Phương thức phương thức có phạm vi từ vựng gần nhất với lớp này

dalvik.annotation.InnerClass

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

Chú thích InnerClass được đính kèm vào mỗi lớp được xác định trong phạm vi từ vựng của định nghĩa lớp khác. Mọi lớp có chú thích này cũng phải có một trong hai chú thích EnclosingClass hoặc chú thích EnclosingMethod.

Tên Định dạng Mô tả
tên Chuỗi tên đơn giản được khai báo ban đầu của lớp này (không bao gồm tiền tố gói nào). Nếu lớp này là lớp ẩn danh, thì tên sẽ là null.
accessFlags int cờ truy cập được khai báo ban đầu của lớp (có thể khác với cờ hiệu quả do sự không khớp giữa các mô hình thực thi của ngôn ngữ nguồn và máy ảo đích)

dalvik.annotation.MemberClasses

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

Chú thích MemberClasses được đính kèm vào mỗi lớp khai báo các lớp thành phần. (Lớp thành viên là một lớp bên trong trực tiếp có tên.)

Tên Định dạng Mô tả
value Class[] mảng của các lớp thành viên

dalvik.annotation.MethodParameters

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

Lưu ý: Chú thích này được thêm sau Android 7.1. Sự hiện diện của nó trên các bản phát hành Android trước đó sẽ bị bỏ qua.

Chú thích MethodParameters là không bắt buộc và có thể dùng để cung cấp siêu dữ liệu tham số, chẳng hạn như tên tham số và đối tượng sửa đổi.

Bạn có thể bỏ qua chú giải này một cách an toàn trong một phương thức hoặc hàm khởi tạo khi không cần siêu dữ liệu tham số trong thời gian chạy. Bạn có thể dùng java.lang.reflect.Parameter.isNamePresent() để kiểm tra xem một tham số có siêu dữ liệu hay không, và các phương thức phản chiếu được liên kết (chẳng hạn như java.lang.reflect.Parameter.getName()) sẽ quay lại hành vi mặc định trong thời gian chạy nếu không có thông tin.

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

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

Các mảng được ghi lại bên dưới phải có cùng kích thước với cấu trúc dex method_id_item được liên kết với phương thức, nếu không, java.lang.reflect.MalformedParametersException sẽ được truyền trong thời gian chạy.

Tức là: method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size phải giống với names().lengthaccessFlags().length.

MethodParameters mô tả tất cả các tham số phương thức chính thức, ngay cả những tham số không được khai báo rõ ràng hoặc ngầm định trong mã nguồn, kích thước của các mảng có thể khác với Chữ ký hoặc thông tin siêu dữ liệu khác chỉ dựa trên các tham số rõ ràng được khai báo trong mã nguồn. MethodParameters cũng sẽ không bao gồm bất kỳ thông tin nào về các tham số của đối tượng nhận chú thích kiểu không tồn tại trong chữ ký phương thức thực tế.

Tên Định dạng Mô tả
tên String[] Tên của các tham số chính thức cho phương thức được liên kết. Mảng không được rỗng nhưng phải trống nếu không có tham số chính thức. Giá trị trong mảng phải là giá trị rỗng nếu tham số chính thức có chỉ mục đó không có tên.
Nếu chuỗi tên tham số bị trống hoặc chứa ".", ";", "[" hoặc "/" thì java.lang.reflect.MalformedParametersException sẽ được truyền tại thời gian chạy.
accessFlags int[] Cờ truy cập của các tham số chính thức cho phương thức được liên kết. Mảng không được rỗng nhưng phải trống nếu không có tham số chính thức.
Giá trị là một mặt nạ bit có các giá trị sau:
  • 0x0010 : final, tham số được khai báo là final
  • 0x1000 : tổng hợp, tham số do trình biên dịch giới thiệu
  • 0x8000 : bắt buộc, tham số là tham số tổng hợp nhưng cũng được ngầm hiểu theo quy cách ngôn ngữ
Nếu có bất kỳ bit nào được đặt bên ngoài tập hợp này thì java.lang.reflect.MalformedParametersException sẽ được gửi trong thời gian chạy.

dalvik.annotation.Signature

Xuất hiện trên các lớp, trường và phương thức

Chú thích Signature được đính kèm vào mỗi lớp, trường hoặc phương thức được xác định theo một loại phức tạp hơn so với loại có thể biểu thị bằng type_id_item. Định dạng .dex không xác định định dạng cho chữ ký; định dạng này chỉ nhằm mục đích có thể biểu thị bất kỳ chữ ký nào mà ngôn ngữ nguồn yêu cầu để triển khai thành công ngữ nghĩa của ngôn ngữ đó. Do đó, các chữ ký thường không được các hoạt động triển khai máy ảo phân tích cú pháp (hoặc xác minh). Các chữ ký chỉ được chuyển cho các API và công cụ cấp cao hơn (chẳng hạn như trình gỡ lỗi). Do đó, mọi hoạt động sử dụng chữ ký đều phải được viết sao cho không đưa ra bất kỳ giả định nào về việc chỉ nhận được chữ ký hợp lệ, đồng thời tự bảo vệ một cách rõ ràng trước khả năng gặp phải chữ ký không hợp lệ về mặt cú pháp.

Vì chuỗi chữ ký có xu hướng có nhiều nội dung trùng lặp, nên chú thích Signature được xác định là một mảng gồm các chuỗi, trong đó các phần tử trùng lặp tự nhiên đề cập đến cùng một dữ liệu cơ bản và chữ ký được coi là sự nối kết của tất cả các chuỗi trong mảng. Không có quy tắc nào về cách tách chữ ký thành các chuỗi riêng biệt; điều đó hoàn toàn tuỳ thuộc vào các công cụ tạo tệp .dex.

Tên Định dạng Mô tả
value String[] chữ ký của lớp hoặc thành viên này, dưới dạng một mảng gồm các chuỗi sẽ được nối với nhau

dalvik.annotation.Throws

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

Chú thích Throws được đính kèm vào mỗi phương thức được khai báo để truyền một hoặc nhiều loại ngoại lệ.

Tên Định dạng Mô tả
value Class[] mảng các loại ngoại lệ được gửi