Định dạng có thể thực thi Dalvik

Tài liệu này mô tả bố cục và nội dung của .dex tệp này được dùng để lưu trữ một tập hợp các định nghĩa về lớp và dữ liệu bổ trợ.

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

Tên Mô tả
byte Int đã đăng nhập 8 bit
ubyte Số nguyên 8 bit không dấu
ngắn Int đã đăng nhập 16 bit, Little-endian
CANNOT TRANSLATE Int không dấu 16 bit, Little-endian
int Int đã đăng nhập 32 bit, Little-endian
CANNOT TRANSLATE Int không dấu 32 bit, Little-endian
long Int đã đăng nhập 64 bit, Little-endian
châu Long Int không dấu 64 bit, Little-endian
sleb128 LEB128 đã ký, độ dài thay đổi (xem bên dưới)
uleb128 LEB128 không dấu, độ dài thay đổi (xem bên dưới)
uleb128p1 LEB128 không dấu cộng với 1, độ dài biến (xem bên dưới)

128 euro

LEB128 ("Little-Endian Base 128") là phương pháp mã hoá có độ dài biến thiên cho đại lượng số nguyên tuỳ ý đã ký hoặc chưa ký. Định dạng là mượn từ DWARF3 đặc điểm kỹ thuật. Trong một tệp .dex, LEB128 chỉ được dùng để mã hoá số lượng 32 bit.

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

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

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

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

Trình tự được mã hóa Dưới tên sleb128 Dưới tên uleb128 Dưới tên uleb128p1
0000-1
01110
7f-1127126
80 giây-1281625616255

Bố cục tệp

Tên Định dạng Mô tả
tiêu đề tiêu_đề_mục_hàng tiêu đề
string_ids (mã_chuỗi) string_id_item[] danh sách giá trị nhận dạng chuỗi. Đây là các giá trị nhận dạng cho tất cả các chuỗi mà tệp này sử dụng, để đặt tên nội bộ (ví dụ: mã mô tả loại) hoặc dưới dạng đối tượng không đổi được mã tham chiếu đến. Danh sách này phải được sắp xếp theo nội dung chuỗi, sử dụng giá trị điểm mã UTF-16 (không phải ở dạng phân biệt theo ngôn ngữ) và không được chứa bất kỳ mục nhập trùng lặp nào.
id_loại loại_mã_mặt_hàng[] danh sách mã nhận dạng loại. Đây là giá trị nhận dạng cho tất cả các loại (lớp, mảng hoặc loại nguyên hàm) được tham chiếu bởi tệp này, dù đã được định nghĩa trong tệp hay không. Danh sách này phải được sắp xếp theo string_id chỉ mục và chỉ mục không được chứa bất kỳ mục nhập trùng lặp nào.
proto_id proto_id_item[] danh sách giá trị nhận dạng nguyên mẫu của phương thức. Đây là các giá trị nhận dạng cho tất cả nguyên mẫu mà tệp này tham chiếu đến. Danh sách này phải được sắp xếp theo thứ tự chính loại trả về (theo chỉ mục type_id), sau đó theo danh sách đối số (thứ tự từ điển, đối số riêng lẻ được sắp xếp theo chỉ mục type_id). Danh sách không được chứa bất kỳ mục nhập trùng lặp nào.
mã_trường trường_id_item[] danh sách giá trị nhận dạng trường. Đây là giá trị nhận dạng cho tất cả các trường tham chiếu đến tệp này, dù có được xác định trong tệp hay không. Chiến dịch này danh sách phải được sắp xếp, trong đó loại xác định (theo type_id chỉ mục) là đơn đặt hàng chính, tên trường (theo chỉ mục string_id) là thứ tự trung gian và loại (theo chỉ mục type_id) là đơn đặt hàng phụ. Danh sách này không được chứa bất kỳ mục nhập trùng lặp nào.
mã_phương_ thức method_id_item[] danh sách giá trị nhận dạng phương thức. Đây là các giá trị nhận dạng cho tất cả phương thức tham chiếu đến tệp này, dù có được xác định trong tệp hay không. Chiến dịch này danh sách phải được sắp xếp, trong đó loại xác định (theo type_id chỉ mục) là thứ tự chính, tên phương thức (theo string_id chỉ mục) là thứ tự trung gian và nguyên mẫu phương thức (theo Chỉ mục proto_id) là thứ tự nhỏ. Danh sách không được chứa bất kỳ mục nhập trùng lặp nào.
lớp_def class_def_item[] danh sách định nghĩa lớp. Các lớp phải được sắp xếp sao cho một giá trị lớp cấp cao của lớp và giao diện đã triển khai sẽ xuất hiện trong sớm hơn lớp giới thiệu. Ngoài ra, URL này không hợp lệ đối với một định nghĩa cho lớp cùng tên xuất hiện nhiều lần trong danh sách.
call_site_ids (mã_trang_web) call_site_id_item[] cho mã_trang_web[] danh sách giá trị nhận dạng trang web cuộc gọi. Đây là những giá trị nhận dạng cho tất cả các trang web cuộc gọi tham chiếu đến tệp này, dù có được xác định trong tệp hay không. Danh sách này phải được sắp xếp theo thứ tự tăng dần call_site_off.
method_handles method_handle_item[] phương thức xử lý danh sách. Danh sách tất cả các tên người dùng phương thức được tệp này tham chiếu đến, có được xác định trong tệp hay không. Danh sách này không được sắp xếp và có thể chứa các bản sao sẽ tương ứng về mặt logic với các thực thể xử lý phương thức khác nhau.
data ubyte[] vùng dữ liệu chứa tất cả dữ liệu hỗ trợ cho các bảng được liệt kê ở trên. Các mục khác nhau có yêu cầu căn chỉnh khác nhau và các byte khoảng đệm sẽ được chèn trước mỗi mục nếu cần để đạt được căn chỉnh thích hợp.
dữ liệu_đường_liên_kết ubyte[] dùng trong các tệp được liên kết tĩnh. Định dạng của dữ liệu trong phần này chưa được tài liệu này chỉ định. Phần này bị trống trong các tệp chưa liên kết và các phương thức triển khai thời gian chạy có thể sử dụng nếu thấy phù hợp.

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

