Dokumen ini menjelaskan tata letak dan konten file .dex, yang digunakan untuk menyimpan sekumpulan definisi class dan data tambahan yang terkait.
Panduan untuk mengetik
| Nama | Deskripsi | 
|---|---|
| byte | int bertanda 8-bit | 
| ubyte | Bilangan bulat tanpa tanda 8-bit | 
| short | Bilangan bulat bertanda 16-bit, little-endian | 
| ushort | Bilangan bulat tidak bertanda 16-bit, little-endian | 
| int | int bertanda 32-bit, little-endian | 
| uint | int tanpa tanda 32-bit, little-endian | 
| long | Bilangan bulat 64-bit bertanda, little-endian | 
| ulong | int 64-bit tanpa tanda, little-endian | 
| sleb128 | LEB128 bertanda, panjang variabel (lihat di bawah) | 
| uleb128 | LEB128 tidak bertanda, panjang variabel (lihat di bawah) | 
| uleb128p1 | LEB128 yang tidak bertanda plus 1, panjang variabel (lihat di bawah) | 
LEB128
LEB128 ("Little-Endian Base 128") adalah
enkode panjang variabel untuk
kuantitas bilangan bulat bertanda atau tidak bertanda 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 merepresentasikan satu nilai 32-bit. Setiap byte memiliki bit paling signifikan yang ditetapkan, kecuali byte terakhir dalam urutan, yang memiliki bit paling signifikan yang dihapus. Tujuh bit yang tersisa dari setiap byte adalah payload, dengan tujuh bit paling tidak signifikan dari jumlah dalam byte pertama, tujuh bit berikutnya dalam byte kedua, dan seterusnya. Dalam kasus LEB128 bertanda (sleb128),
bit payload paling signifikan dari byte terakhir dalam urutan
diperluas tanda untuk menghasilkan nilai akhir. Dalam kasus tanpa tanda
(uleb128), 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 merepresentasikan nilai bertanda, dengan representasi nilai ditambah satu yang dienkode sebagai uleb128. Hal ini membuat encoding -1
(atau dapat juga dianggap sebagai nilai yang tidak bertanda 0xffffffff)
— tetapi bukan angka negatif lainnya — menjadi satu byte, dan berguna
dalam kasus-kasus ketika angka yang ditampilkan harus berupa
non-negatif atau -1 (atau 0xffffffff),
dan ketika tidak ada nilai negatif lain yang diizinkan (atau ketika nilai
besar yang tidak bertanda tidak mungkin diperlukan).
Berikut beberapa contoh formatnya:
| Urutan yang Dienkode | Sebagai sleb128 | Sebagai uleb128 | Sebagai uleb128p1 | 
|---|---|---|---|
| 00 | 0 | 0 | -1 | 
| 01 | 1 | 1 | 0 | 
| 7f | -1 | 127 | 126 | 
| 80 7f | -128 | 16256 | 16255 | 
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, deskriptor jenis) atau sebagai objek konstanta yang dirujuk oleh kode. Daftar ini harus diurutkan berdasarkan konten string, menggunakan nilai titik kode UTF-16 (tidak 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 berdasarkan 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 yang ditampilkan (berdasarkan indeks type_id), lalu
    berdasarkan daftar argumen (pengurutan leksikografis, setiap argumen
    diurutkan berdasarkan indekstype_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 yang ditentukan dalam file maupun tidak. Daftar
    ini harus diurutkan, dengan jenis yang menentukan (berdasarkan indeks type_id) adalah urutan utama, nama kolom (berdasarkan indeksstring_id)
    adalah urutan menengah, dan jenis (berdasarkan indekstype_id)
    adalah urutan kecil. 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 yang ditentukan dalam file maupun tidak. Daftar
    ini harus diurutkan, dengan jenis yang menentukan (berdasarkan indeks type_id) adalah urutan utama, nama metode (berdasarkan indeksstring_id) adalah urutan menengah, dan prototipe metode (berdasarkan
    indeksproto_id) adalah urutan kecil.  Daftar tidak boleh
    berisi entri duplikat. | 
| class_defs | class_def_item[] | daftar definisi class. Class harus diurutkan sedemikian rupa sehingga superclass dan antarmuka yang diimplementasikan oleh class tertentu muncul dalam daftar sebelum class yang merujuk. 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 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 kebutuhan. | 
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 berupa penggabungan file dalam format sebelumnya, dengan beberapa perbedaan:
- file_sizeadalah ukuran file logis, bukan file fisik. Objek ini dapat digunakan untuk melakukan iterasi pada semua file logis dalam penampung.
- File dex logis dapat mereferensikan data apa pun yang lebih baru dalam penampung (tetapi tidak yang lebih lama). Hal ini memungkinkan file dex berbagi data, seperti string, di antara keduanya.
- 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 menjelaskan batas penampung. Ini adalah pemeriksaan konsistensi tambahan dan mempermudah porting kode ke format baru.
- data_sizedan- data_offsekarang 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 konstanta DEX_FILE_MAGIC adalah daftar byte yang harus muncul di awal file .dex agar dikenali sebagai file tersebut. Nilai sengaja
berisi baris baru ("\n" atau 0x0a) dan
byte null ("\0" atau 0x00) untuk membantu
mendeteksi bentuk kerusakan tertentu. Nilai ini juga
mengenkode nomor versi format sebagai tiga digit desimal, yang
diharapkan 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 041 bersifat eksperimental dalam rilis Android 16 untuk menguji format penampung.
Namun, versi 041 tidak boleh digunakan untuk kode produksi.
Catatan: Dukungan untuk format 040 ditambahkan dalam rilis Android 10.0, yang memperluas kumpulan karakter yang diizinkan dalam SimpleName.
Catatan: Dukungan untuk format 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 boot.
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 konstanta tersebut ditemukan. Meskipun format .dex standar adalah little-endian, penerapan dapat memilih untuk melakukan pertukaran byte. Jika implementasi menemukan header yang endian_tag-nya adalah REVERSE_ENDIAN_CONSTANT, bukan ENDIAN_CONSTANT, implementasi tersebut akan mengetahui bahwa file telah ditukar byte-nya 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 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 referensithisluar | static: global ke kelas yang menentukan | static: tidak menerima argumenthis | 
| ACC_FINAL | 0x10 | final: tidak dapat dibuat subclass | final: tidak dapat diubah setelah dibuat | final: tidak dapat diganti | 
| ACC_SYNCHRONIZED | 0x20 | synchronized: kunci terkait diperoleh secara otomatis
    di sekitar panggilan ke metode ini.Catatan: Atribut ini hanya valid untuk ditetapkan jika
     | ||
| ACC_VOLATILE | 0x40 | volatile: aturan akses khusus untuk membantu keamanan
    thread | ||
| ACC_BRIDGE | 0x40 | metode jembatan, ditambahkan secara otomatis oleh compiler sebagai jembatan yang aman untuk jenis | ||
| ACC_TRANSIENT | 0x80 | transient: tidak disimpan oleh serialisasi default | ||
| ACC_VARARGS | 0x80 | argumen terakhir harus diperlakukan sebagai argumen "rest" oleh compiler | ||
| ACC_NATIVE | 0x100 | native: diimplementasikan dalam kode native | ||
| ACC_INTERFACE | 0x200 | interface: class abstrak yang dapat diimplementasikan secara berulang | ||
| ACC_ABSTRACT | 0x400 | abstract: tidak dapat di-instantiate secara langsung | abstract: tidak diterapkan 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 yang di-enum | dideklarasikan sebagai nilai yang disebutkan | |
| (tidak digunakan) | 0x8000 | |||
| ACC_CONSTRUCTOR | 0x10000 | metode konstruktor (penginisialisasi class atau instance) | ||
| ACC_DECLARED_ SYNCHRONIZED | 0x20000 | menyatakan synchronized.Catatan: Hal ini tidak memengaruhi eksekusi (selain dalam refleksi tanda ini, dengan sendirinya). | 
InnerClass,
dan tidak boleh ada 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. Bentuk ini identik dengan UTF-8 standar, kecuali:
- Hanya encoding satu, dua, dan tiga byte yang digunakan.
- Titik kode dalam rentang U+10000…U+10ffffdienkode sebagai pasangan pengganti, yang masing-masing ditampilkan sebagai nilai yang dienkode tiga byte.
- Titik kode U+0000dienkode 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 secara bersamaan untuk menyertakan
titik kode U+0000 dalam string dan tetap memanipulasinya
sebagai string yang dihentikan null gaya 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 string tidak sama yang ditandatangani dengan benar.
Jika pengurutan (bukan hanya kesamaan) menjadi masalah, cara paling mudah untuk membandingkan string MUTF-8 adalah dengan mendekodenya karakter demi karakter, dan membandingkan nilai yang telah didekode. (Namun, implementasi yang lebih cerdas juga
mungkin dilakukan.)
Lihat Standar Unicode untuk mengetahui informasi selengkapnya tentang encoding karakter. MUTF-8 sebenarnya lebih dekat dengan encoding CESU-8 (yang relatif kurang dikenal) daripada UTF-8 itu sendiri.
Encoding encoded_value
Disematkan dalam annotation_element dan encoded_array_item
encoded_value adalah bagian data terstruktur hierarkis (hampir)
arbitrer yang dienkode. Encoding ini dimaksudkan agar ringkas dan mudah diurai.
| Nama | Format | Deskripsi | 
|---|---|---|
| (value_arg << 5) | value_type | ubyte | byte yang menunjukkan jenis valueyang langsung mengikuti bersama dengan argumen klarifikasi opsional dalam tiga bit tingkat tinggi.
    Lihat di bawah untuk mengetahui berbagai definisivalue.
    Dalam kebanyakan kasus,value_argmengenkode panjangvalueyang segera mengikuti dalam byte, sebagai(size - 1), misalnya,0berarti nilai memerlukan satu byte, dan7berarti nilai memerlukan delapan byte; namun, ada pengecualian seperti yang tercantum di bawah. | 
| nilai | ubyte[] | byte yang merepresentasikan nilai, panjang variabel, dan ditafsirkan
    secara berbeda untuk byte value_typeyang 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 | (tidak ada; harus 0) | ubyte[1] | nilai bilangan bulat satu byte yang ditandai | 
| VALUE_SHORT | 0x02 | ukuran - 1 (0…1) | ubyte[size] | nilai bilangan bulat dua byte bertanda, diperluas tanda | 
| VALUE_CHAR | 0x03 | ukuran - 1 (0…1) | ubyte[size] | nilai bilangan bulat dua byte yang tidak bertanda, diperluas dengan nol | 
| VALUE_INT | 0x04 | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte bertanda, yang diperluas tanda | 
| VALUE_LONG | 0x06 | ukuran - 1 (0…7) | ubyte[size] | nilai bilangan bulat delapan byte bertanda, yang diperluas tanda | 
| VALUE_FLOAT | 0x10 | ukuran - 1 (0…3) | ubyte[size] | pola bit empat byte, diperluas dengan 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 dengan 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 bertanda (diperluas nol),
    ditafsirkan sebagai indeks ke dalam
    bagian proto_idsdan merepresentasikan nilai jenis metode | 
| VALUE_METHOD_HANDLE | 0x16 | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak bertanda (diperluas ke nol),
    ditafsirkan sebagai indeks ke dalam
    bagian method_handlesdan merepresentasikan nilai handle metode | 
| VALUE_STRING | 0x17 | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak bertanda (diperluas nol),
    ditafsirkan sebagai indeks ke dalam
    bagian string_idsdan merepresentasikan nilai string | 
| VALUE_TYPE | 0x18 | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak bertanda (diperluas nol),
    ditafsirkan sebagai indeks ke dalam
    bagian type_idsdan merepresentasikan nilai
    jenis/class reflektif | 
| VALUE_FIELD | 0x19 | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak bertanda (diperluas ke nol),
    ditafsirkan sebagai indeks ke dalam
    bagian field_idsdan merepresentasikan nilai kolom
    reflektif | 
| VALUE_METHOD | 0x1a | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak bertanda (diperluas dengan nol),
    ditafsirkan sebagai indeks ke dalam
    bagian method_idsdan merepresentasikan nilai metode
    reflektif | 
| VALUE_ENUM | 0x1b | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak bertanda (diperluas ke nol),
    ditafsirkan sebagai indeks ke dalam
    bagian field_idsdan merepresentasikan nilai
    konstanta jenis yang di-enum | 
| VALUE_ARRAY | 0x1c | (tidak ada; harus 0) | encoded_array | array nilai, dalam format yang ditentukan oleh
    "format encoded_array" di bawah. Ukuranvaluetersirat dalam encoding. | 
| VALUE_ANNOTATION | 0x1d | (tidak ada; harus 0) | encoded_annotation | sub-anotasi, dalam format yang ditentukan oleh
    "format encoded_annotation" di bawah. Ukuranvaluetersirat dalam encoding. | 
| VALUE_NULL | 0x1e | (tidak ada; harus 0) | (tidak ada) | Nilai referensi null | 
| VALUE_BOOLEAN | 0x1f | boolean (0…1) | (tidak ada) | nilai satu bit; 0untukfalsedan1untuktrue. Bit diwakili dalamvalue_arg. | 
Format encoded_array
| Nama | Format | Deskripsi | 
|---|---|---|
| ukuran | uleb128 | jumlah elemen dalam array | 
| nilai | encoded_value[size] | serangkaian urutan byte sizeencoded_valuedalam format yang ditentukan oleh bagian ini, digabungkan secara berurutan. | 
Format encoded_annotation
| Nama | Format | Deskripsi | 
|---|---|---|
| type_idx | uleb128 | jenis anotasi. Ini harus berupa class (bukan array atau jenis primitif). | 
| ukuran | uleb128 | jumlah pemetaan nama-nilai dalam anotasi ini | 
| elemen | annotation_element[size] | elemen anotasi, yang ditampilkan langsung secara 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 dalam
    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 sintaks yang dapat diterima untuk string ini.
SimpleName
SimpleName adalah dasar untuk sintaksis nama hal-hal
lainnya. Format .dex memungkinkan sejumlah besar keleluasaan di sini (jauh lebih banyak daripada sebagian besar bahasa sumber umum). Singkatnya, nama
sederhana terdiri dari karakter atau digit alfabet ASCII rendah, beberapa
simbol ASCII rendah tertentu, dan sebagian besar titik kode non-ASCII yang bukan
karakter kontrol, spasi, atau khusus. Mulai dari versi 040
format ini juga mengizinkan karakter spasi (kategori Unicode Zs
). Perhatikan bahwa poin kode pengganti
(dalam rentang U+d800 … U+dfff) tidak
dianggap sebagai karakter nama yang valid, tetapi karakter tambahan Unicode valid (yang diwakili oleh alternatif terakhir aturan untuk SimpleNameChar), dan karakter tersebut harus diwakili dalam file sebagai pasangan poin 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+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 | |
MemberName
digunakan oleh field_id_item dan method_id_item
MemberName adalah nama anggota class, dengan anggota berupa 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 dari jenis apa pun, termasuk
primitif, class, array, dan void. Lihat di bawah untuk mengetahui arti 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 tidak ada
perbedaan antara berbagai jenis referensi (class atau array). Sebaliknya,
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
Berikut 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 | 
| Lfully/qualified/Name; | kelas fully.qualified.Name | 
| [deskriptor | array descriptor, dapat digunakan secara rekursif untuk
    array-array, meskipun tidak valid jika memiliki lebih dari 255
    dimensi. | 
Item dan struktur terkait
Bagian ini mencakup definisi untuk setiap item tingkat teratas 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 ajaib. Lihat diskusi di atas di bagian " DEX_FILE_MAGIC"
    untuk mengetahui detail selengkapnya. | 
| checksum | uint | checksum adler32 dari bagian file lainnya (semua kecuali magicdan kolom ini); digunakan untuk mendeteksi kerusakan file | 
| tanda tangan | ubyte[20] | Tanda tangan (hash) SHA-1 dari bagian file lainnya (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 (container). (v41 atau yang lebih baru) | 
| header_size | uint | ukuran header (seluruh bagian ini), dalam byte. Hal ini memungkinkan setidaknya sejumlah kecil kompatibilitas mundur/maju 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_CONSTANTdanREVERSE_ENDIAN_CONSTANT" untuk mengetahui detail selengkapnya. | 
| link_size | uint | ukuran bagian link, atau 0jika file ini tidak
    ditautkan secara statis | 
| link_off | uint | offset dari awal file ke bagian link, atau 0jikalink_size == 0. Jika bukan nol, offset
    harus berupa offset ke bagianlink_data. Format
    data yang ditunjuk tidak ditentukan oleh dokumen ini;
    kolom header 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 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 0jikastring_ids_size == 0(memang
    kasus ekstrem yang aneh). Offset, jika bukan nol,
    harus berada di awal bagianstring_ids. | 
| type_ids_size | uint | jumlah elemen dalam daftar ID jenis, paling banyak 65535 | 
| type_ids_off | uint | offset dari awal file ke daftar ID jenis, atau 0jikatype_ids_size == 0(memang
    kasus ekstrem yang aneh). Jika bukan nol, offset
    harus berada di awal bagiantype_ids. | 
| proto_ids_size | uint | jumlah elemen dalam daftar ID prototipe, paling banyak 65535 | 
| proto_ids_off | uint | offset dari awal file ke daftar ID prototipe, atau 0jikaproto_ids_size == 0(memang
    kasus ekstrem yang aneh). Jika bukan nol, offset
    harus berada di awal bagianproto_ids. | 
| field_ids_size | uint | jumlah elemen dalam daftar ID kolom | 
| field_ids_off | uint | offset dari awal file ke daftar ID kolom, atau 0jikafield_ids_size == 0. Offset, jika
    bukan nol, harus berada di awal bagianfield_ids. | 
| method_ids_size | uint | jumlah elemen dalam daftar ID metode | 
| method_ids_off | uint | offset dari awal file ke daftar ID metode, atau 0jikamethod_ids_size == 0. Offset, jika
    bukan nol, harus berada di awal bagianmethod_ids. | 
| class_defs_size | uint | jumlah elemen dalam daftar definisi class | 
| class_defs_off | uint | offset dari awal file ke daftar definisi class, atau 0jikaclass_defs_size == 0(memang
    kasus ekstrem yang aneh). Offset, jika bukan nol,
    harus berada di awal bagianclass_defs. | 
| data_size | uint | Ukuran bagian  Tidak digunakan (v41 atau yang lebih baru) | 
| data_off | uint | offset dari awal file ke awal bagian  Tidak digunakan (v41 atau yang lebih baru) | 
| container_size | uint | Kolom ini tidak ada. Dapat diasumsikan sama dengan  ukuran seluruh file (termasuk header dex lainnya dan datanya). (v41 atau yang lebih baru) | 
| header_offset | uint | Kolom ini tidak ada. Dapat diasumsikan sama dengan  offset dari awal file ke awal header ini. (v41 atau yang lebih baru) | 
map_list
Muncul di bagian data
Direferensikan dari header_item
Penyelarasan: 4 byte
Ini adalah daftar seluruh isi file, secara berurutan. Objek ini
berisi beberapa redundansi terkait header_item
tetapi dimaksudkan sebagai formulir yang mudah digunakan untuk melakukan iterasi pada seluruh
file. Jenis tertentu hanya boleh muncul paling banyak satu kali dalam peta, tetapi tidak ada batasan urutan jenis yang dapat muncul, selain batasan yang tersirat dalam format lainnya (misalnya, bagian header harus muncul terlebih dahulu, diikuti dengan bagian 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 | 
| list | 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 diurai | 
| code_item | TYPE_CODE_ITEM | 0x2001 | implisit; harus diurai | 
| string_data_item | TYPE_STRING_DATA_ITEM | 0x2002 | implisit; harus diurai | 
| debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | implisit; harus diurai | 
| annotation_item | TYPE_ANNOTATION_ITEM | 0x2004 | implisit; harus diurai | 
| encoded_array_item | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | implisit; harus diurai | 
| annotations_directory_item | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | implisit; harus diurai | 
| hiddenapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | implisit; harus diurai | 
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
Penyelarasan: 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 dari posisi byte 0.) | 
| data | ubyte[] | serangkaian unit kode MUTF-8 (alias oktet, alias byte)
    diikuti dengan byte bernilai 0. Lihat
    "Encoding MUTF-8 (UTF-8 Modifikasi)" di atas untuk mengetahui detail dan
    pembahasan tentang format data.Catatan: String yang menyertakan
    (bentuk yang dienkode dari) unit kode pengganti UTF-16 (yaitu,
     | 
type_id_item
Muncul di bagian type_ids
Penyelarasan: 4 byte
| Nama | Format | Deskripsi | 
|---|---|---|
| descriptor_idx | uint | indeks ke dalam daftar string_idsuntuk string
    deskriptor 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_idsuntuk string
    deskriptor bentuk pendek 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_idsuntuk jenis nilai yang ditampilkan
    dari prototipe ini | 
| parameters_off | uint | offset dari awal file ke daftar jenis parameter
    untuk prototipe ini, atau 0jika prototipe ini tidak memiliki
    parameter. Jika tidak nol, offset ini harus berada di bagiandata, dan data di sana harus dalam
    format yang ditentukan oleh"type_list"di bawah. Selain itu, tidak boleh ada referensi ke jenisvoiddalam daftar. | 
field_id_item
Muncul di bagian field_ids
Penyelarasan: 4 byte
| Nama | Format | Deskripsi | 
|---|---|---|
| class_idx | ushort | indeks ke dalam daftar type_idsuntuk penentu kolom ini. Ini harus berupa jenis class, dan bukan jenis array atau primitif. | 
| type_idx | ushort | indeks ke dalam daftar type_idsuntuk jenis
    kolom ini | 
| name_idx | uint | indeks ke dalam daftar string_idsuntuk 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_idsuntuk penentu metode ini. Ini harus berupa jenis class atau array, dan bukan jenis primitif. | 
| proto_idx | ushort | indeks ke dalam daftar proto_idsuntuk prototipe
    metode ini | 
| name_idx | uint | indeks ke dalam daftar string_idsuntuk 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_idsuntuk kelas ini.
    Ini harus berupa jenis class, dan bukan jenis array atau primitif. | 
| access_flags | uint | flag akses untuk class ( public,final,
    dll.). Lihat "Definisiaccess_flags" untuk mengetahui detailnya. | 
| superclass_idx | uint | indeks ke dalam daftar type_idsuntuk superclass, atau
    nilai konstantaNO_INDEXjika class ini tidak memiliki
    superclass (yaitu, class ini adalah class root sepertiObject).
    Jika ada, ini harus berupa jenis class, dan bukan jenis array atau primitif. | 
| interfaces_off | uint | offset dari awal file ke daftar antarmuka, atau 0jika tidak ada. Offset ini
    harus berada di bagiandata, dan data
    di sana harus dalam format yang ditentukan oleh
    "type_list" di bawah. Setiap elemen daftar
    harus berupa jenis class (bukan jenis array atau primitif), dan tidak
    boleh ada duplikat. | 
| source_file_idx | uint | indeks ke dalam daftar string_idsuntuk nama
    file yang berisi sumber asli untuk (setidaknya sebagian besar) class ini,
    atau nilai khususNO_INDEXuntuk menunjukkan tidak adanya
    informasi ini.debug_info_itemdari metode tertentu
    dapat menggantikan file sumber ini, tetapi sebagian besar class
    diharapkan hanya berasal dari satu file sumber. | 
| annotations_off | uint | offset dari awal file ke struktur anotasi
    untuk class ini, atau 0jika tidak ada anotasi pada
    class ini. Jika tidak nol, offset ini harus berada di bagiandata, 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 kelas terkait untuk item ini, atau 0jika tidak ada data kelas untuk kelas ini. (Hal ini mungkin terjadi, misalnya, jika class ini
    adalah antarmuka penanda.) Jika tidak nol, offset harus berada di bagiandata, dan data di sana harus dalam
    format yang ditentukan oleh "class_data_item" di bawah, dengan semua
    item merujuk ke class ini sebagai penentu. | 
| static_values_off | uint | offset dari awal file ke daftar nilai awal untuk kolom static, atau0jika tidak ada (dan semua kolomstaticakan diinisialisasi dengan0ataunull). Offset ini harus berada di bagiandata, dan data di sana harus dalam format yang ditentukan oleh "encoded_array_item" di bawah. Ukuran
    array tidak boleh lebih besar dari jumlah kolomstaticyang dideklarasikan oleh class ini, dan elemen sesuai dengan
    kolomstaticdalam urutan yang sama seperti yang dideklarasikan dalamfield_listyang sesuai. Jenis setiap elemen
    array harus cocok dengan jenis yang dideklarasikan dari kolom yang sesuai.
    Jika jumlah elemen dalam array lebih sedikit daripada jumlah kolomstatic, kolom yang tersisa akan diinisialisasi dengan0ataunullyang 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 ada di bagian data, dan data di sana harus dalam format yang ditentukan oleh "call_site_item" di bawah. | 
item_situs_panggilan
Muncul di bagian data
Penyelarasan: tidak ada (diselaraskan byte)
call_site_item adalah encoded_array_item yang elemennya sesuai dengan argumen yang diberikan ke metode linker bootstrap. Tiga argumen pertama adalah:
- Handle metode yang merepresentasikan metode linker bootstrap (VALUE_METHOD_HANDLE).
- Nama metode yang harus diselesaikan oleh linker bootstrap (VALUE_STRING).
- Jenis metode yang sesuai dengan jenis nama metode yang akan diselesaikan (VALUE_METHOD_TYPE).
Argumen tambahan adalah nilai konstanta yang diteruskan ke metode linker bootstrap. Argumen ini diteruskan secara berurutan dan tanpa konversi jenis apa pun.
Tuas metode yang merepresentasikan metode linker bootstrap harus memiliki jenis nilai yang ditampilkan java.lang.invoke.CallSite. Tiga jenis parameter pertama adalah:
- java.lang.invoke.Lookup
- java.lang.String
- 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 kolom statis (pengakses) | 
| METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | Handle metode adalah pengambil (pengakses) kolom statis | 
| METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | Tuas 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 | Tuas 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
Penyelarasan: 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, ditampilkan sebagai urutan
    elemen yang dienkode. Kolom harus diurutkan berdasarkan field_idxdalam urutan menaik. | 
| instance_fields | encoded_field[instance_fields_size] | kolom instance yang ditentukan, yang ditampilkan sebagai urutan
    elemen yang dienkode. Kolom harus diurutkan berdasarkan field_idxdalam urutan menaik. | 
| direct_methods | encoded_method[direct_methods_size] | metode langsung yang ditentukan ( static,private,
    atau konstruktor), yang ditampilkan sebagai urutan
    elemen yang dienkode. Metode harus diurutkan berdasarkanmethod_idxdalam urutan menaik. | 
| virtual_methods | encoded_method[virtual_methods_size] | metode virtual yang ditentukan (bukan static,private,
    atau konstruktor), yang ditampilkan sebagai urutan
    elemen yang dienkode. Daftar ini tidak boleh menyertakan metode
    yang diwariskan kecuali jika diganti oleh class yang diwakili oleh item ini. Metode
    harus diurutkan berdasarkanmethod_idxdalam urutan menaik.method_idxmetode virtual tidak boleh sama
    dengan metode langsung mana 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_idsuntuk identitas
    kolom ini (mencakup nama dan deskriptor), yang ditampilkan sebagai perbedaan
    dari indeks elemen sebelumnya dalam daftar. Indeks elemen pertama dalam daftar ditampilkan secara langsung. | 
| access_flags | uleb128 | flag akses untuk kolom ( public,final,
    dll.). Lihat "Definisiaccess_flags" untuk mengetahui detailnya. | 
Format encoded_method
| Nama | Format | Deskripsi | 
|---|---|---|
| method_idx_diff | uleb128 | indeks ke dalam daftar method_idsuntuk identitas
    metode ini (mencakup nama dan deskriptor), yang ditampilkan sebagai perbedaan
    dari indeks elemen sebelumnya dalam daftar. Indeks elemen pertama dalam daftar ditampilkan secara langsung. | 
| access_flags | uleb128 | flag akses untuk metode ( public,final,
    dll.). Lihat "Definisiaccess_flags" untuk mengetahui detailnya. | 
| code_off | uleb128 | offset dari awal file ke struktur kode untuk metode ini, atau 0jika metode ini adalahabstractataunative. Offset harus ke lokasi di bagiandata. 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 | 
| list | type_item[size] | elemen daftar | 
Format type_item
| Nama | Format | Deskripsi | 
|---|---|---|
| type_idx | ushort | indeks ke dalam daftar type_ids | 
code_item
Direferensikan 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 dari argumen masuk ke metode yang kode ini ditujukan untuknya | 
| outs_size | ushort | jumlah kata ruang argumen keluar yang diperlukan oleh kode ini untuk pemanggilan metode | 
| tries_size | ushort | jumlah try_itemuntuk instance ini. Jika bukan nol,
    maka ini akan muncul sebagai arraytriestepat setelahinsnsdalam instance ini. | 
| debug_info_off | uint | offset dari awal file ke urutan info proses debug (nomor baris +
    info variabel lokal) untuk kode ini, atau 0jika
    tidak ada informasi. Jika bukan nol, offset harus
    ke lokasi di bagiandata. 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 sebenarnya. Format kode dalam array insnsditentukan oleh dokumen pendamping
    bytecode Dalvik. Perhatikan
    bahwa meskipun ini ditentukan sebagai arrayushort, ada
    beberapa struktur internal yang lebih memilih perataan empat byte. Selain itu,
    jika ini terjadi pada file yang diubah endian, maka pengubahan
    hanya dilakukan pada setiap instanceushortdan bukan pada
    struktur internal yang lebih besar. | 
| padding | ushort (opsional) = 0 | dua byte padding untuk membuat triessejajar empat byte.
    Elemen ini hanya ada jikatries_sizebukan nol
    daninsns_sizeganjil. | 
| mencoba | try_item[tries_size] (opsional) | array yang menunjukkan tempat pengecualian ditangkap dalam kode 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_sizebukan nol. | 
| handler | encoded_catch_handler_list (opsional) | byte yang merepresentasikan daftar daftar jenis penangkapan dan alamat
    handler terkait. Setiap try_itemmemiliki offset byte-wise
    ke dalam struktur ini. Elemen ini hanya ada jikatries_sizebukan nol. | 
Format try_item
| Nama | Format | Deskripsi | 
|---|---|---|
| start_addr | uint | alamat awal blok kode yang tercakup dalam entri ini. Alamat adalah jumlah unit kode 16-bit ke awal instruksi 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_listterkait hinggaencoded_catch_handleruntuk entri ini. Ini harus berupa
    offset ke awalencoded_catch_handler. | 
Format encoded_catch_handler_list
| Nama | Format | Deskripsi | 
|---|---|---|
| ukuran | uleb128 | ukuran daftar ini, dalam entri | 
| list | encoded_catch_handler[handlers_size] | daftar sebenarnya dari daftar pengendali, yang ditampilkan secara langsung (bukan sebagai offset), dan digabungkan secara berurutan | 
Format encoded_catch_handler
| Nama | Format | Deskripsi | 
|---|---|---|
| ukuran | sleb128 | jumlah jenis penangkapan dalam daftar ini. Jika non-positif, maka ini adalah
    negatif dari jumlah jenis penangkapan, dan penangkapan diikuti
    oleh handler catch-all. Misalnya: size0berarti ada penangkapan semua, tetapi tidak ada penangkapan yang diketik secara eksplisit.size2berarti ada dua pengambilan yang diketik secara eksplisit dan tidak ada pengambilan semua.size-1berarti ada satu penangkapan yang diketik bersama dengan penangkapan semua. | 
| handler | 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 handler catch-all. Elemen ini hanya ada jika sizetidak positif. | 
Format encoded_type_addr_pair
| Nama | Format | Deskripsi | 
|---|---|---|
| type_idx | uleb128 | indeks ke dalam daftar type_idsuntuk jenis
    pengecualian yang akan ditangkap | 
| addr | uleb128 | alamat bytecode dari exception handler terkait | 
debug_info_item
Dirujuk dari code_item
Muncul di bagian data
Penyelarasan: tidak ada (diselaraskan byte)
Setiap debug_info_item menentukan mesin status byte-coded yang terinspirasi dari DWARF3 yang, saat ditafsirkan, memancarkan tabel posisi dan (berpotensi) informasi variabel lokal untuk code_item. Urutan dimulai dengan header
berpanjang variabel (yang 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 merepresentasikan offset instruksi 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 menunjukkan nomor baris sumber yang harus dikaitkan dengan entri tabel posisi berikutnya yang dikeluarkan oleh mesin status. Nilai ini diinisialisasi di header urutan, dan dapat
berubah ke arah positif atau negatif, tetapi tidak boleh kurang dari
1. Register source_file mewakili
file sumber yang dirujuk oleh entri nomor baris. Diinisialisasi ke
nilai source_file_idx di class_def_item.
Dua variabel lainnya, prologue_end dan
epilogue_begin, adalah tanda boolean (diinisialisasi ke
false) yang menunjukkan apakah posisi berikutnya yang dikeluarkan
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.
Header-nya adalah sebagai berikut:
| Nama | Format | Deskripsi | 
|---|---|---|
| line_start | uleb128 | nilai awal untuk register linemesin status.
    Tidak merepresentasikan entri posisi sebenarnya. | 
| parameters_size | uleb128 | jumlah nama parameter yang dienkode. Harus ada
   satu per parameter metode, tidak termasuk thismetode instance,
   jika ada. | 
| parameter_names | uleb128p1[parameters_size] | Indeks string nama parameter metode. Nilai yang dienkode dari NO_INDEXmenunjukkan bahwa tidak ada nama
   yang tersedia untuk parameter terkait. Deskripsi jenis
   dan tanda tangan tersirat dari deskripsi dan tanda tangan metode. | 
Nilai kode byte adalah sebagai berikut:
| Nama | Nilai | Format | Argumen | Deskripsi | 
|---|---|---|---|---|
| DBG_END_SEQUENCE | 0x00 | (tidak ada) | mengakhiri urutan info debug untuk code_item | |
| DBG_ADVANCE_PC | 0x01 | uleb128 addr_diff | addr_diff: jumlah yang akan ditambahkan ke pendaftaran alamat | memajukan pendaftaran alamat tanpa memancarkan entri posisi | 
| DBG_ADVANCE_LINE | 0x02 | sleb128 line_diff | line_diff: jumlah perubahan register baris | memajukan pendaftaran baris tanpa memancarkan entri posisi | 
| DBG_START_LOCAL | 0x03 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx | register_num: register yang akan berisiname_idx: indeks string dari namatype_idx: indeks jenis dari jenis | memperkenalkan variabel lokal di alamat saat ini. name_idxatautype_idxdapat berupaNO_INDEXuntuk 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 berisiname_idx: indeks string namatype_idx: indeks jenis dari jenissig_idx: indeks string tanda tangan jenis | memperkenalkan lokal dengan tanda tangan jenis di alamat saat ini. name_idx,type_idx, atausig_idxdapat berupaNO_INDEXuntuk menunjukkan bahwa nilai tersebut tidak diketahui. (Namun, jikasig_idxadalah-1, data yang sama dapat direpresentasikan secara lebih
    efisien menggunakan opcodeDBG_START_LOCAL.)Catatan: Lihat diskusi di bagian
    " | 
| 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: mendaftar untuk memulai ulang | 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 | (tidak ada) | menetapkan register mesin status prologue_end,
    yang menunjukkan bahwa entri posisi berikutnya yang ditambahkan harus
    dianggap sebagai akhir prolog metode (tempat yang tepat untuk
    titik henti sementara metode). Registerprologue_enddihapus oleh kode operasi khusus (>= 0x0a) apa pun. | |
| 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 tepat
    untuk menangguhkan eksekusi sebelum keluar dari metode).
    Registerepilogue_begindihapus oleh kode operasi khusus
    (>= 0x0a) apa pun. | |
| DBG_SET_FILE | 0x09 | uleb128p1 name_idx | name_idx: indeks string nama file sumber;NO_INDEXjika tidak diketahui | menunjukkan bahwa semua entri nomor baris berikutnya merujuk ke nama file sumber ini, bukan nama default yang ditentukan dalam code_item | 
| Opcodes Khusus | 0x0a…0xff | (tidak ada) | memajukan register linedanaddress,
    memancarkan entri posisi, dan menghapusprologue_enddanepilogue_begin. Lihat deskripsi di bawah. | 
Opcodes khusus
Opcode dengan nilai antara 0x0a dan 0xff
(inklusif) memindahkan register line dan address
dalam jumlah kecil, lalu memancarkan entri tabel posisi baru.
Rumus untuk kenaikan 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
    pada class, atau 0jika class tidak memiliki anotasi langsung.
    Jika bukan nol, offset harus berada di lokasi di bagiandata. Format data ditentukan
    oleh "annotation_set_item" di bawah. | 
| fields_size | uint | jumlah kolom yang diberi anotasi oleh item ini | 
| annotated_methods_size | uint | jumlah metode yang dianotasi oleh item ini | 
| annotated_parameters_size | uint | jumlah daftar parameter metode yang diberi anotasi oleh item ini | 
| field_annotations | field_annotation[fields_size] (opsional) | daftar anotasi kolom terkait. Elemen daftar harus
    diurutkan dalam urutan menaik, berdasarkan field_idx. | 
| method_annotations | method_annotation[methods_size] (opsional) | daftar anotasi metode terkait. Elemen daftar harus
    diurutkan dalam urutan menaik, berdasarkan method_idx. | 
| parameter_annotations | parameter_annotation[parameters_size] (opsional) | daftar anotasi parameter metode terkait. Elemen
    daftar harus diurutkan dalam urutan menaik, berdasarkan 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 | indeks ke dalam daftar field_idsuntuk identitas
    kolom yang diberi anotasi | 
| annotations_off | uint | offset dari awal file ke daftar anotasi untuk
    kolom. Offset harus ke lokasi di bagian data. Format data ditentukan oleh
    "annotation_set_item" di bawah. | 
format method_annotation
| Nama | Format | Deskripsi | 
|---|---|---|
| method_idx | uint | indeks ke dalam daftar method_idsuntuk identitas
    metode yang diberi anotasi | 
| 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_idsuntuk identitas
    metode yang parameternya diberi anotasi | 
| 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 | 
| list | annotation_set_ref_item[size] | elemen daftar | 
Format annotation_set_ref_item
| Nama | Format | Deskripsi | 
|---|---|---|
| annotations_off | uint | offset dari awal file ke set anotasi yang dirujuk
    atau 0jika tidak ada anotasi untuk elemen ini.
    Jika bukan nol, offset harus berada di lokasi di bagiandata. Format data ditentukan oleh
    "annotation_set_item" di bawah. | 
annotation_set_item
Direferensikan 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 kumpulan. Elemen harus diurutkan dalam urutan menaik,
    berdasarkan type_idx. | 
Format annotation_off_item
| Nama | Format | Deskripsi | 
|---|---|---|
| annotation_off | uint | offset dari awal file ke anotasi.
    Offset harus berada di lokasi dalam bagian data,
    dan format data di lokasi tersebut ditentukan oleh
    "annotation_item" di bawah. | 
annotation_item
Direferensikan dari annotation_set_item
Muncul di bagian data
Penyelarasan: 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
    "enkodeencoded_value" di atas. | 
Nilai visibilitas
Berikut adalah opsi untuk kolom visibility dalam
annotation_item:
| Nama | Nilai | Deskripsi | 
|---|---|---|
| VISIBILITY_BUILD | 0x00 | hanya dimaksudkan agar terlihat pada waktu build (misalnya, selama kompilasi kode lain) | 
| VISIBILITY_RUNTIME | 0x01 | ditujukan agar terlihat saat runtime | 
| VISIBILITY_SYSTEM | 0x02 | ditujukan agar terlihat saat runtime, tetapi hanya oleh sistem yang mendasarinya (dan bukan oleh kode pengguna biasa) | 
encoded_array_item
Direferensikan dari class_def_item
Muncul di bagian data
Penyelarasan: tidak ada (diselaraskan byte)
| Nama | Format | Deskripsi | 
|---|---|---|
| nilai | encoded_array | byte yang merepresentasikan nilai array yang dienkode, dalam format yang ditentukan
    oleh "Format encoded_array" di bagian "encoded_valueEncoding" 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 boot. 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 indeksclass_idxberarti bahwa
    tidak ada data untukclass_idxini, atau semua flag API
    tersembunyi adalah nol.
    Jika tidak, entri array bukan nol dan berisi offset dari
    awal bagian ke array flag API tersembunyi
    untukclass_idxini. | 
| flags | uleb128[] | array gabungan flag API tersembunyi untuk setiap class. Kemungkinan nilai tanda 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 level API 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 di bawahnya, 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 informasi reflektif tentang class (dan metode serta kolom). Informasi ini umumnya hanya diakses secara tidak langsung oleh kode klien (non-sistem).
Anotasi sistem ditampilkan 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 ditampilkan sebagai anotasi dari 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 bersifat 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 | kelas yang paling dekat cakupan leksikalnya dengan kelas 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 leksikal dengan cakupan kelas ini | 
dalvik.annotation.InnerClass
Muncul di kelas
Anotasi InnerClass dilampirkan ke setiap class
yang ditentukan dalam cakupan leksikal definisi class lain.
Setiap class yang memiliki anotasi ini juga harus memiliki salah satu anotasi
EnclosingClass atau anotasi
EnclosingMethod.
| Nama | Format | Deskripsi | 
|---|---|---|
| nama | String | nama sederhana class ini yang dideklarasikan awalnya (tidak termasuk awalan
    paket). Jika class ini anonim, maka namanya adalah null. | 
| accessFlags | int | flag akses yang awalnya dideklarasikan untuk class (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 kelas anggota | 
dalvik.annotation.MethodParameters
Muncul di metode
Catatan: Anotasi ini ditambahkan setelah Android 7.1. Keberadaannya 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 suatu 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 dibuat seperti enum, karena metadata parameter menyertakan apakah parameter bersifat sintetis atau wajib.
Anotasi MethodParameters hanya menjelaskan parameter
metode individual. Oleh karena itu, compiler dapat menghilangkan 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.
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 parameter metode formal, bahkan yang tidak dideklarasikan secara eksplisit atau implisit dalam kode sumber, ukuran array mungkin 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 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 berupa null jika parameter formal dengan indeks tersebut tidak memiliki nama. Jika string nama parameter kosong atau berisi '.', ';', '[', atau '/', maka java.lang.reflect.MalformedParametersExceptionakan ditampilkan saat
runtime. | 
| accessFlags | int[] | Flag akses parameter formal untuk metode terkait. Array
tidak boleh null, tetapi harus kosong jika tidak ada parameter formal. Nilainya adalah mask bit dengan nilai berikut: 
 java.lang.reflect.MalformedParametersExceptionakan ditampilkan saat runtime. | 
dalvik.annotation.Signature
Muncul di class, kolom, dan metode
Anotasi Signature dilampirkan ke setiap class,
kolom, atau metode yang ditentukan dalam jenis yang lebih rumit
daripada yang dapat direpresentasikan oleh type_id_item. Format
.dex tidak menentukan format tanda tangan; format ini
hanya dimaksudkan untuk dapat merepresentasikan tanda tangan apa pun yang diperlukan
bahasa sumber agar berhasil menerapkan semantik bahasa tersebut. Oleh karena itu, tanda tangan umumnya tidak diuraikan (atau diverifikasi)
oleh implementasi virtual machine. Tanda tangan hanya diserahkan
ke API dan alat tingkat 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, dengan secara eksplisit
melindungi dirinya sendiri dari kemungkinan menemukan tanda tangan yang
tidak valid secara sintaksis.
Karena string tanda tangan cenderung memiliki banyak konten duplikat,
anotasi Signature ditentukan sebagai array dari
string, dengan elemen duplikat secara alami merujuk ke data
dasar yang sama, dan tanda tangan dianggap sebagai gabungan
semua string dalam array. Tidak ada aturan tentang cara memisahkan tanda tangan menjadi string terpisah; hal tersebut 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 memunculkan satu atau beberapa jenis pengecualian.
| Nama | Format | Deskripsi | 
|---|---|---|
| nilai | Class[] | array jenis pengecualian yang ditampilkan |