Dokumen ini menjelaskan tata letak dan konten file .dex
, yang digunakan untuk menyimpan sekumpulan definisi class dan data tambahan
terkaitnya.
Panduan jenis
Nama | Deskripsi |
---|---|
byte | int bertanda 8-bit |
ubyte | Int tanpa tanda tangan 8-bit |
short | Int bertanda 16-bit, little-endian |
ushort | Int 16-bit tanpa tanda tangan, little-endian |
int | Int bertanda 32-bit, little-endian |
uint | Int tanpa tanda 32-bit, little-endian |
long | Int bertanda 64-bit, little-endian |
ulong | Int 64-bit tanpa tanda, little-endian |
sleb128 | LEB128 bertanda, panjang variabel (lihat di bawah) |
uleb128 | LEB128 tanpa tanda tangan, panjang variabel (lihat di bawah) |
uleb128p1 | LEB128 tanpa tanda tangan plus 1 , panjang variabel (lihat di bawah) |
LEB128
LEB128 ("Little-Endian Base 128") adalah
enkode panjang variabel untuk
jumlah bilangan bulat bertanda atau tanpa tanda arbitrer. Format ini
dipinjam dari spesifikasi
DWARF3. Dalam file .dex
, LEB128 hanya digunakan untuk
mengenkode kuantitas 32-bit.
Setiap nilai yang dienkode LEB128 terdiri dari satu hingga lima
byte, yang bersama-sama mewakili satu nilai 32-bit. Setiap
byte memiliki bit paling signifikan yang ditetapkan kecuali untuk byte terakhir dalam
urutan, yang memiliki bit paling signifikan yang jelas. Tujuh
bit yang tersisa dari setiap byte adalah payload, dengan tujuh
bit yang paling tidak signifikan dari kuantitas dalam byte pertama, tujuh
bit berikutnya dalam byte kedua, dan seterusnya. Dalam kasus LEB128 yang ditandatangani (sleb128
),
bit payload paling signifikan dari byte terakhir dalam urutan
diperluas tanda untuk menghasilkan nilai akhir. Dalam kasus tanpa tanda tangan
(uleb128
), setiap bit yang tidak direpresentasikan secara eksplisit
akan ditafsirkan sebagai 0
.
Diagram bitwise nilai LEB128 dua byte | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Byte pertama | Byte kedua | ||||||||||||||
1 |
bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | 0 |
bit13 | bit12 | bit11 | bit10 | bit9 | bit8 | bit7 |
Varian uleb128p1
digunakan untuk mewakili nilai
yang ditandatangani, dengan representasi nilai plus satu yang dienkode
sebagai uleb128
. Hal ini membuat encoding -1
(atau dianggap sebagai nilai tanpa tanda tangan 0xffffffff
)
— tetapi tidak ada angka negatif lainnya — menjadi satu byte, dan
berguna persis dalam kasus ketika angka yang direpresentasikan harus
non-negatif atau -1
(atau 0xffffffff
),
dan tidak ada nilai negatif lainnya yang diizinkan (atau jika nilai besar tanpa tanda tangan
tidak mungkin diperlukan).
Berikut beberapa contoh formatnya:
Urutan yang Dienkode | Seperti sleb128 |
Seperti uleb128 |
Seperti uleb128p1 |
---|---|---|---|
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, deskripsi jenis) maupun sebagai objek konstan yang dirujuk oleh kode. Daftar ini harus diurutkan menurut konten string, menggunakan nilai titik kode UTF-16 (bukan dengan cara yang sensitif terhadap lokalitas), dan tidak boleh berisi entri duplikat. |
type_ids | type_id_item[] | daftar ID jenis. Ini adalah ID untuk semua jenis (class,
array, atau jenis primitif) yang dirujuk oleh file ini, baik ditentukan
dalam file atau tidak. Daftar ini harus diurutkan menurut indeks string_id , dan tidak boleh berisi entri duplikat.
|
proto_ids | proto_id_item[] | daftar ID prototipe metode. Ini adalah ID untuk semua prototipe yang dirujuk oleh file ini. Daftar ini harus diurutkan dalam
urutan utama jenis nilai yang ditampilkan (menurut indeks type_id ), lalu
menurut daftar argumen (pengurutan leksikografis, setiap argumen
diurutkan menurut indeks type_id ). Daftar tidak boleh
berisi entri duplikat.
|
field_ids | field_id_item[] | daftar ID kolom. Ini adalah ID untuk semua kolom
yang dirujuk oleh file ini, baik ditentukan dalam file maupun tidak. Daftar
ini harus diurutkan, dengan jenis penentu (menurut indeks type_id )
adalah urutan utama, nama kolom (menurut indeks string_id )
adalah urutan perantara, dan jenis (menurut indeks type_id )
adalah urutan minor. Daftar tidak boleh berisi entri duplikat.
|
method_ids | method_id_item[] | daftar ID metode. Ini adalah ID untuk semua metode
yang dirujuk oleh file ini, baik ditentukan dalam file maupun tidak. Daftar
ini harus diurutkan, dengan jenis penentu (menurut indeks
type_id ) adalah urutan utama, nama metode (menurut indeks
string_id ) adalah urutan perantara, dan prototipe metode (menurut
indeks proto_id ) adalah urutan minor. Daftar tidak boleh
berisi entri duplikat.
|
class_defs | class_def_item[] | daftar definisi class. Class harus diurutkan sedemikian rupa sehingga superclass class tertentu dan antarmuka yang diterapkan muncul dalam daftar lebih awal daripada class perujuk. Selain itu, definisi untuk class dengan nama yang sama tidak boleh muncul lebih dari sekali dalam daftar. |
call_site_ids | call_site_id_item[] | daftar ID situs panggilan. Ini adalah ID untuk semua situs panggilan
yang dirujuk oleh file ini, baik yang ditentukan dalam file maupun tidak. Daftar ini
harus diurutkan dalam urutan menaik call_site_off .
|
method_handles | method_handle_item[] | daftar handle metode. Daftar semua handle metode yang dirujuk oleh file ini, baik yang ditentukan dalam file maupun tidak. Daftar ini tidak diurutkan dan mungkin berisi duplikat yang secara logis akan sesuai dengan instance handle metode yang berbeda. |
data | ubyte[] | area data, yang berisi semua data pendukung untuk tabel yang tercantum di atas. Item yang berbeda memiliki persyaratan perataan yang berbeda, dan byte padding disisipkan sebelum setiap item jika diperlukan untuk mencapai perataan yang tepat. |
link_data | ubyte[] | data yang digunakan dalam file yang ditautkan secara statis. Format data di bagian ini tidak ditentukan oleh dokumen ini. Bagian ini kosong dalam file yang tidak ditautkan, dan implementasi runtime dapat menggunakannya sesuai keinginan. |
Format penampung
Versi 41 memperkenalkan format penampung baru untuk data DEX dengan tujuan menghemat ruang. Format penampung ini memungkinkan beberapa file DEX logis digabungkan menjadi satu file fisik. Format baru sebagian besar hanya merupakan penyambungan file yang sederhana dalam format sebelumnya, dengan beberapa perbedaan:
file_size
adalah ukuran file logis, bukan file fisik. Fungsi ini dapat digunakan untuk melakukan iterasi pada semua file logis dalam penampung.- File dex logis dapat mereferensikan data yang lebih baru di penampung (tetapi tidak lebih lama). Hal ini memungkinkan file dex berbagi data, seperti string, di antara file tersebut.
- Semua offset bersifat relatif terhadap file fisik. Tidak ada offset yang relatif terhadap header. Hal ini memastikan bahwa bagian dengan offset dapat dibagikan di antara file logis.
- Header menambahkan dua kolom baru untuk mendeskripsikan batas penampung. Ini adalah pemeriksaan konsistensi tambahan dan mempermudah porting kode ke format baru.
data_size
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 konstan DEX_FILE_MAGIC
adalah daftar
byte yang harus muncul di awal file .dex
agar dapat dikenali sebagai file tersebut. Nilai ini sengaja
berisi baris baru ("\n"
atau 0x0a
) dan
byte null ("\0"
atau 0x00
) untuk membantu
dalam mendeteksi bentuk kerusakan tertentu. Nilai ini juga
mengenkode nomor versi format sebagai tiga digit desimal, yang
diperkirakan akan meningkat secara monoton dari waktu ke waktu seiring berkembangnya format.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
Catatan: Dukungan untuk format
versi 040
ditambahkan dalam rilis Android 10.0, yang memperluas kumpulan karakter
yang diizinkan di SimpleNames.
Catatan: Dukungan untuk format
versi 039
ditambahkan dalam rilis Android 9.0, yang memperkenalkan dua
bytecode baru, const-method-handle
dan
const-method-type
. (Masing-masing dijelaskan dalam
tabel
Ringkasan set bytecode.) Di Android 10, versi 039
memperluas format file DEX untuk menyertakan informasi
API tersembunyi yang hanya berlaku untuk file DEX di jalur class booting.
Catatan: Dukungan untuk format
versi 038
ditambahkan dalam rilis
Android 8.0. Versi 038
menambahkan bytecode baru
(invoke-polymorphic
dan invoke-custom
) serta
data untuk handle metode.
Catatan: Dukungan untuk format versi 037
ditambahkan dalam rilis Android 7.0. Sebelum versi 037
, sebagian besar
versi Android telah menggunakan format versi 035
. Satu-satunya
perbedaan antara versi 035
dan 037
adalah
penambahan metode default dan penyesuaian invoke
.
Catatan: Setidaknya beberapa versi format sebelumnya telah
digunakan dalam rilis software publik yang tersedia secara luas. Misalnya,
versi 009
digunakan untuk rilis M3
platform Android (November–Desember 2007),
dan versi 013
digunakan untuk rilis M5 platform
Android (Februari–Maret 2008). Dalam beberapa hal, versi format
sebelumnya ini sangat berbeda dengan versi yang dijelaskan dalam
dokumen ini.
ENDIAN_CONSTANT dan REVERSE_ENDIAN_CONSTANT
Disematkan di header_item
Konstanta ENDIAN_CONSTANT
digunakan untuk menunjukkan
endianness file tempat file tersebut ditemukan. Meskipun format
.dex
standar adalah little-endian, implementasi dapat memilih
untuk melakukan pertukaran byte. Jika implementasi menemukan header
yang endian_tag
-nya adalah REVERSE_ENDIAN_CONSTANT
,
bukan ENDIAN_CONSTANT
, implementasi akan mengetahui bahwa file
telah ditukar byte dari bentuk yang diharapkan.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
NO_INDEX
Disematkan dalam class_def_item dan debug_info_item
Konstanta NO_INDEX
digunakan untuk menunjukkan bahwa
nilai indeks tidak ada.
Catatan: Nilai ini tidak ditentukan sebagai
0
, karena sebenarnya biasanya merupakan indeks yang valid.
Nilai yang dipilih untuk NO_INDEX
dapat direpresentasikan sebagai satu byte dalam encoding uleb128p1
.
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
Definisi access_flags
Disematkan di class_def_item, encoded_field, encoded_method, dan InnerClass
Bitfield tanda ini digunakan untuk menunjukkan aksesibilitas dan properti keseluruhan class dan anggota class.
Nama | Nilai | Untuk Class (dan anotasi InnerClass ) |
Untuk Kolom | Untuk Metode |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : terlihat di mana saja |
public : terlihat di mana saja |
public : terlihat di mana saja |
ACC_PRIVATE | 0x2 | private : hanya terlihat oleh class yang menentukan
|
private : hanya terlihat oleh class yang menentukan |
private : hanya terlihat oleh class yang menentukan |
ACC_PROTECTED | 0x4 | protected : terlihat oleh paket dan subclass
|
protected : terlihat oleh paket dan subclass |
protected : terlihat oleh paket dan subclass |
ACC_STATIC | 0x8 | static : tidak dibuat dengan referensi
this luar |
static : global untuk menentukan class |
static : tidak menggunakan argumen this |
ACC_FINAL | 0x10 | final : tidak dapat dibuat subclass |
final : tidak dapat diubah setelah konstruksi |
final : tidak dapat diganti |
ACC_SYNCHRONIZED | 0x20 | synchronized : kunci terkait otomatis diperoleh
di sekitar panggilan ke metode ini. Catatan: Ini hanya valid untuk ditetapkan jika
|
||
ACC_VOLATILE | 0x40 | volatile : aturan akses khusus untuk membantu keamanan
urutan pesan |
||
ACC_BRIDGE | 0x40 | metode bridge, ditambahkan secara otomatis oleh compiler sebagai bridge yang aman untuk jenis | ||
ACC_TRANSIENT | 0x80 | transient : tidak akan disimpan oleh serialisasi default |
||
ACC_VARARGS | 0x80 | argumen terakhir harus diperlakukan sebagai argumen "sisanya" oleh compiler | ||
ACC_NATIVE | 0x100 | native : diimplementasikan dalam kode native |
||
ACC_INTERFACE | 0x200 | interface : class abstrak yang dapat diimplementasikan beberapa kali |
||
ACC_ABSTRACT | 0x400 | abstract : tidak dapat dibuat instance-nya secara langsung |
abstract : tidak diimplementasikan oleh class ini |
|
ACC_STRICT | 0x800 | strictfp : aturan ketat untuk aritmetika floating point |
||
ACC_SYNTHETIC | 0x1000 | tidak ditentukan secara langsung dalam kode sumber | tidak ditentukan secara langsung dalam kode sumber | tidak ditentukan secara langsung dalam kode sumber |
ACC_ANNOTATION | 0x2000 | dideklarasikan sebagai class anotasi | ||
ACC_ENUM | 0x4000 | dideklarasikan sebagai jenis enumerasi | dideklarasikan sebagai nilai yang disebutkan | |
(tidak digunakan) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | metode konstruktor (penginisialisasi class atau instance) | ||
ACC_DECLARED_ SYNCHRONIZED |
0x20000 | mendeklarasikan synchronized . Catatan: Hal ini tidak memengaruhi eksekusi (selain dalam refleksi tanda ini, per se). |
InnerClass
,
dan tidak boleh diaktifkan di class_def_item
.
Encoding UTF-8 yang diubah
Sebagai konsesi untuk dukungan lama yang lebih mudah, format .dex
mengenkode data stringnya dalam bentuk UTF-8 modifikasi standar de facto, yang selanjutnya disebut sebagai MUTF-8. Format ini sama dengan UTF-8 standar, kecuali:
- Hanya encoding satu, dua, dan tiga byte yang digunakan.
- Titik kode dalam rentang
U+10000
…U+10ffff
dienkode sebagai pasangan pengganti, yang masing-masing direpresentasikan sebagai nilai yang dienkode tiga byte. - Titik kode
U+0000
dienkode dalam bentuk dua byte. - Byte null biasa (nilai
0
) menunjukkan akhir string, seperti interpretasi bahasa C standar.
Dua item pertama di atas dapat diringkas sebagai: MUTF-8 adalah format encoding untuk UTF-16, bukan format encoding yang lebih langsung untuk karakter Unicode.
Dua item terakhir di atas memungkinkan untuk menyertakan
titik kode U+0000
dalam string dan masih memanipulasinya
sebagai string yang diakhiri null bergaya C.
Namun, encoding khusus U+0000
berarti bahwa, tidak seperti
UTF-8 normal, hasil pemanggilan fungsi C standar
strcmp()
pada sepasang string MUTF-8 tidak selalu
menunjukkan hasil perbandingan yang ditandatangani dengan benar dari string tidak sama.
Jika pengurutan (bukan hanya kesetaraan) menjadi masalah, cara paling sederhana
untuk membandingkan string MUTF-8 adalah dengan mendekodenya karakter demi karakter,
dan membandingkan nilai yang didekode. (Namun, implementasi yang lebih cerdas
juga memungkinkan.)
Lihat Standar Unicode untuk informasi lebih lanjut tentang encoding karakter. MUTF-8 sebenarnya lebih dekat dengan encoding CESU-8 (yang relatif kurang dikenal) daripada UTF-8 secara umum.
encoding encoded_value
Disematkan dalam annotation_element dan encoded_array_item
encoded_value
adalah bagian data terstruktur hierarkis (hampir)
arbitrer yang dienkode. Encoding dimaksudkan untuk
ringkas dan mudah diuraikan.
Nama | Format | Deskripsi |
---|---|---|
(value_arg << 5) | value_type | ubyte | byte yang menunjukkan jenis value
berikutnya beserta
argumen klarifikasi opsional dalam tiga bit urutan tinggi.
Lihat di bawah untuk mengetahui berbagai definisi value .
Pada umumnya, value_arg mengenkode panjang
value yang langsung berikutnya dalam byte, seperti
(size - 1) , misalnya, 0 berarti
nilai memerlukan satu byte, dan 7 berarti memerlukan delapan byte; tetapi, ada pengecualian seperti yang tercantum di bawah.
|
nilai | ubyte[] | byte yang mewakili nilai, variabel dalam panjang dan ditafsirkan
secara berbeda untuk byte value_type yang berbeda, meskipun
selalu little-endian. Lihat berbagai definisi nilai di bawah untuk
mengetahui detailnya.
|
Format nilai
Ketik Nama | value_type |
Format value_arg |
Format value |
Deskripsi |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (none; must be 0 ) |
ubyte[1] | nilai bilangan bulat satu byte yang ditandatangani |
VALUE_SHORT | 0x02 | ukuran - 1 (0…1) | ubyte[size] | nilai bilangan bulat dua byte yang ditandatangani, diperluas tanda |
VALUE_CHAR | 0x03 | ukuran - 1 (0…1) | ubyte[size] | nilai bilangan bulat dua byte yang tidak ditandatangani, diperluas nol |
VALUE_INT | 0x04 | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte bertanda, diperluas tanda |
VALUE_LONG | 0x06 | ukuran - 1 (0…7) | ubyte[size] | nilai bilangan bulat delapan byte bertanda, diperluas tanda |
VALUE_FLOAT | 0x10 | ukuran - 1 (0…3) | ubyte[size] | pola bit empat byte, diperluas nol ke kanan, dan ditafsirkan sebagai nilai floating point 32-bit IEEE754 |
VALUE_DOUBLE | 0x11 | ukuran - 1 (0…7) | ubyte[size] | pola bit delapan byte, diperluas nol ke kanan, dan ditafsirkan sebagai nilai floating point 64-bit IEEE754 |
VALUE_METHOD_TYPE | 0x15 | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (diperluas nol),
ditafsirkan sebagai indeks ke
bagian proto_ids dan mewakili nilai jenis metode
|
VALUE_METHOD_HANDLE | 0x16 | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (diperluas nol),
ditafsirkan sebagai indeks ke
bagian method_handles dan mewakili nilai handle metode
|
VALUE_STRING | 0x17 | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte tanpa tanda tangan (diperluas nol),
ditafsirkan sebagai indeks ke
bagian string_ids dan mewakili nilai string
|
VALUE_TYPE | 0x18 | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (diperluas nol),
ditafsirkan sebagai indeks ke
bagian type_ids dan mewakili nilai
jenis/class reflektif
|
VALUE_FIELD | 0x19 | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (diperluas nol),
ditafsirkan sebagai indeks ke
bagian field_ids dan mewakili nilai kolom
reflektif
|
VALUE_METHOD | 0x1a | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (diperluas nol),
ditafsirkan sebagai indeks ke
bagian method_ids dan mewakili nilai metode
reflektif
|
VALUE_ENUM | 0x1b | ukuran - 1 (0…3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (diperluas nol),
ditafsirkan sebagai indeks ke
bagian field_ids dan mewakili nilai
konstanta jenis yang dihitung
|
VALUE_ARRAY | 0x1c | (none; must be 0 ) |
encoded_array | array nilai, dalam format yang ditentukan oleh
"format encoded_array " di bawah. Ukuran
value bersifat implisit dalam encoding.
|
VALUE_ANNOTATION | 0x1d | (none; must be 0 ) |
encoded_annotation | subanotasi, dalam format yang ditentukan oleh
"format encoded_annotation " di bawah. Ukuran
value bersifat implisit dalam encoding.
|
VALUE_NULL | 0x1e | (none; must be 0 ) |
(tidak ada) | Nilai referensi null |
VALUE_BOOLEAN | 0x1f | boolean (0…1) | (none) | nilai satu bit; 0 untuk false dan
1 untuk true . Bit diwakili dalam
value_arg .
|
Format encoded_array
Nama | Format | Deskripsi |
---|---|---|
ukuran | uleb128 | jumlah elemen dalam array |
nilai | encoded_value[size] | serangkaian urutan byte size encoded_value
dalam format yang ditentukan oleh bagian ini, yang digabungkan
secara berurutan.
|
format encoded_annotation
Nama | Format | Deskripsi |
---|---|---|
type_idx | uleb128 | jenis anotasi. Ini harus berupa jenis class (bukan array atau primitif). |
ukuran | uleb128 | jumlah pemetaan nama-nilai dalam anotasi ini |
elemen | annotation_element[size] | elemen anotasi, yang direpresentasikan secara langsung inline (bukan sebagai
offset). Elemen harus diurutkan dalam urutan menaik menurut
indeks string_id .
|
format annotation_element
Nama | Format | Deskripsi |
---|---|---|
name_idx | uleb128 | nama elemen, yang direpresentasikan sebagai indeks ke
bagian string_ids . String harus sesuai dengan sintaksis untuk MemberName, yang ditentukan di atas.
|
nilai | encoded_value | nilai elemen |
Sintaksis string
Ada beberapa jenis item dalam file .dex
yang
pada akhirnya merujuk ke string. Definisi gaya BNF berikut
menunjukkan sintaksis yang dapat diterima untuk string ini.
SimpleName
SimpleName adalah dasar untuk sintaksis nama
hal lainnya. Format .dex
memungkinkan cukup banyak kebebasan
di sini (jauh lebih banyak daripada sebagian besar bahasa sumber umum). Singkatnya, nama sederhana
terdiri dari karakter alfabet atau angka ASCII rendah, beberapa
simbol ASCII rendah tertentu, dan sebagian besar titik kode non-ASCII yang bukan
karakter kontrol, spasi, atau karakter khusus. Mulai dari versi 040
, format ini juga mengizinkan karakter spasi (kategori Zs
Unicode). Perhatikan bahwa titik kode pengganti
(dalam rentang U+d800
… U+dfff
) tidak
dianggap sebagai karakter nama yang valid, tetapi karakter tambahan
Unicode valid (yang direpresentasikan oleh alternatif
akhir aturan untuk SimpleNameChar), dan harus
direpresentasikan dalam file sebagai pasangan titik kode pengganti dalam encoding
MUTF-8.
SimpleName → | ||
SimpleNameChar (SimpleNameChar)* | ||
SimpleNameChar → | ||
'A' … 'Z' |
||
| | 'a' … 'z' |
|
| | '0' … '9' |
|
| | ' ' |
sejak DEX versi 040 |
| | '$' |
|
| | '-' |
|
| | '_' |
|
| | U+00a0 |
sejak DEX versi 040 |
| | U+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, anggota adalah kolom, metode, dan class dalam.
MemberName → | |
SimpleName | |
| | '<' SimpleName '>' |
FullClassName
FullClassName adalah nama class yang sepenuhnya memenuhi syarat, termasuk penentu paket opsional yang diikuti dengan nama yang diperlukan.
FullClassName → | |
OptionalPackagePrefix SimpleName | |
OptionalPackagePrefix → | |
(SimpleName '/' )* |
TypeDescriptor
Digunakan oleh type_id_item
TypeDescriptor adalah representasi jenis apa pun, termasuk primitif, class, array, dan void
. Lihat di bawah untuk mengetahui makna berbagai versi.
TypeDescriptor → | |
'V' |
|
| | FieldTypeDescriptor |
FieldTypeDescriptor → | |
NonArrayFieldTypeDescriptor | |
| | ('[' * 1…255)
NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor→ | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' FullClassName ';' |
ShortyDescriptor
Digunakan oleh proto_id_item
ShortyDescriptor adalah representasi bentuk singkat dari prototipe
metode, termasuk jenis nilai yang ditampilkan dan parameter, kecuali bahwa tidak ada
perbedaan antara berbagai jenis referensi (class atau array). Sebagai gantinya,
semua jenis referensi diwakili oleh satu karakter 'L'
.
ShortyDescriptor → | |
ShortyReturnType (ShortyFieldType)* | |
ShortyReturnType → | |
'V' |
|
| | ShortyFieldType |
ShortyFieldType → | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
Semantik TypeDescriptor
Ini adalah arti dari setiap varian TypeDescriptor.
Sintaksis | Arti |
---|---|
V | void ; hanya valid untuk jenis nilai yang ditampilkan |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long |
F | float |
D | double |
Lfully/qualified/Name; | class fully.qualified.Name |
[descriptor | array descriptor , yang dapat digunakan secara rekursif untuk
array array, meskipun tidak valid untuk memiliki lebih dari 255
dimensi.
|
Item dan struktur terkait
Bagian ini mencakup definisi untuk setiap item tingkat atas yang
dapat muncul dalam file .dex
.
header_item
Muncul di bagian header
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
sihir | ubyte[8] = DEX_FILE_MAGIC | nilai magic. Lihat diskusi di atas di bagian "DEX_FILE_MAGIC "
untuk mengetahui detail selengkapnya.
|
checksum | uint | Checksum adler32 dari sisa file (semuanya kecuali
magic dan kolom ini); digunakan untuk mendeteksi kerusakan file
|
tanda tangan | ubyte[20] | Tanda tangan (hash) SHA-1 dari sisa file (semuanya kecuali
magic , checksum , dan kolom ini); digunakan
untuk mengidentifikasi file secara unik
|
file_size | uint |
ukuran seluruh file (termasuk header), dalam byte (v40 atau yang lebih lama) jarak dalam byte dari awal header ini ke header berikutnya atau ke akhir seluruh file (penampung). (v41 atau yang lebih baru) |
header_size | uint |
ukuran header (seluruh bagian ini), dalam byte. Hal ini memungkinkan setidaknya kompatibilitas mundur/maju dalam jumlah terbatas tanpa membatalkan format. harus berukuran 0x70 (112) byte (v40 atau yang lebih lama) harus berukuran 0x78 (120) byte (v41 atau yang lebih baru) |
endian_tag | uint = ENDIAN_CONSTANT | tag endianness. Lihat diskusi di atas di bagian "ENDIAN_CONSTANT
dan REVERSE_ENDIAN_CONSTANT " untuk detail selengkapnya.
|
link_size | uint | ukuran bagian link, atau 0 jika file ini tidak
ditautkan secara statis |
link_off | uint | offset dari awal file ke bagian link, atau
0 jika link_size == 0 . Offset, jika bukan nol,
harus berupa offset ke bagian link_data . Format
data yang ditunjuk tidak ditentukan oleh dokumen ini;
kolom header ini (dan yang sebelumnya) dibiarkan sebagai hook untuk digunakan oleh
penerapan runtime.
|
map_off | uint | offset dari awal file ke item peta. Offset, yang harus
bukan nol, harus berupa offset ke bagian data ,
dan data harus dalam format yang ditentukan oleh "map_list "
di bawah.
|
string_ids_size | uint | jumlah string dalam daftar ID string |
string_ids_off | uint | offset dari awal file ke daftar ID string, atau
0 jika string_ids_size == 0 (memang
kasus ekstrem yang aneh). Offset, jika bukan nol,
harus berada di awal bagian string_ids .
|
type_ids_size | uint | jumlah elemen dalam daftar ID jenis, maksimal 65.535 |
type_ids_off | uint | offset dari awal file ke daftar ID jenis, atau
0 jika type_ids_size == 0 (memang
kasus ekstrem yang aneh). Offset, jika bukan nol,
harus berada di awal bagian
type_ids .
|
proto_ids_size | uint | jumlah elemen dalam daftar ID prototipe, maksimal 65.535 |
proto_ids_off | uint | offset dari awal file ke daftar ID prototipe, atau
0 jika proto_ids_size == 0 (memang
kasus ekstrem yang aneh). Offset, jika bukan nol,
harus berada di awal bagian
proto_ids .
|
field_ids_size | uint | jumlah elemen dalam daftar ID kolom |
field_ids_off | uint | offset dari awal file ke daftar ID kolom, atau
0 jika field_ids_size == 0 . Offset, jika
bukan nol, harus berada di awal bagian
field_ids . |
method_ids_size | uint | jumlah elemen dalam daftar ID metode |
method_ids_off | uint | offset dari awal file ke daftar ID metode, atau
0 jika method_ids_size == 0 . Offset, jika
bukan nol, harus berada di awal bagian
method_ids . |
class_defs_size | uint | jumlah elemen dalam daftar definisi class |
class_defs_off | uint | offset dari awal file ke daftar definisi class, atau
0 jika class_defs_size == 0 (memang
kasus ekstrem yang aneh). Offset, jika bukan nol,
harus berada di awal bagian class_defs .
|
data_size | uint |
Ukuran bagian 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. Nilai ini 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. Nilai ini 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 konten file, secara berurutan. Fungsi ini
berisi beberapa redundansi sehubungan dengan header_item
,
tetapi dimaksudkan untuk menjadi bentuk yang mudah digunakan untuk melakukan iterasi di seluruh
file. Jenis tertentu harus muncul maksimal sekali dalam peta, tetapi tidak ada
batasan jenis urutan yang dapat muncul, selain
batasan yang tersirat oleh format lainnya (misalnya,
bagian header
harus muncul terlebih dahulu, diikuti dengan
bagian string_ids
, dll.). Selain itu, entri peta harus
diurutkan menurut offset awal dan tidak boleh tumpang-tindih.
Nama | Format | Deskripsi |
---|---|---|
ukuran | uint | ukuran daftar, dalam entri |
daftar | map_item[size] | elemen daftar |
format map_item
Nama | Format | Deskripsi |
---|---|---|
type | ushort | jenis item; lihat tabel di bawah |
unused | ushort | (tidak digunakan) |
ukuran | uint | jumlah item yang akan ditemukan pada offset yang ditunjukkan |
offset | uint | offset dari awal file ke item yang dimaksud |
Kode jenis
Jenis Item | Konstanta | Nilai | Ukuran Item dalam Byte |
---|---|---|---|
header_item | TYPE_HEADER_ITEM | 0x0000 | 0x70 |
string_id_item | TYPE_STRING_ID_ITEM | 0x0001 | 0x04 |
type_id_item | TYPE_TYPE_ID_ITEM | 0x0002 | 0x04 |
proto_id_item | TYPE_PROTO_ID_ITEM | 0x0003 | 0x0c |
field_id_item | TYPE_FIELD_ID_ITEM | 0x0004 | 0x08 |
method_id_item | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
class_def_item | TYPE_CLASS_DEF_ITEM | 0x0006 | 0x20 |
call_site_id_item | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x04 |
method_handle_item | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
map_list | TYPE_MAP_LIST | 0x1000 | 4 + (item.size * 12) |
type_list | TYPE_TYPE_LIST | 0x1001 | 4 + (item.size * 2) |
annotation_set_ref_list | TYPE_ANNOTATION_SET_REF_LIST | 0x1002 | 4 + (item.size * 4) |
annotation_set_item | TYPE_ANNOTATION_SET_ITEM | 0x1003 | 4 + (item.size * 4) |
class_data_item | TYPE_CLASS_DATA_ITEM | 0x2000 | implisit; harus mengurai |
code_item | TYPE_CODE_ITEM | 0x2001 | implisit; harus mengurai |
string_data_item | TYPE_STRING_DATA_ITEM | 0x2002 | implisit; harus mengurai |
debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | implisit; harus mengurai |
annotation_item | TYPE_ANNOTATION_ITEM | 0x2004 | implisit; harus mengurai |
encoded_array_item | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | implisit; harus mengurai |
annotations_directory_item | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | implisit; harus mengurai |
hiddenapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | implisit; harus mengurai |
string_id_item
Muncul di bagian string_ids
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
string_data_off | uint | offset dari awal file ke data string untuk item
ini. Offset harus ke lokasi di bagian data , dan data harus dalam format yang ditentukan oleh "string_data_item " di bawah.
Tidak ada persyaratan perataan untuk offset.
|
string_data_item
Muncul di bagian data
Perataan: tidak ada (diselaraskan byte)
Nama | Format | Deskripsi |
---|---|---|
utf16_size | uleb128 | ukuran string ini, dalam unit kode UTF-16 (yang merupakan "panjang
string" di banyak sistem). Artinya, ini adalah panjang string yang didekode. (Panjang yang dienkode tersirat oleh posisi
byte 0 .) |
data | ubyte[] | serangkaian unit kode MUTF-8 (alias octet, alias byte)
diikuti dengan byte dengan nilai 0 . Lihat
"Encoding MUTF-8 (UTF-8 Modifikasi)" di atas untuk mengetahui detail dan
diskusi tentang format data.
Catatan: String yang menyertakan unit kode pengganti UTF-16 (yaitu,
|
type_id_item
Muncul di bagian type_ids
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
descriptor_idx | uint | indeks ke dalam daftar string_ids untuk string
deskripsi jenis ini. String harus sesuai dengan sintaksis untuk
TypeDescriptor, yang ditentukan di atas.
|
proto_id_item
Muncul di bagian proto_ids
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
shorty_idx | uint | indeks ke dalam daftar string_ids untuk string deskripsi
bentuk singkat prototipe ini. String harus sesuai dengan sintaksis untuk ShortyDescriptor, yang ditentukan di atas, dan harus sesuai dengan jenis nilai yang ditampilkan dan parameter item ini.
|
return_type_idx | uint | indeks ke dalam daftar type_ids untuk jenis nilai yang ditampilkan prototipe ini
|
parameters_off | uint | offset dari awal file ke daftar jenis parameter
untuk prototipe ini, atau 0 jika prototipe ini tidak memiliki
parameter. Offset ini, jika bukan nol, harus berada di
bagian data , dan data di sana harus dalam
format yang ditentukan oleh "type_list" di bawah. Selain itu, tidak boleh ada referensi ke jenis void dalam daftar.
|
field_id_item
Muncul di bagian field_ids
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
class_idx | ushort | indeks ke dalam daftar type_ids untuk penentu kolom ini. Ini harus berupa jenis class, bukan array atau jenis primitif.
|
type_idx | ushort | indeks ke dalam daftar type_ids untuk jenis
kolom ini
|
name_idx | uint | indeks ke dalam daftar string_ids untuk nama kolom ini. String harus sesuai dengan sintaksis untuk MemberName,
yang ditentukan di atas.
|
method_id_item
Muncul di bagian method_ids
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
class_idx | ushort | indeks ke dalam daftar type_ids untuk penentu metode
ini. Ini harus berupa jenis class atau array, dan bukan jenis primitif.
|
proto_idx | ushort | indeks ke dalam daftar proto_ids untuk prototipe
metode ini
|
name_idx | uint | indeks ke dalam daftar string_ids untuk nama metode
ini. String harus sesuai dengan sintaksis untuk MemberName,
yang ditentukan di atas.
|
class_def_item
Muncul di bagian class_defs
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
class_idx | uint | indeks ke dalam daftar type_ids untuk class ini.
Ini harus berupa jenis class, bukan array atau jenis primitif.
|
access_flags | uint | flag akses untuk class (public , final ,
dll.). Lihat "Definisi access_flags " untuk mengetahui detailnya.
|
superclass_idx | uint | indeks ke dalam daftar type_ids untuk superclass, atau
nilai konstan NO_INDEX jika class ini tidak memiliki
superclass (yaitu, class root seperti Object ).
Jika ada, ini harus berupa jenis class, bukan array atau jenis primitif.
|
interfaces_off | uint | offset dari awal file ke daftar antarmuka, atau
0 jika tidak ada. Offset ini
harus berada di bagian data , dan data
di sana harus dalam format yang ditentukan oleh
"type_list " di bawah. Setiap elemen daftar
harus berupa jenis class (bukan array atau jenis primitif), dan tidak boleh
ada duplikat.
|
source_file_idx | uint | indeks ke dalam daftar string_ids untuk nama
file yang berisi sumber asli untuk (setidaknya sebagian besar) class ini,
atau nilai khusus NO_INDEX untuk merepresentasikan kurangnya
informasi ini. debug_info_item dari metode tertentu
dapat mengganti file sumber ini, tetapi harapannya adalah sebagian besar class
hanya akan berasal dari satu file sumber.
|
annotations_off | uint | offset dari awal file ke struktur anotasi
untuk class ini, atau 0 jika tidak ada anotasi pada
class ini. Offset ini, jika bukan nol, harus berada di
bagian data , dan data di sana harus dalam
format yang ditentukan oleh "annotations_directory_item " di bawah,
dengan semua item yang merujuk ke class ini sebagai penentu.
|
class_data_off | uint | offset dari awal file ke data
class terkait untuk item ini, atau 0 jika tidak ada data
class untuk class ini. (Hal ini mungkin terjadi, misalnya, jika class ini
adalah antarmuka penanda.) Offset, jika bukan nol, harus berada di
bagian data , dan data di sana harus dalam
format yang ditentukan oleh "class_data_item " di bawah, dengan semua
item yang merujuk ke class ini sebagai penentu.
|
static_values_off | uint | offset dari awal file ke daftar nilai awal
untuk kolom static , atau 0 jika
tidak ada (dan semua kolom static akan diinisialisasi dengan
0 atau null ). Offset ini harus berada di
bagian data , dan data di sana harus dalam
format yang ditentukan oleh "encoded_array_item " di bawah. Ukuran
array tidak boleh lebih besar dari jumlah kolom static
yang dideklarasikan oleh class ini, dan elemennya sesuai dengan
kolom static dalam urutan yang sama seperti yang dideklarasikan dalam
field_list yang sesuai. Jenis setiap elemen array harus cocok dengan jenis yang dideklarasikan dari kolom yang sesuai.
Jika elemen dalam array lebih sedikit daripada
kolom static , kolom yang tersisa akan diinisialisasi
dengan 0 atau null yang sesuai dengan jenisnya.
|
call_site_id_item
Muncul di bagian call_site_ids
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
call_site_off | uint | offset dari awal file untuk memanggil definisi situs. Offset harus berada di bagian data, dan data di sana harus dalam format yang ditentukan oleh "call_site_item" di bawah. |
call_site_item
Muncul di bagian data
Alignment: none (byte aligned)
call_site_item adalah encoded_array_item yang elemennya sesuai dengan argumen yang diberikan ke metode bootstrap linker. Tiga argumen pertama adalah:
- Handle metode yang mewakili metode bootstrap linker (VALUE_METHOD_HANDLE).
- Nama metode yang harus di-resolve oleh linker bootstrap (VALUE_STRING).
- Jenis metode yang sesuai dengan jenis nama metode yang akan di-resolve (VALUE_METHOD_TYPE).
Setiap argumen tambahan adalah nilai konstan yang diteruskan ke metode bootstrap linker. Argumen ini diteruskan secara berurutan dan tanpa konversi jenis apa pun.
Handle metode yang mewakili metode bootstrap linker harus memiliki jenis nilai yang ditampilkan java.lang.invoke.CallSite
. Tiga jenis parameter pertama adalah:
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 (pengakses) kolom statis |
METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | Handle metode adalah pengambil (pengakses) kolom statis |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | Handle metode adalah penyetel kolom instance (pengakses) |
METHOD_HANDLE_TYPE_INSTANCE_GET | 0x03 | Handle metode adalah pengambil (pengakses) kolom instance |
METHOD_HANDLE_TYPE_INVOKE_STATIC | 0x04 | Handle metode adalah pemanggil metode statis |
METHOD_HANDLE_TYPE_INVOKE_INSTANCE | 0x05 | Handle metode adalah pemanggil metode instance |
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR | 0x06 | Handle metode adalah pemanggil metode konstruktor |
METHOD_HANDLE_TYPE_INVOKE_DIRECT | 0x07 | Handle metode adalah pemanggil metode langsung |
METHOD_HANDLE_TYPE_INVOKE_INTERFACE | 0x08 | Handle metode adalah pemanggil metode antarmuka |
class_data_item
Dirujuk dari class_def_item
Muncul di bagian data
Perataan: tidak ada (diselaraskan byte)
Nama | Format | Deskripsi |
---|---|---|
static_fields_size | uleb128 | jumlah kolom statis yang ditentukan dalam item ini |
instance_fields_size | uleb128 | jumlah kolom instance yang ditentukan dalam item ini |
direct_methods_size | uleb128 | jumlah metode langsung yang ditentukan dalam item ini |
virtual_methods_size | uleb128 | jumlah metode virtual yang ditentukan dalam item ini |
static_fields | encoded_field[static_fields_size] | kolom statis yang ditentukan, yang direpresentasikan sebagai urutan elemen yang dienkode. Kolom harus diurutkan menurut
field_idx dalam urutan yang semakin meningkat.
|
instance_fields | encoded_field[instance_fields_size] | kolom instance yang ditentukan, yang direpresentasikan sebagai urutan elemen yang dienkode. Kolom harus diurutkan menurut
field_idx dalam urutan menaik.
|
direct_methods | encoded_method[direct_methods_size] | metode langsung (static , private ,
atau konstruktor) yang ditentukan, yang direpresentasikan sebagai urutan
elemen yang dienkode. Metode harus diurutkan menurut
method_idx dalam urutan yang semakin meningkat.
|
virtual_methods | encoded_method[virtual_methods_size] | metode virtual yang ditentukan (bukan static , private ,
atau konstruktor), yang direpresentasikan sebagai urutan
elemen yang dienkode. Daftar ini tidak boleh menyertakan metode
yang diwarisi kecuali jika diganti oleh class yang diwakili item ini. Metode
harus diurutkan menurut method_idx dalam urutan yang semakin meningkat.
method_idx metode virtual tidak boleh sama
dengan metode langsung apa pun.
|
Catatan: Semua instance field_id
dan
method_id
elemen harus merujuk ke class penentu yang sama.
format encoded_field
Nama | Format | Deskripsi |
---|---|---|
field_idx_diff | uleb128 | indeks ke dalam daftar field_ids untuk identitas kolom
ini (termasuk nama dan deskripsi), yang direpresentasikan sebagai perbedaan
dari indeks elemen sebelumnya dalam daftar. Indeks elemen pertama dalam daftar direpresentasikan secara langsung.
|
access_flags | uleb128 | flag akses untuk kolom (public , final ,
dll.). Lihat "Definisi access_flags " untuk mengetahui detailnya.
|
format encoded_method
Nama | Format | Deskripsi |
---|---|---|
method_idx_diff | uleb128 | indeks ke dalam daftar method_ids untuk identitas metode
ini (termasuk nama dan deskripsi), yang direpresentasikan sebagai perbedaan
dari indeks elemen sebelumnya dalam daftar. Indeks elemen pertama dalam daftar direpresentasikan secara langsung.
|
access_flags | uleb128 | flag akses untuk metode (public , final ,
dll.). Lihat "Definisi access_flags " untuk mengetahui detailnya.
|
code_off | uleb128 | offset dari awal file ke struktur kode untuk metode
ini, atau 0 jika metode ini adalah abstract
atau native . Offset harus ke lokasi di
bagian data . Format data ditentukan oleh
"code_item " di bawah.
|
type_list
Dirujuk dari class_def_item dan proto_id_item
Muncul di bagian data
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
ukuran | uint | ukuran daftar, dalam entri |
daftar | type_item[size] | elemen daftar |
format type_item
Nama | Format | Deskripsi |
---|---|---|
type_idx | ushort | indeks ke dalam daftar type_ids |
code_item
Dirujuk dari encoded_method
Muncul di bagian data
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
registers_size | ushort | jumlah register yang digunakan oleh kode ini |
ins_size | ushort | jumlah kata argumen yang masuk ke metode yang menjadi tujuan kode ini |
outs_size | ushort | jumlah kata ruang argumen keluar yang diperlukan oleh kode ini untuk pemanggilan metode |
tries_size | ushort | jumlah try_item untuk instance ini. Jika bukan nol,
nilai ini akan muncul sebagai array tries tepat setelah
insns dalam instance ini.
|
debug_info_off | uint | offset dari awal file ke urutan info debug (nomor baris +
informasi variabel lokal) untuk kode ini, atau 0 jika
tidak ada informasi. Offset, jika bukan nol, harus
ke lokasi di bagian data . Format data ditentukan oleh "debug_info_item " di bawah.
|
insns_size | uint | ukuran daftar petunjuk, dalam unit kode 16-bit |
insns | ushort[insns_size] | array bytecode yang sebenarnya. Format kode dalam array
insns ditentukan oleh dokumen pendamping
bytecode Dalvik. Perhatikan
bahwa meskipun ini ditentukan sebagai array ushort , ada
beberapa struktur internal yang lebih memilih perataan empat byte. Selain itu,
jika hal ini terjadi dalam file yang ditukar endian, pertukaran
hanya dilakukan pada setiap instance ushort dan bukan pada
struktur internal yang lebih besar.
|
padding | ushort (opsional) = 0 | dua byte padding untuk membuat tries sejajar empat byte.
Elemen ini hanya ada jika tries_size bukan nol
dan insns_size ganjil.
|
percobaan | try_item[tries_size] (opsional) | array yang menunjukkan tempat pengecualian kode tertangkap dan
cara menanganinya. Elemen array tidak boleh tumpang-tindih dalam
rentang dan dalam urutan dari alamat rendah ke tinggi. Elemen ini hanya
ada jika tries_size bukan nol.
|
pengendali | encoded_catch_handler_list (opsional) | byte yang mewakili daftar daftar jenis tangkapan dan alamat pengendali
terkait. Setiap try_item memiliki offset byte ke dalam struktur ini. Elemen ini hanya ada jika
tries_size bukan nol.
|
format try_item
Nama | Format | Deskripsi |
---|---|---|
start_addr | uint | alamat awal blok kode yang dicakup oleh entri ini. Alamat adalah jumlah unit kode 16-bit hingga awal petunjuk pertama yang tercakup. |
insn_count | ushort | jumlah unit kode 16-bit yang tercakup dalam entri ini. Unit kode
terakhir yang tercakup (inklusif) adalah start_addr + insn_count - 1 .
|
handler_off | ushort | offset dalam byte dari awal
encoded_catch_hander_list terkait ke
encoded_catch_handler untuk entri ini. Ini harus berupa
offset ke awal encoded_catch_handler .
|
format encoded_catch_handler_list
Nama | Format | Deskripsi |
---|---|---|
ukuran | uleb128 | ukuran daftar ini, dalam entri |
daftar | encoded_catch_handler[handlers_size] | daftar sebenarnya dari daftar pengendali, yang direpresentasikan secara langsung (bukan sebagai offset), dan digabungkan secara berurutan |
format encoded_catch_handler
Nama | Format | Deskripsi |
---|---|---|
ukuran | sleb128 | jumlah jenis tangkapan dalam daftar ini. Jika non-positif, ini adalah
negatif dari jumlah jenis tangkapan, dan tangkapan diikuti
oleh pengendali generik. Misalnya: size dari 0
berarti ada catch-all, tetapi tidak ada catch yang diketik secara eksplisit.
size dari 2 berarti ada dua pengecualian yang
diketik secara eksplisit dan tidak ada pengecualian umum. Dan size dari -1
berarti ada satu tangkapan yang diketik beserta tangkapan semua.
|
pengendali | encoded_type_addr_pair[abs(size)] | aliran item yang dienkode abs(size) , satu untuk setiap jenis yang tertangkap, dalam urutan jenis yang harus diuji.
|
catch_all_addr | uleb128 (opsional) | alamat bytecode pengendali email generik. Elemen ini hanya
ada jika size non-positif.
|
Format encoded_type_addr_pair
Nama | Format | Deskripsi |
---|---|---|
type_idx | uleb128 | mengindeks ke dalam daftar type_ids untuk jenis pengecualian yang akan ditangkap
|
addr | uleb128 | alamat bytecode pengendali pengecualian terkait |
debug_info_item
Dirujuk dari code_item
Muncul di bagian data
Perataan: tidak ada (diselaraskan byte)
Setiap debug_info_item
menentukan mesin status berenkode byte
yang terinspirasi DWARF3 yang, saat ditafsirkan, memunculkan tabel
posisi dan (berpotensi) informasi variabel lokal untuk
code_item
. Urutan dimulai dengan header
panjang variabel (panjangnya bergantung pada jumlah parameter
metode), diikuti dengan bytecode mesin status, dan diakhiri
dengan byte DBG_END_SEQUENCE
.
Mesin status terdiri dari lima register. Register
address
mewakili offset petunjuk dalam
insns_item
terkait dalam unit kode 16-bit. Register
address
dimulai dari 0
di awal setiap
urutan debug_info
dan hanya boleh meningkat secara monoton.
Register line
mewakili nomor baris sumber
yang harus dikaitkan dengan entri tabel posisi berikutnya yang dikeluarkan oleh
mesin status. Ini diinisialisasi di header urutan, dan dapat
berubah dalam arah positif atau negatif, tetapi tidak boleh kurang dari
1
. Register source_file
mewakili
file sumber yang dirujuk oleh entri nomor baris. Ini diinisialisasi ke
nilai source_file_idx
di class_def_item
.
Dua variabel lainnya, prologue_end
dan
epilogue_begin
, adalah flag boolean (diinisialisasi ke
false
) yang menunjukkan apakah posisi berikutnya yang ditampilkan
harus dianggap sebagai prolog atau epilog metode. Mesin status
juga harus melacak nama dan jenis variabel lokal terakhir yang aktif di
setiap register untuk kode DBG_RESTART_LOCAL
.
Headernya adalah sebagai berikut:
Nama | Format | Deskripsi |
---|---|---|
line_start | uleb128 | nilai awal untuk register line mesin status.
Tidak mewakili entri posisi yang sebenarnya.
|
parameters_size | uleb128 | jumlah nama parameter yang dienkode. Harus ada
satu per parameter metode, tidak termasuk this metode instance,
jika ada.
|
parameter_names | uleb128p1[parameters_size] | indeks string nama parameter metode. Nilai NO_INDEX yang dienkode menunjukkan bahwa tidak ada nama yang tersedia untuk parameter terkait. Deskripsi dan tanda tangan jenis
tersirat dari deskripsi dan tanda tangan metode.
|
Nilai kode byte adalah sebagai berikut:
Nama | Nilai | Format | Argumen | Deskripsi |
---|---|---|---|---|
DBG_END_SEQUENCE | 0x00 | (none) | menghentikan urutan info debug untuk code_item |
|
DBG_ADVANCE_PC | 0x01 | uleb128 addr_diff | addr_diff : jumlah yang akan ditambahkan ke register alamat |
memajukan register alamat tanpa memunculkan entri posisi |
DBG_ADVANCE_LINE | 0x02 | sleb128 line_diff | line_diff : jumlah untuk mengubah register baris |
memajukan register baris tanpa memunculkan entri posisi |
DBG_START_LOCAL | 0x03 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx |
register_num : register yang akan berisi lokalname_idx : indeks string namatype_idx : indeks jenis jenis
|
memperkenalkan variabel lokal di alamat saat ini. name_idx atau type_idx dapat berupa NO_INDEX untuk menunjukkan bahwa nilai tersebut tidak diketahui.
|
DBG_START_LOCAL_EXTENDED | 0x04 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx uleb128p1 sig_idx |
register_num : register yang akan berisi lokalname_idx : indeks string namatype_idx : indeks jenis 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 : register to restart |
memperkenalkan kembali variabel lokal di alamat saat ini. Nama dan jenisnya sama dengan lokal terakhir yang aktif di register yang ditentukan. |
DBG_SET_PROLOGUE_END | 0x07 | (none) | menetapkan register mesin status prologue_end ,
yang menunjukkan bahwa entri posisi berikutnya yang ditambahkan harus
dianggap sebagai akhir prolog metode (tempat yang sesuai untuk
titik henti sementara metode). Register prologue_end
dihapus oleh opcode (>= 0x0a ) khusus.
|
|
DBG_SET_EPILOGUE_BEGIN | 0x08 | (tidak ada) | menetapkan register mesin status epilogue_begin ,
yang menunjukkan bahwa entri posisi berikutnya yang ditambahkan harus
dianggap sebagai awal epilog metode (tempat yang sesuai
untuk menangguhkan eksekusi sebelum metode keluar).
Register epilogue_begin dihapus oleh opcode
khusus (>= 0x0a ).
|
|
DBG_SET_FILE | 0x09 | uleb128p1 name_idx | name_idx : indeks string nama file sumber;
NO_INDEX jika tidak diketahui
|
menunjukkan bahwa semua entri nomor baris berikutnya akan merujuk ke
nama file sumber ini, bukan nama default yang ditentukan dalam
code_item
|
Opcode Khusus | 0x0a…0xff | (none) | memajukan register line dan address ,
memunculkan entri posisi, dan menghapus prologue_end dan
epilogue_begin . Lihat deskripsi di bawah.
|
Opcode khusus
Opcode dengan nilai antara 0x0a
dan 0xff
(inklusif) memindahkan register line
dan address
dengan jumlah kecil, lalu memunculkan entri tabel posisi baru.
Rumus untuk inkremen adalah sebagai berikut:
DBG_FIRST_SPECIAL = 0x0a // the smallest special opcode DBG_LINE_BASE = -4 // the smallest line number increment DBG_LINE_RANGE = 15 // the number of line increments represented adjusted_opcode = opcode - DBG_FIRST_SPECIAL line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE) address += (adjusted_opcode / DBG_LINE_RANGE)
annotations_directory_item
Dirujuk dari class_def_item
Muncul di bagian data
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
class_annotations_off | uint | offset dari awal file ke anotasi yang dibuat langsung
di class, atau 0 jika class tidak memiliki anotasi langsung.
Offset, jika bukan nol, harus mengarah ke lokasi di
bagian data . Format data ditentukan oleh "annotation_set_item " di bawah.
|
fields_size | uint | jumlah kolom yang dianotasi oleh item ini |
annotated_methods_size | uint | jumlah metode yang dianotasi oleh item ini |
annotated_parameters_size | uint | jumlah daftar parameter metode yang dianotasi oleh item ini |
field_annotations | field_annotation[fields_size] (opsional) | daftar anotasi kolom terkait. Elemen daftar harus
diurutkan dalam urutan menaik, menurut field_idx .
|
method_annotations | method_annotation[methods_size] (opsional) | daftar anotasi metode terkait. Elemen daftar harus
diurutkan dalam urutan menaik, menurut method_idx .
|
parameter_annotations | parameter_annotation[parameters_size] (opsional) | daftar anotasi parameter metode terkait. Elemen daftar harus diurutkan dalam urutan menaik, menurut method_idx .
|
Catatan: Semua instance field_id
dan
method_id
elemen harus merujuk ke class penentu yang sama.
format field_annotation
Nama | Format | Deskripsi |
---|---|---|
field_idx | uint | mengindeks ke dalam daftar field_ids untuk identitas
kolom yang dianotasi
|
annotations_off | uint | offset dari awal file ke daftar anotasi untuk
kolom. Offset harus mengarah ke lokasi di bagian
data . Format data ditentukan oleh
"annotation_set_item " di bawah.
|
format method_annotation
Nama | Format | Deskripsi |
---|---|---|
method_idx | uint | mengindeks ke dalam daftar method_ids untuk identitas
metode yang dianotasi
|
annotations_off | uint | offset dari awal file ke daftar anotasi untuk
metode. Offset harus ke lokasi di
bagian data . Format data ditentukan oleh
"annotation_set_item " di bawah.
|
format parameter_annotation
Nama | Format | Deskripsi |
---|---|---|
method_idx | uint | indeks ke dalam daftar method_ids untuk identitas
metode yang parameternya sedang dianotasi
|
annotations_off | uint | offset dari awal file ke daftar anotasi untuk
parameter metode. Offset harus ke lokasi di
bagian data . Format data ditentukan oleh
"annotation_set_ref_list " di bawah.
|
annotation_set_ref_list
Dirujuk dari parameter_annotations_item
Muncul di bagian data
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
ukuran | uint | ukuran daftar, dalam entri |
daftar | annotation_set_ref_item[size] | elemen daftar |
format annotation_set_ref_item
Nama | Format | Deskripsi |
---|---|---|
annotations_off | uint | offset dari awal file ke kumpulan anotasi yang dirujuk
atau 0 jika tidak ada anotasi untuk elemen ini.
Offset, jika bukan nol, harus mengarah ke lokasi di bagian
data . Format data ditentukan oleh
"annotation_set_item " di bawah.
|
annotation_set_item
Dirujuk dari annotations_directory_item, field_annotations_item, method_annotations_item, dan annotation_set_ref_item
Muncul di bagian data
Penyelarasan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
ukuran | uint | ukuran set, dalam entri |
entri | annotation_off_item[size] | elemen set. Elemen harus diurutkan dalam urutan menaik,
menurut type_idx .
|
format annotation_off_item
Nama | Format | Deskripsi |
---|---|---|
annotation_off | uint | offset dari awal file ke anotasi.
Offset harus mengarah ke lokasi di bagian data , dan format data di lokasi tersebut ditentukan oleh "annotation_item " di bawah.
|
annotation_item
Dirujuk dari annotation_set_item
Muncul di bagian data
Perataan: tidak ada (diselaraskan byte)
Nama | Format | Deskripsi |
---|---|---|
visibilitas | ubyte | visibilitas yang diinginkan untuk anotasi ini (lihat di bawah) |
annotation | encoded_annotation | konten anotasi yang dienkode, dalam format yang dijelaskan oleh
"format encoded_annotation " di bagian
"enkode encoded_value " di atas.
|
Nilai visibilitas
Berikut adalah opsi untuk kolom visibility
dalam
annotation_item
:
Nama | Nilai | Deskripsi |
---|---|---|
VISIBILITY_BUILD | 0x00 | hanya dimaksudkan untuk terlihat pada waktu build (misalnya, selama kompilasi kode lain) |
VISIBILITY_RUNTIME | 0x01 | dimaksudkan untuk terlihat saat runtime |
VISIBILITY_SYSTEM | 0x02 | dimaksudkan untuk terlihat saat runtime, tetapi hanya untuk sistem yang mendasarinya (dan bukan untuk kode pengguna biasa) |
encoded_array_item
Dirujuk dari class_def_item
Muncul di bagian data
Perataan: tidak ada (diselaraskan byte)
Nama | Format | Deskripsi |
---|---|---|
nilai | encoded_array | byte yang mewakili nilai array yang dienkode, dalam format yang ditentukan oleh "encoded_array Format" di bagian "encoded_value Encoding" di atas.
|
hiddenapi_class_data_item
Bagian ini berisi data tentang antarmuka terbatas yang digunakan oleh setiap class.
Catatan: Fitur API tersembunyi diperkenalkan di Android 10.0 dan hanya berlaku untuk file DEX class di jalur class booting. Daftar flag yang dijelaskan di bawah dapat diperluas dalam rilis Android mendatang. Untuk mengetahui informasi selengkapnya, lihat pembatasan pada antarmuka non-SDK.
Nama | Format | Deskripsi |
---|---|---|
ukuran | uint | ukuran total bagian |
offset | uint[] | array offset yang diindeks oleh class_idx .
Entri array nol pada indeks class_idx berarti tidak ada data untuk class_idx ini, atau semua tanda API tersembunyi adalah nol.
Jika tidak, entri array bukan nol dan berisi offset dari
awal bagian ke array flag API tersembunyi
untuk class_idx ini.
|
flags | uleb128[] | array gabungan flag API tersembunyi untuk setiap class. Kemungkinan nilai flag dijelaskan dalam tabel di bawah. Flag dienkode dalam urutan yang sama seperti kolom dan metode dienkode dalam data class. |
Jenis tanda pembatasan:
Nama | Nilai | Deskripsi |
---|---|---|
daftar yang diizinkan | 0 | Antarmuka yang dapat digunakan secara bebas dan didukung sebagai bagian dari Indeks Paket framework Android yang didokumentasikan secara resmi. |
daftar abu-abu | 1 | Antarmuka non-SDK yang dapat digunakan, apa pun level API target aplikasi. |
daftar hitam | 2 | Antarmuka non-SDK yang tidak dapat digunakan, apa pun API level target aplikasi. Mengakses salah satu antarmuka ini akan menyebabkan error runtime. |
greylist‑max‑o | 3 | Antarmuka non-SDK yang dapat digunakan untuk Android 8.x dan yang lebih lama kecuali jika dibatasi. |
greylist‑max‑p | 4 | Antarmuka non-SDK yang dapat digunakan untuk Android 9.x kecuali jika dibatasi. |
greylist‑max‑q | 5 | Antarmuka non-SDK yang dapat digunakan untuk Android 10.x kecuali jika dibatasi. |
greylist‑max‑r | 6 | Antarmuka non-SDK yang dapat digunakan untuk Android 11.x kecuali jika dibatasi. |
Anotasi sistem
Anotasi sistem digunakan untuk merepresentasikan berbagai bagian informasi reflektif tentang class (dan metode serta kolom). Informasi ini umumnya hanya diakses secara tidak langsung oleh kode klien (non-sistem).
Anotasi sistem direpresentasikan dalam file .dex
sebagai
anotasi dengan visibilitas yang ditetapkan ke VISIBILITY_SYSTEM
.
dalvik.annotation.AnnotationDefault
Muncul pada metode di antarmuka anotasi
Anotasi AnnotationDefault
dilampirkan ke setiap
antarmuka anotasi yang ingin menunjukkan binding default.
Nama | Format | Deskripsi |
---|---|---|
nilai | Annotation | binding default untuk anotasi ini, yang direpresentasikan sebagai anotasi jenis ini. Anotasi tidak perlu menyertakan semua nama yang ditentukan oleh anotasi; nama yang tidak ada tidak memiliki default. |
dalvik.annotation.EnclosingClass
Muncul di kelas
Anotasi EnclosingClass
dilampirkan ke setiap class
yang ditentukan sebagai anggota class lain, atau
anonim, tetapi tidak ditentukan dalam isi metode (misalnya, class
dalam sintetis). Setiap class yang memiliki anotasi ini juga harus memiliki
anotasi InnerClass
. Selain itu, class tidak boleh memiliki
anotasi EnclosingClass
dan
EnclosingMethod
.
Nama | Format | Deskripsi |
---|---|---|
nilai | Class | class yang cakupan leksikalnya paling dekat dengan class ini |
dalvik.annotation.EnclosingMethod
Muncul di kelas
Anotasi EnclosingMethod
dilampirkan ke setiap class
yang ditentukan di dalam isi metode. Setiap class yang memiliki anotasi
ini juga harus memiliki anotasi InnerClass
.
Selain itu, class tidak boleh memiliki anotasi EnclosingClass
dan EnclosingMethod
.
Nama | Format | Deskripsi |
---|---|---|
nilai | Metode | metode yang paling dekat secara leksikalis mencakup class ini |
dalvik.annotation.InnerClass
Muncul di kelas
Anotasi InnerClass
dilampirkan ke setiap class
yang ditentukan dalam cakupan leksik dari definisi class lain.
Setiap class yang memiliki anotasi ini juga harus memiliki anotasi
EnclosingClass
atau
anotasi EnclosingMethod
.
Nama | Format | Deskripsi |
---|---|---|
nama | String | nama sederhana class ini yang awalnya dideklarasikan (tidak termasuk
awalan paket apa pun). Jika class ini bersifat anonim, namanya adalah
null .
|
accessFlags | int | flag akses class yang awalnya dideklarasikan (yang mungkin berbeda dari flag efektif karena ketidakcocokan antara model eksekusi bahasa sumber dan virtual machine target) |
dalvik.annotation.MemberClasses
Muncul di kelas
Anotasi MemberClasses
dilampirkan ke setiap class
yang mendeklarasikan class anggota. (Class anggota adalah class dalam langsung
yang memiliki nama.)
Nama | Format | Deskripsi |
---|---|---|
nilai | Class[] | array class anggota |
dalvik.annotation.MethodParameters
Muncul di metode
Catatan: Anotasi ini ditambahkan setelah Android 7.1. Kehadirannya di rilis Android sebelumnya akan diabaikan.
Anotasi MethodParameters
bersifat opsional dan dapat digunakan untuk
memberikan metadata parameter seperti nama dan pengubah parameter.
Anotasi dapat dihilangkan dari metode atau konstruktor dengan aman jika
metadata parameter tidak diperlukan saat runtime.
java.lang.reflect.Parameter.isNamePresent()
dapat digunakan untuk memeriksa
apakah metadata ada untuk parameter, dan metode refleksi
terkait seperti java.lang.reflect.Parameter.getName()
akan kembali
ke perilaku default saat runtime jika informasi tidak ada.
Saat menyertakan metadata parameter, compiler harus menyertakan informasi untuk class yang dihasilkan seperti enum, karena metadata parameter menyertakan apakah parameter bersifat sintetis atau diwajibkan.
Anotasi MethodParameters
hanya menjelaskan parameter metode
individual. Oleh karena itu, compiler dapat menghapus anotasi sepenuhnya
untuk konstruktor dan metode yang tidak memiliki parameter, demi ukuran kode
dan efisiensi runtime.
Array yang didokumentasikan di bawah harus berukuran sama dengan
struktur dex method_id_item
yang terkait dengan metode. Jika tidak, java.lang.reflect.MalformedParametersException
akan ditampilkan saat
runtime.
Artinya: method_id_item.proto_idx
->
proto_id_item.parameters_off
->
type_list.size
harus sama dengan names().length
dan
accessFlags().length
.
Karena MethodParameters
menjelaskan semua parameter metode formal, bahkan yang tidak dideklarasikan secara eksplisit atau implisit dalam kode sumber,
ukuran array dapat berbeda dari informasi Signature atau metadata
lainnya yang hanya didasarkan pada parameter eksplisit yang dideklarasikan dalam kode
sumber. MethodParameters
juga tidak akan menyertakan informasi apa pun tentang
parameter penerima anotasi jenis yang tidak ada dalam tanda tangan
metode yang sebenarnya.
Nama | Format | Deskripsi |
---|---|---|
nama | String[] | Nama parameter formal untuk metode terkait. Array
tidak boleh null, tetapi harus kosong jika tidak ada parameter formal. Nilai dalam
array harus null jika parameter formal dengan indeks tersebut tidak memiliki nama. Jika string nama parameter kosong atau berisi '.', ';', '[', atau '/', maka java.lang.reflect.MalformedParametersException akan ditampilkan saat
runtime.
|
accessFlags | int[] | Flag akses parameter formal untuk metode terkait. Array
tidak boleh null, tetapi harus kosong jika tidak ada parameter formal. Nilai ini adalah bit mask dengan nilai berikut:
java.lang.reflect.MalformedParametersException akan ditampilkan saat runtime.
|
dalvik.annotation.Signature
Muncul di class, kolom, dan metode
Anotasi Signature
dilampirkan ke setiap class,
kolom, atau metode yang ditentukan dalam hal jenis yang lebih rumit
daripada yang dapat direpresentasikan oleh type_id_item
. Format
.dex
tidak menentukan format untuk tanda tangan; format ini
hanya dimaksudkan agar dapat merepresentasikan tanda tangan apa pun yang diperlukan bahasa
sumber untuk keberhasilan penerapan semantik
bahasa tersebut. Dengan demikian, tanda tangan umumnya tidak diuraikan (atau diverifikasi)
oleh implementasi virtual machine. Tanda tangan hanya akan diteruskan
ke API dan alat level yang lebih tinggi (seperti debugger). Oleh karena itu, setiap penggunaan
tanda tangan harus ditulis agar tidak membuat
asumsi apa pun tentang hanya menerima tanda tangan yang valid, yang secara eksplisit menjaga
dirinya dari kemungkinan menemukan tanda tangan yang tidak valid secara sintaksis.
Karena string tanda tangan cenderung memiliki banyak konten duplikat,
anotasi Signature
ditentukan sebagai array
string, dengan elemen duplikat secara alami merujuk ke data dasar
yang sama, dan tanda tangan dianggap sebagai penyambungan
semua string dalam array. Tidak ada aturan tentang cara memisahkan
tanda tangan menjadi string terpisah; hal ini sepenuhnya bergantung pada
alat yang membuat file .dex
.
Nama | Format | Deskripsi |
---|---|---|
nilai | String[] | tanda tangan class atau anggota ini, sebagai array string yang akan digabungkan |
dalvik.annotation.Throws
Muncul di metode
Anotasi Throws
dilampirkan ke setiap metode yang
dideklarasikan untuk menampilkan satu atau beberapa jenis pengecualian.
Nama | Format | Deskripsi |
---|---|---|
nilai | Class[] | array jenis pengecualian yang ditampilkan |