DEX_FILE_MAGIC

Được nhúng trong header_item

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

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

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

Lưu ý: Hỗ trợ dành cho phiên bản 038 của định dạng này đã được thêm vào Android 8.0 bản phát hành. Phiên bản 038 đã thêm mã byte mới (invoke-polymorphicinvoke-custom) và cho các ô điều khiển phương thức.

Lưu ý: Hỗ trợ cho phiên bản 037 của định dạng này đã được thêm vào bản phát hành Android 7.0. Trước phiên bản 037 phần lớn các phiên bản Android đã sử dụng phiên bản 035 của định dạng này. Chỉ Sự khác biệt giữa phiên bản 035037 là thêm các phương thức mặc định và điều chỉnh invoke.

Lưu ý: Ít nhất một vài phiên bản cũ của định dạng này có được sử dụng trong các bản phát hành phần mềm công khai rộng rãi. Ví dụ: phiên bản 009 được dùng cho các bản phát hành M3 của Nền tảng Android (Tháng 11–Tháng 12 năm 2007), và phiên bản 013 đã được dùng cho các bản phát hành M5 của Android Google (Tháng 2–Tháng 3 năm 2008). Theo một số khía cạnh, những quy tắc này các phiên bản của định dạng này khác biệt đáng kể so với phiên bản được mô tả trong tài liệu.

ENDIAN_CONSTANT và REVERSE_ENDIAN_CONSTANT

Được nhúng trong header_item

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

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

NO_INDEX

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

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

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

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

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

định nghĩa access_flags

Được nhúng trong class_def_item, encrypted_field, encrypted_method và Lớp bên trong

Trường bit của những cờ này dùng để biểu thị khả năng truy cập và thuộc tính chung của các lớp và thành phần trong lớp.

Tên Giá trị Đối với Lớp (và chú giải InnerClass) Cho trường Đối với phương thức
ACC_ CÔNG KHAI 0x1 public: hiển thị ở mọi nơi public: hiển thị ở mọi nơi public: hiển thị ở mọi nơi
ACC_PRIVATE 0x2 * private: chỉ hiển thị khi xác định lớp private: chỉ hiển thị khi xác định lớp private: chỉ hiển thị khi xác định lớp
ĐÃ_ BẢO VỆ 0x4 * protected: hiển thị với gói và lớp con protected: hiển thị cho gói và lớp con protected: hiển thị cho gói và lớp con
Hàm ACC_StatIC 0x8 * static: không được tạo bằng lớp ngoài Tham chiếu this static: chung để xác định lớp static: không nhận đối số this
ACC_FINAL 0x10 final: không thể phân lớp con final: không thể thay đổi sau khi tạo final: không thể ghi đè
ACC_SYNCHRONIZED 0x20     synchronized: khoá được liên kết đã được tự động thu nạp liên quan đến lệnh gọi phương thức này.

Lưu ý: Giá trị này chỉ hợp lệ để đặt khi Tôi cũng đã đặt ACC_NATIVE.

ACC_VOLATILE 0x40   volatile: quy tắc truy cập đặc biệt để trợ giúp về chuỗi ghi điểm phòng thủ  
ACC_bridge 0x40     cầu nối, được trình biên dịch thêm tự động dưới dạng một kiểu an toàn cái cầu
Hàm ACC_TRANSIENT 0x80   transient: không được lưu theo chuỗi tuần tự mặc định  
ACC_VARARGS 0x80     đối số cuối cùng nên được coi là "phần còn lại" đối số của trình biên dịch
ACC_NATIVE 0x100     native: được triển khai trong mã gốc
GIAO DIỆN 0x200 interface: lớp trừu tượng có thể triển khai nhân    
Hàm ACC_ABSTRACT 0x400 abstract: không thể tạo thực thể trực tiếp   abstract: chưa được lớp này triển khai
Hàm ACC_STRICT 0x800     strictfp: các quy tắc nghiêm ngặt đối với số học dấu phẩy động
TỔNG HỢP_ACC 0 x 1.000 không được xác định trực tiếp trong mã nguồn không được xác định trực tiếp trong mã nguồn không được xác định trực tiếp trong mã nguồn
ACC_ lưu 0x2000 đã khai báo là lớp chú giải    
ACC_ENUM 0x4000 được khai báo dưới dạng loại liệt kê đã khai báo dưới dạng giá trị được liệt kê  
(không sử dụng) 0x8.000      
Hàm ACC_CONSTRUCTOR 0x10.000     phương thức hàm khởi tạo (trình khởi tạo lớp hoặc thực thể)
ACC_DECLARED_
ĐỒNG BỘ HOÁ
0x20.000     đã khai báo là synchronized.

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

* Chỉ được bật đối với chú thích InnerClass, và không được ở trên class_def_item.

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

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

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

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

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

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

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

mã hoá giá trị được mã hoá

Được nhúng trong callout_element và encrypted_array_item

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

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

Định dạng giá trị

