Format Dalvik yang dapat dieksekusi

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

Panduan jenis

Nama Deskripsi
byte int bertanda 8-bit
ubyte Int tanpa tanda tangan 8-bit
short Int bertanda 16-bit, little-endian
ushort Int 16-bit tanpa tanda tangan, little-endian
int Int bertanda 32-bit, little-endian
uint Int tanpa tanda 32-bit, little-endian
long Int bertanda 64-bit, little-endian
ulong Int 64-bit tanpa tanda, little-endian
sleb128 LEB128 bertanda, panjang variabel (lihat di bawah)
uleb128 LEB128 tanpa tanda tangan, panjang variabel (lihat di bawah)
uleb128p1 LEB128 tanpa tanda tangan plus 1, panjang variabel (lihat di bawah)

LEB128

LEB128 ("Little-Endian Base 128") adalah enkode panjang variabel untuk jumlah bilangan bulat bertanda atau tanpa tanda arbitrer. Format ini dipinjam dari spesifikasi DWARF3. Dalam file .dex, LEB128 hanya digunakan untuk mengenkode kuantitas 32-bit.

Setiap nilai yang dienkode LEB128 terdiri dari satu hingga lima byte, yang bersama-sama mewakili satu nilai 32-bit. Setiap byte memiliki bit paling signifikan yang ditetapkan kecuali untuk byte terakhir dalam urutan, yang memiliki bit paling signifikan yang jelas. Tujuh bit yang tersisa dari setiap byte adalah payload, dengan tujuh bit yang paling tidak signifikan dari kuantitas dalam byte pertama, tujuh bit berikutnya dalam byte kedua, dan seterusnya. Dalam kasus LEB128 yang ditandatangani (sleb128), bit payload paling signifikan dari byte terakhir dalam urutan diperluas tanda untuk menghasilkan nilai akhir. Dalam kasus tanpa tanda tangan (uleb128), setiap bit yang tidak direpresentasikan secara eksplisit akan ditafsirkan sebagai 0.

Diagram bitwise 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 mewakili nilai yang ditandatangani, dengan representasi nilai plus satu yang dienkode sebagai uleb128. Hal ini membuat encoding -1 (atau dianggap sebagai nilai tanpa tanda tangan 0xffffffff) — tetapi tidak ada angka negatif lainnya — menjadi satu byte, dan berguna persis dalam kasus ketika angka yang direpresentasikan harus non-negatif atau -1 (atau 0xffffffff), dan tidak ada nilai negatif lainnya yang diizinkan (atau jika nilai besar tanpa tanda tangan tidak mungkin diperlukan).

Berikut beberapa contoh formatnya:

Urutan yang Dienkode Seperti sleb128 Seperti uleb128 Seperti uleb128p1
0000-1
01110
7f-1127126
80 7f-1281625616255

Tata letak file

Nama Format Deskripsi
header header_item header
string_ids string_id_item[] daftar ID string. Ini adalah ID untuk semua string yang digunakan oleh file ini, baik untuk penamaan internal (misalnya, deskripsi jenis) maupun sebagai objek konstan yang dirujuk oleh kode. Daftar ini harus diurutkan menurut konten string, menggunakan nilai titik kode UTF-16 (bukan dengan cara yang sensitif terhadap lokalitas), dan tidak boleh berisi entri duplikat.
type_ids type_id_item[] daftar ID jenis. Ini adalah ID untuk semua jenis (class, array, atau jenis primitif) yang dirujuk oleh file ini, baik ditentukan dalam file atau tidak. Daftar ini harus diurutkan menurut indeks string_id, dan tidak boleh berisi entri duplikat.
proto_ids proto_id_item[] daftar ID prototipe metode. Ini adalah ID untuk semua prototipe yang dirujuk oleh file ini. Daftar ini harus diurutkan dalam urutan utama jenis nilai yang ditampilkan (menurut indeks type_id), lalu menurut daftar argumen (pengurutan leksikografis, setiap argumen diurutkan menurut indeks type_id). Daftar tidak boleh berisi entri duplikat.
field_ids field_id_item[] daftar ID kolom. Ini adalah ID untuk semua kolom yang dirujuk oleh file ini, baik ditentukan dalam file maupun tidak. Daftar ini harus diurutkan, dengan jenis penentu (menurut indeks type_id) adalah urutan utama, nama kolom (menurut indeks string_id) adalah urutan perantara, dan jenis (menurut indeks type_id) adalah urutan minor. Daftar tidak boleh berisi entri duplikat.
method_ids method_id_item[] daftar ID metode. Ini adalah ID untuk semua metode yang dirujuk oleh file ini, baik ditentukan dalam file maupun tidak. Daftar ini harus diurutkan, dengan jenis penentu (menurut indeks type_id) adalah urutan utama, nama metode (menurut indeks string_id) adalah urutan perantara, dan prototipe metode (menurut indeks proto_id) adalah urutan minor. Daftar tidak boleh berisi entri duplikat.
class_defs class_def_item[] daftar definisi class. Class harus diurutkan sedemikian rupa sehingga superclass class tertentu dan antarmuka yang diterapkan muncul dalam daftar lebih awal daripada class perujuk. Selain itu, definisi untuk class dengan nama yang sama tidak boleh muncul lebih dari sekali dalam daftar.
call_site_ids call_site_id_item[] daftar ID situs panggilan. Ini adalah ID untuk semua situs panggilan yang dirujuk oleh file ini, baik yang ditentukan dalam file maupun tidak. Daftar ini harus diurutkan dalam urutan menaik call_site_off.
method_handles method_handle_item[] daftar handle metode. Daftar semua handle metode yang dirujuk oleh file ini, baik yang ditentukan dalam file maupun tidak. Daftar ini tidak diurutkan dan mungkin berisi duplikat yang secara logis akan sesuai dengan instance handle metode yang berbeda.
data ubyte[] area data, yang berisi semua data pendukung untuk tabel yang tercantum di atas. Item yang berbeda memiliki persyaratan perataan yang berbeda, dan byte padding disisipkan sebelum setiap item jika diperlukan untuk mencapai perataan yang tepat.
link_data ubyte[] data yang digunakan dalam file yang ditautkan secara statis. Format data di bagian ini tidak ditentukan oleh dokumen ini. Bagian ini kosong dalam file yang tidak ditautkan, dan implementasi runtime dapat menggunakannya sesuai keinginan.

Format penampung

