Format Dalvik yang dapat dieksekusi

Dokumen ini menjelaskan tata letak dan konten .dex , yang digunakan untuk menyimpan sekumpulan definisi class dan file terkait data tambahan.

Panduan jenis-jenis

Nama Deskripsi
byte Int login 8 bit
{i>ubyte<i} Int 8-bit yang tidak ditandatangani
short Int login 16-bit, little-endian
singkat 16-bit tanpa tanda tangan int, little-endian
int Int login 32-bit, little-endian
Uint 32-bit tanpa tanda tangan int, little-endian
long Int 64-bit bertanda tangan, little-endian
Ulong 64-bit tanpa tanda tangan int, little-endian
sleb128 LEB128 bertanda tangan, panjang variabel (lihat di bawah)
uleb128 LEB128 yang tidak ditandatangani, panjang-variabel (lihat di bawah)
uleb128p1 LEB128 yang tidak ditandatangani ditambah 1, panjang variabel (lihat di bawah)

LEB128

LEB128 ("Little-Endian Base 128") adalah encoding panjang variabel kuantitas bilangan bulat yang ditandatangani atau tidak ditandatangani secara arbitrer. Formatnya adalah yang dipinjam dari DWARF3 spesifikasi pendukung. Dalam file .dex, LEB128 hanya digunakan untuk mengenkode jumlah 32-bit.

Setiap nilai yang dienkode dengan LEB128 terdiri dari satu hingga lima {i>byte<i}, yang bersama-sama mewakili nilai 32-bit tunggal. Masing-masing memiliki set bit yang paling signifikan kecuali untuk byte terakhir dalam , yang memiliki bagian paling jelas yang jelas. Sisa tujuh bit dari setiap byte adalah {i>payload<i}, dengan tujuh bit yang paling tidak signifikan bit jumlah di byte pertama, tujuh berikutnya dalam byte kedua dan seterusnya. Dalam kasus LEB128 yang ditandatangani (sleb128), bit {i>payload<i} paling signifikan dari byte terakhir dalam urutan ini adalah {i>sign-extended<i} untuk menghasilkan nilai akhir. Dalam kasus yang tidak ditandatangani (uleb128), setiap bit yang tidak diwakili secara eksplisit adalah ditafsirkan sebagai 0.

Diagram bitwise dari nilai LEB128 dua byte
Byte pertama Byte kedua
1 bit6 bit5 bit4 bit3 bit2 bit1 bit0 0 bit13 bit12 bit11 bit10 bit9 bit8 bit7

Varian uleb128p1 digunakan untuk merepresentasikan , dengan representasi yang dienkode adalah nilai plus satu yang dienkode sebagai uleb128. Hal ini membuat encoding -1 (atau juga dianggap sebagai nilai yang tidak ditandatangani 0xffffffff) — tetapi tidak ada angka negatif lainnya — satu byte, dan berguna dalam kasus tertentu di mana angka yang diwakili harus bukan negatif atau -1 (atau 0xffffffff), dan yang nilai-nilai negatifnya tidak dibolehkan (atau jika nilai besar yang tidak ditandatangani kemungkinan nilai tersebut tidak diperlukan).

Berikut beberapa contoh formatnya:

Urutan yang Dienkodekan Sebagai sleb128 Sebagai uleb128 Sebagai uleb128p1
0000-1
01110
7f-1127126
80 7f-1281625616255

Tata letak file