Loại tên value_type Định dạng value_arg Định dạng value Mô tả
GIÁ TRỊ_BYTE 0x00 (không có; phải là 0) ubyte[1] giá trị số nguyên 1 byte có dấu
VIDEO NGẮN GIÁ TRỊ 0x02 kích thước - 1 (0...1) ubyte[kích thước] giá trị số nguyên 2 byte đã ký, đăng nhập mở rộng
GIÁ TRỊ 0x03 kích thước - 1 (0...1) ubyte[kích thước] giá trị số nguyên hai byte chưa ký, mở rộng bằng 0
GIÁ TRỊ_INT 0x04 kích thước - 1 (0...3) ubyte[kích thước] giá trị số nguyên 4 byte đã ký, mở rộng ký
GIÁ TRỊ_DÀI 0x06 kích thước - 1 (0...7) ubyte[kích thước] giá trị số nguyên 8 byte đã ký, mở rộng ký
GIÁ TRỊ_FLOAT 0x10 kích thước - 1 (0...3) ubyte[kích thước] mẫu bit 4 byte, mở rộng bằng 0 ở bên phải và được diễn giải là giá trị dấu phẩy động 32 bit IEEE754
GIÁ TRỊ_ ĐÔI 0x11 kích thước - 1 (0...7) ubyte[kích thước] mẫu bit 8 byte, mở rộng bằng 0 ở bên phải và được diễn giải là giá trị dấu phẩy động 64 bit IEEE754
GIÁ TRỊ_METHOD_TYPE 0x15 kích thước - 1 (0...3) ubyte[kích thước] giá trị số nguyên bốn byte không dấu (mở rộng) được diễn giải là một chỉ mục thành phần proto_ids và biểu thị một giá trị của loại phương thức
GIÁ TRỊ_PHƯƠNG PHÁP_HANDLE 0x16 kích thước - 1 (0...3) ubyte[kích thước] giá trị số nguyên bốn byte không dấu (mở rộng) được diễn giải là một chỉ mục thành phần method_handles và biểu thị một giá trị xử lý phương thức
GIÁ TRỊ 0x17 kích thước - 1 (0...3) ubyte[kích thước] giá trị số nguyên bốn byte không dấu (mở rộng) được diễn giải là một chỉ mục thành phần string_ids và biểu thị một giá trị chuỗi
GIÁ TRỊ 0x18 kích thước - 1 (0...3) ubyte[kích thước] giá trị số nguyên bốn byte không dấu (mở rộng) được diễn giải là một chỉ mục thành phần type_ids và thể hiện phần phản chiếu giá trị loại/lớp
GIÁ TRỊ_Trường 0x19 kích thước - 1 (0...3) ubyte[kích thước] giá trị số nguyên bốn byte không dấu (mở rộng) được diễn giải là một chỉ mục thành phần field_ids và thể hiện phần phản chiếu giá trị trường
GIÁ TRỊ 0x1a kích thước - 1 (0...3) ubyte[kích thước] giá trị số nguyên bốn byte không dấu (mở rộng) được diễn giải là một chỉ mục thành phần method_ids và thể hiện phần phản chiếu giá trị phương thức
GIÁ TRỊ_ENUM 0x1b kích thước - 1 (0...3) ubyte[kích thước] giá trị số nguyên bốn byte không dấu (mở rộng) được diễn giải là một chỉ mục thành phần field_ids và biểu thị giá trị của một hằng số kiểu được liệt kê
GIÁ TRỊ_ARRAY 0x1c (không có; phải là 0) mảng_mã_ hoá một mảng giá trị, theo định dạng được chỉ định bởi "Định dạng encoded_array" bên dưới. Kích thước của value được ngầm ẩn trong quá trình mã hoá.
LƯỢT CHUYỂN ĐỔI 0x1 ngày (không có; phải là 0) chú_ thích được mã hoá một chú thích phụ, ở định dạng được chỉ định bởi "Định dạng encoded_annotation" bên dưới. Kích thước của value được ngầm ẩn trong quá trình mã hoá.
GIÁ_ TRỊ_RỜI KHỎI 0x1e (không có; phải là 0) (không có) Giá trị tham chiếu null
GIÁ TRỊ_BOOLEAN 0x1f boolean (0...1) (không có) giá trị một bit; 0 cho false1 với giá true. Bit được biểu thị trong value_arg.

định dạng mảng được mã hoá

Tên Định dạng Mô tả
size uleb128 số phần tử trong mảng
giá trị giá_trị_được_mã_ hoá[size] một chuỗi size encoded_value byte các chuỗi theo định dạng được chỉ định bởi phần này, được nối với nhau tuần tự.

định dạng mã_chú thích

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

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

Tên Định dạng Mô tả
Tên_idx uleb128 được biểu thị dưới dạng chỉ mục trong string_ids. Chuỗi này phải tuân theo cú pháp cho membershipsName, được xác định ở trên.
value giá_trị_được_mã_ hoá giá trị phần tử

Cú pháp chuỗi

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

Tên đơn giản

SimpleName là cơ sở cho cú pháp tên của các từ khoá khác của bạn. Định dạng .dex cho phép vĩ độ tương đối ở đây (nhiều hơn nhiều so với hầu hết các ngôn ngữ nguồn phổ biến). Tóm lại, việc đơn giản bao gồm bất kỳ ký tự bảng chữ cái hoặc chữ số ASCII thấp nào, một vài ký hiệu ASCII thấp cụ thể và hầu hết các điểm mã không phải ASCII không được phím Ctrl, dấu cách hoặc ký tự đặc biệt. Bắt đầu từ phiên bản 040 định dạng này cũng cho phép sử dụng thêm ký tự khoảng trắng (Unicode Zs danh mục). Xin lưu ý rằng điểm mã thay thế (trong phạm vi U+d800 ... U+dfff) không được coi là các ký tự tên hợp lệ, mỗi ký tự, nhưng phần bổ sung Unicode các ký tự hợp lệ (được biểu thị bằng ký tự cuối cùng lựa chọn thay thế cho quy tắc cho SimpleNameChar) và chúng phải là được trình bày trong tệp dưới dạng các cặp điểm mã thay thế trong MUTF-8 mã hoá.

SimpleName
SimpleNameChar (SimpleNameChar)*
SimpleNameChar
'A'... 'Z'
| 'a'... 'z'
| '0'... '9'
| ' ' kể từ phiên bản DEX 040
| '$'
| '-'
| '_'
| U+00a0 kể từ phiên bản DEX 040
| U+00a1... U+1fff
| U+2000... U+200a kể từ phiên bản DEX 040
| U+2010... U+2027
| U+202f kể từ phiên bản DEX 040
| U+2030... U+d7ff
| U+e000... U+ffef
| U+10000... U+10ffff

Tên thành viên

được sử dụng bởi trường_id_item và method_id_item

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

membershipsName
SimpleName
| '<' SimpleName '>'

Tên lớp đầy đủ

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

FullClassName
optionalPackagePrefix SimpleName
CustomPackagePrefix (Tiền tố gói tuỳ chọn) →
(SimpleName '/')*

Mô tả kiểu dữ liệu

Được type_id_item sử dụng

TypeDescriptor là đại diện của bất kỳ loại nào, bao gồm dữ liệu nguyên gốc, lớp, mảng và void. Xem bên dưới để biết ý nghĩa của các phiên bản khác nhau.

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

ShortyDescriptor (Mô tả ngắn gọn)