Versi 41 memperkenalkan format penampung baru untuk data DEX dengan tujuan menghemat ruang. Format penampung ini memungkinkan beberapa file DEX logis digabungkan menjadi satu file fisik. Format baru sebagian besar hanya merupakan penyambungan file yang sederhana dalam format sebelumnya, dengan beberapa perbedaan:

  • file_size adalah ukuran file logis, bukan file fisik. Fungsi ini dapat digunakan untuk melakukan iterasi pada semua file logis dalam penampung.
  • File dex logis dapat mereferensikan data yang lebih baru di penampung (tetapi tidak lebih lama). Hal ini memungkinkan file dex berbagi data, seperti string, di antara file tersebut.
  • Semua offset bersifat relatif terhadap file fisik. Tidak ada offset yang relatif terhadap header. Hal ini memastikan bahwa bagian dengan offset dapat dibagikan di antara file logis.
  • Header menambahkan dua kolom baru untuk mendeskripsikan batas penampung. Ini adalah pemeriksaan konsistensi tambahan dan mempermudah porting kode ke format baru.
  • data_size dan data_off sekarang tidak digunakan. Data dapat tersebar di beberapa file logis dan tidak harus berdekatan.

Definisi bitfield, string, dan konstanta

DEX_FILE_MAGIC

Disematkan di header_item

Array/string konstan DEX_FILE_MAGIC adalah daftar byte yang harus muncul di awal file .dex agar dapat dikenali sebagai file tersebut. Nilai ini sengaja berisi baris baru ("\n" atau 0x0a) dan byte null ("\0" atau 0x00) untuk membantu dalam mendeteksi 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 berkembangnya format.

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

Catatan: Dukungan untuk format versi 040 ditambahkan dalam rilis Android 10.0, yang memperluas kumpulan karakter yang diizinkan di SimpleNames.

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

Catatan: Dukungan untuk format versi 038 ditambahkan dalam rilis Android 8.0. Versi 038 menambahkan bytecode baru (invoke-polymorphic dan invoke-custom) serta data untuk handle metode.

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

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

ENDIAN_CONSTANT dan REVERSE_ENDIAN_CONSTANT

Disematkan di header_item

Konstanta ENDIAN_CONSTANT digunakan untuk menunjukkan endianness file tempat file tersebut ditemukan. Meskipun format .dex standar adalah little-endian, implementasi dapat memilih untuk melakukan pertukaran byte. Jika implementasi menemukan header yang endian_tag-nya adalah REVERSE_ENDIAN_CONSTANT, bukan ENDIAN_CONSTANT, implementasi akan mengetahui bahwa file telah ditukar byte dari bentuk yang diharapkan.

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

NO_INDEX

Disematkan dalam class_def_item dan debug_info_item

Konstanta NO_INDEX digunakan untuk menunjukkan bahwa nilai indeks tidak ada.

Catatan: Nilai ini tidak ditentukan sebagai 0, karena sebenarnya biasanya merupakan indeks yang valid.

Nilai yang dipilih untuk NO_INDEX dapat direpresentasikan sebagai satu byte dalam encoding uleb128p1.

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

Definisi access_flags

Disematkan di class_def_item, encoded_field, encoded_method, dan InnerClass

Bitfield tanda 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: terlihat di mana saja public: terlihat di mana saja public: terlihat di mana saja
ACC_PRIVATE 0x2 * private: hanya terlihat oleh class yang menentukan private: hanya terlihat oleh class yang menentukan private: hanya terlihat oleh class yang menentukan
ACC_PROTECTED 0x4 * protected: terlihat oleh paket dan subclass protected: terlihat oleh paket dan subclass protected: terlihat oleh paket dan subclass
ACC_STATIC 0x8 * static: tidak dibuat dengan referensi this luar static: global untuk menentukan class static: tidak menggunakan argumen this
ACC_FINAL 0x10 final: tidak dapat dibuat subclass final: tidak dapat diubah setelah konstruksi final: tidak dapat diganti
ACC_SYNCHRONIZED 0x20     synchronized: kunci terkait otomatis diperoleh di sekitar panggilan ke metode ini.

Catatan: Ini hanya valid untuk ditetapkan jika ACC_NATIVE juga ditetapkan.

ACC_VOLATILE 0x40   volatile: aturan akses khusus untuk membantu keamanan urutan pesan  
ACC_BRIDGE 0x40     metode bridge, ditambahkan secara otomatis oleh compiler sebagai bridge yang aman untuk jenis
ACC_TRANSIENT 0x80   transient: tidak akan disimpan oleh serialisasi default  
ACC_VARARGS 0x80     argumen terakhir harus diperlakukan sebagai argumen "sisanya" oleh compiler
ACC_NATIVE 0x100     native: diimplementasikan dalam kode native
ACC_INTERFACE 0x200 interface: class abstrak yang dapat diimplementasikan beberapa kali    
ACC_ABSTRACT 0x400 abstract: tidak dapat dibuat instance-nya secara langsung   abstract: tidak diimplementasikan oleh class ini
ACC_STRICT 0x800     strictfp: aturan ketat untuk aritmetika floating point
ACC_SYNTHETIC 0x1000 tidak ditentukan secara langsung dalam kode sumber tidak ditentukan secara langsung dalam kode sumber tidak ditentukan secara langsung dalam kode sumber
ACC_ANNOTATION 0x2000 dideklarasikan sebagai class anotasi    
ACC_ENUM 0x4000 dideklarasikan sebagai jenis enumerasi dideklarasikan sebagai nilai yang disebutkan  
(tidak digunakan) 0x8000      
ACC_CONSTRUCTOR 0x10000     metode konstruktor (penginisialisasi class atau instance)
ACC_DECLARED_
SYNCHRONIZED
0x20000     mendeklarasikan synchronized.

Catatan: Hal ini tidak memengaruhi eksekusi (selain dalam refleksi tanda ini, per se).

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

Encoding UTF-8 yang diubah

Sebagai konsesi untuk dukungan lama yang lebih mudah, format .dex mengenkode data stringnya dalam bentuk UTF-8 modifikasi standar de facto, yang selanjutnya disebut sebagai MUTF-8. Format ini sama dengan UTF-8 standar, kecuali:

  • Hanya encoding satu, dua, dan tiga byte yang digunakan.
  • Titik kode dalam rentang U+10000U+10ffff dienkode sebagai pasangan pengganti, yang masing-masing direpresentasikan sebagai nilai yang dienkode tiga byte.
  • Titik kode U+0000 dienkode dalam bentuk dua byte.
  • Byte null biasa (nilai 0) menunjukkan akhir string, seperti interpretasi bahasa C standar.

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

Dua item terakhir di atas memungkinkan untuk menyertakan titik kode U+0000 dalam string dan masih memanipulasinya sebagai string yang diakhiri null 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 perbandingan yang ditandatangani dengan benar dari string tidak sama. Jika pengurutan (bukan hanya kesetaraan) menjadi masalah, cara paling sederhana untuk membandingkan string MUTF-8 adalah dengan mendekodenya karakter demi karakter, dan membandingkan nilai yang didekode. (Namun, implementasi yang lebih cerdas juga memungkinkan.)

Lihat Standar Unicode untuk informasi lebih lanjut tentang encoding karakter. MUTF-8 sebenarnya lebih dekat dengan encoding CESU-8 (yang relatif kurang dikenal) daripada UTF-8 secara umum.

encoding encoded_value

Disematkan dalam annotation_element dan encoded_array_item

encoded_value adalah bagian data terstruktur hierarkis (hampir) arbitrer yang dienkode. Encoding dimaksudkan untuk ringkas dan mudah diuraikan.