Nama Format Deskripsi
header item_header {i>header<i}
string_id [id_string] string_id_item[] daftar ID string. Ini adalah ID untuk semua {i>string<i} digunakan oleh file ini, baik untuk penamaan internal (mis., deskriptor jenis) atau sebagai objek konstan yang dirujuk oleh kode. Daftar ini harus diurutkan menurut isi string, menggunakan nilai poin kode UTF-16 (bukan dalam sensitif terhadap lokalitas), dan tidak boleh berisi entri duplikat.
jenis_id type_id_item[] daftar ID jenis. Ini adalah pengenal untuk semua jenis (class, (jenis primitif) yang dirujuk oleh file ini, baik yang telah ditentukan dalam file atau tidak. Daftar ini harus diurutkan menurut string_id indeks, dan tidak boleh berisi entri duplikat.
id_proto proto_id_item[] daftar ID prototipe metode. Ini adalah ID untuk semua prototipe yang dirujuk oleh file ini. Daftar ini harus disortir dalam urutan utama jenis nilai yang ditampilkan (berdasarkan indeks type_id), lalu berdasarkan daftar argumen (pengurutan leksikografis, argumen individual diurutkan menurut indeks type_id). Daftar tidak boleh berisi entri duplikat.
id_kolom field_id_item[] daftar ID kolom. Ini adalah ID untuk semua kolom yang dirujuk oleh file ini, baik yang didefinisikan dalam file atau tidak. Ini daftar harus diurutkan, dengan jenis pendefinisian (berdasarkan type_id indeks) adalah urutan utama, nama kolom (berdasarkan indeks string_id) adalah urutan perantara, dan jenis (berdasarkan indeks type_id) adalah pesanan minor. Daftar tidak boleh berisi entri duplikat.
id_metode method_id_item[] daftar ID metode. Ini adalah ID untuk semua metode yang dirujuk oleh file ini, baik yang didefinisikan dalam file atau tidak. Ini daftar harus diurutkan, dengan jenis pendefinisian (berdasarkan type_id indeks) adalah urutan utama, nama metode (berdasarkan string_id indeks) adalah urutan perantara, dan purwarupa metode (berdasarkan proto_id) adalah pesanan minor. Daftar tidak boleh berisi entri duplikat.
class_def class_def_item[] daftar definisi class. Class harus diurutkan sedemikian rupa sehingga superclass class dan antarmuka yang diimplementasikan akan muncul di lebih awal daripada kelas perujuk. Selain itu, token tidak valid untuk definisi untuk kelas dengan nama yang sama muncul lebih dari sekali dalam daftar.
id_situs_panggilan call_site_id_item[] panggil daftar ID situs. Ini merupakan ID untuk semua situs panggilan yang dirujuk oleh file ini, baik yang didefinisikan dalam file atau tidak. Daftar ini harus diurutkan dalam urutan call_site_off menaik.
metode_menangani method_handle_item[] metode yang menangani daftar. Daftar semua nama sebutan channel yang dirujuk oleh file ini, yang ditentukan dalam file atau tidak. Daftar ini tidak diurutkan dan mungkin berisi duplikasi yang secara logis akan berhubungan dengan instance penanganan metode yang berbeda.
data ubyte[] area data, yang berisi semua data dukungan untuk tabel yang tercantum di atas. Item yang berbeda memiliki persyaratan penyelarasan yang berbeda, dan byte padding disisipkan sebelum setiap item jika diperlukan untuk mencapai keselarasan yang tepat.
link_data [data_link] ubyte[] data yang digunakan dalam file yang terhubung secara statis. Format data pada bagian ini tidak ditetapkan oleh dokumen ini. Bagian ini kosong dalam file yang dibatalkan tautannya, dan implementasi runtime dapat menggunakannya sesuai kebutuhan.

Definisi bitfield, string, dan konstanta

DEX_FILE_MAGIC

Disematkan di header_item

Array/string konstanta DEX_FILE_MAGIC adalah daftar byte yang harus muncul di awal file .dex agar dapat dikenali sebagaimana mestinya. Nilai ini sengaja berisi baris baru ("\n" atau 0x0a) dan null byte ("\0" atau 0x00) untuk membantu dalam mendeteksi bentuk-bentuk kerusakan tertentu. Nilai ini juga mengenkode nomor versi format sebagai tiga digit desimal, yang diperkirakan akan meningkat secara monoton dari waktu ke waktu seiring perkembangan format.

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

Catatan: Dukungan untuk versi 039 format baru ini ditambahkan dalam rilis Android 9.0, yang memperkenalkan bytecode baru, const-method-handle, dan const-method-type. (Masing-masing dijelaskan dalam Ringkasan kumpulan bytecode tabel.) Di Android 10, versi 039 memperluas format file DEX untuk menyertakan Informasi API yang hanya berlaku untuk file DEX di jalur class booting.

Catatan: Dukungan untuk versi 038 format ditambahkan di Android 8.0 data. Versi 038 menambahkan bytecode baru (invoke-polymorphic dan invoke-custom) dan untuk nama sebutan channel.

Catatan: Dukungan untuk versi 037 format ini ditambahkan dalam rilis Android 7.0. Sebelum versi 037 paling sering versi Android telah menggunakan format 035. Satu-satunya perbedaan antara versi 035 dan 037 adalah penambahan metode default dan penyesuaian invoke.

Catatan: Setidaknya beberapa versi format sebelumnya memiliki telah digunakan dalam rilis perangkat lunak publik yang tersedia secara luas. Misalnya, versi 009 digunakan untuk rilis M3 dari Platform Android (November–Desember 2007), dan versi 013 digunakan untuk rilis M5 Android (Februari–Maret 2008). Dalam beberapa hal, versi berbeda secara signifikan berbeda dengan versi yang dijelaskan dalam dokumen.

ENDIAN_CONSTANT dan REVERSE_ENDIAN_CONSTANT

Disematkan di header_item

Konstanta ENDIAN_CONSTANT digunakan untuk menunjukkan endianness dari file tempat file itu ditemukan. Meskipun standar Format .dex adalah little-endian, implementasi dapat memilih untuk melakukan pertukaran byte. Jika implementasi menemukan header yang endian_tag-nya adalah REVERSE_ENDIAN_CONSTANT bukannya ENDIAN_CONSTANT, sistem akan mengetahui bahwa file tersebut telah {i>byte-swap <i}dari bentuk yang diharapkan.

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

TIDAK ADA INDEKS

Disematkan di class_def_item dan debug_info_item

Konstanta NO_INDEX digunakan untuk menunjukkan bahwa nilai indeks tidak ada.

Catatan: Nilai ini tidak ditetapkan sebagai 0, karena sebenarnya ini adalah indeks yang valid.

Nilai yang dipilih untuk NO_INDEX adalah dapat diwakili sebagai byte tunggal dalam encoding uleb128p1.

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

definisi access_flags

Disematkan di class_def_item, coded_field, encrypted_method, dan Dalam Kelas

{i>Bitfield<i} dari penanda ini digunakan untuk menunjukkan aksesibilitas dan properti keseluruhan class dan anggota class.

Nama Nilai Untuk Class (dan anotasi InnerClass) Untuk Kolom Untuk Metode
ACC_PUBLIC 0x1 public: dapat dilihat di mana saja public: dapat dilihat di mana saja public: dapat dilihat di mana saja
ACC_PRIVATE 0x2 * private: hanya terlihat oleh class yang menentukan private: hanya terlihat oleh menentukan class private: hanya terlihat oleh menentukan class
{i>ACC_PROTECTED<i} 0x4 * protected: terlihat oleh paket dan subclass protected: terlihat oleh paket dan subclass protected: terlihat oleh paket dan subclass
{i>ACC_STATIC<i} 0x8 * static: tidak dibuat dengan lapisan luar Referensi this static: class global ke class pendefinisi static: tidak menerima argumen this
ACC_FINAL 0x10 final: tidak dapat dibuat subclass final: tidak dapat diubah setelah dibangun final: tidak dapat diganti
ACC_SYNCHRONIZED 0x20     synchronized: kunci terkait yang diperoleh secara otomatis pada panggilan ke metode ini.

Catatan: Ini hanya valid jika disetel jika ACC_NATIVE juga disetel.

ACC_VOLATILE 0x40   volatile: aturan akses khusus untuk membantu rangkaian pesan melakukan safety  
{i>ACC_ tua<i} 0x40     metode bridge, ditambahkan secara otomatis oleh compiler sebagai metode keamanan jenis jembatan
ACC_TRANSIENT 0x80   transient: tidak disimpan secara default  
ACC_VARARGS 0x80     argumen terakhir harus diperlakukan sebagai "rest" argumen berdasarkan compiler
ACC_NATIVE 0x100     native: diimplementasikan dalam kode native
ACC_INTERFACE 0x200 interface: class abstrak yang dapat diimplementasikan dan dilipatgandakan    
ACC_ABSTRAK 0x400 abstract: tidak dapat dibuat instance-nya secara langsung   abstract: tidak diterapkan oleh class ini
ACC_STRICT 0x800     strictfp: aturan ketat untuk aritmetika floating point
{i>ACC_SYNTHETIC<i} 0x1000 tidak didefinisikan secara langsung dalam kode sumber tidak didefinisikan secara langsung dalam kode sumber tidak didefinisikan secara langsung dalam kode sumber
ACC_Creator 0x2000 yang dideklarasikan sebagai class anotasi    
ACC_ENUM 0x4000 dideklarasikan sebagai jenis terenumerasi dideklarasikan sebagai nilai yang dienumerasi  
(tidak digunakan) 0x8.000      
AKC_CONSTRUCTOR 0x10.000     metode konstruktor (penginisialisasi class atau instance)
ACC_DECLARED_
SYNCHRONIZED
0x20.000     mendeklarasikan synchronized.

Catatan: Penetapan ini tidak akan memengaruhi eksekusi (selain dari refleksi tanda ini, itu sendiri).

* Hanya diizinkan aktif untuk anotasi InnerClass, dan tidak boleh aktif di class_def_item.

Encoding UTF-8 yang dimodifikasi

Untuk mempermudah dukungan lama, format .dex mengenkode data string-nya dalam bentuk UTF-8 modifikasi standar de facto, selanjutnya yang disebut sebagai MUTF-8. Format ini identik dengan UTF-8 standar, kecuali:

  • Hanya encoding satu, dua, dan tiga byte yang digunakan.
  • Titik kode dalam rentang U+10000 ... U+10ffff dienkode sebagai pasangan surrogate, masing-masing yang direpresentasikan sebagai nilai yang dienkode dengan tiga byte.
  • Titik kode U+0000 dienkode dalam bentuk dua byte.
  • Byte null biasa (nilai 0) menunjukkan akhir dari sebuah {i>string<i}, sebagaimana interpretasi bahasa C standar.

Dua item pertama di atas dapat diringkas sebagai: MUTF-8 adalah format encoding untuk UTF-16, bukan format format encoding untuk karakter Unicode.

Dua item terakhir di atas memungkinkan secara bersamaan untuk menyertakan titik kode U+0000 dalam string dan tetap memanipulasi itu sebagai string yang dihentikan {i>null<i} bergaya C.

Namun, encoding khusus U+0000 berarti bahwa, tidak seperti UTF-8 normal, hasil pemanggilan fungsi C standar strcmp() pada sepasang string MUTF-8 tidak selalu menunjukkan hasil yang ditandatangani dengan benar dari perbandingan string yang tidak sama. Saat memesan (tidak hanya kesetaraan) adalah masalah, yang paling lugas cara membandingkan {i>string<i} MUTF-8 adalah dengan mendekodenya karakter demi karakter, dan membandingkan nilai-nilai yang telah didekode. (Namun, implementasi yang lebih cerdas juga dimungkinkan.)

Harap lihat Unicode Standar untuk informasi lebih lanjut tentang encoding karakter. MUTF-8 sebenarnya lebih dekat dengan encoding (yang relatif kurang dikenal) CESU-8 daripada UTF-8 biayanya per s.

encoding encoding_value

Disematkan di annotation_element dan encoding_array_item

encoded_value adalah bagian yang dienkode dari (hampir) data terstruktur secara hierarkis yang arbitrer. Pengkodean ini dimaksudkan untuk ringkas dan mudah diurai.

Nama Format Deskripsi
(value_arg << 5) | nilai_tipe {i>ubyte<i} byte yang menunjukkan jenis peristiwa value bersama dengan argumen klarifikasi opsional dalam tiga bit urutan tinggi. Lihat di bawah untuk mengetahui berbagai definisi value. Pada umumnya, value_arg mengenkode panjang value berikutnya dalam byte, seperti (size - 1), misalnya, 0 berarti bahwa nilainya memerlukan satu byte, dan 7 berarti memerlukan delapan {i>byte<i}; namun, ada pengecualian seperti yang tercantum di bawah ini.
nilai ubyte[] {i>byte<i} yang mewakili nilai, panjangnya bervariasi, dan secara berbeda untuk value_type byte yang berbeda, selalu little-endian. Lihat berbagai definisi nilai di bawah ini untuk spesifikasi pendukung.

Format nilai

Ketik Nama value_type Format value_arg Format value Deskripsi
NILAI_BYTE 0x00 (none; harus 0) ubyte[1] nilai bilangan bulat satu byte yang ditandatangani
NILAI_SHORTS 0x02 ukuran - 1 (0...1) ubyte[size] nilai bilangan bulat dua byte yang ditandatangani, {i>sign-extended<i}
NILAI_CHAR 0x03 ukuran - 1 (0...1) ubyte[size] nilai bilangan bulat dua byte yang tidak ditandatangani, nol-diperluas
VALUE_INT 0x04 ukuran - 1 (0...3) ubyte[size] nilai bilangan bulat empat byte yang ditandatangani, {i>sign-extended<i}
NILAI_PANJANG 0x06 ukuran - 1 (0...7) ubyte[size] nilai bilangan bulat delapan byte yang ditandatangani, {i>sign-extended<i}
NILAI_FLOAT 0x10 ukuran - 1 (0...3) ubyte[size] pola bit empat byte, dipanjangkan nol ke kanan, dan ditafsirkan sebagai nilai floating point 32-bit IEEE754
NILAI_Ganda 0x11 ukuran - 1 (0...7) ubyte[size] pola bit delapan byte, memanjang nol ke kanan, dan ditafsirkan sebagai nilai floating point 64-bit IEEE754
VALUE_METHOD_TYPE 0x15 ukuran - 1 (0...3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas), ditafsirkan sebagai indeks ke dalam bagian proto_ids dan merepresentasikan nilai jenis metode
VALUE_METHOD_HANDLE 0x16 ukuran - 1 (0...3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas), ditafsirkan sebagai indeks ke dalam bagian method_handles dan merepresentasikan nilai pengendalian metode
VALUE_STRING 0x17 ukuran - 1 (0...3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas), ditafsirkan sebagai indeks ke dalam bagian string_ids dan merepresentasikan nilai string
NILAI_JENIS 0x18 ukuran - 1 (0...3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas), ditafsirkan sebagai indeks ke dalam bagian type_ids dan merepresentasikan nilai jenis/class
KOLOM_VALUE 0x19 ukuran - 1 (0...3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas), ditafsirkan sebagai indeks ke dalam bagian field_ids dan merepresentasikan nilai kolom
VALUE_METHOD 0x1a ukuran - 1 (0...3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas), ditafsirkan sebagai indeks ke dalam bagian method_ids dan merepresentasikan nilai metode
VALUE_ENUM 0x1b ukuran - 1 (0...3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas), ditafsirkan sebagai indeks ke dalam bagian field_ids dan mewakili nilai konstanta jenis yang dienumerasi
NILAI_ARRAY 0x1c (none; harus 0) array_enkode array nilai, dalam format yang ditentukan oleh "Format encoded_array" di bawah ini. Ukuran value bersifat implisit dalam encoding.
NILAI 0x1h (none; harus 0) anotasi_yang_dikodekan sub-anotasi, dalam format yang ditentukan oleh "Format encoded_annotation" di bawah ini. Ukuran value bersifat implisit dalam encoding.
VALUE_NULL 0x1e (none; harus 0) (tidak ada) Nilai referensi null
NILAI_BOOLEAN 0x1f boolean (0...1) (tidak ada) nilai satu bit; 0 untuk false dan 1 untuk true. Bit diwakili dalam value_arg.

format encode_array

Nama Format Deskripsi
ukuran uleb128 jumlah elemen dalam array
nilai-nilai nilai_dikodekan[size] rangkaian size encoded_value byte urutan dalam format yang ditentukan oleh bagian ini, yang disambungkan secara berurutan.

format encoding_annotation

Nama Format Deskripsi
jenis_idx uleb128 jenis anotasi. Ini harus berupa class (bukan array atau primitif) .
ukuran uleb128 jumlah pemetaan nilai nama dalam anotasi ini
elemen anotasi_elemen[size] anotasi, yang direpresentasikan langsung di baris (tidak seperti ). Elemen harus diurutkan dalam urutan meningkat berdasarkan Indeks string_id.

format annotate_element

Nama Format Deskripsi
nama_idx uleb128 nama elemen, direpresentasikan sebagai indeks ke dalam string_ids. String harus sesuai dengan untuk MemberName, yang ditentukan di atas.
nilai nilai_yang_dikodekan nilai elemen

Sintaksis string

Ada beberapa jenis item dalam file .dex yang pada akhirnya merujuk pada suatu {i>string<i}. Definisi gaya BNF berikut menunjukkan sintaks yang dapat diterima untuk {i>string<i} ini.

NamaSederhana

SimpleName adalah dasar sintaksis nama banyak hal. Format .dex memungkinkan garis lintang yang cukup di sini (jauh lebih banyak daripada bahasa sumber yang paling umum). Singkatnya, proses terdiri dari karakter atau angka alfabet ASCII rendah, beberapa simbol ASCII rendah tertentu, dan sebagian besar poin kode non-ASCII yang tidak kontrol, spasi, atau karakter khusus. Mulai dari versi 040 format ini juga memungkinkan karakter spasi (Unicode Zs kategori). Perhatikan bahwa poin kode surrogate (dalam rentang U+d800 ... U+dfff) tidak dianggap sebagai karakter nama yang valid, tetapi perangkat tambahan Unicode karakter valid (yang diwakili oleh alternatif dari aturan SimpleNameChar), dan parameter tersebut harus direpresentasikan dalam file sebagai pasangan titik kode pengganti dalam MUTF-8 encoding.

SimpleName
SimpleNameChar (SimpleNameChar)*
SimpleNameChar
'A' ... 'Z'
| 'a' ... 'z'
| '0' ... '9'
| ' ' sejak DEX versi 040
| '$'
| '-'
| '_'
| U+00a0 sejak DEX versi 040
| U+00a1 ... U+1fff
| U+2000 ... U+200a sejak DEX versi 040
| U+2010 ... U+2027
| U+202f sejak DEX versi 040
| U+2030 ... U+d7ff
| U+e000 ... U+ffef
| U+10000 ... U+10ffff

NamaAnggota

digunakan oleh field_id_item dan method_id_item

MemberName adalah nama dari anggota kelas, anggota yang {i>field<i}, metode, dan {i>inner class<i}.

MemberName
NamaSederhana
| '<' SimpleName '>'

{i>FullClassName<i}

FullClassName adalah nama class yang sepenuhnya memenuhi syarat, termasuk penentu paket opsional diikuti dengan nama yang diperlukan.

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(SimpleName '/')*

TypeDescriptor

Digunakan menurut type_id_item

TypeDescriptor adalah representasi jenis apa pun, termasuk primitif, class, array, dan void. Lihat di bawah untuk arti dari berbagai versi.

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

Deskripsi Shorty

Digunakan oleh proto_id_item

ShortyDescriptor adalah representasi bentuk singkat dari suatu metode termasuk tipe pengembalian dan parameter, kecuali jika ada tidak ada perbedaan antara berbagai jenis referensi (class atau array). Sebagai gantinya, semua jenis referensi direpresentasikan oleh satu karakter 'L'.

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

Semantik TypeDescriptor

Ini adalah arti setiap varian TypeDescriptor.

Sintaksis Arti
V void; hanya valid untuk jenis nilai yang ditampilkan
Z boolean
B byte
S short
C char
I int
J long
F float
D double
Sepenuhnya/memenuhi syarat/Nama; kelas fully.qualified.Name
[deskriptor array descriptor, dapat digunakan secara rekursif untuk array-of-array, meskipun tidak valid untuk memiliki lebih dari 255 dimensi kustom.

Item dan struktur terkait

Bagian ini mencakup definisi untuk setiap item tingkat atas yang dapat muncul dalam file .dex.

item_header

Muncul di bagian header

Perataan: 4 byte

Nama Format Deskripsi
sihir ubyte[8] = DEX_FILE_MAGIC nilai ajaib. Lihat diskusi di atas pada "DEX_FILE_MAGIC" untuk mengetahui detail selengkapnya.
{i>checksum<i} Uint {i>checksum<i} adler32 dari sisa file (semua kecuali magic dan kolom ini); digunakan untuk mendeteksi kerusakan file
tanda tangan ubyte[20] Tanda tangan SHA-1 (hash) dari sisa file (semua kecuali magic, checksum, dan kolom ini); digunakan untuk mengidentifikasi file secara unik
ukuran_file Uint ukuran seluruh file (termasuk {i>header<i}), dalam byte
ukuran_header uint = 0x70 ukuran {i>header<i} (seluruh bagian ini), dalam byte. Hal ini memungkinkan di memiliki sedikit kompatibilitas mundur/ke depan tanpa membuat format menjadi tidak valid.
tag_endian uint = ENDIAN_CONSTANT tag endianness. Lihat diskusi di atas pada "ENDIAN_CONSTANT dan REVERSE_ENDIAN_CONSTANT" untuk mengetahui detail selengkapnya.
link_size [ukuran_link] Uint ukuran bagian link, atau 0 jika file ini bukan tertaut secara statis
link_off Uint offset dari awal file ke bagian link, atau 0 jika link_size == 0. {i>Offset<i}, jika bukan nol, harus di-offset ke bagian link_data. Tujuan format data yang ditunjuk tidak ditentukan oleh dokumen ini; isian {i>header<i} ini (dan sebelumnya) dibiarkan sebagai hook untuk digunakan oleh implementasi runtime.
map_off Uint offset dari awal file ke item peta. Offset, yang harus bukan nol, harus untuk di-offset ke bagian data, dan data harus dalam format yang ditentukan oleh "map_list" di bawah ini.
string_ids_size [ukuran_id_string] Uint jumlah string dalam daftar ID string
string_id_off Uint dari awal file ke daftar ID string, atau 0 jika string_ids_size == 0 (tentunya {i>edge case<i} yang aneh). {i>Offset<i}, jika bukan nol, harus di awal bagian string_ids.
type_ids_size [ukuran_id_jenis] Uint jumlah elemen dalam daftar ID jenis, maksimal 65535
type_ids_off Uint dari awal file ke daftar pengidentifikasi jenis, atau 0 jika type_ids_size == 0 (tentunya {i>edge case<i} yang aneh). {i>Offset<i}, jika bukan nol, seharusnya ke awal type_ids bagian.
proto_ids_size [ukuran_id_proto] Uint jumlah elemen dalam daftar pengidentifikasi prototipe, maksimal 65535
proto_ids_off Uint kompensasi dari awal file ke daftar pengidentifikasi prototipe, atau 0 jika proto_ids_size == 0 (tentunya {i>edge case<i} yang aneh). {i>Offset<i}, jika bukan nol, seharusnya ke awal proto_ids bagian.
ukuran_id_kolom Uint jumlah elemen dalam daftar ID kolom
field_ids_off Uint dari awal file ke daftar ID kolom, atau 0 jika field_ids_size == 0. Offset, jika bukan nol, harus sejak awal field_ids bagian.
ukuran_id_metode Uint jumlah elemen dalam daftar ID metode
id_metode_nonaktif Uint dari awal file ke daftar ID metode, atau 0 jika method_ids_size == 0. Offset, jika bukan nol, harus sejak awal method_ids bagian.
{i>class_defs_size<i} Uint jumlah elemen dalam daftar definisi class
class_defs_off Uint dari awal file ke daftar definisi class, atau 0 jika class_defs_size == 0 (tentunya {i>edge case<i} yang aneh). {i>Offset<i}, jika bukan nol, harus di awal bagian class_defs.
ukuran_data Uint Ukuran bagian data dalam byte. Harus genap kelipatan dari sizeof(uint).
data_nonaktif Uint dari awal file hingga awal data.

map_list (daftar_peta)

Muncul di bagian data

Direferensikan dari header_item

Perataan: 4 byte

Ini adalah daftar seluruh isi file, secara berurutan. Ini berisi beberapa redundansi sehubungan dengan header_item tetapi dimaksudkan sebagai bentuk yang mudah digunakan untuk melakukan iterasi pada seluruh . Jenis tertentu harus muncul paling banyak sekali di peta, tetapi tidak ada batasan terkait jenis pesanan yang akan ditampilkan, selain batasan yang tersirat oleh format lainnya (mis., Bagian header harus muncul terlebih dahulu, diikuti dengan string_ids, dll.). Selain itu, entri peta harus diurutkan berdasarkan offset awal dan tidak boleh tumpang-tindih.

Nama Format Deskripsi
ukuran Uint ukuran daftar, dalam entri
daftar map_item[size] elemen daftar

format map_item

Nama Format Deskripsi
type singkat jenis item; lihat tabel di bawah
unused singkat (tidak digunakan)
ukuran Uint hitungan jumlah item yang akan ditemukan pada offset yang ditunjukkan
offset Uint offset dari awal file hingga item yang dipermasalahkan

Ketik kode

Tipe Item Konstanta Nilai Ukuran Item Dalam Byte
item_header ITEM_Header_TYPE 0x0.000 0x70
string_id_item [item_id_string] ITEM_ITEM_STRING_STRING 0x0001 0x04
type_id_item [item_id_jenis] ITEM_ID_TYPE_TYPE 0x0002 0x04
proto_id_item [item_id_prototipe] JENIS_ITEM_ID_PROTO 0x0003 0x0c
field_id_item TYPE_FIELD_ID_ITEM 0x0004 0x08
item_id_metode TYPE_METHOD_ID_ITEM 0x0005 0x08
class_def_item [item_defini_kelas] ITEM_DEF_CLASS_TYPE_CLASS_DEF 0x0006 0x20
call_site_id_item [item_id_situs] TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
method_handle_item [item_handle_item] TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
map_list (daftar_peta) TYPE_MAP_LIST 0x1000 4 + (item.size * 12)
type_list (daftar jenis) TYPE_TYPE_LIST 0x1001 4 + (item.size * 2)
anotasi_set_ref_list TYPE_7.SET_REF_LIST 0x1002 4 + (item.size * 4)
anotasi_set_item TYPE_edu_SET_ITEM 0x1003 4 + (item.size * 4)
class_data_item [item_data_kelas] ITEM_DATA_CLASS_TYPE_CLASS_DATA 0x2000 implisit; harus diurai
item_kode ITEM_KODE_TYPE 0x2001 implisit; harus diurai
string_data_item [item_data_string] ITEM_DATA_TYPE_STRING 0x2002 implisit; harus diurai
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 implisit; harus diurai
anotasi_item TYPE_ usia ITEM 0x2004 implisit; harus diurai
item_array_yang_dikodekan TYPE_ENCODED_ARRAY_ITEM 0x2005 implisit; harus diurai
anotasi_direktori_item {i>TYPE_CreatorS_DIRECTORY_ITEM<i} 0x2006 implisit; harus diurai
tersembunyiapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 implisit; harus diurai

string_id_item [item_id_string]

Muncul di bagian string_ids

Perataan: 4 byte

Nama Format Deskripsi
string_data_off Uint dari awal file ke data {i>string <i}untuk yang bermanfaat. Offset harus ke lokasi di bagian data, dan data harus berada di format yang ditentukan oleh "string_data_item" di bawah ini. Tidak ada persyaratan perataan untuk offset.

string_data_item [item_data_string]

Muncul di bagian data

Perataan: tidak ada (diselaraskan byte)

Nama Format Deskripsi
ukuran_utf16 uleb128 ukuran string ini, dalam unit kode UTF-16 (yang merupakan "string panjang" dalam banyak sistem). Artinya, ini adalah panjang {i>dekode<i} dari {i>string<i}. (Panjang yang dienkode ditunjukkan oleh posisi byte 0.)
data ubyte[] serangkaian unit kode MUTF-8 (alias oktet, alias byte) diikuti dengan byte nilai 0. Lihat "Encoding MUTF-8 (UTF-8 Modifikasi)" di atas untuk mengetahui detail dan diskusi tentang format data.

Catatan: Anda dapat memiliki string yang berisi (bentuk yang dienkode dari) unit kode pengganti UTF-16 (yaitu, U+d800 ... U+dfff) baik secara terpisah atau tidak berurutan sehubungan dengan encoding Unicode ke UTF-16. Hal ini tergantung pada penggunaan di tingkat yang lebih tinggi {i>string<i} untuk menolak pengkodean yang tidak valid tersebut, jika sesuai.

type_id_item [item_id_jenis]

Muncul di bagian type_ids

Perataan: 4 byte

Nama Format Deskripsi
deskriptor_idx Uint indeks ke dalam daftar string_ids untuk deskriptor {i>string<i} dari jenis ini. String ini harus sesuai dengan sintaks untuk TypeDescriptor, ditentukan di atas.

proto_id_item [item_id_prototipe]

Muncul di bagian proto_ids

Perataan: 4 byte

Nama Format Deskripsi
{i>shorty_idx<i} Uint indeks ke dalam daftar string_ids untuk video pendek string deskriptor prototipe ini. String harus sesuai dengan untuk ShortyDescriptor, didefinisikan di atas, dan harus sesuai jenis nilai yang ditampilkan dan parameter item ini.
return_type_idx Uint indeks ke dalam daftar type_ids untuk jenis nilai yang ditampilkan dari prototipe ini.
parameter_off Uint offset dari awal file ke daftar tipe parameter untuk prototipe ini, atau 0 jika prototipe ini tidak memiliki parameter. Selisih ini, jika bukan nol, harus berada dalam data, dan data yang seharusnya ada di yang ditentukan oleh "type_list" di bawah ini. Selain itu, ada seharusnya tidak ada referensi ke jenis void dalam daftar.

field_id_item

Muncul di bagian field_ids

Perataan: 4 byte

Nama Format Deskripsi
kelas_idx singkat indeks ke dalam daftar type_ids untuk penentunya kolom tersebut. Ini harus berupa jenis class, dan bukan array atau jenis primitif.
jenis_idx singkat indeks ke dalam daftar type_ids untuk jenis kolom ini
nama_idx Uint indeks ke dalam daftar string_ids sesuai dengan kolom tersebut. String harus sesuai dengan sintaksis untuk MemberName, didefinisikan di atas.

item_id_metode

Muncul di bagian method_ids

Perataan: 4 byte

Nama Format Deskripsi
kelas_idx singkat indeks ke dalam daftar type_ids untuk penentunya . Ini harus berupa class atau jenis array, dan bukan jenis primitif.
proto_idx singkat indeks ke dalam daftar proto_ids untuk prototipe metode ini
nama_idx Uint indeks ke dalam daftar string_ids sesuai dengan . String harus sesuai dengan sintaksis untuk MemberName, didefinisikan di atas.

class_def_item [item_defini_kelas]

Muncul di bagian class_defs

Perataan: 4 byte

Nama Format Deskripsi
kelas_idx Uint indeks ke dalam daftar type_ids untuk class ini. Ini harus berupa jenis class, dan bukan array atau jenis primitif.
tanda_akses Uint flag akses untuk class (public, final, dll.). Lihat "access_flags Definisi" untuk mengetahui detailnya.
{i>superclass_idx<i} Uint indeks ke dalam daftar type_ids untuk superclass, atau nilai konstanta NO_INDEX jika class ini tidak memiliki superclass (yaitu, ini adalah class root seperti Object). Jika ada, ini harus berupa jenis class, dan bukan array atau jenis primitif.
interface_off Uint offset dari awal file ke daftar antarmuka, atau 0 jika tidak ada. Offset ini harus berada di bagian data, dan datanya harus ada dalam format yang ditentukan oleh "type_list" di bawah ini. Setiap elemen daftar harus berupa jenis kelas (bukan tipe primitif atau larik), dan ada tidak boleh ada duplikat.
idx_file_sumber Uint indeks ke dalam daftar string_ids untuk nama yang berisi sumber asli untuk (setidaknya sebagian besar dari) class ini, atau nilai khusus NO_INDEX untuk menunjukkan kurangnya informasi ini. debug_info_item dari metode tertentu dapat menimpa file sumber ini, tetapi harapannya adalah sebagian besar kelas hanya akan berasal dari satu file sumber.
anotasi_nonaktif Uint offset dari awal file ke struktur anotasi untuk class ini, atau 0 jika tidak ada anotasi di di kelas ini. Selisih ini, jika bukan nol, harus berada dalam data, dan data yang seharusnya ada di format yang ditentukan oleh "annotations_directory_item" di bawah, dengan semua item yang mengacu ke class ini sebagai penentu.
class_data_off Uint dari awal file ke elemen yang terkait data class untuk item ini, atau 0 jika tidak ada class data untuk class ini. (Ini mungkin terjadi, misalnya, jika kelas ini adalah antarmuka penanda.) Offset, jika bukan nol, harus berada di data, dan data yang seharusnya ada di format yang ditentukan oleh "class_data_item" di bawah, dengan semua item yang mengacu ke class ini sebagai penentu.
nilai_statis_nonaktif Uint dari awal file ke daftar awal nilai untuk kolom static, atau 0 jika ada tidak ada (dan semua kolom static harus diinisialisasi dengan 0 atau null). Offset ini harus dalam data, dan data harus ada di format yang ditentukan oleh "encoded_array_item" di bawah ini. Ukuran array tidak boleh lebih besar dari jumlah static yang dideklarasikan oleh class ini, dan elemen sesuai dengan static kolom dengan urutan yang sama seperti yang dideklarasikan dalam field_list yang sesuai. Jenis setiap array harus cocok dengan jenis yang dideklarasikan dari bidang terkait. Jika jumlah elemen di {i>array<i} lebih sedikit daripada jumlah Kolom static, lalu kolom yang tersisa akan diinisialisasi dengan 0 atau null yang sesuai.

call_site_id_item [item_id_situs]

Muncul di bagian call_site_ids

Perataan: 4 byte

Nama Format Deskripsi
call_site_off Uint dari awal file untuk memanggil definisi situs. Offset harus di bagian data, dan data itu harus ada dalam format yang ditentukan oleh "item_situs_panggilan" di bawah ini.

call_site_item [item_situs_panggilan]

Muncul di bagian data

Perataan: tidak ada (sejajar byte)

Call_site_item adalah item yang dienkode_array_item yang elemennya sesuai dengan argumen yang disediakan untuk metode penaut bootstrap. Tiga argumen pertama adalah:

  1. Tuas metode yang mewakili metode penaut bootstrap (VALUE_METHOD_HANDLE).
  2. Nama metode yang harus diselesaikan oleh penaut bootstrap (VALUE_STRING).
  3. Jenis metode yang sesuai dengan jenis nama metode yang akan diselesaikan (VALUE_METHOD_TYPE).

Argumen tambahan apa pun adalah nilai konstanta yang diteruskan ke metode penaut bootstrap. Argumen tersebut adalah diteruskan secara berurutan dan tanpa konversi jenis apa pun.

Tuas metode yang mewakili metode penaut bootstrap harus memiliki jenis nilai yang ditampilkan java.lang.invoke.CallSite. Tiga jenis parameter pertama adalah:

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

Jenis parameter argumen tambahan ditentukan dari nilai konstantanya.

method_handle_item [item_handle_item]

Muncul di bagian method_handles

Perataan: 4 byte

Nama Format Deskripsi
method_handle_type (tipe penanganan) singkat jenis handle metode; lihat tabel di bawah
unused singkat (tidak digunakan)
field_or_method_id singkat ID kolom atau metode, bergantung pada apakah jenis nama sebutan channel adalah pengakses atau invoker metode
unused singkat (tidak digunakan)

Kode jenis penanganan metode

Konstanta Nilai Deskripsi
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 Tuas metode adalah penyetel kolom statis (aksesor)
METHOD_HANDLE_TYPE_STATIC_GET 0x01 Handle metode adalah pengambil kolom statis (aksesor)
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 Penanganan metode adalah penyetel kolom instance (aksesor)
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 Handle metode adalah pengambil kolom instance (aksesor)
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 Tuas metode adalah invoker metode statis
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 Tuas metode adalah invoker metode instance
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 Tuas metode adalah invoker metode konstruktor
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 Penanganan metode adalah invoker metode langsung
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 Tuas metode adalah invoker metode antarmuka

class_data_item [item_data_kelas]

Direferensikan dari class_def_item

Muncul di bagian data

Perataan: tidak ada (diselaraskan byte)

Nama Format Deskripsi
{i>static_fields_size<i} uleb128 jumlah kolom statis yang ditentukan dalam item ini
ukuran_kolom_instance uleb128 jumlah kolom instance yang ditentukan dalam item ini
direct_metode_size uleb128 jumlah metode langsung yang ditentukan dalam item ini
virtual_method_size [ukuran_metode_virtual] uleb128 jumlah metode virtual yang ditentukan dalam item ini
{i>static_fields<i} kolom_enkode[static_fields_size] isian statis yang didefinisikan, direpresentasikan sebagai urutan elemen yang dienkode. {i>Field<i} harus diurutkan menurut field_idx dalam urutan yang meningkat.
kolom_instance kolom_enkode[instance_fields_size] bidang instance yang ditentukan, direpresentasikan sebagai urutan elemen yang dienkode. {i>Field<i} harus diurutkan menurut field_idx dalam urutan yang meningkat.
direct_method encoding_method[direct_method_size] langsung yang ditentukan (salah satu dari static, private, atau konstruktor), direpresentasikan sebagai urutan elemen yang dienkode. Metode harus diurutkan berdasarkan method_idx dalam urutan yang meningkat.
metode_virtual encoding_method[virtual_method_size] virtual yang ditentukan (tidak satu pun dari static, private, atau konstruktor), direpresentasikan sebagai urutan elemen yang dienkode. Daftar ini tidak boleh menyertakan turunan kecuali jika diganti oleh class yang diwakili oleh item ini. Tujuan harus diurutkan berdasarkan method_idx dalam urutan yang meningkat. method_idx dari metode virtual tidak boleh sama sebagai metode langsung.

Catatan: Semua elemen field_id dan Instance method_id harus merujuk pada class penentu yang sama.

format encoding_field

Nama Format Deskripsi
{i>field_idx_diff<i} uleb128 indeks ke dalam daftar field_ids untuk identitas (mencakup nama dan deskripsi), yang direpresentasikan sebagai perbedaan dari indeks elemen sebelumnya dalam daftar. Indeks elemen pertama dalam daftar direpresentasikan secara langsung.
tanda_akses uleb128 flag akses untuk kolom (public, final, dll.). Lihat "access_flags Definisi" untuk mengetahui detailnya.

format encoding_method

Nama Format Deskripsi
metode_idx_diff uleb128 indeks ke dalam daftar method_ids untuk identitas metode (mencakup nama dan deskripsi), direpresentasikan sebagai perbedaan dari indeks elemen sebelumnya dalam daftar. Indeks elemen pertama dalam daftar direpresentasikan secara langsung.
tanda_akses uleb128 flag akses untuk metode (public, final, dll.). Lihat "access_flags Definisi" untuk mengetahui detailnya.
kode_nonaktif uleb128 dari awal file ke struktur kode untuk , atau 0 jika metode ini adalah abstract atau native. Offset harus ke lokasi di data. Format data ditentukan oleh "code_item" di bawah ini.

type_list (daftar jenis)

Direferensikan dari class_def_item dan proto_id_item

Muncul di bagian data

Perataan: 4 byte

Nama Format Deskripsi
ukuran Uint ukuran daftar, dalam entri
daftar type_item[size] elemen daftar

format type_item

Nama Format Deskripsi
jenis_idx singkat indeks ke dalam daftar type_ids

item_kode

Direferensikan dari encoding_method

Muncul di bagian data

Perataan: 4 byte

Nama Format Deskripsi
registers_size [ukuran_daftar] singkat jumlah register yang digunakan oleh kode ini
ins_size [ukuran_ins] singkat jumlah kata dari argumen yang masuk ke metode yang kode ditujukan untuk
outs_size [ukuran_besar] singkat jumlah kata dari ruang argumen keluar yang dibutuhkan oleh kode untuk pemanggilan metode
mencoba_ukuran singkat jumlah try_item untuk instance ini. Jika bukan nol, ini akan muncul sebagai array tries tepat setelah insns dalam instance ini.
debug_info_off Uint offset dari awal file ke info debug (nomor baris + variabel lokal) untuk kode ini, atau 0 jika tidak ada informasi. Offset, jika bukan nol, harus ke lokasi di bagian data. Format data ditentukan oleh "debug_info_item" di bawah ini.
insns_size [ukuran_insns] Uint ukuran daftar instruksi, dalam unit kode 16-bit
Insns ushort[insns_size] array bytecode aktual. Format kode dalam insns array ditentukan oleh dokumen pendamping Bytecode Dalvik. Catatan meskipun ini didefinisikan sebagai array ushort, ada ada beberapa struktur internal yang lebih memilih penyelarasan empat byte. Selain itu, jika ini terjadi dalam file {i>endian-swapped<i}, maka proses {i>swapping<i} hanya dilakukan pada instance ushort individual, bukan pada struktur internal yang lebih besar.
padding ushort (opsional) = 0 dua byte padding untuk membuat tries diselaraskan dengan empat byte. Elemen ini hanya ada jika tries_size bukan nol dan insns_size ganjil.
mencoba try_item[tries_size] (opsional) array yang menunjukkan di mana pengecualian kode diambil dan bagaimana menanganinya. Elemen himpunan tidak boleh tumpang tindih dalam rentang dan dalam urutan dari alamat rendah ke tinggi. Elemen ini hanya ada jika tries_size bukan nol.
pengendali encoding_catch_handler_list (opsional) {i>byte<i} yang mewakili daftar daftar jenis tangkapan dan elemen terkait alamat pengendali. Setiap try_item memiliki offset berdasarkan byte ke dalam struktur ini. Elemen ini hanya ada jika tries_size bukan nol.

format try_item

Nama Format Deskripsi
{i>start_addr<i} Uint alamat awal blok kode yang dicakup oleh entri ini. Alamat adalah hitungan 16-bit unit kode ke awal dari yang pertama dibahas instruksi.
insn_count singkat jumlah unit kode 16-bit yang dicakup oleh entri ini. Kode terakhir unit yang dicakup (inklusif) adalah start_addr + insn_count - 1.
handler_off singkat offset dalam byte dari awal proses encoded_catch_hander_list menjadi encoded_catch_handler untuk entri ini. Ini harus berupa offset ke awal encoded_catch_handler.

format encode_catch_handler_list

Nama Format Deskripsi
ukuran uleb128 ukuran daftar ini, dalam entri
daftar terenkode_catch_handler[handlers_size] daftar aktual dari daftar pengendali, yang direpresentasikan secara langsung (bukan sebagai offset), dan digabungkan secara berurutan

format encode_catch_handler

Nama Format Deskripsi
ukuran sleb128 jumlah jenis tangkapan dalam daftar ini. Jika non-positif, maka ini adalah negatif dari jumlah jenis tangkapan, dan hasil tangkapan diikuti oleh pengendali generik. Misalnya: size dari 0 berarti bahwa ada tangkapan semua, tetapi tidak ada tangkapan yang diketik secara eksplisit. size dari 2 berarti ada dua secara eksplisit yang diketik dan tidak ada generik. Dan size dari -1 berarti ada satu tangkapan yang diketik bersama dengan {i>catch-all<i}.
pengendali pasangan_tipe_addr_yang dienkode[abs(ukuran)] aliran abs(size) item yang dienkode, satu untuk setiap item yang tertangkap sesuai dengan urutan jenis yang harus diuji.
menangkap_semua_addr uleb128 (opsional) alamat bytecode pengendali generik. Elemen ini hanya ada jika size non-positif.

format encode_type_addr_pair

Nama Format Deskripsi
jenis_idx uleb128 indeks ke dalam daftar type_ids untuk jenis pengecualian untuk menangkap
addr uleb128 alamat bytecode pengendali pengecualian yang terkait

debug_info_item

Direferensikan dari code_item

Muncul di bagian data

Perataan: tidak ada (diselaraskan byte)

Setiap debug_info_item menentukan kode byte yang terinspirasi DWARF3 mesin status yang, jika diinterpretasikan, akan memunculkan posisi tabel dan (kemungkinan) informasi variabel lokal untuk code_item. Urutan dimulai dengan panjang-variabel (yang panjangnya bergantung pada jumlah metode parameter), diikuti oleh bytecode mesin status, dan berakhir dengan DBG_END_SEQUENCE byte.

Mesin status terdiri dari lima register. Tujuan Register address merepresentasikan offset petunjuk dalam insns_item yang terkait dalam unit kode 16-bit. Tujuan Pendaftaran address dimulai pada 0 di awal setiap pendaftaran urutan debug_info dan hanya boleh meningkat secara monoton. Register line mewakili nomor baris sumber harus dikaitkan dengan entri tabel posisi berikutnya yang dimunculkan oleh mesin status. Ini diinisialisasi dalam header urutan, dan mungkin perubahan ke arah positif atau negatif tetapi tidak boleh kurang dari 1. Register source_file mewakili {i>file<i} sumber yang dirujuk oleh entri nomor baris. Inisialisasi dilakukan ke nilai source_file_idx di class_def_item. Dua variabel lainnya, prologue_end dan epilogue_begin, adalah flag boolean (diinisialisasi ke false) yang menunjukkan apakah posisi berikutnya dimunculkan harus dianggap sebagai metode prolog atau epilog. Mesin status juga harus melacak nama dan jenis variabel lokal terakhir yang berada setiap register untuk kode DBG_RESTART_LOCAL.

{i>Header<i}-nya adalah sebagai berikut:

Nama Format Deskripsi
line_start uleb128 nilai awal untuk register line mesin status. Tidak menunjukkan entri posisi yang sebenarnya.
parameter_size uleb128 jumlah nama parameter yang dienkode. Seharusnya ada satu per parameter metode, dengan mengecualikan this metode instance, jika ada.
nama_parameter uleb128p1[parameters_size] indeks string dari nama parameter metode. Nilai yang dienkode dari NO_INDEX menunjukkan bahwa tidak ada nama yang tersedia untuk parameter terkait. Deskripsi jenis dan tanda tangan tersirat dari deskriptor dan tanda tangan metode.

Nilai kode byte adalah sebagai berikut:

Nama Nilai Format Argumen Deskripsi
DBG_END_SEQUENCE 0x00 (tidak ada) menghentikan urutan info debug untuk code_item
PC_ADVANCE_DBG 0x01 uleb128 addr_diff addr_diff: jumlah yang akan ditambahkan ke daftar alamat memajukan register alamat tanpa memunculkan entri posisi
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: jumlah yang akan diubah ke jalur pendaftaran memajukan register baris tanpa memunculkan entri posisi
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: daftar yang akan berisi informasi lokal
name_idx: indeks string nama
type_idx: indeks jenis jenis
memperkenalkan variabel lokal pada alamat saat ini. Keduanya name_idx atau type_idx mungkin NO_INDEX untuk menunjukkan bahwa nilai tersebut tidak diketahui.
DBG_START_LOCAL_EXTENDED 0x04 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
uleb128p1 sig_idx
register_num: daftar yang akan berisi informasi lokal
name_idx: indeks string nama
type_idx: indeks jenis jenis
sig_idx: indeks string tanda tangan jenis
memperkenalkan sebuah lokal dengan tanda tangan tipe di alamat saat ini. Salah satu dari name_idx, type_idx, atau sig_idx mungkin NO_INDEX untuk menunjukkan bahwa nilai tersebut tidak diketahui. (Jika sig_idx adalah Namun, -1, data yang sama dapat ditampilkan dengan secara efisien menggunakan opcode DBG_START_LOCAL.)

Catatan: Lihat diskusi di dalvik.annotation.Signature" di bawah untuk peringatan tentang menangani tanda tangan.

DBG_END_LOCAL 0x05 uleb128 register_num register_num: daftar yang berisi informasi lokal menandai variabel lokal yang aktif saat ini sebagai di luar cakupan pada kondisi saat ini Anda
DBG_RESTART_LOCAL 0x06 uleb128 register_num register_num: daftar untuk memulai ulang memperkenalkan kembali variabel lokal di alamat saat ini. Nama dan jenisnya sama dengan lokal terakhir yang ditampilkan di mendaftar.
DBG_SET_PROLOGUE_END 0x07 (tidak ada) menetapkan register mesin status prologue_end, yang menunjukkan bahwa entri posisi berikutnya yang ditambahkan harus dianggap sebagai akhir dari prolog metode (tempat yang tepat untuk titik henti sementara metode). Register prologue_end merupakan dihapus oleh opcode khusus (>= 0x0a).
DBG_SET_EPILOGUE_BEGIN 0x08 (tidak ada) menetapkan register mesin status epilogue_begin, yang menunjukkan bahwa entri posisi berikutnya yang ditambahkan harus dianggap sebagai awal dari epilog metode (tempat yang sesuai untuk menangguhkan eksekusi sebelum metode keluar). Pendaftaran epilogue_begin dihapus oleh entitas khusus apa pun (>= 0x0a).
DBG_SET_FILE 0x09 uleb128p1 name_idx name_idx: indeks string dari nama file sumber; NO_INDEX jika tidak diketahui menunjukkan bahwa semua entri nomor baris berikutnya merujuk ke nama file sumber, alih-alih nama {i> default<i} yang ditentukan dalam code_item
Opcode Khusus 0x0a...0xff (tidak ada) melanjutkan register line dan address, memunculkan entri posisi, dan menghapus prologue_end dan epilogue_begin. Lihat di bawah untuk deskripsinya.

Opcode khusus

Opcode dengan nilai antara 0x0a dan 0xff (inklusif) memindahkan line dan address mendaftar dalam jumlah kecil dan kemudian menghasilkan entri tabel posisi baru. Rumus untuk penambahan adalah sebagai berikut:

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)

anotasi_direktori_item

Direferensikan dari class_def_item

Muncul di bagian data

Perataan: 4 byte

Nama Format Deskripsi
class_annotations_off Uint offset dari awal file ke anotasi yang dibuat secara langsung di class, atau 0 jika class tidak memiliki anotasi langsung. Offset, jika bukan nol, harus ke lokasi di data. Format data sudah ditentukan oleh "annotation_set_item" di bawah ini.
ukuran_kolom Uint jumlah kolom yang dianotasi oleh item ini
dianotasi_metode_size Uint jumlah metode yang dianotasi oleh item ini
dianotasi_parameters_size Uint jumlah daftar parameter metode yang dianotasi oleh item ini
kolom_anotasi field_annotation[fields_size] (opsional) daftar anotasi kolom terkait. Elemen-elemen daftar harus diurutkan dalam urutan yang meningkat, menurut field_idx.
anotasi_metode method_annotation[method_size] (opsional) daftar anotasi metode yang terkait. Elemen-elemen daftar harus diurutkan dalam urutan yang meningkat, menurut method_idx.
parameter_anotasi parameter_annotation[parameters_size] (opsional) daftar anotasi parameter metode yang terkait. Elemen-elemen dari daftar harus diurutkan secara meningkat, menurut method_idx.

Catatan: Semua elemen field_id dan Instance method_id harus merujuk pada class penentu yang sama.

format field_annotation

Nama Format Deskripsi
{i>field_idx<i} Uint indeks ke dalam daftar field_ids untuk identitas kolom yang dianotasi
anotasi_nonaktif Uint offset dari awal file ke daftar anotasi untuk bidang Anda. Offset harus ke lokasi di data bagian. Format data ditentukan oleh "annotation_set_item" di bawah ini.

format method_annotation

Nama Format Deskripsi
metode_idx Uint indeks ke dalam daftar method_ids untuk identitas metode yang dianotasi
anotasi_nonaktif Uint offset dari awal file ke daftar anotasi untuk metode tersebut. Offset harus ke lokasi di data. Format data ditentukan oleh "annotation_set_item" di bawah ini.

format parameter_annotation

Nama Format Deskripsi
metode_idx Uint indeks ke dalam daftar method_ids untuk identitas yang parameternya sedang dianotasi
anotasi_nonaktif Uint offset dari awal file ke daftar anotasi untuk parameter metode. Offset harus ke lokasi di data. Format data ditentukan oleh "annotation_set_ref_list" di bawah ini.

anotasi_set_ref_list

Direferensikan dari parameter_annotations_item

Muncul di bagian data

Perataan: 4 byte

Nama Format Deskripsi
ukuran Uint ukuran daftar, dalam entri
daftar anotasi_set_ref_item[ukuran] elemen daftar

format anotasi_set_ref_item

Nama Format Deskripsi
anotasi_nonaktif Uint offset dari awal file ke kumpulan anotasi yang direferensikan atau 0 jika tidak ada anotasi untuk elemen ini. Offset, jika bukan nol, harus ke lokasi di data bagian. Format data ditentukan oleh "annotation_set_item" di bawah ini.

anotasi_set_item

Direferensikan dari annotation_directory_item, field_annotations_item, method_annotations_item, dan annotation_set_ref_item

Muncul di bagian data

Perataan: 4 byte

Nama Format Deskripsi
ukuran Uint ukuran set, dalam entri
entri anotasi_off_item[ukuran] elemen dari himpunan tersebut. Elemen harus diurutkan dalam urutan yang meningkat, paling lambat type_idx.

format anotasi_off_item

Nama Format Deskripsi
anotasi_nonaktif Uint offset dari awal file ke anotasi. Offset harus ke lokasi di bagian data, dan format data di lokasi itu ditentukan oleh "annotation_item" di bawah ini.

anotasi_item

Direferensikan dari annotation_set_item

Muncul di bagian data

Perataan: tidak ada (diselaraskan byte)

Nama Format Deskripsi
visibilitas {i>ubyte<i} visibilitas yang diinginkan dari anotasi ini (lihat di bawah)
annotation anotasi_yang_dikodekan konten anotasi yang dienkode, dalam format yang dijelaskan oleh "Format encoded_annotation" di bawah "Encoding encoded_value" di atas.

Nilai visibilitas

Ini adalah opsi untuk kolom visibility di annotation_item:

Nama Nilai Deskripsi
BANGUN_VISIBILITY_BUILD 0x00 dimaksudkan agar hanya terlihat pada waktu build (misalnya, selama kompilasi kode lain)
VISIBILITY_RUNTIME 0x01 yang dimaksudkan untuk terlihat pada runtime
SISTEM_VISIBILITY 0x02 dimaksudkan untuk terlihat saat runtime, tetapi hanya untuk sistem yang mendasarinya (dan bukan kode pengguna biasa)

item_array_yang_dikodekan

Direferensikan dari class_def_item

Muncul di bagian data

Perataan: tidak ada (diselaraskan byte)

Nama Format Deskripsi
nilai array_enkode byte yang mewakili nilai array yang dienkode, dalam format yang ditentukan menurut "Format encoded_array" pada "encoded_value Enkode" di atas.

tersembunyiapi_class_data_item

Bagian ini berisi data tentang antarmuka yang dibatasi yang digunakan oleh setiap class.

Catatan: Fitur API tersembunyi diperkenalkan di Android 10.0 dan hanya berlaku untuk file DEX class di jalur class booting. Daftar tanda yang dijelaskan di bawah dapat diperluas dalam rilis mendatang Android. Untuk informasi selengkapnya, lihat batasan untuk antarmuka non-SDK.

Nama Format Deskripsi
ukuran Uint total ukuran bagian
offset uint[] array offset yang diindeks oleh class_idx. Entri array nol pada indeks class_idx berarti bahwa tidak ada data untuk class_idx ini, atau semua API tersembunyi penanda adalah nol. Jika tidak, entri array bukan nol dan berisi offset dari awal bagian ke array tanda API tersembunyi untuk class_idx ini.
flags uleb128[] array gabungan flag API tersembunyi untuk setiap class. Kemungkinan nilai flag dijelaskan dalam tabel di bawah. Tanda dienkode dalam urutan yang sama seperti kolom dan metode dienkode dalam data class.

Jenis tanda pembatasan:

Nama Nilai Deskripsi
daftar putih 0 Antarmuka yang dapat digunakan secara bebas dan didukung sebagai bagian dari framework Android yang didokumentasikan secara resmi Indeks Paket.
daftar abu-abu 1 Antarmuka non-SDK yang dapat digunakan terlepas dari level API target Anda.
daftar hitam 2 Antarmuka non-SDK yang tidak dapat digunakan, apa pun persyaratan aplikasi level API target Anda. Mengakses salah satu antarmuka ini menyebabkan error runtime.
daftar abu-abu‐max‐o 3 Antarmuka non-SDK yang dapat digunakan untuk Android 8.x dan yang lebih lama kecuali jika dibatasi.
daftar abu-abu‐max‐p 4 Antarmuka non-SDK yang dapat digunakan untuk Android 9.x kecuali jika dibatasi.
daftar abu-abu‐max‐q 5 Antarmuka non-SDK yang dapat digunakan untuk Android 10.x kecuali jika dibatasi.
greylist‐max‐r 6 Antarmuka non-SDK yang dapat digunakan untuk Android 11.x kecuali jika dibatasi.

Anotasi sistem

Anotasi sistem digunakan untuk merepresentasikan berbagai bagian reflektif informasi tentang class (serta metode dan kolom). Informasi ini umumnya hanya diakses secara tidak langsung oleh kode klien (non-sistem).

Anotasi sistem direpresentasikan dalam file .dex sebagai anotasi dengan visibilitas yang disetel ke VISIBILITY_SYSTEM.

dalvik.annotation.AnnotationDefault

Muncul di metode dalam antarmuka anotasi

Anotasi AnnotationDefault dilampirkan ke setiap yang ingin menunjukkan binding default.

Nama Format Deskripsi
nilai Annotation binding default untuk anotasi ini, yang direpresentasikan sebagai anotasi dari jenis ini. Anotasi tidak perlu menyertakan semua nama yang ditentukan oleh anotasi; nama yang hilang tidak memiliki {i>default<i}.

dalvik.annotation.EnclosingClass

Muncul di kelas

Anotasi EnclosingClass dilampirkan ke setiap class yang bisa didefinisikan sebagai anggota kelas lain, atau anonim tetapi tidak didefinisikan dalam isi metode (mis., komponen inner class). Setiap class yang memiliki anotasi ini juga harus memiliki anotasi InnerClass. Selain itu, class tidak boleh memiliki EnclosingClass dan anotasi EnclosingMethod.

Nama Format Deskripsi
nilai Class class yang paling mendekati cakupan class ini

dalvik.annotation.EnclosingMethod

Muncul di kelas

Anotasi EnclosingMethod dilampirkan ke setiap class yang ditentukan di dalam isi metode. Setiap class yang memiliki anotasi juga harus memiliki anotasi InnerClass. Selain itu, class tidak boleh memiliki EnclosingClass dan anotasi EnclosingMethod.

Nama Format Deskripsi
nilai Metode metode yang paling mendekati cakupan class ini

dalvik.annotation.InnerClass

Muncul di kelas

Anotasi InnerClass dilampirkan ke setiap class yang didefinisikan dalam cakupan leksikal dari definisi class lain. Setiap class yang memiliki anotasi ini juga harus memiliki salah satu EnclosingClass atau anotasi EnclosingMethod.

Nama Format Deskripsi
nama String nama sederhana class ini yang dideklarasikan semula (tidak termasuk ). Jika kelas ini anonim, maka namanya null.
accessFlags int flag akses class yang pertama kali dideklarasikan (yang mungkin berbeda dari flag efektif karena ketidakcocokan antara eksekusi model bahasa sumber dan virtual machine target)

dalvik.annotation.MemberClasses

Muncul di kelas

Anotasi MemberClasses dilampirkan ke setiap class yang mendeklarasikan class anggota. (Class anggota adalah class dalam langsung yang memiliki nama.)

Nama Format Deskripsi
nilai Kelas[] array class anggota

dalvik.annotation.MethodParameters

Muncul di metode

Catatan: Anotasi ini ditambahkan setelah Android 7.1. Kehadirannya pada rilis Android sebelumnya akan diabaikan.

Anotasi MethodParameters bersifat opsional dan dapat digunakan untuk menyediakan metadata parameter seperti nama parameter dan pengubah.

Anotasi dapat dihilangkan dari metode atau konstruktor dengan aman jika metadata parameter tidak diperlukan saat runtime. java.lang.reflect.Parameter.isNamePresent() dapat digunakan untuk memeriksa apakah metadata ada untuk suatu parameter, dan refleksi terkait metode seperti java.lang.reflect.Parameter.getName() akan jatuh kembali ke perilaku default saat runtime jika informasinya tidak ada.

Saat menyertakan metadata parameter, compiler harus menyertakan informasi untuk class yang dihasilkan seperti enum, karena metadata parameter mencakup apakah suatu parameter sintetis atau dimandatkan atau tidak.

Anotasi MethodParameters hanya menjelaskan metode individual parameter. Oleh karena itu, compiler dapat menghilangkan anotasi sepenuhnya untuk konstruktor dan metode yang tidak memiliki parameter, demi ukuran kode dan efisiensi runtime.

Himpunan yang didokumentasikan di bawah ini harus berukuran sama dengan Struktur dex method_id_item yang terkait dengan metode, jika tidak java.lang.reflect.MalformedParametersException akan ditampilkan dengan waktu beroperasi.

Yaitu: method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size harus sama dengan names().length dan accessFlags().length.

Karena MethodParameters menjelaskan semua metode formal parameter, bahkan yang tidak dideklarasikan secara eksplisit atau implisit dalam kode sumber, ukuran himpunan mungkin berbeda dari Tanda Tangan atau {i>metadata <i}lainnya informasi yang hanya didasarkan pada parameter eksplisit yang dideklarasikan dalam sumber pada kode sumber. MethodParameters juga tidak akan menyertakan informasi apa pun tentang jenis parameter penerima anotasi yang tidak ada di metode sebenarnya tanda tangan.

Nama Format Deskripsi
nama String[] Nama-nama parameter formal untuk metode terkait. Array (array) tidak boleh nol, tetapi harus kosong jika tidak ada parameter formal. Sebuah nilai di array harus bernilai null jika parameter formal dengan indeks tersebut tidak memiliki nama.
Jika string nama parameter kosong atau berisi '.', ';', '[' atau '/' lalu java.lang.reflect.MalformedParametersException akan ditampilkan pada waktu beroperasi.
accessFlags int[] Tanda akses parameter formal untuk metode terkait. Tujuan array tidak boleh null, tetapi harus kosong jika tidak ada parameter formal.
Nilainya adalah bit mask dengan nilai berikut:
  • 0x0010 : akhir, parameter dinyatakan final
  • 0x1000 : sintetis, parameter diperkenalkan oleh compiler
  • 0x8000 : diwajibkan, parameter bersifat sintetis, tetapi juga tersirat oleh bahasa spesifikasi
Jika ada bit yang ditetapkan di luar {i>dataset<i} ini maka java.lang.reflect.MalformedParametersException akan ditampilkan saat runtime.

dalvik.annotation.Tanda tangan

Muncul di class, kolom, dan metode

Anotasi Signature dilampirkan ke setiap class, {i>field<i}, atau metode yang didefinisikan dalam jenis tipe yang lebih rumit daripada yang dapat diwakili oleh type_id_item. Tujuan Format .dex tidak menentukan format untuk tanda tangan; ini hanya dimaksudkan untuk dapat mewakili tanda tangan apa pun bahasa membutuhkan keberhasilan implementasi semantik. Dengan demikian, tanda tangan umumnya tidak diuraikan (atau diverifikasi) dengan implementasi virtual machine. Tanda tangan itu langsung diserahkan ke alat dan API dengan level lebih tinggi (seperti debugger). Setiap penggunaan tanda tangan, oleh karena itu, harus ditulis sedemikian rupa untuk tidak memberikan asumsi tentang hanya untuk menerima tanda tangan yang valid, secara eksplisit menjaga terhadap kemungkinan munculnya sintaksis tanda tangan tidak valid.

Karena {i>string <i}tanda tangan cenderung memiliki banyak konten duplikat, anotasi Signature ditentukan sebagai array dari {i>string<i}, di mana elemen duplikat secara alami merujuk pada data yang mendasarinya, dan tanda tangan dianggap sebagai penyambungan dari semua {i>string<i} dalam {i>array<i}. Tidak ada aturan tentang cara menarik memisahkan tanda tangan menjadi {i>string<i} terpisah; yang sepenuhnya bergantung pada alat yang menghasilkan file .dex.

Nama Format Deskripsi
nilai String[] tanda tangan class atau anggota ini, sebagai array string yang adalah digabungkan bersama

dalvik.annotation.Throws

Muncul di metode

Anotasi Throws dilampirkan ke setiap metode yang dideklarasikan untuk menampilkan satu atau beberapa jenis pengecualian.

Nama Format Deskripsi
nilai Kelas[] array jenis pengecualian yang ditampilkan