Được proto_id_item sử dụng

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

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

Ngữ nghĩa TypeDescriptor

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

Cú pháp Ý nghĩa
V void; chỉ hợp lệ đối với loại dữ liệu trả lại
Z boolean
B byte
S short
C char
I int
J long
T6 float
D double
Đủ điều kiện/Tên; lớp fully.qualified.Name
[phần mô tả mảng descriptor, có thể sử dụng theo cách đệ quy cho mảng- của mảng, mặc dù nếu lớn hơn 255 thì sẽ không hợp lệ thứ nguyên.

Mục và cấu trúc liên quan

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

tiêu_đề_mục_hàng

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

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
ma thuật ubyte[8] = DEX_FILE_MAGIC giá trị kỳ diệu. Xem thảo luận phía trên trong "DEX_FILE_MAGIC" để biết thêm chi tiết.
giá trị tổng kiểm CANNOT TRANSLATE adler32 tổng kiểm tra phần còn lại của tệp (mọi thứ trừ magic và trường này); dùng để phát hiện tệp bị hỏng
Chữ ký ubyte[20] Chữ ký SHA-1 (băm) của phần còn lại của tệp (mọi thứ trừ magic, checksum và trường này); đã dùng để xác định chính xác tệp
kích thước tệp CANNOT TRANSLATE kích thước của toàn bộ tệp (bao gồm cả tiêu đề), tính bằng byte
kích_ thước_tiêu_đề uint = 0x70 kích thước của tiêu đề (toàn bộ phần này), tính bằng byte. Điều này cho phép tại ở mức hạn chế về khả năng tương thích ngược/chuyển tiếp mà không cần làm mất hiệu lực định dạng.
thẻ_endian uint = ENDIAN_CONSTANT thẻ nội dung. Xem thảo luận phía trên bên dưới "ENDIAN_CONSTANTREVERSE_ENDIAN_CONSTANT inch để biết thêm chi tiết.
kích_ thước_đường_liên_kết CANNOT TRANSLATE kích thước của phần liên kết hoặc 0 nếu tệp này không được liên kết tĩnh
tắt_đường_liên_kết CANNOT TRANSLATE phần chênh lệch từ đầu tệp sang phần liên kết, hoặc 0 nếu link_size == 0. Độ lệch, nếu khác 0, phải là một giá trị bù trừ vào phần link_data. Chiến lược phát hành đĩa đơn định dạng của dữ liệu trỏ đến không được tài liệu này chỉ định; trường tiêu đề này (và trường trước đó) được để lại dưới dạng nội dung hấp dẫn để thời gian chạy.
tắt_bản_đồ CANNOT TRANSLATE bù trừ từ đầu tệp đến mục bản đồ. Giá trị bù trừ, phải khác 0, phải là một giá trị bù trừ vào phần data, và dữ liệu phải ở định dạng do "map_list" chỉ định bên dưới.
string_ids_size CANNOT TRANSLATE số lượng chuỗi trong danh sách giá trị nhận dạng chuỗi
string_ids_off CANNOT TRANSLATE độ lệch từ đầu tệp đến danh sách giá trị nhận dạng chuỗi, hoặc 0 nếu string_ids_size == 0 (được phép là trường hợp hiếm gặp). Độ lệch, nếu khác 0, phải ở đầu phần string_ids.
type_ids_size CANNOT TRANSLATE số lượng phần tử trong danh sách mã nhận dạng loại, tối đa là 65535
type_ids_off CANNOT TRANSLATE vị trí bù trừ từ đầu tệp đến danh sách mã nhận dạng loại, hoặc 0 nếu type_ids_size == 0 (được phép là trường hợp hiếm gặp). Độ lệch, nếu khác 0, phải ở đầu type_ids .
proto_ids_size CANNOT TRANSLATE số lượng phần tử trong danh sách giá trị nhận dạng nguyên mẫu, tối đa là 65535
proto_ids_off CANNOT TRANSLATE giá trị bù trừ từ đầu tệp đến danh sách giá trị nhận dạng nguyên mẫu, hoặc 0 nếu proto_ids_size == 0 (được phép là trường hợp hiếm gặp). Độ lệch, nếu khác 0, phải ở đầu proto_ids .
Kích_ thước_mã_trường_trường CANNOT TRANSLATE số lượng phần tử trong danh sách giá trị nhận dạng trường
trường_id_tắt CANNOT TRANSLATE giá trị bù trừ từ đầu tệp đến danh sách giá trị nhận dạng trường, hoặc 0 nếu field_ids_size == 0. Độ lệch, nếu khác 0, phải ở đầu field_ids .
method_ids_size CANNOT TRANSLATE số lượng phần tử trong danh sách giá trị nhận dạng phương thức
method_ids_off (tắt_mã_phương_pháp) CANNOT TRANSLATE độ lệch từ đầu tệp sang danh sách giá trị nhận dạng phương thức, hoặc 0 nếu method_ids_size == 0. Độ lệch, nếu khác 0, phải ở đầu method_ids .
class_defs_size CANNOT TRANSLATE số lượng phần tử trong danh sách định nghĩa lớp
lớp_defs_off CANNOT TRANSLATE chênh lệch từ đầu tệp sang danh sách định nghĩa lớp, hoặc 0 nếu class_defs_size == 0 (được phép là trường hợp hiếm gặp). Độ lệch, nếu khác 0, phải ở đầu phần class_defs.
kích_ thước_dữ_liệu CANNOT TRANSLATE Kích thước của phần data tính bằng byte. Phải là số chẵn bội số của sizeof(uint).
tắt_dữ_liệu CANNOT TRANSLATE độ lệch từ đầu tệp đến đầu tệp data.

danh_sách_bản_đồ

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

Được tham chiếu từ header_item

Căn chỉnh: 4 byte

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

Tên Định dạng Mô tả
size CANNOT TRANSLATE kích thước của danh sách, trong các mục nhập
danh sách mục_bản_đồ[size] các phần tử của danh sách

định dạng map_item

Tên Định dạng Mô tả
loại CANNOT TRANSLATE loại mặt hàng; xem bảng bên dưới
unused CANNOT TRANSLATE (không sử dụng)
size CANNOT TRANSLATE số lượng mục được tìm thấy tại độ lệch được chỉ định
bù trừ CANNOT TRANSLATE bù trừ từ đầu tệp đến các mục liên quan

Mã loại

Loại mục Hằng số Giá trị Kích thước mục tính bằng byte
tiêu_đề_mục_hàng TYPE_TIÊU_MỤC 0x0000 0x70
chuỗi_id_mục_hàng Hàm TYPE_STRING_ID_ITEM 0x0001 0x04
loại_mã_mặt_hàng TYPE_TYPE_ID_ITEM 0x0002 0x04
proto_id_item TYPE_PROTO_ID_ITEM 0x0003 0x0c
trường_id_item TYPE_FIELD_ID_ITEM 0x0004 0x08
mã_phương_ thức TYPE_METHOD_ID_ITEM 0x0005 0x08
lớp_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
gọi_mục_id_trang_web TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
mục_xử_lý_phương_ thức TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
danh_sách_bản_đồ TYPE_MAP_LIST 0 x 1.000 4 + (item.size * 12)
danh_sách_loại_loại DANH SÁCH_TYPE_TYPE_ 0x1001 4 + (item.size * 2)
danh_sách_tham_mục_chú_thích TYPE_ đổi _ DANH SÁCH TÂM LÝ 0x1002 4 + (item.size * 4)
mục_set_chú_ thích TYPE_FORMATTED_SET_ITEM 0x1003 4 + (item.size * 4)
mục dữ_liệu_lớp TYPE_CLASS_DATA_ITEM 0x2000 ngầm ẩn; phải phân tích cú pháp
mặt_hàng_mã TYPE_CODE_ITEM 0x2001 ngầm ẩn; phải phân tích cú pháp
mục dữ liệu_chuỗi TYPE_STRING_DATA_ITEM 0x2002 ngầm ẩn; phải phân tích cú pháp
gỡ_tin_mục_thông_tin TYPE_DEBUG_INFO_ITEM 0x2003 ngầm ẩn; phải phân tích cú pháp
mục_chú thích TYPE_ đổi_ITEM 0x2004 ngầm ẩn; phải phân tích cú pháp
mục_mảng_được_mã_ hoá TYPE_ENCODED_ARRAY_ITEM 0x2005 ngầm ẩn; phải phân tích cú pháp
chú_mục_thư_mục_chú thích TYPE_PARAMS_DIRECTORY_ITEM 0x2006 ngầm ẩn; phải phân tích cú pháp
mục dữ liệu_dữ_liệu_lớp_API ẩn TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 ngầm ẩn; phải phân tích cú pháp

chuỗi_id_mục_hàng

Xuất hiện trong phần string_ids

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
chuỗi_dữ_liệu_tắt CANNOT TRANSLATE bù trừ từ đầu tệp sang dữ liệu chuỗi cho mục. Giá trị bù phải là một vị trí trong phần data và dữ liệu sẽ nằm trong định dạng do "string_data_item" chỉ định bên dưới. Không có yêu cầu căn chỉnh cho độ lệch.

mục dữ liệu_chuỗi

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

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

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

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

loại_mã_mặt_hàng

Xuất hiện trong phần type_ids

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
mô_tả_idx CANNOT TRANSLATE lập chỉ mục vào danh sách string_ids cho phần mô tả thuộc loại này. Chuỗi này phải tuân thủ cú pháp cho TypeDescriptor, đã được định nghĩa ở trên.

proto_id_item

Xuất hiện trong phần proto_ids

Căn chỉnh: 4 byte

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

trường_id_item

Xuất hiện trong mục trường_id

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
lớp_idx CANNOT TRANSLATE chỉ mục vào danh sách type_ids cho phần định nghĩa của thuộc tính này. . Đây phải là loại lớp chứ không phải là kiểu mảng hoặc kiểu dữ liệu nguyên thuỷ.
loại_idx CANNOT TRANSLATE chỉ mục vào danh sách type_ids cho loại trường này
Tên_idx CANNOT TRANSLATE chỉ mục vào danh sách string_ids cho tên của chỉ mục này . Chuỗi này phải tuân thủ cú pháp cho memberName, xác định ở trên.

mã_phương_ thức

Xuất hiện trong phần method_ids

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
lớp_idx CANNOT TRANSLATE chỉ mục vào danh sách type_ids cho phần định nghĩa của thuộc tính này. . Đây phải là một loại mảng hoặc lớp chứ không phải là loại nguyên gốc.
proto_idx CANNOT TRANSLATE chỉ mục vào danh sách proto_ids cho nguyên mẫu phương thức này
Tên_idx CANNOT TRANSLATE chỉ mục vào danh sách string_ids cho tên của chỉ mục này . Chuỗi này phải tuân thủ cú pháp cho memberName, xác định ở trên.

lớp_def_item

Xuất hiện trong phần class_defs

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
lớp_idx CANNOT TRANSLATE chỉ mục vào danh sách type_ids cho lớp này. Đây phải là loại lớp chứ không phải là kiểu mảng hoặc kiểu dữ liệu nguyên thuỷ.
cờ_truy_cập CANNOT TRANSLATE cờ truy cập cho lớp (public, final, v.v). Xem "Định nghĩa access_flags" để biết thông tin chi tiết.
lớp_siêu_class_idx CANNOT TRANSLATE chỉ mục vào danh sách type_ids cho lớp cấp cao, hoặc là giá trị không đổi NO_INDEX nếu lớp này không có siêu lớp (tức là lớp gốc như Object). Nếu có thì đây phải là loại lớp chứ không phải là kiểu mảng hoặc kiểu dữ liệu nguyên thuỷ.
giao diện_tắt CANNOT TRANSLATE độ lệch từ đầu tệp đến danh sách giao diện, hoặc 0 nếu không có. Mức chênh lệch này sẽ nằm trong phần data và dữ liệu phải ở định dạng được chỉ định bởi "type_list" bên dưới. Từng phần tử của danh sách phải là loại lớp (không phải là mảng hoặc loại nguyên hàm) và ở đó không được trùng lặp.
source_file_idx CANNOT TRANSLATE chỉ mục vào danh sách string_ids cho tên của tệp chứa nguồn ban đầu của (ít nhất là hầu hết) lớp này, hoặc giá trị đặc biệt NO_INDEX để thể hiện việc thiếu thông tin này. debug_info_item của phương thức bất kỳ có thể ghi đè tệp nguồn này, nhưng kỳ vọng là hầu hết các lớp sẽ chỉ đến từ một tệp nguồn.
tắt_chú thích CANNOT TRANSLATE độ lệch từ đầu tệp đến cấu trúc chú giải cho lớp này hoặc 0 nếu không có chú thích nào trên lớp này. Độ lệch này, nếu khác 0, phải nằm trong data và dữ liệu cần có trong định dạng do "annotations_directory_item" chỉ định bên dưới với tất cả các mục đều tham chiếu lớp này làm phần định nghĩa.
lớp_dữ_liệu_tắt CANNOT TRANSLATE từ đầu tệp đến giá trị được liên kết dữ liệu lớp cho mục này hoặc 0 nếu không có lớp dữ liệu của lớp này. (Đây có thể là trường hợp, chẳng hạn như nếu lớp này là một giao diện điểm đánh dấu.) Độ lệch, nếu khác 0, phải nằm trong data và dữ liệu trong đó định dạng do "class_data_item" chỉ định bên dưới, với tất cả các mục tham chiếu đến lớp này là phần định nghĩa.
static_values_off CANNOT TRANSLATE độ lệch từ đầu tệp đến danh sách tên viết tắt giá trị cho các trường static hoặc 0 nếu có không có (và tất cả các trường static đều sẽ được khởi tạo bằng 0 hoặc null). Mức chênh lệch này phải nằm trong data và dữ liệu sẽ có trong định dạng được chỉ định bởi "encoded_array_item" bên dưới. Kích thước của mảng không được lớn hơn số static các trường được khai báo bởi lớp này và các phần tử tương ứng với Trường static theo cùng thứ tự như được khai báo trong field_list tương ứng. Loại của mỗi mảng phải phù hợp với loại đã khai báo của trường tương ứng. Nếu mảng có ít phần tử hơn số phần tử có static trường, sau đó những trường còn lại sẽ được khởi động có 0 hoặc null phù hợp với loại.

gọi_mục_id_trang_web

Xuất hiện trong phần call_site_ids

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
call_site_off CANNOT TRANSLATE bù trừ ở đầu tệp để gọi định nghĩa trang web. Độ lệch sẽ nằm trong phần dữ liệu và dữ liệu phải ở định dạng được chỉ định theo "call_site_item" bên dưới.

gọi_mục_trang_web

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

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

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

  1. Một trình xử lý phương thức biểu thị phương thức trình liên kết tự khởi động (VALUE_METHOD_HANDLE).
  2. Tên phương thức mà trình liên kết 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 được giải quyết (VALUE_METHOD_TYPE).

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

Trình xử lý phương thức biểu thị phương thức trình liên kết tự động khởi động phải có loại dữ liệu trả về java.lang.invoke.CallSite. Ba loại thông số đầu tiên là:

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

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

mục_xử_lý_phương_ thức

Xuất hiện trong phần method_handles

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
method_handle_type [loại_xử_lý_phương_pháp] CANNOT TRANSLATE loại xử lý phương thức; xem bảng bên dưới
unused CANNOT TRANSLATE (không sử dụng)
trường_hoặc_phương_pháp_id CANNOT TRANSLATE Mã trường hoặc phương thức tuỳ thuộc vào việc loại xử lý phương thức là trình truy cập hay trình gọi phương thức
unused CANNOT TRANSLATE (không sử dụng)

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

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

mục dữ_liệu_lớp

Được tham chiếu từ class_def_item

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

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

Tên Định dạng Mô tả
kích_ thước_trường_tĩnh uleb128 số trường tĩnh được xác định trong mục này
kích thước trường_thực thể uleb128 số trường thực thể được xác định trong mục này
kích_ thước_phương_pháp_trực_tiếp uleb128 số phương thức trực tiếp được xác định trong mục này
kích_ thước_phương_pháp_ảo uleb128 số phương thức ảo được xác định trong mục này
trường_tĩnh trường được mã hoá[static_fields_size] các trường tĩnh xác định, được biểu diễn dưới dạng một chuỗi các phần tử được mã hóa. Các trường phải được sắp xếp theo field_idx theo thứ tự tăng dần.
trường_thực_thể trường_mã_ hoá[instance_fields_size] các trường đối tượng đã khai báo, được biểu diễn dưới dạng một chuỗi các phần tử được mã hóa. Các trường phải được sắp xếp theo field_idx theo thứ tự tăng dần.
phương_pháp_trực_tiếp phương thức mã hoá [direct_methods_size] giá trị trực tiếp đã xác định (bất kỳ giá trị nào trong số static, private, hoặc hàm khởi tạo), được biểu thị dưới dạng một chuỗi các phần tử được mã hóa. Các phương thức phải được sắp xếp theo method_idx theo thứ tự tăng dần.
phương_pháp_ảo phương_pháp_mã_hoá[virtual_methods_size] ảo được xác định (không có static, private, hoặc hàm khởi tạo), được biểu thị dưới dạng một chuỗi các phần tử được mã hóa. Danh sách này không được bao gồm dữ liệu kế thừa trừ phi bị lớp mà mục này đại diện ghi đè. Chiến lược phát hành đĩa đơn phải được sắp xếp theo method_idx theo thứ tự tăng dần. method_idx của một phương thức ảo không được giống nhau như bất kỳ phương thức trực tiếp nào.

Lưu ý: Tất cả các phần tử field_id và Các thực thể method_id phải tham chiếu đến cùng một lớp xác định.

định dạng trường được_mã hoá

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

định dạng encrypted_method

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

danh_sách_loại_loại

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

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

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
size CANNOT TRANSLATE kích thước của danh sách, trong các mục nhập
danh sách loại_mặt_hàng[size] các phần tử của danh sách

định dạng type_item

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

mặt_hàng_mã

Được tham chiếu từ encrypted_method

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

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
kích_ thước_thanh_toán CANNOT TRANSLATE số lượng thanh ghi mà mã này sử dụng
kích thước ins CANNOT TRANSLATE số từ của đối số đến cho phương thức này mã dành cho
kích_ thước_ngoài CANNOT TRANSLATE số từ của không gian đối số đi được yêu cầu bởi mã gọi phương thức
kích_ thước_thử CANNOT TRANSLATE số lượng try_item cho phiên bản này. Nếu khác 0, thì chúng sẽ xuất hiện dưới dạng mảng tries ngay sau insns trong trường hợp này.
gỡ_ lỗi_thông_tin_tắt CANNOT TRANSLATE bù trừ từ đầu tệp đến thông tin gỡ lỗi (số dòng + chuỗi thông tin về biến cục bộ cho mã này hoặc 0 nếu đơn giản là không có thông tin. Độ lệch, nếu khác 0, phải là vào một vị trí trong phần data. Định dạng của dữ liệu do "debug_info_item" chỉ định bên dưới.
kích_ thước_Insns CANNOT TRANSLATE kích thước của danh sách lệnh, theo đơn vị mã 16 bit
nhà trọ ushort[insns_size] mảng mã byte thực tế. Định dạng mã trong insns do tài liệu đồng hành chỉ định Mã byte Dalvik. Ghi chú mặc dù đoạn mã này được định nghĩa là một mảng ushort, nhưng là một số cấu trúc nội bộ thích căn chỉnh 4 byte. Ngoài ra, nếu điều này xảy ra trong một tệp hoán đổi kết thúc, thì hoán đổi sẽ chỉ được thực hiện trên từng thực thể ushort chứ không phải trên các cấu trúc bên trong lớn hơn.
padding ushort (không bắt buộc) = 0 hai byte khoảng đệm để căn chỉnh tries 4 byte. Phần tử này chỉ xuất hiện nếu tries_size khác 0 và insns_size là số lẻ.
cố gắng try_item[tries_size] (không bắt buộc) mảng cho biết vị trí phát hiện các ngoại lệ trong mã và cách xử lý. Các phần tử của mảng không được chồng chéo trong dải ô và theo thứ tự từ thấp đến cao. Phần tử này chỉ sẽ xuất hiện nếu tries_size khác 0.
trình xử lý được mã hoá_catch_handler_list (không bắt buộc) các byte đại diện cho danh sách các loại dữ liệu khai thác và các byte được liên kết địa chỉ của trình xử lý. Mỗi try_item có một giá trị bù theo byte vào cấu trúc này. Phần tử này chỉ xuất hiện nếu tries_size khác 0.

định dạng try_item

Tên Định dạng Mô tả
địa_chỉ_bắt_đầu CANNOT TRANSLATE địa chỉ bắt đầu của khối mã được đề cập trong mục nhập này. Địa chỉ là số lượng đơn vị mã 16 bit tính đến đầu của đơn vị mã chỉ dẫn.
số_số_lượng_trong CANNOT TRANSLATE số đơn vị mã 16 bit được đề cập trong mục này. Đoạn mã cuối cùng đơn vị được bao gồm (bao gồm) là start_addr + insn_count - 1.
xử_lý_tắt CANNOT TRANSLATE theo byte tính từ đầu encoded_catch_hander_list vào encoded_catch_handler cho mục nhập này. Đây phải là độ lệch ở đầu encoded_catch_handler.

định dạng mã hoá_catch_handler_list

Tên Định dạng Mô tả
size uleb128 kích thước của danh sách này, trong mục nhập
danh sách mã hoá_catch_handler[handlers_size] danh sách thực tế gồm các danh sách trình xử lý, được trình bày trực tiếp (không phải dưới dạng giá trị bù trừ), và được nối tuần tự

định dạng mã hoá_catch_handler

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

định dạngized_type_addr_pair

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

gỡ_tin_mục_thông_tin

Được tham chiếu từ code_item

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

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

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

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

Tiêu đề như sau:

Tên Định dạng Mô tả
bắt_đầu_dòng_ uleb128 giá trị ban đầu cho thanh ghi line của máy trạng thái. Không đại diện cho mục nhập vị trí thực tế.
thông số_kích thước uleb128 số lượng tên thông số được mã hoá. Nên có một lần cho mỗi tham số phương thức, ngoại trừ this của một phương thức thực thể, nếu có.
tên_thông_số uleb128p1[parameter_size] chỉ mục chuỗi của tên tham số phương thức. Giá trị được mã hoá của NO_INDEX cho biết rằng không có tên nào có sẵn cho thông số liên quan. Chỉ số mô tả loại và chữ ký được ngụ ý từ phần mô tả và chữ ký của phương thức.

Giá trị mã byte như sau:

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

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

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

Mã hoạt động đặc biệt

Mã Opa có các giá trị từ 0x0a đến 0xff (bao gồm) di chuyển cả lineaddress đăng ký một lượng nhỏ rồi phát ra một mục nhập bảng vị trí mới. Sau đây là công thức tính các số gia:

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

adjusted_opcode = opcode - DBG_FIRST_SPECIAL

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

chú_mục_thư_mục_chú thích

Được tham chiếu từ class_def_item

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

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
lớp_chú thích_tắt CANNOT TRANSLATE bù trừ từ đầu tệp sang các chú thích được tạo trực tiếp trên lớp hoặc 0 nếu lớp không có chú giải trực tiếp. Giá trị bù trừ, nếu khác 0, phải là một vị trí trong data. Định dạng của dữ liệu được chỉ định của "annotation_set_item" bên dưới.
kích_ thước_trường CANNOT TRANSLATE số lượng trường được chú thích bởi mục này
kích_ thước_phương_pháp_chú giải CANNOT TRANSLATE số lượng phương thức được chú thích bởi mục này
kích_ thước_tham_số_chú_thích CANNOT TRANSLATE số lượng danh sách tham số phương thức được chú thích bởi mục này
chú_ thích cho trường trường_chú thích[fields_size] (không bắt buộc) danh sách chú thích trường liên kết. Các phần tử của danh sách phải được sắp xếp theo thứ tự tăng dần, theo field_idx.
chú_ giải_phương_ thức method_annotation[methods_size] (không bắt buộc) danh sách chú giải phương thức liên kết. Các phần tử của danh sách phải được sắp xếp theo thứ tự tăng dần, theo method_idx.
chú_ giải thông số Thông số_chú thích[parameters_size] (không bắt buộc) danh sách chú giải tham số phương thức liên kết. Các phần tử của danh sách phải được sắp xếp theo thứ tự tăng dần (theo method_idx).

Lưu ý: Tất cả các phần tử field_id và Các thực thể method_id phải tham chiếu đến cùng một lớp xác định.

định dạng trường_chú thích

Tên Định dạng Mô tả
trường_idx CANNOT TRANSLATE chỉ mục vào danh sách field_ids để biết danh tính của trường đang được chú thích
tắt_chú thích CANNOT TRANSLATE bù trừ từ đầu tệp sang danh sách các chú thích cho trường này. Giá trị bù trừ phải là một vị trí trong data . Định dạng của dữ liệu được chỉ định bởi "annotation_set_item" bên dưới.

định dạng method_annotation

Tên Định dạng Mô tả
phương_ thức_idx CANNOT TRANSLATE chỉ mục vào danh sách method_ids để biết danh tính của phương thức được chú giải
tắt_chú thích CANNOT TRANSLATE bù trừ từ đầu tệp sang danh sách các chú thích cho phương thức. Giá trị bù phải là một vị trí trong data. Định dạng của dữ liệu được chỉ định bởi "annotation_set_item" bên dưới.

định dạng Thông số_chú thích

Tên Định dạng Mô tả
phương_ thức_idx CANNOT TRANSLATE chỉ mục vào danh sách method_ids để biết danh tính của phương thức có các tham số được chú thích
tắt_chú thích CANNOT TRANSLATE bù trừ từ đầu tệp sang danh sách các chú thích cho các tham số của phương thức. Giá trị bù phải là một vị trí trong data. Định dạng của dữ liệu được chỉ định bởi "annotation_set_ref_list" bên dưới.

danh_sách_tham_mục_chú_thích

Được tham chiếu từ notification_annotations_item

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

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
size CANNOT TRANSLATE kích thước của danh sách, trong các mục nhập
danh sách chú thích_set_ref_item[kích thước] các phần tử của danh sách

định dạng callout_set_ref_item

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

mục_set_chú_ thích

Được tham chiếu từ shortcuts_directory_item, event_annotations_item, method_annotations_item và callout_set_ref_item

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

Căn chỉnh: 4 byte

Tên Định dạng Mô tả
size CANNOT TRANSLATE kích thước của tập hợp, trong các phần tử
bài viết chú_thích_ngoài_mặt_hàng[size] là các phần tử của tập hợp. Các phần tử phải được sắp xếp theo thứ tự tăng dần, của type_idx.

định dạng callout_off_item

Tên Định dạng Mô tả
tắt_chú thích CANNOT TRANSLATE bù trừ từ đầu tệp vào một chú giải. Mức chênh lệch phải là một vị trí trong phần data, và định dạng của dữ liệu ở vị trí đó được chỉ định bởi "annotation_item" bên dưới.

mục_chú thích

Được tham chiếu từ callout_set_item

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

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

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

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

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

Tên Giá trị Mô tả
XÂY DỰNG TRỰC QUAN 0x00 chỉ hiển thị tại thời điểm xây dựng (ví dụ: trong quá trình biên dịch) của mã khác)
LƯỢT XEM HIỂN THỊ 0x01 dự định hiển thị trong thời gian chạy
HỆ THỐNG HIỂN THỊ 0x02 nhằm hiển thị trong thời gian chạy, nhưng chỉ cho hệ thống cơ bản (và không sử dụng mã người dùng thông thường)

mục_mảng_được_mã_ hoá

Được tham chiếu từ class_def_item

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

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

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

mục dữ liệu_dữ_liệu_lớp_API ẩn

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

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

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

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

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

Chú thích hệ thống

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

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

dalvik.annotation.AnnotationDefault

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

Chú thích AnnotationDefault được đính kèm vào mỗi đường dẫn giao diện chú giải muốn chỉ định các liên kết mặc định.

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

dalvik.annotation.En bao hiệnClass

Xuất hiện trong lớp học

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

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

dalvik.annotation.En bao gồmphương thức

Xuất hiện trong lớp học

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

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

dalvik.annotation.innerClass

Xuất hiện trong lớp học

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

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

dalvik.annotation.membershipsClasses

Xuất hiện trong lớp học

Chú giải MemberClasses được đính kèm cho mỗi lớp Tệp này khai báo các lớp thành viên. (Lớp thành viên là một lớp bên trong trực tiếp có tên.)

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

dalvik.annotation.MethodParameters

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

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

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

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

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

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

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

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

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

Tên Định dạng Mô tả
tên String[] Tên của các tham số hình thức cho phương thức được liên kết. Mảng không được để trống nhưng phải để trống nếu không có tham số chính thức. Một giá trị trong mảng phải có giá trị rỗng nếu tham số hình thức có chỉ mục đó không có tên.
Nếu chuỗi tên tham số trống hoặc chứa '.', ';', '[' hoặc '/' thì a java.lang.reflect.MalformedParametersException sẽ được gửi vào thời gian chạy.
cờ truy cập int[] Cờ truy cập của các tham số chính thức cho phương thức được liên kết. Chiến lược phát hành đĩa đơn mảng không được rỗng nhưng phải trống nếu không có tham số chính thức.
Giá trị này là một mặt nạ bit có các giá trị sau:
  • 0x0010 : cuối cùng, tham số được khai báo là cuối cùng
  • 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ụ ý theo ngôn ngữ quy cách
Nếu 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 chữ ký

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

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

Do chuỗi chữ ký thường có nhiều nội dung trùng lặp, chú giải Signature được định nghĩa là một mảng của chuỗi, trong đó các phần tử trùng lặp tự nhiên tham chiếu đến cùng một chuỗi dữ liệu cơ bản và chữ ký được coi là kết hợp của tất cả các chuỗi trong mảng. Không có quy tắc nào về cách lấy tách chữ ký thành các chuỗi riêng biệt; điều đó hoàn toàn tuỳ thuộc vào công cụ tạo tệp .dex.

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

dalvik.annotation.Throw

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

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

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