Nama Format Deskripsi
(value_arg << 5) | value_type ubyte byte yang menunjukkan jenis value berikutnya beserta argumen klarifikasi opsional dalam tiga bit urutan tinggi. Lihat di bawah untuk mengetahui berbagai definisi value. Pada umumnya, value_arg mengenkode panjang value yang langsung berikutnya dalam byte, seperti (size - 1), misalnya, 0 berarti nilai memerlukan satu byte, dan 7 berarti memerlukan delapan byte; tetapi, ada pengecualian seperti yang tercantum di bawah.
nilai ubyte[] byte yang mewakili nilai, variabel dalam panjang dan ditafsirkan secara berbeda untuk byte value_type yang berbeda, meskipun selalu little-endian. Lihat berbagai definisi nilai di bawah untuk mengetahui detailnya.

Format nilai

Ketik Nama value_type Format value_arg Format value Deskripsi
VALUE_BYTE 0x00 (none; must be 0) ubyte[1] nilai bilangan bulat satu byte yang ditandatangani
VALUE_SHORT 0x02 ukuran - 1 (0…1) ubyte[size] nilai bilangan bulat dua byte yang ditandatangani, diperluas tanda
VALUE_CHAR 0x03 ukuran - 1 (0…1) ubyte[size] nilai bilangan bulat dua byte yang tidak ditandatangani, diperluas nol
VALUE_INT 0x04 ukuran - 1 (0…3) ubyte[size] nilai bilangan bulat empat byte bertanda, diperluas tanda
VALUE_LONG 0x06 ukuran - 1 (0…7) ubyte[size] nilai bilangan bulat delapan byte bertanda, diperluas tanda
VALUE_FLOAT 0x10 ukuran - 1 (0…3) ubyte[size] pola bit empat byte, diperluas nol ke kanan, dan ditafsirkan sebagai nilai floating point 32-bit IEEE754
VALUE_DOUBLE 0x11 ukuran - 1 (0…7) ubyte[size] pola bit delapan byte, diperluas 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 (diperluas nol), ditafsirkan sebagai indeks ke bagian proto_ids dan mewakili nilai jenis metode
VALUE_METHOD_HANDLE 0x16 ukuran - 1 (0…3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (diperluas nol), ditafsirkan sebagai indeks ke bagian method_handles dan mewakili nilai handle metode
VALUE_STRING 0x17 ukuran - 1 (0…3) ubyte[size] nilai bilangan bulat empat byte tanpa tanda tangan (diperluas nol), ditafsirkan sebagai indeks ke bagian string_ids dan mewakili nilai string
VALUE_TYPE 0x18 ukuran - 1 (0…3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (diperluas nol), ditafsirkan sebagai indeks ke bagian type_ids dan mewakili nilai jenis/class reflektif
VALUE_FIELD 0x19 ukuran - 1 (0…3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (diperluas nol), ditafsirkan sebagai indeks ke bagian field_ids dan mewakili nilai kolom reflektif
VALUE_METHOD 0x1a ukuran - 1 (0…3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (diperluas nol), ditafsirkan sebagai indeks ke bagian method_ids dan mewakili nilai metode reflektif
VALUE_ENUM 0x1b ukuran - 1 (0…3) ubyte[size] nilai bilangan bulat empat byte yang tidak ditandatangani (diperluas nol), ditafsirkan sebagai indeks ke bagian field_ids dan mewakili nilai konstanta jenis yang dihitung
VALUE_ARRAY 0x1c (none; must be 0) encoded_array array nilai, dalam format yang ditentukan oleh "format encoded_array" di bawah. Ukuran value bersifat implisit dalam encoding.
VALUE_ANNOTATION 0x1d (none; must be 0) encoded_annotation subanotasi, dalam format yang ditentukan oleh "format encoded_annotation" di bawah. Ukuran value bersifat implisit dalam encoding.
VALUE_NULL 0x1e (none; must be 0) (tidak ada) Nilai referensi null
VALUE_BOOLEAN 0x1f boolean (0…1) (none) nilai satu bit; 0 untuk false dan 1 untuk true. Bit diwakili dalam value_arg.

Format encoded_array

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

format encoded_annotation

Nama Format Deskripsi
type_idx uleb128 jenis anotasi. Ini harus berupa jenis class (bukan array atau primitif).
ukuran uleb128 jumlah pemetaan nama-nilai dalam anotasi ini
elemen annotation_element[size] elemen anotasi, yang direpresentasikan secara langsung inline (bukan sebagai offset). Elemen harus diurutkan dalam urutan menaik menurut indeks string_id.

format annotation_element

Nama Format Deskripsi
name_idx uleb128 nama elemen, yang direpresentasikan sebagai indeks ke bagian string_ids. String harus sesuai dengan sintaksis untuk MemberName, yang ditentukan di atas.
nilai encoded_value nilai elemen

Sintaksis string

Ada beberapa jenis item dalam file .dex yang pada akhirnya merujuk ke string. Definisi gaya BNF berikut menunjukkan sintaksis yang dapat diterima untuk string ini.

SimpleName

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

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

MemberName

digunakan oleh field_id_item dan method_id_item

MemberName adalah nama anggota class, anggota adalah kolom, metode, dan class dalam.

MemberName
SimpleName
| '<' SimpleName '>'

FullClassName

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

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(SimpleName '/')*

TypeDescriptor

Digunakan oleh type_id_item

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

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

ShortyDescriptor

Digunakan oleh proto_id_item

ShortyDescriptor adalah representasi bentuk singkat dari prototipe metode, termasuk jenis nilai yang ditampilkan dan parameter, kecuali bahwa tidak ada perbedaan antara berbagai jenis referensi (class atau array). Sebagai gantinya, semua jenis referensi diwakili 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 dari 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
Lfully/qualified/Name; class fully.qualified.Name
[descriptor array descriptor, yang dapat digunakan secara rekursif untuk array array, meskipun tidak valid untuk memiliki lebih dari 255 dimensi.

Item dan struktur terkait

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

header_item

Muncul di bagian header

Penyelarasan: 4 byte

Nama Format Deskripsi
sihir ubyte[8] = DEX_FILE_MAGIC nilai magic. Lihat diskusi di atas di bagian "DEX_FILE_MAGIC" untuk mengetahui detail selengkapnya.
checksum uint Checksum adler32 dari sisa file (semuanya kecuali magic dan kolom ini); digunakan untuk mendeteksi kerusakan file
tanda tangan ubyte[20] Tanda tangan (hash) SHA-1 dari sisa file (semuanya kecuali magic, checksum, dan kolom ini); digunakan untuk mengidentifikasi file secara unik
file_size uint

ukuran seluruh file (termasuk header), dalam byte (v40 atau yang lebih lama)

jarak dalam byte dari awal header ini ke header berikutnya atau ke akhir seluruh file (penampung). (v41 atau yang lebih baru)

header_size uint

ukuran header (seluruh bagian ini), dalam byte. Hal ini memungkinkan setidaknya kompatibilitas mundur/maju dalam jumlah terbatas tanpa membatalkan format.

harus berukuran 0x70 (112) byte (v40 atau yang lebih lama)

harus berukuran 0x78 (120) byte (v41 atau yang lebih baru)

endian_tag uint = ENDIAN_CONSTANT tag endianness. Lihat diskusi di atas di bagian "ENDIAN_CONSTANT dan REVERSE_ENDIAN_CONSTANT" untuk detail selengkapnya.
link_size uint ukuran bagian link, atau 0 jika file ini tidak ditautkan secara statis
link_off uint offset dari awal file ke bagian link, atau 0 jika link_size == 0. Offset, jika bukan nol, harus berupa offset ke bagian link_data. Format data yang ditunjuk tidak ditentukan oleh dokumen ini; kolom header ini (dan yang sebelumnya) dibiarkan sebagai hook untuk digunakan oleh penerapan runtime.
map_off uint offset dari awal file ke item peta. Offset, yang harus bukan nol, harus berupa offset ke bagian data, dan data harus dalam format yang ditentukan oleh "map_list" di bawah.
string_ids_size uint jumlah string dalam daftar ID string
string_ids_off uint offset dari awal file ke daftar ID string, atau 0 jika string_ids_size == 0 (memang kasus ekstrem yang aneh). Offset, jika bukan nol, harus berada di awal bagian string_ids.
type_ids_size uint jumlah elemen dalam daftar ID jenis, maksimal 65.535
type_ids_off uint offset dari awal file ke daftar ID jenis, atau 0 jika type_ids_size == 0 (memang kasus ekstrem yang aneh). Offset, jika bukan nol, harus berada di awal bagian type_ids.
proto_ids_size uint jumlah elemen dalam daftar ID prototipe, maksimal 65.535
proto_ids_off uint offset dari awal file ke daftar ID prototipe, atau 0 jika proto_ids_size == 0 (memang kasus ekstrem yang aneh). Offset, jika bukan nol, harus berada di awal bagian proto_ids.
field_ids_size uint jumlah elemen dalam daftar ID kolom
field_ids_off uint offset dari awal file ke daftar ID kolom, atau 0 jika field_ids_size == 0. Offset, jika bukan nol, harus berada di awal bagian field_ids.
method_ids_size uint jumlah elemen dalam daftar ID metode
method_ids_off uint offset dari awal file ke daftar ID metode, atau 0 jika method_ids_size == 0. Offset, jika bukan nol, harus berada di awal bagian method_ids.
class_defs_size uint jumlah elemen dalam daftar definisi class
class_defs_off uint offset dari awal file ke daftar definisi class, atau 0 jika class_defs_size == 0 (memang kasus ekstrem yang aneh). Offset, jika bukan nol, harus berada di awal bagian class_defs.
data_size uint

Ukuran bagian data dalam byte. Harus kelipatan genap dari sizeof(uint). (v40 atau yang lebih lama)

Tidak digunakan (v41 atau yang lebih baru)

data_off uint

offset dari awal file ke awal bagian data (v40 atau yang lebih lama)

Tidak digunakan (v41 atau yang lebih baru)

container_size uint

kolom ini tidak ada. Nilai ini dapat diasumsikan sama dengan file_size. (v40 atau yang lebih lama)

ukuran seluruh file (termasuk header dex lainnya dan datanya). (v41 atau yang lebih baru)

header_offset uint

kolom ini tidak ada. Nilai ini dapat diasumsikan sama dengan 0. (v40 atau yang lebih lama)

offset dari awal file ke awal header ini. (v41 atau yang lebih baru)

map_list

Muncul di bagian data

Dirujuk dari header_item

Penyelarasan: 4 byte

Ini adalah daftar seluruh konten file, secara berurutan. Fungsi ini berisi beberapa redundansi sehubungan dengan header_item, tetapi dimaksudkan untuk menjadi bentuk yang mudah digunakan untuk melakukan iterasi di seluruh file. Jenis tertentu harus muncul maksimal sekali dalam peta, tetapi tidak ada batasan jenis urutan yang dapat muncul, selain batasan yang tersirat oleh format lainnya (misalnya, bagian header harus muncul terlebih dahulu, diikuti dengan bagian string_ids, dll.). Selain itu, entri peta harus diurutkan menurut 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 ushort jenis item; lihat tabel di bawah
unused ushort (tidak digunakan)
ukuran uint jumlah item yang akan ditemukan pada offset yang ditunjukkan
offset uint offset dari awal file ke item yang dimaksud

Kode jenis

Jenis Item Konstanta Nilai Ukuran Item dalam Byte
header_item TYPE_HEADER_ITEM 0x0000 0x70
string_id_item TYPE_STRING_ID_ITEM 0x0001 0x04
type_id_item TYPE_TYPE_ID_ITEM 0x0002 0x04
proto_id_item TYPE_PROTO_ID_ITEM 0x0003 0x0c
field_id_item TYPE_FIELD_ID_ITEM 0x0004 0x08
method_id_item TYPE_METHOD_ID_ITEM 0x0005 0x08
class_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
call_site_id_item TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
method_handle_item TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
map_list TYPE_MAP_LIST 0x1000 4 + (item.size * 12)
type_list TYPE_TYPE_LIST 0x1001 4 + (item.size * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (item.size * 4)
annotation_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (item.size * 4)
class_data_item TYPE_CLASS_DATA_ITEM 0x2000 implisit; harus mengurai
code_item TYPE_CODE_ITEM 0x2001 implisit; harus mengurai
string_data_item TYPE_STRING_DATA_ITEM 0x2002 implisit; harus mengurai
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 implisit; harus mengurai
annotation_item TYPE_ANNOTATION_ITEM 0x2004 implisit; harus mengurai
encoded_array_item TYPE_ENCODED_ARRAY_ITEM 0x2005 implisit; harus mengurai
annotations_directory_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 implisit; harus mengurai
hiddenapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 implisit; harus mengurai

string_id_item

Muncul di bagian string_ids

Penyelarasan: 4 byte

Nama Format Deskripsi
string_data_off uint offset dari awal file ke data string untuk item ini. Offset harus ke lokasi di bagian data, dan data harus dalam format yang ditentukan oleh "string_data_item" di bawah. Tidak ada persyaratan perataan untuk offset.

string_data_item

Muncul di bagian data

Perataan: tidak ada (diselaraskan byte)

Nama Format Deskripsi
utf16_size uleb128 ukuran string ini, dalam unit kode UTF-16 (yang merupakan "panjang string" di banyak sistem). Artinya, ini adalah panjang string yang didekode. (Panjang yang dienkode tersirat oleh posisi byte 0.)
data ubyte[] serangkaian unit kode MUTF-8 (alias octet, alias byte) diikuti dengan byte dengan nilai 0. Lihat "Encoding MUTF-8 (UTF-8 Modifikasi)" di atas untuk mengetahui detail dan diskusi tentang format data.

Catatan: String yang menyertakan unit kode pengganti UTF-16 (yaitu, U+d800U+dfff) baik secara terpisah maupun tidak berurutan sehubungan dengan encoding Unicode yang biasa ke dalam UTF-16 dapat diterima. Penggunaan string tingkat tinggi dapat menolak encoding yang tidak valid tersebut, jika sesuai.

type_id_item

Muncul di bagian type_ids

Penyelarasan: 4 byte

Nama Format Deskripsi
descriptor_idx uint indeks ke dalam daftar string_ids untuk string deskripsi jenis ini. String harus sesuai dengan sintaksis untuk TypeDescriptor, yang ditentukan di atas.

proto_id_item

Muncul di bagian proto_ids

Penyelarasan: 4 byte

Nama Format Deskripsi
shorty_idx uint indeks ke dalam daftar string_ids untuk string deskripsi bentuk singkat prototipe ini. String harus sesuai dengan sintaksis untuk ShortyDescriptor, yang ditentukan di atas, dan harus sesuai dengan jenis nilai yang ditampilkan dan parameter item ini.
return_type_idx uint indeks ke dalam daftar type_ids untuk jenis nilai yang ditampilkan prototipe ini
parameters_off uint offset dari awal file ke daftar jenis parameter untuk prototipe ini, atau 0 jika prototipe ini tidak memiliki parameter. Offset ini, jika bukan nol, harus berada di bagian data, dan data di sana harus dalam format yang ditentukan oleh "type_list" di bawah. Selain itu, tidak boleh ada referensi ke jenis void dalam daftar.

field_id_item

Muncul di bagian field_ids

Penyelarasan: 4 byte

Nama Format Deskripsi
class_idx ushort indeks ke dalam daftar type_ids untuk penentu kolom ini. Ini harus berupa jenis class, bukan array atau jenis primitif.
type_idx ushort indeks ke dalam daftar type_ids untuk jenis kolom ini
name_idx uint indeks ke dalam daftar string_ids untuk nama kolom ini. String harus sesuai dengan sintaksis untuk MemberName, yang ditentukan di atas.

method_id_item

Muncul di bagian method_ids

Penyelarasan: 4 byte

Nama Format Deskripsi
class_idx ushort indeks ke dalam daftar type_ids untuk penentu metode ini. Ini harus berupa jenis class atau array, dan bukan jenis primitif.
proto_idx ushort indeks ke dalam daftar proto_ids untuk prototipe metode ini
name_idx uint indeks ke dalam daftar string_ids untuk nama metode ini. String harus sesuai dengan sintaksis untuk MemberName, yang ditentukan di atas.

class_def_item

Muncul di bagian class_defs

Penyelarasan: 4 byte

Nama Format Deskripsi
class_idx uint indeks ke dalam daftar type_ids untuk class ini. Ini harus berupa jenis class, bukan array atau jenis primitif.
access_flags uint flag akses untuk class (public, final, dll.). Lihat "Definisi access_flags" untuk mengetahui detailnya.
superclass_idx uint indeks ke dalam daftar type_ids untuk superclass, atau nilai konstan NO_INDEX jika class ini tidak memiliki superclass (yaitu, class root seperti Object). Jika ada, ini harus berupa jenis class, bukan array atau jenis primitif.
interfaces_off uint offset dari awal file ke daftar antarmuka, atau 0 jika tidak ada. Offset ini harus berada di bagian data, dan data di sana harus dalam format yang ditentukan oleh "type_list" di bawah. Setiap elemen daftar harus berupa jenis class (bukan array atau jenis primitif), dan tidak boleh ada duplikat.
source_file_idx uint indeks ke dalam daftar string_ids untuk nama file yang berisi sumber asli untuk (setidaknya sebagian besar) class ini, atau nilai khusus NO_INDEX untuk merepresentasikan kurangnya informasi ini. debug_info_item dari metode tertentu dapat mengganti file sumber ini, tetapi harapannya adalah sebagian besar class hanya akan berasal dari satu file sumber.
annotations_off uint offset dari awal file ke struktur anotasi untuk class ini, atau 0 jika tidak ada anotasi pada class ini. Offset ini, jika bukan nol, harus berada di bagian data, dan data di sana harus dalam format yang ditentukan oleh "annotations_directory_item" di bawah, dengan semua item yang merujuk ke class ini sebagai penentu.
class_data_off uint offset dari awal file ke data class terkait untuk item ini, atau 0 jika tidak ada data class untuk class ini. (Hal ini mungkin terjadi, misalnya, jika class ini adalah antarmuka penanda.) Offset, jika bukan nol, harus berada di bagian data, dan data di sana harus dalam format yang ditentukan oleh "class_data_item" di bawah, dengan semua item yang merujuk ke class ini sebagai penentu.
static_values_off uint offset dari awal file ke daftar nilai awal untuk kolom static, atau 0 jika tidak ada (dan semua kolom static akan diinisialisasi dengan 0 atau null). Offset ini harus berada di bagian data, dan data di sana harus dalam format yang ditentukan oleh "encoded_array_item" di bawah. Ukuran array tidak boleh lebih besar dari jumlah kolom static yang dideklarasikan oleh class ini, dan elemennya sesuai dengan kolom static dalam urutan yang sama seperti yang dideklarasikan dalam field_list yang sesuai. Jenis setiap elemen array harus cocok dengan jenis yang dideklarasikan dari kolom yang sesuai. Jika elemen dalam array lebih sedikit daripada kolom static, kolom yang tersisa akan diinisialisasi dengan 0 atau null yang sesuai dengan jenisnya.

call_site_id_item

Muncul di bagian call_site_ids

Penyelarasan: 4 byte

Nama Format Deskripsi
call_site_off uint offset dari awal file untuk memanggil definisi situs. Offset harus berada di bagian data, dan data di sana harus dalam format yang ditentukan oleh "call_site_item" di bawah.

call_site_item

Muncul di bagian data

Alignment: none (byte aligned)

call_site_item adalah encoded_array_item yang elemennya sesuai dengan argumen yang diberikan ke metode bootstrap linker. Tiga argumen pertama adalah:

  1. Handle metode yang mewakili metode bootstrap linker (VALUE_METHOD_HANDLE).
  2. Nama metode yang harus di-resolve oleh linker bootstrap (VALUE_STRING).
  3. Jenis metode yang sesuai dengan jenis nama metode yang akan di-resolve (VALUE_METHOD_TYPE).

Setiap argumen tambahan adalah nilai konstan yang diteruskan ke metode bootstrap linker. Argumen ini diteruskan secara berurutan dan tanpa konversi jenis apa pun.

Handle metode yang mewakili metode bootstrap linker 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 konstannya.

method_handle_item

Muncul di bagian method_handles

Penyelarasan: 4 byte

Nama Format Deskripsi
method_handle_type ushort jenis handle metode; lihat tabel di bawah
unused ushort (tidak digunakan)
field_or_method_id ushort ID kolom atau metode, bergantung pada apakah jenis handle metode adalah pengakses atau pemanggil metode
unused ushort (tidak digunakan)

Kode jenis handle metode

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

class_data_item

Dirujuk dari class_def_item

Muncul di bagian data

Perataan: tidak ada (diselaraskan byte)

Nama Format Deskripsi
static_fields_size uleb128 jumlah kolom statis yang ditentukan dalam item ini
instance_fields_size uleb128 jumlah kolom instance yang ditentukan dalam item ini
direct_methods_size uleb128 jumlah metode langsung yang ditentukan dalam item ini
virtual_methods_size uleb128 jumlah metode virtual yang ditentukan dalam item ini
static_fields encoded_field[static_fields_size] kolom statis yang ditentukan, yang direpresentasikan sebagai urutan elemen yang dienkode. Kolom harus diurutkan menurut field_idx dalam urutan yang semakin meningkat.
instance_fields encoded_field[instance_fields_size] kolom instance yang ditentukan, yang direpresentasikan sebagai urutan elemen yang dienkode. Kolom harus diurutkan menurut field_idx dalam urutan menaik.
direct_methods encoded_method[direct_methods_size] metode langsung (static, private, atau konstruktor) yang ditentukan, yang direpresentasikan sebagai urutan elemen yang dienkode. Metode harus diurutkan menurut method_idx dalam urutan yang semakin meningkat.
virtual_methods encoded_method[virtual_methods_size] metode virtual yang ditentukan (bukan static, private, atau konstruktor), yang direpresentasikan sebagai urutan elemen yang dienkode. Daftar ini tidak boleh menyertakan metode yang diwarisi kecuali jika diganti oleh class yang diwakili item ini. Metode harus diurutkan menurut method_idx dalam urutan yang semakin meningkat. method_idx metode virtual tidak boleh sama dengan metode langsung apa pun.

Catatan: Semua instance field_id dan method_id elemen harus merujuk ke class penentu yang sama.

format encoded_field

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

format encoded_method

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

type_list

Dirujuk dari class_def_item dan proto_id_item

Muncul di bagian data

Penyelarasan: 4 byte

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

format type_item

Nama Format Deskripsi
type_idx ushort indeks ke dalam daftar type_ids

code_item

Dirujuk dari encoded_method

Muncul di bagian data

Penyelarasan: 4 byte

Nama Format Deskripsi
registers_size ushort jumlah register yang digunakan oleh kode ini
ins_size ushort jumlah kata argumen yang masuk ke metode yang menjadi tujuan kode ini
outs_size ushort jumlah kata ruang argumen keluar yang diperlukan oleh kode ini untuk pemanggilan metode
tries_size ushort jumlah try_item untuk instance ini. Jika bukan nol, nilai ini akan muncul sebagai array tries tepat setelah insns dalam instance ini.
debug_info_off uint offset dari awal file ke urutan info debug (nomor baris + informasi 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.
insns_size uint ukuran daftar petunjuk, dalam unit kode 16-bit
insns ushort[insns_size] array bytecode yang sebenarnya. Format kode dalam array insns ditentukan oleh dokumen pendamping bytecode Dalvik. Perhatikan bahwa meskipun ini ditentukan sebagai array ushort, ada beberapa struktur internal yang lebih memilih perataan empat byte. Selain itu, jika hal ini terjadi dalam file yang ditukar endian, pertukaran hanya dilakukan pada setiap instance ushort dan bukan pada struktur internal yang lebih besar.
padding ushort (opsional) = 0 dua byte padding untuk membuat tries sejajar empat byte. Elemen ini hanya ada jika tries_size bukan nol dan insns_size ganjil.
percobaan try_item[tries_size] (opsional) array yang menunjukkan tempat pengecualian kode tertangkap dan cara menanganinya. Elemen array tidak boleh tumpang-tindih dalam rentang dan dalam urutan dari alamat rendah ke tinggi. Elemen ini hanya ada jika tries_size bukan nol.
pengendali encoded_catch_handler_list (opsional) byte yang mewakili daftar daftar jenis tangkapan dan alamat pengendali terkait. Setiap try_item memiliki offset byte ke dalam struktur ini. Elemen ini hanya ada jika tries_size bukan nol.

format try_item

Nama Format Deskripsi
start_addr uint alamat awal blok kode yang dicakup oleh entri ini. Alamat adalah jumlah unit kode 16-bit hingga awal petunjuk pertama yang tercakup.
insn_count ushort jumlah unit kode 16-bit yang tercakup dalam entri ini. Unit kode terakhir yang tercakup (inklusif) adalah start_addr + insn_count - 1.
handler_off ushort offset dalam byte dari awal encoded_catch_hander_list terkait ke encoded_catch_handler untuk entri ini. Ini harus berupa offset ke awal encoded_catch_handler.

format encoded_catch_handler_list

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

format encoded_catch_handler

Nama Format Deskripsi
ukuran sleb128 jumlah jenis tangkapan dalam daftar ini. Jika non-positif, ini adalah negatif dari jumlah jenis tangkapan, dan tangkapan diikuti oleh pengendali generik. Misalnya: size dari 0 berarti ada catch-all, tetapi tidak ada catch yang diketik secara eksplisit. size dari 2 berarti ada dua pengecualian yang diketik secara eksplisit dan tidak ada pengecualian umum. Dan size dari -1 berarti ada satu tangkapan yang diketik beserta tangkapan semua.
pengendali encoded_type_addr_pair[abs(size)] aliran item yang dienkode abs(size), satu untuk setiap jenis yang tertangkap, dalam urutan jenis yang harus diuji.
catch_all_addr uleb128 (opsional) alamat bytecode pengendali email generik. Elemen ini hanya ada jika size non-positif.

Format encoded_type_addr_pair

Nama Format Deskripsi
type_idx uleb128 mengindeks ke dalam daftar type_ids untuk jenis pengecualian yang akan ditangkap
addr uleb128 alamat bytecode pengendali pengecualian terkait

debug_info_item

Dirujuk dari code_item

Muncul di bagian data

Perataan: tidak ada (diselaraskan byte)

Setiap debug_info_item menentukan mesin status berenkode byte yang terinspirasi DWARF3 yang, saat ditafsirkan, memunculkan tabel posisi dan (berpotensi) informasi variabel lokal untuk code_item. Urutan dimulai dengan header panjang variabel (panjangnya bergantung pada jumlah parameter metode), diikuti dengan bytecode mesin status, dan diakhiri dengan byte DBG_END_SEQUENCE.

Mesin status terdiri dari lima register. Register address mewakili offset petunjuk dalam insns_item terkait dalam unit kode 16-bit. Register address dimulai dari 0 di awal setiap urutan debug_info dan hanya boleh meningkat secara monoton. Register line mewakili nomor baris sumber yang harus dikaitkan dengan entri tabel posisi berikutnya yang dikeluarkan oleh mesin status. Ini diinisialisasi di header urutan, dan dapat berubah dalam arah positif atau negatif, tetapi tidak boleh kurang dari 1. Register source_file mewakili file sumber yang dirujuk oleh entri nomor baris. Ini diinisialisasi 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 yang ditampilkan harus dianggap sebagai prolog atau epilog metode. Mesin status juga harus melacak nama dan jenis variabel lokal terakhir yang aktif di setiap register untuk kode DBG_RESTART_LOCAL.

Headernya adalah sebagai berikut:

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

Nilai kode byte adalah sebagai berikut:

Nama Nilai Format Argumen Deskripsi
DBG_END_SEQUENCE 0x00 (none) menghentikan urutan info debug untuk code_item
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff: jumlah yang akan ditambahkan ke register alamat memajukan register alamat tanpa memunculkan entri posisi
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: jumlah untuk mengubah register baris memajukan register baris tanpa memunculkan entri posisi
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: register yang akan berisi lokal
name_idx: indeks string nama
type_idx: indeks jenis jenis
memperkenalkan variabel lokal di alamat saat ini. name_idx atau type_idx dapat berupa 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: register yang akan berisi lokal
name_idx: indeks string nama
type_idx: indeks jenis jenis
sig_idx: indeks string tanda tangan jenis
memperkenalkan lokal dengan tanda tangan jenis di alamat saat ini. name_idx, type_idx, atau sig_idx dapat berupa NO_INDEX untuk menunjukkan bahwa nilai tersebut tidak diketahui. (Namun, jika sig_idx adalah -1, data yang sama dapat direpresentasikan secara lebih efisien menggunakan opcode DBG_START_LOCAL.)

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

DBG_END_LOCAL 0x05 uleb128 register_num register_num: register yang berisi lokal menandai variabel lokal yang saat ini aktif sebagai di luar cakupan di alamat saat ini
DBG_RESTART_LOCAL 0x06 uleb128 register_num register_num: register to restart memperkenalkan kembali variabel lokal di alamat saat ini. Nama dan jenisnya sama dengan lokal terakhir yang aktif di register yang ditentukan.
DBG_SET_PROLOGUE_END 0x07 (none) menetapkan register mesin status prologue_end, yang menunjukkan bahwa entri posisi berikutnya yang ditambahkan harus dianggap sebagai akhir prolog metode (tempat yang sesuai untuk titik henti sementara metode). Register prologue_end dihapus oleh opcode (>= 0x0a) khusus.
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 epilog metode (tempat yang sesuai untuk menangguhkan eksekusi sebelum metode keluar). Register epilogue_begin dihapus oleh opcode khusus (>= 0x0a).
DBG_SET_FILE 0x09 uleb128p1 name_idx name_idx: indeks string nama file sumber; NO_INDEX jika tidak diketahui menunjukkan bahwa semua entri nomor baris berikutnya akan merujuk ke nama file sumber ini, bukan nama default yang ditentukan dalam code_item
Opcode Khusus 0x0a…0xff (none) memajukan register line dan address, memunculkan entri posisi, dan menghapus prologue_end dan epilogue_begin. Lihat deskripsi di bawah.

Opcode khusus

Opcode dengan nilai antara 0x0a dan 0xff (inklusif) memindahkan register line dan address dengan jumlah kecil, lalu memunculkan entri tabel posisi baru. Rumus untuk inkremen 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)

annotations_directory_item

Dirujuk dari class_def_item

Muncul di bagian data

Penyelarasan: 4 byte

Nama Format Deskripsi
class_annotations_off uint offset dari awal file ke anotasi yang dibuat langsung di class, atau 0 jika class tidak memiliki anotasi langsung. Offset, jika bukan nol, harus mengarah ke lokasi di bagian data. Format data ditentukan oleh "annotation_set_item" di bawah.
fields_size uint jumlah kolom yang dianotasi oleh item ini
annotated_methods_size uint jumlah metode yang dianotasi oleh item ini
annotated_parameters_size uint jumlah daftar parameter metode yang dianotasi oleh item ini
field_annotations field_annotation[fields_size] (opsional) daftar anotasi kolom terkait. Elemen daftar harus diurutkan dalam urutan menaik, menurut field_idx.
method_annotations method_annotation[methods_size] (opsional) daftar anotasi metode terkait. Elemen daftar harus diurutkan dalam urutan menaik, menurut method_idx.
parameter_annotations parameter_annotation[parameters_size] (opsional) daftar anotasi parameter metode terkait. Elemen daftar harus diurutkan dalam urutan menaik, menurut method_idx.

Catatan: Semua instance field_id dan method_id elemen harus merujuk ke class penentu yang sama.

format field_annotation

Nama Format Deskripsi
field_idx uint mengindeks ke dalam daftar field_ids untuk identitas kolom yang dianotasi
annotations_off uint offset dari awal file ke daftar anotasi untuk kolom. Offset harus mengarah ke lokasi di bagian data. Format data ditentukan oleh "annotation_set_item" di bawah.

format method_annotation

Nama Format Deskripsi
method_idx uint mengindeks ke dalam daftar method_ids untuk identitas metode yang dianotasi
annotations_off uint offset dari awal file ke daftar anotasi untuk metode. Offset harus ke lokasi di bagian data. Format data ditentukan oleh "annotation_set_item" di bawah.

format parameter_annotation

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

annotation_set_ref_list

Dirujuk dari parameter_annotations_item

Muncul di bagian data

Penyelarasan: 4 byte

Nama Format Deskripsi
ukuran uint ukuran daftar, dalam entri
daftar annotation_set_ref_item[size] elemen daftar

format annotation_set_ref_item

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

annotation_set_item

Dirujuk dari annotations_directory_item, field_annotations_item, method_annotations_item, dan annotation_set_ref_item

Muncul di bagian data

Penyelarasan: 4 byte

Nama Format Deskripsi
ukuran uint ukuran set, dalam entri
entri annotation_off_item[size] elemen set. Elemen harus diurutkan dalam urutan menaik, menurut type_idx.

format annotation_off_item

Nama Format Deskripsi
annotation_off uint offset dari awal file ke anotasi. Offset harus mengarah ke lokasi di bagian data, dan format data di lokasi tersebut ditentukan oleh "annotation_item" di bawah.

annotation_item

Dirujuk dari annotation_set_item

Muncul di bagian data

Perataan: tidak ada (diselaraskan byte)

Nama Format Deskripsi
visibilitas ubyte visibilitas yang diinginkan untuk anotasi ini (lihat di bawah)
annotation encoded_annotation konten anotasi yang dienkode, dalam format yang dijelaskan oleh "format encoded_annotation" di bagian "enkode encoded_value" di atas.

Nilai visibilitas

Berikut adalah opsi untuk kolom visibility dalam annotation_item:

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

encoded_array_item

Dirujuk dari class_def_item

Muncul di bagian data

Perataan: tidak ada (diselaraskan byte)

Nama Format Deskripsi
nilai encoded_array byte yang mewakili nilai array yang dienkode, dalam format yang ditentukan oleh "encoded_array Format" di bagian "encoded_value Encoding" di atas.

hiddenapi_class_data_item

Bagian ini berisi data tentang antarmuka terbatas 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 flag yang dijelaskan di bawah dapat diperluas dalam rilis Android mendatang. Untuk mengetahui informasi selengkapnya, lihat pembatasan pada antarmuka non-SDK.

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

Jenis tanda pembatasan:

Nama Nilai Deskripsi
daftar yang diizinkan 0 Antarmuka yang dapat digunakan secara bebas dan didukung sebagai bagian dari Indeks Paket framework Android yang didokumentasikan secara resmi.
daftar abu-abu 1 Antarmuka non-SDK yang dapat digunakan, apa pun level API target aplikasi.
daftar hitam 2 Antarmuka non-SDK yang tidak dapat digunakan, apa pun API level target aplikasi. Mengakses salah satu antarmuka ini akan menyebabkan error runtime.
greylist‑max‑o 3 Antarmuka non-SDK yang dapat digunakan untuk Android 8.x dan yang lebih lama kecuali jika dibatasi.
greylist‑max‑p 4 Antarmuka non-SDK yang dapat digunakan untuk Android 9.x kecuali jika dibatasi.
greylist‑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 informasi reflektif tentang class (dan metode serta 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 ditetapkan ke VISIBILITY_SYSTEM.

dalvik.annotation.AnnotationDefault

Muncul pada metode di antarmuka anotasi

Anotasi AnnotationDefault dilampirkan ke setiap antarmuka anotasi yang ingin menunjukkan binding default.

Nama Format Deskripsi
nilai Annotation binding default untuk anotasi ini, yang direpresentasikan sebagai anotasi jenis ini. Anotasi tidak perlu menyertakan semua nama yang ditentukan oleh anotasi; nama yang tidak ada tidak memiliki default.

dalvik.annotation.EnclosingClass

Muncul di kelas

Anotasi EnclosingClass dilampirkan ke setiap class yang ditentukan sebagai anggota class lain, atau anonim, tetapi tidak ditentukan dalam isi metode (misalnya, class dalam sintetis). Setiap class yang memiliki anotasi ini juga harus memiliki anotasi InnerClass. Selain itu, class tidak boleh memiliki anotasi EnclosingClass dan EnclosingMethod.

Nama Format Deskripsi
nilai Class class yang cakupan leksikalnya paling dekat dengan 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 ini juga harus memiliki anotasi InnerClass. Selain itu, class tidak boleh memiliki anotasi EnclosingClass dan EnclosingMethod.

Nama Format Deskripsi
nilai Metode metode yang paling dekat secara leksikalis mencakup class ini

dalvik.annotation.InnerClass

Muncul di kelas

Anotasi InnerClass dilampirkan ke setiap class yang ditentukan dalam cakupan leksik dari definisi class lain. Setiap class yang memiliki anotasi ini juga harus memiliki anotasi EnclosingClass atau anotasi EnclosingMethod.

Nama Format Deskripsi
nama String nama sederhana class ini yang awalnya dideklarasikan (tidak termasuk awalan paket apa pun). Jika class ini bersifat anonim, namanya adalah null.
accessFlags int flag akses class yang awalnya dideklarasikan (yang mungkin berbeda dari flag efektif karena ketidakcocokan antara model eksekusi 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 Class[] array class anggota

dalvik.annotation.MethodParameters

Muncul di metode

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

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

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 parameter, dan metode refleksi terkait seperti java.lang.reflect.Parameter.getName() akan kembali ke perilaku default saat runtime jika informasi tidak ada.

Saat menyertakan metadata parameter, compiler harus menyertakan informasi untuk class yang dihasilkan seperti enum, karena metadata parameter menyertakan apakah parameter bersifat sintetis atau diwajibkan.

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

Array yang didokumentasikan di bawah harus berukuran sama dengan struktur dex method_id_item yang terkait dengan metode. Jika tidak, java.lang.reflect.MalformedParametersException akan ditampilkan saat runtime.

Artinya: 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 parameter metode formal, bahkan yang tidak dideklarasikan secara eksplisit atau implisit dalam kode sumber, ukuran array dapat berbeda dari informasi Signature atau metadata lainnya yang hanya didasarkan pada parameter eksplisit yang dideklarasikan dalam kode sumber. MethodParameters juga tidak akan menyertakan informasi apa pun tentang parameter penerima anotasi jenis yang tidak ada dalam tanda tangan metode yang sebenarnya.

Nama Format Deskripsi
nama String[] Nama parameter formal untuk metode terkait. Array tidak boleh null, tetapi harus kosong jika tidak ada parameter formal. Nilai dalam array harus null jika parameter formal dengan indeks tersebut tidak memiliki nama.
Jika string nama parameter kosong atau berisi '.', ';', '[', atau '/', maka java.lang.reflect.MalformedParametersException akan ditampilkan saat runtime.
accessFlags int[] Flag akses parameter formal untuk metode terkait. Array tidak boleh null, tetapi harus kosong jika tidak ada parameter formal.
Nilai ini adalah bit mask dengan nilai berikut:
  • 0x0010 : final, parameter dideklarasikan final
  • 0x1000 : sintetis, parameter diperkenalkan oleh compiler
  • 0x8000 : diwajibkan, parameter bersifat sintetis, tetapi juga tersirat oleh spesifikasi bahasa
Jika ada bit yang ditetapkan di luar kumpulan ini, java.lang.reflect.MalformedParametersException akan ditampilkan saat runtime.

dalvik.annotation.Signature

Muncul di class, kolom, dan metode

Anotasi Signature dilampirkan ke setiap class, kolom, atau metode yang ditentukan dalam hal jenis yang lebih rumit daripada yang dapat direpresentasikan oleh type_id_item. Format .dex tidak menentukan format untuk tanda tangan; format ini hanya dimaksudkan agar dapat merepresentasikan tanda tangan apa pun yang diperlukan bahasa sumber untuk keberhasilan penerapan semantik bahasa tersebut. Dengan demikian, tanda tangan umumnya tidak diuraikan (atau diverifikasi) oleh implementasi virtual machine. Tanda tangan hanya akan diteruskan ke API dan alat level yang lebih tinggi (seperti debugger). Oleh karena itu, setiap penggunaan tanda tangan harus ditulis agar tidak membuat asumsi apa pun tentang hanya menerima tanda tangan yang valid, yang secara eksplisit menjaga dirinya dari kemungkinan menemukan tanda tangan yang tidak valid secara sintaksis.

Karena string tanda tangan cenderung memiliki banyak konten duplikat, anotasi Signature ditentukan sebagai array string, dengan elemen duplikat secara alami merujuk ke data dasar yang sama, dan tanda tangan dianggap sebagai penyambungan semua string dalam array. Tidak ada aturan tentang cara memisahkan tanda tangan menjadi string terpisah; hal ini sepenuhnya bergantung pada alat yang membuat file .dex.

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

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 Class[] array jenis pengecualian yang ditampilkan