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 | int bertanda 16-bit, little-endian |
ushort | int tidak bertanda 16-bit, little-endian |
int | int bertanda 32-bit, little-endian |
uint | int tanpa tanda 32-bit, little-endian |
long | Int 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 yang ditentukan dalam file maupun 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 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 yang ditentukan dalam file maupun tidak. Daftar
ini harus diurutkan, dengan jenis yang menentukan (berdasarkan indeks type_id
) adalah urutan utama, nama kolom (berdasarkan indeks string_id )
adalah urutan menengah, dan jenis (berdasarkan indeks type_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 indeks
string_id ) adalah urutan menengah, dan prototipe metode (berdasarkan
indeks proto_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 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 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_size
adalah 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_size
dandata_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 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
ditambahkan dalam rilis Android 16, yang mendukung
format penampung.
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 Kelas (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 ke kelas yang menentukan |
static : tidak menerima argumen this |
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+10ffff
dienkode sebagai pasangan pengganti, yang masing-masing ditampilkan 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 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 value yang langsung mengikuti bersama dengan argumen klarifikasi opsional dalam tiga bit tingkat tinggi.
Lihat di bawah untuk mengetahui berbagai definisi value .
Dalam kebanyakan kasus, value_arg mengenkode panjang
value yang segera mengikuti dalam byte, sebagai
(size - 1) , misalnya, 0 berarti nilai memerlukan satu byte, dan 7 berarti 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_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 | (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_ids dan 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_handles dan 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_ids dan 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_ids dan 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_ids dan 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_ids dan 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_ids dan 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. Ukuran
value tersirat dalam encoding.
|
VALUE_ANNOTATION | 0x1d | (tidak ada; harus 0 ) |
encoded_annotation | sub-anotasi, dalam format yang ditentukan oleh
"format encoded_annotation " di bawah. Ukuran
value tersirat 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; 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, 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
magic dan kolom ini); digunakan untuk mendeteksi kerusakan file
|
tanda tangan | ubyte[20] | Tanda tangan (hash) SHA-1 dari bagian file lainnya (semua 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_CONSTANT
dan REVERSE_ENDIAN_CONSTANT " untuk mengetahui 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 . Jika bukan nol, offset
harus berupa offset ke bagian link_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
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, paling banyak 65535 |
type_ids_off | uint | offset dari awal file ke daftar ID jenis, atau
0 jika type_ids_size == 0 (memang
kasus ekstrem yang aneh). Jika bukan nol, offset
harus berada di awal bagian type_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
0 jika proto_ids_size == 0 (memang
kasus ekstrem yang aneh). Jika bukan nol, offset
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 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
Dirujuk 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
diskusi 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_ids untuk 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_ids untuk 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_ids untuk jenis nilai yang ditampilkan
dari prototipe ini
|
parameters_off | uint | offset dari awal file ke daftar jenis parameter
untuk prototipe ini, atau 0 jika prototipe ini tidak memiliki
parameter. Jika tidak nol, offset ini 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, dan bukan jenis array atau 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 kelas ini.
Ini harus berupa jenis class, dan bukan jenis array atau 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 konstanta NO_INDEX jika class ini tidak memiliki
superclass (yaitu, class ini adalah class root seperti Object ).
Jika ada, ini harus berupa jenis class, dan bukan jenis array atau 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 jenis array atau 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 menunjukkan tidak adanya
informasi ini. debug_info_item dari 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 0 jika tidak ada anotasi pada
class ini. Jika tidak nol, offset ini 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 kelas terkait untuk item ini, atau 0 jika 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 bagian
data , 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 , 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 elemen 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 jumlah elemen dalam array lebih sedikit daripada jumlah 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 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_idx dalam 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_idx dalam 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 berdasarkan
method_idx dalam 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 berdasarkan method_idx dalam urutan menaik.
method_idx metode 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_ids untuk 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 "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 (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 "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 |
list | type_item[size] | elemen daftar |
Format type_item
Nama | Format | Deskripsi |
---|---|---|
type_idx | ushort | mengindeks 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 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_item untuk instance ini. Jika bukan nol,
maka ini akan muncul sebagai array tries tepat setelah
insns dalam instance ini.
|
debug_info_off | uint | offset dari awal file ke urutan info proses debug (nomor baris +
info variabel lokal) untuk kode ini, atau 0 jika
tidak ada informasi. Jika bukan nol, offset 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 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 pada file yang endian-swapped, maka swapping
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.
|
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_size bukan nol.
|
handler | encoded_catch_handler_list (opsional) | byte yang merepresentasikan daftar daftar jenis penangkapan dan alamat
handler terkait. Setiap try_item memiliki offset byte-wise
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 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_list terkait hingga
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 |
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: size 0
berarti ada catch-all, tetapi tidak ada catch yang diketik secara eksplisit.
size 2 berarti ada dua pengambilan yang diketik secara eksplisit dan tidak ada pengambilan semua. size -1
berarti 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 size tidak positif.
|
Format encoded_type_addr_pair
Nama | Format | Deskripsi |
---|---|---|
type_idx | uleb128 | indeks ke dalam daftar type_ids untuk 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 line mesin status.
Tidak merepresentasikan entri posisi 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 yang dienkode dari
NO_INDEX menunjukkan 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 namatype_idx : indeks jenis dari 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 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 , 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
" |
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). Register prologue_end dihapus 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).
Register epilogue_begin dihapus oleh kode operasi khusus
(>= 0x0a ) apa pun.
|
|
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 merujuk ke nama file sumber ini, bukan nama default yang ditentukan dalam code_item
|
Opcodes Khusus | 0x0a…0xff | (tidak ada) | memajukan register line dan address ,
memancarkan entri posisi, dan menghapus prologue_end dan
epilogue_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 0 jika class tidak memiliki anotasi langsung.
Jika bukan nol, offset harus berada di lokasi di bagian
data . 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_ids untuk 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_ids untuk 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_ids untuk 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 0 jika tidak ada anotasi untuk elemen ini.
Jika bukan nol, offset harus berada di 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 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
"enkode encoded_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
Dirujuk 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_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 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 indeks class_idx berarti bahwa
tidak ada data untuk class_idx ini, atau semua flag 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 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 cakupan leksikalnya dengan class 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.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. Nilainya adalah mask bit dengan nilai berikut:
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 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 |