Dokumen ini menjelaskan tata letak dan konten file .dex
, yang digunakan untuk menyimpan sekumpulan definisi kelas dan data tambahan terkait.
Panduan untuk tipe
Nama | Keterangan |
---|---|
byte | masuk 8-bit |
ubyte | 8-bit tidak ditandatangani int |
pendek | Masuk 16-bit, little-endian |
pendek | 16-bit unsigned int, little-endian |
ke dalam | Masuk 32-bit, little-endian |
tidak | 32-bit tidak bertanda tangan int, little-endian |
panjang | Masuk 64-bit, little-endian |
ulong | 64-bit tidak bertanda tangan int, little-endian |
sleb128 | bertanda LEB128, panjang variabel (lihat di bawah) |
uleb128 | unsigned LEB128, panjang variabel (lihat di bawah) |
uleb128p1 | unsigned LEB128 plus 1 , panjang variabel (lihat di bawah) |
LEB128
LEB128 (" L ittle- E ndian B ase 128 ") adalah pengkodean panjang variabel untuk jumlah bilangan bulat bertanda atau tidak bertanda sembarang. Formatnya dipinjam dari spesifikasi DWARF3 . Dalam file .dex
, LEB128 hanya digunakan untuk menyandikan jumlah 32-bit.
Setiap nilai yang dikodekan LEB128 terdiri dari satu hingga lima byte, yang bersama-sama mewakili nilai 32-bit tunggal. Setiap byte memiliki kumpulan bit paling signifikan kecuali byte terakhir dalam urutan, yang memiliki bit paling signifikan yang jelas. Tujuh bit tersisa dari setiap byte adalah payload, dengan tujuh bit paling tidak signifikan dari kuantitas tersebut pada byte pertama, tujuh bit berikutnya pada byte kedua, dan seterusnya. Dalam kasus LEB128 yang ditandatangani ( sleb128
), bit payload paling signifikan dari byte terakhir dalam urutan tersebut diperluas tandanya untuk menghasilkan nilai akhir. Dalam kasus unsigned ( uleb128
), bit apa pun yang tidak direpresentasikan secara eksplisit akan ditafsirkan sebagai 0
.
Diagram bitwise dari nilai LEB128 dua byte | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Byte pertama | Byte kedua | ||||||||||||||
1 | sedikit 6 | bagian 5 | bagian 4 | bagian 3 | bagian 2 | sedikit 1 | sedikit 0 | 0 | bagian 13 | bagian 12 | bagian 11 | sedikit 10 | bagian 9 | bagian 8 | sedikit 7 |
Varian uleb128p1
digunakan untuk mewakili nilai yang ditandatangani, dengan representasi nilai ditambah satu yang dikodekan sebagai uleb128
. Hal ini membuat pengkodean -1
(atau dianggap sebagai nilai unsigned 0xffffffff
) — tetapi tidak ada bilangan negatif lainnya — menjadi satu byte, dan berguna dalam kasus-kasus di mana bilangan yang diwakili harus berupa non-negatif atau -1
(atau 0xffffffff
), dan jika tidak ada nilai negatif lainnya yang diperbolehkan (atau jika nilai besar yang tidak ditandatangani kemungkinan besar tidak diperlukan).
Berikut beberapa contoh formatnya:
Urutan yang Dikodekan | 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 berkas
Nama | Format | Keterangan |
---|---|---|
tajuk | header_item | tajuk |
string_id | string_id_item[] | daftar pengidentifikasi string. Ini adalah pengidentifikasi untuk semua string yang digunakan oleh file ini, baik untuk penamaan internal (misalnya, deskriptor tipe) atau sebagai objek konstan yang dirujuk oleh kode. Daftar ini harus diurutkan berdasarkan konten string, menggunakan nilai titik kode UTF-16 (tidak peka terhadap lokalitas), dan tidak boleh berisi entri duplikat. |
type_ids | ketik_id_item[] | ketik daftar pengidentifikasi. Ini adalah pengidentifikasi untuk semua tipe (kelas, array, atau tipe primitif) yang dirujuk oleh file ini, baik ditentukan dalam file atau tidak. Daftar ini harus diurutkan berdasarkan indeks string_id , dan tidak boleh berisi entri duplikat. |
proto_ids | proto_id_item[] | daftar pengidentifikasi prototipe metode. Ini adalah pengidentifikasi untuk semua prototipe yang dirujuk oleh file ini. Daftar ini harus diurutkan berdasarkan urutan utama tipe kembalian (menurut indeks type_id ), dan kemudian berdasarkan daftar argumen (pengurutan leksikografis, argumen individual diurutkan berdasarkan indeks type_id ). Daftar tersebut tidak boleh berisi entri duplikat. |
bidang_id | bidang_id_item[] | daftar pengidentifikasi bidang. Ini adalah pengidentifikasi untuk semua bidang yang dirujuk oleh file ini, baik ditentukan dalam file atau tidak. Daftar ini harus diurutkan, dengan tipe penentu (menurut indeks type_id ) adalah urutan utama, nama bidang (menurut indeks string_id ) adalah urutan perantara, dan jenis (menurut indeks type_id ) adalah urutan minor. Daftar tersebut tidak boleh berisi entri duplikat. |
metode_id | metode_id_item[] | daftar pengidentifikasi metode. Ini adalah pengidentifikasi untuk semua metode yang dirujuk oleh file ini, baik ditentukan dalam file atau tidak. Daftar ini harus diurutkan, dengan tipe 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 tersebut tidak boleh berisi entri duplikat. |
kelas_defs | kelas_def_item[] | daftar definisi kelas. Kelas harus diurutkan sedemikian rupa sehingga superkelas kelas tertentu dan antarmuka yang diimplementasikan muncul dalam daftar lebih awal daripada kelas rujukan. Selain itu, tidak valid jika definisi kelas dengan nama yang sama muncul lebih dari satu kali dalam daftar. |
call_site_ids | panggilan_situs_id_item[] | daftar pengidentifikasi situs panggilan. Ini adalah pengidentifikasi untuk semua situs panggilan yang dirujuk oleh file ini, baik ditentukan dalam file atau tidak. Daftar ini harus diurutkan dalam urutan call_site_off . |
metode_pegangan | metode_pegangan_item[] | metode menangani daftar. Daftar semua metode yang ditangani yang dirujuk oleh file ini, baik ditentukan dalam file atau tidak. Daftar ini tidak diurutkan dan mungkin berisi duplikat yang secara logis sesuai dengan contoh penanganan metode yang berbeda. |
data | ubita[] | area data, berisi semua data pendukung untuk tabel yang tercantum di atas. Item yang berbeda memiliki persyaratan penyelarasan yang berbeda, dan padding byte dimasukkan sebelum setiap item jika perlu untuk mencapai penyelarasan yang tepat. |
tautan_data | ubita[] | 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 tertaut, dan implementasi runtime dapat menggunakannya sesuai keinginan. |
Definisi bitfield, string, dan konstanta
DEX_FILE_MAGIC
Tertanam di header_item
Array/string konstan DEX_FILE_MAGIC
adalah daftar byte yang harus muncul di awal file .dex
agar dapat dikenali. Nilai sengaja berisi baris baru ( "\n"
atau 0x0a
) dan byte nol ( "\0"
atau 0x00
) untuk membantu mendeteksi bentuk korupsi tertentu. Nilai tersebut juga mengkodekan nomor versi format sebagai tiga digit desimal, yang diperkirakan akan meningkat secara monoton seiring berjalannya waktu seiring dengan perkembangan format.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
Catatan: Dukungan untuk format versi 039
telah ditambahkan pada rilis Android 9.0, yang memperkenalkan dua bytecode baru, const-method-handle
dan const-method-type
. (Masing-masing dijelaskan dalam tabel Ringkasan kumpulan bytecode .) Di Android 10, versi 039
memperluas format file DEX untuk menyertakan informasi API tersembunyi yang hanya berlaku untuk file DEX di jalur kelas boot.
Catatan: Dukungan untuk format versi 038
telah ditambahkan pada rilis Android 8.0. Versi 038
menambahkan bytecode baru ( invoke-polymorphic
dan invoke-custom
) dan data untuk penanganan metode.
Catatan: Dukungan untuk format versi 037
telah ditambahkan pada 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 perangkat lunak 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, format versi sebelumnya ini berbeda secara signifikan dari versi yang dijelaskan dalam dokumen ini.
ENDIAN_CONSTANT dan REVERSE_ENDIAN_CONSTANT
Tertanam di header_item
Konstanta ENDIAN_CONSTANT
digunakan untuk menunjukkan endianness file yang ditemukannya. Meskipun format .dex
standarnya adalah little-endian, implementasinya dapat memilih untuk melakukan pertukaran byte. Jika implementasi menemukan header yang endian_tag
adalah REVERSE_ENDIAN_CONSTANT
dan bukan ENDIAN_CONSTANT
, implementasi akan mengetahui bahwa file telah ditukar byte dari bentuk yang diharapkan.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
TIDAK_INDEX
Tertanam di class_def_item dan debug_info_item
Konstanta NO_INDEX
digunakan untuk menunjukkan bahwa nilai indeks tidak ada.
Catatan: Nilai ini tidak didefinisikan sebagai 0
, karena biasanya itu adalah indeks yang valid.
Nilai yang dipilih untuk NO_INDEX
dapat direpresentasikan sebagai satu byte dalam pengkodean uleb128p1
.
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
definisi access_flags
Tertanam di class_def_item, encoded_field, encoded_method, dan InnerClass
Bitfield dari flag ini digunakan untuk menunjukkan aksesibilitas dan properti keseluruhan kelas dan anggota kelas.
Nama | Nilai | Untuk Kelas (dan anotasi InnerClass ) | Untuk Bidang | Untuk Metode |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : terlihat di mana-mana | public : terlihat di mana-mana | public : terlihat di mana-mana |
ACC_PRIVATE | 0x2 | private : hanya terlihat oleh kelas yang menentukan | private : hanya terlihat oleh kelas yang menentukan | private : hanya terlihat oleh kelas yang menentukan |
ACC_PROTECTED | 0x4 | protected : terlihat oleh paket dan subkelas | protected : terlihat oleh paket dan subkelas | protected : terlihat oleh paket dan subkelas |
ACC_STATIC | 0x8 | static : tidak dibuat dengan referensi luar this | static : global untuk mendefinisikan kelas | static : tidak menerima argumen this |
ACC_FINAL | 0x10 | final : tidak dapat disubklasifikasikan | final : tidak dapat diubah setelah konstruksi | final : tidak dapat diganti |
ACC_SYNCHRONISASI | 0x20 | synchronized : kunci terkait secara otomatis diperoleh sekitar panggilan ke metode ini. Catatan: Ini hanya valid untuk disetel jika | ||
ACC_VOLATILE | 0x40 | volatile : aturan akses khusus untuk membantu keamanan thread | ||
ACC_BRIDGE | 0x40 | metode jembatan, ditambahkan secara otomatis oleh kompiler sebagai jembatan yang aman untuk tipe | ||
ACC_TRANSIENT | 0x80 | transient : tidak untuk disimpan secara serialisasi default | ||
ACC_VAARGS | 0x80 | argumen terakhir harus diperlakukan sebagai argumen "istirahat" oleh kompiler | ||
ACC_NATIVE | 0x100 | native : diimplementasikan dalam kode asli | ||
ACC_INTERFACE | 0x200 | interface : kelas abstrak yang dapat diimplementasikan berkali-kali | ||
ACC_ABSTRAK | 0x400 | abstract : tidak dapat dipakai secara langsung | abstract : tidak diimplementasikan oleh kelas ini | |
ACC_STRICT | 0x800 | strictfp : aturan ketat untuk aritmatika floating-point | ||
ACC_SYNTHETIC | 0x1000 | tidak didefinisikan secara langsung dalam kode sumber | tidak didefinisikan secara langsung dalam kode sumber | tidak didefinisikan secara langsung dalam kode sumber |
ACC_ANNOTASI | 0x2000 | dideklarasikan sebagai kelas anotasi | ||
ACC_ENUM | 0x4000 | dideklarasikan sebagai tipe yang disebutkan | dinyatakan sebagai nilai yang disebutkan | |
(tidak terpakai) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | metode konstruktor (penginisialisasi kelas atau instance) | ||
ACC_DECLARED_ DISINKRONISASI | 0x20000 | dinyatakan synchronized .Catatan: Ini tidak berpengaruh pada eksekusi (selain refleksi dari flag ini). |
InnerClass
, dan tidak boleh aktif dalam class_def_item
.
Pengkodean UTF-8 yang dimodifikasi
Sebagai konsesi untuk dukungan warisan yang lebih mudah, format .dex
mengkodekan data stringnya dalam bentuk UTF-8 standar de facto yang dimodifikasi, selanjutnya disebut sebagai MUTF-8. Formulir ini identik dengan UTF-8 standar, kecuali:
- Hanya pengkodean satu, dua, dan tiga byte yang digunakan.
- Titik kode dalam rentang
U+10000
…U+10ffff
dikodekan sebagai pasangan pengganti, yang masing-masing direpresentasikan sebagai nilai yang dikodekan tiga byte. - Titik kode
U+0000
dikodekan dalam bentuk dua byte. - Byte nol biasa (nilai
0
) menunjukkan akhir string, seperti interpretasi bahasa C standar.
Dua item pertama di atas dapat diringkas sebagai: MUTF-8 adalah format pengkodean untuk UTF-16, bukan format pengkodean langsung untuk karakter Unicode.
Dua item terakhir di atas memungkinkan secara bersamaan untuk menyertakan titik kode U+0000
dalam sebuah string dan masih memanipulasinya sebagai string yang diakhiri dengan null gaya C.
Namun, pengkodean 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 yang tidak sama yang ditandatangani dengan benar . Ketika pengurutan (bukan hanya kesetaraan) menjadi perhatian, cara paling mudah untuk membandingkan string MUTF-8 adalah dengan mendekode string tersebut karakter demi karakter, dan membandingkan nilai yang didekodekan. (Namun, penerapan yang lebih cerdas juga dimungkinkan.)
Silakan merujuk ke Standar Unicode untuk informasi lebih lanjut tentang pengkodean karakter. MUTF-8 sebenarnya lebih mirip dengan pengkodean CESU-8 (yang relatif kurang terkenal) dibandingkan dengan UTF-8 itu sendiri.
encoded_value pengkodean
Tertanam di annotation_element dan encoded_array_item
encoded_value
adalah bagian data yang terstruktur secara hierarkis (hampir) arbitrer yang disandikan. Pengkodean ini dimaksudkan agar ringkas dan mudah diurai.
Nama | Format | Keterangan |
---|---|---|
(nilai_arg << 5) | nilai_tipe | ubyte | byte yang menunjukkan tipe value berikutnya bersama dengan argumen klarifikasi opsional dalam tiga bit orde tinggi. Lihat di bawah untuk berbagai definisi value . Dalam kebanyakan kasus, value_arg mengkodekan panjang value segera setelahnya dalam byte, seperti (size - 1) , misalnya, 0 berarti nilai memerlukan satu byte, dan 7 berarti memerlukan delapan byte; namun, ada pengecualian seperti disebutkan di bawah. |
nilai | ubita[] | byte yang mewakili nilai, panjangnya bervariasi dan diinterpretasikan secara berbeda untuk byte value_type yang berbeda, meskipun selalu little-endian. Lihat berbagai definisi nilai di bawah untuk detailnya. |
Format nilai
Ketik nama | value_type | value_arg Format | format value | Keterangan |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (tidak ada; harus 0 ) | ubita[1] | menandatangani nilai integer satu byte |
VALUE_SHORT | 0x02 | ukuran - 1 (0…1) | ubyte[ukuran] | nilai integer dua byte yang ditandatangani, diperpanjang tandanya |
VALUE_CHAR | 0x03 | ukuran - 1 (0…1) | ubyte[ukuran] | nilai integer dua byte yang tidak ditandatangani, diperpanjang nol |
VALUE_INT | 0x04 | ukuran - 1 (0…3) | ubyte[ukuran] | nilai integer empat byte yang ditandatangani, diperpanjang tandanya |
VALUE_PANJANG | 0x06 | ukuran - 1 (0…7) | ubyte[ukuran] | nilai integer delapan byte yang ditandatangani, diperpanjang tandanya |
VALUE_FLOAT | 0x10 | ukuran - 1 (0…3) | ubyte[ukuran] | pola bit empat byte, diperpanjang nol ke kanan , dan ditafsirkan sebagai nilai floating point 32-bit IEEE754 |
VALUE_DOUBLE | 0x11 | ukuran - 1 (0…7) | ubyte[ukuran] | pola bit delapan byte, diperpanjang nol ke kanan , dan ditafsirkan sebagai nilai floating point 64-bit IEEE754 |
VALUE_METHOD_TYPE | 0x15 | ukuran - 1 (0…3) | ubyte[ukuran] | nilai integer empat byte yang tidak ditandatangani (diperluas nol), ditafsirkan sebagai indeks ke dalam bagian proto_ids dan mewakili nilai tipe metode |
VALUE_METHOD_HANDLE | 0x16 | ukuran - 1 (0…3) | ubyte[ukuran] | nilai bilangan bulat empat byte yang tidak ditandatangani (diperpanjang nol), ditafsirkan sebagai indeks ke dalam bagian method_handles dan mewakili nilai pegangan metode |
VALUE_STRING | 0x17 | ukuran - 1 (0…3) | ubyte[ukuran] | nilai integer empat byte yang tidak ditandatangani (diperpanjang nol), ditafsirkan sebagai indeks ke bagian string_ids dan mewakili nilai string |
VALUE_TYPE | 0x18 | ukuran - 1 (0…3) | ubyte[ukuran] | nilai integer empat byte yang tidak ditandatangani (diperpanjang nol), ditafsirkan sebagai indeks ke bagian type_ids dan mewakili nilai tipe/kelas reflektif |
VALUE_FIELD | 0x19 | ukuran - 1 (0…3) | ubyte[ukuran] | nilai bilangan bulat empat byte yang tidak ditandatangani (diperpanjang nol), ditafsirkan sebagai indeks ke dalam bagian field_ids dan mewakili nilai bidang reflektif |
VALUE_METHOD | 0x1a | ukuran - 1 (0…3) | ubyte[ukuran] | nilai integer empat byte yang tidak ditandatangani (diperpanjang nol), ditafsirkan sebagai indeks ke dalam bagian method_ids dan mewakili nilai metode reflektif |
VALUE_ENUM | 0x1b | ukuran - 1 (0…3) | ubyte[ukuran] | nilai bilangan bulat empat byte yang tidak ditandatangani (diperpanjang nol), ditafsirkan sebagai indeks ke dalam bagian field_ids dan mewakili nilai konstanta tipe yang disebutkan |
VALUE_ARRAY | 0x1c | (tidak ada; harus 0 ) | encoded_array | array nilai, dalam format yang ditentukan oleh " encoded_array format" di bawah. Ukuran value tersirat dalam pengkodean. |
VALUE_ANNOTATION | 0x1d | (tidak ada; harus 0 ) | disandikan_anotasi | sub-anotasi, dalam format yang ditentukan oleh " format encoded_annotation " di bawah. Ukuran value tersirat dalam pengkodean. |
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 direpresentasikan dalam value_arg . |
format encoded_array
Nama | Format | Keterangan |
---|---|---|
ukuran | uleb128 | jumlah elemen dalam array |
nilai-nilai | nilai_yang disandikan[ukuran] | serangkaian urutan byte encoded_value size dalam format yang ditentukan oleh bagian ini, digabungkan secara berurutan. |
format anotasi_yang disandikan
Nama | Format | Keterangan |
---|---|---|
ketik_idx | uleb128 | jenis anotasi. Ini harus berupa tipe kelas (bukan array atau primitif). |
ukuran | uleb128 | jumlah pemetaan nama-nilai dalam anotasi ini |
elemen | elemen_anotasi[ukuran] | elemen anotasi, direpresentasikan secara langsung sebaris (bukan sebagai offset). Elemen harus diurutkan dalam urutan menaik berdasarkan indeks string_id . |
format anotasi_elemen
Nama | Format | Keterangan |
---|---|---|
nama_idx | uleb128 | nama elemen, direpresentasikan sebagai indeks ke dalam bagian string_ids . String harus sesuai dengan sintaks MemberName , yang didefinisikan di atas. |
nilai | nilai_yang disandikan | nilai elemen |
Sintaks string
Ada beberapa jenis item dalam file .dex
yang pada akhirnya merujuk pada sebuah string. Definisi gaya BNF berikut menunjukkan sintaksis yang dapat diterima untuk string ini.
Nama Sederhana
SimpleName adalah dasar sintaksis nama benda lain. Format .dex
memberikan keleluasaan yang cukup di sini (lebih banyak daripada kebanyakan bahasa sumber umum). Singkatnya, nama sederhana terdiri dari karakter atau angka alfabet ASCII rendah, beberapa simbol ASCII rendah tertentu, dan sebagian besar titik kode non-ASCII yang bukan kontrol, spasi, atau karakter khusus. Mulai dari versi 040
format ini juga mengizinkan karakter spasi (kategori Unicode Zs
). Perhatikan bahwa titik kode pengganti (dalam kisaran 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 mereka harus direpresentasikan dalam file sebagai pasangan titik kode pengganti dalam pengkodean MUTF-8.
Nama Sederhana → | ||
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 |
Nama anggota
digunakan oleh field_id_item dan method_id_item
MemberName adalah nama anggota kelas, anggotanya adalah bidang, metode, dan kelas dalam.
Nama Anggota → | |
Nama Sederhana | |
| | '<' Nama Sederhana '>' |
NamaKelas Lengkap
FullClassName adalah nama kelas yang sepenuhnya memenuhi syarat, termasuk penentu paket opsional diikuti dengan nama yang diperlukan.
NamaKelas Lengkap → | |
OpsionalPackagePrefix SimpleName | |
OpsionalPackagePrefix → | |
( Nama Sederhana '/' )* |
TypeDescriptor
Digunakan oleh type_id_item
TypeDescriptor adalah representasi tipe apa pun, termasuk primitif, kelas, array, dan void
. Lihat di bawah untuk mengetahui arti dari berbagai versi.
TypeDescriptor → | |
'V' | |
| | Deskriptor Tipe Bidang |
Deskriptor Tipe Bidang → | |
Deskriptor NonArrayFieldType | |
| | ( '[' * 1…255) NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor → | |
'Z' | |
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' NamaKelas Lengkap ';' |
Deskripsi Pendek
Digunakan oleh proto_id_item
ShortyDescriptor adalah representasi bentuk singkat dari prototipe metode, termasuk tipe kembalian dan parameter, kecuali bahwa tidak ada perbedaan antara berbagai tipe referensi (kelas atau array). Sebaliknya, semua tipe referensi diwakili oleh satu karakter 'L'
.
Deskripsi Pendek → | |
ShortyReturnType ( ShortyFieldType )* | |
ShortyReturnType → | |
'V' | |
| | Tipe Bidang Pendek |
Tipe Bidang Pendek → | |
'Z' | |
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
Semantik TypeDescriptor
Inilah arti dari masing-masing varian TypeDescriptor .
Sintaksis | Arti |
---|---|
V | void ; hanya berlaku untuk tipe pengembalian |
Z | boolean |
B | byte |
S | short |
C | char |
SAYA | int |
J | long |
F | float |
D | double |
L lengkap/memenuhi syarat/Nama ; | kelas fully.qualified.Name |
[ deskripsi | array descriptor , dapat digunakan secara rekursif untuk array-of-array, meskipun tidak valid jika memiliki lebih dari 255 dimensi. |
Item dan struktur terkait
Bagian ini mencakup definisi untuk setiap item tingkat atas yang mungkin muncul dalam file .dex
.
header_item
Muncul di bagian header
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
sihir | ubita[8] = DEX_FILE_MAGIC | nilai ajaib. Lihat diskusi di atas pada " DEX_FILE_MAGIC " untuk lebih jelasnya. |
checksum | tidak | adler32 checksum dari sisa file (semuanya kecuali magic dan bidang ini); digunakan untuk mendeteksi kerusakan file |
tanda tangan | ubita[20] | Tanda tangan SHA-1 (hash) dari sisa file (semuanya kecuali magic , checksum , dan bidang ini); digunakan untuk mengidentifikasi file secara unik |
ukuran file | tidak | ukuran seluruh file (termasuk header), dalam byte |
ukuran_header | uint = 0x70 | ukuran header (seluruh bagian ini), dalam byte. Hal ini memungkinkan setidaknya kompatibilitas mundur/maju dalam jumlah terbatas tanpa membuat format menjadi tidak valid. |
endian_tag | uint = ENDIAN_CONSTANT | tag endianness. Lihat pembahasan di atas pada " ENDIAN_CONSTANT dan REVERSE_ENDIAN_CONSTANT " untuk detail lebih lanjut. |
tautan_ukuran | tidak | ukuran bagian tautan, atau 0 jika file ini tidak tertaut secara statis |
link_off | tidak | offset dari awal file ke bagian link, atau 0 jika link_size == 0 . Offsetnya, jika bukan nol, harus diimbangi ke bagian link_data . Format data yang ditunjuk tidak ditentukan oleh dokumen ini; bidang header ini (dan yang sebelumnya) dibiarkan sebagai pengait untuk digunakan oleh implementasi runtime. |
map_off | tidak | offset dari awal file ke item peta. Offset yang harus bukan nol harus diimbangi ke bagian data , dan data harus dalam format yang ditentukan oleh " map_list " di bawah. |
string_ids_size | tidak | jumlah string dalam daftar pengidentifikasi string |
string_ids_off | tidak | offset dari awal file ke daftar pengidentifikasi string, atau 0 jika string_ids_size == 0 (memang merupakan kasus tepi yang aneh). Offsetnya, jika bukan nol, harus berada di awal bagian string_ids . |
type_ids_size | tidak | jumlah elemen dalam daftar pengidentifikasi tipe, paling banyak 65535 |
ketik_ids_off | tidak | offset dari awal file ke daftar pengidentifikasi tipe, atau 0 jika type_ids_size == 0 (memang merupakan kasus tepi yang aneh). Offsetnya, jika bukan nol, harus berada di awal bagian type_ids . |
proto_ids_size | tidak | jumlah elemen dalam daftar pengidentifikasi prototipe, paling banyak 65535 |
proto_ids_off | tidak | offset dari awal file ke daftar pengidentifikasi prototipe, atau 0 jika proto_ids_size == 0 (memang merupakan kasus tepi yang aneh). Offsetnya, jika bukan nol, harus berada di awal bagian proto_ids . |
field_ids_size | tidak | jumlah elemen dalam daftar pengidentifikasi bidang |
field_ids_off | tidak | offset dari awal file ke daftar pengidentifikasi bidang, atau 0 jika field_ids_size == 0 . Offsetnya, jika bukan nol, harus berada di awal bagian field_ids . |
metode_ids_size | tidak | jumlah elemen dalam daftar pengidentifikasi metode |
metode_ids_off | tidak | offset dari awal file ke daftar pengidentifikasi metode, atau 0 jika method_ids_size == 0 . Offsetnya, jika bukan nol, harus berada di awal bagian method_ids . |
kelas_defs_size | tidak | jumlah elemen dalam daftar definisi kelas |
kelas_defs_off | tidak | offset dari awal file ke daftar definisi kelas, atau 0 jika class_defs_size == 0 (memang merupakan kasus tepi yang aneh). Offsetnya, jika bukan nol, harus berada di awal bagian class_defs . |
ukuran_data | tidak | Ukuran bagian data dalam byte. Harus berupa kelipatan genap dari sizeof(uint). |
data_mati | tidak | offset dari awal file ke awal bagian data . |
peta_daftar
Muncul di bagian data
Direferensikan dari header_item
Penyelarasan: 4 byte
Ini adalah daftar seluruh isi file secara berurutan. Ini berisi beberapa redundansi sehubungan dengan header_item
tetapi dimaksudkan sebagai bentuk yang mudah digunakan untuk mengulangi seluruh file. Tipe tertentu harus muncul paling banyak satu kali dalam peta, namun tidak ada batasan mengenai tipe urutan apa yang boleh muncul, selain batasan yang diterapkan oleh format lainnya (misalnya, bagian header
harus muncul terlebih dahulu, diikuti dengan string_ids
bagian, dll.). Selain itu, entri peta harus diurutkan berdasarkan offset awal dan tidak boleh tumpang tindih.
Nama | Format | Keterangan |
---|---|---|
ukuran | tidak | ukuran daftar, dalam entri |
daftar | peta_item[ukuran] | elemen daftar |
format peta_item
Nama | Format | Keterangan |
---|---|---|
jenis | pendek | jenis barang; lihat tabel di bawah |
tidak terpakai | pendek | (tidak terpakai) |
ukuran | tidak | hitungan jumlah item yang dapat ditemukan pada offset yang ditunjukkan |
mengimbangi | tidak | offset dari awal file ke item yang dimaksud |
Ketik kode
Tipe barang | Konstan | Nilai | Ukuran Item Dalam Byte |
---|---|---|---|
header_item | TYPE_HEADER_ITEM | 0x0000 | 0x70 |
string_id_item | TYPE_STRING_ID_ITEM | 0x0001 | 0x04 |
ketik_id_item | TYPE_TYPE_ID_ITEM | 0x0002 | 0x04 |
proto_id_item | TYPE_PROTO_ID_ITEM | 0x0003 | 0x0c |
bidang_id_item | TYPE_FIELD_ID_ITEM | 0x0004 | 0x08 |
metode_id_item | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
kelas_def_item | TYPE_CLASS_DEF_ITEM | 0x0006 | 0x20 |
panggilan_situs_id_item | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x04 |
metode_pegangan_item | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
peta_daftar | TYPE_MAP_LIST | 0x1000 | 4 + (ukuran item * 12) |
ketik_daftar | TYPE_TYPE_LIST | 0x1001 | 4 + (ukuran item * 2) |
anotasi_set_ref_list | TYPE_ANNOTATION_SET_REF_LIST | 0x1002 | 4 + (ukuran item * 4) |
anotasi_set_item | TYPE_ANNOTATION_SET_ITEM | 0x1003 | 4 + (ukuran item * 4) |
kelas_data_item | TYPE_CLASS_DATA_ITEM | 0x2000 | implisit; harus diurai |
kode_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 |
anotasi_item | TYPE_ANNOTATION_ITEM | 0x2004 | implisit; harus diurai |
item_array_yang disandikan | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | implisit; harus diurai |
anotasi_direktori_item | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | implisit; harus diurai |
api_kelas_data_item tersembunyi | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | implisit; harus diurai |
string_id_item
Muncul di bagian string_ids
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
string_data_off | tidak | offset dari awal file ke data string untuk item ini. Offsetnya harus ke lokasi di bagian data , dan data harus dalam format yang ditentukan oleh " string_data_item " di bawah. Tidak ada persyaratan penyelarasan untuk offset. |
string_data_item
Muncul di bagian data
Penyelarasan: tidak ada (selaras byte)
Nama | Format | Keterangan |
---|---|---|
utf16_size | uleb128 | ukuran string ini, dalam satuan kode UTF-16 (yang merupakan "panjang string" di banyak sistem). Artinya, ini adalah panjang string yang didekodekan. (Panjang yang dikodekan ditunjukkan oleh posisi 0 byte.) |
data | ubita[] | serangkaian unit kode MUTF-8 (alias oktet, alias byte) diikuti oleh satu byte bernilai 0 . Lihat "Pengkodean MUTF-8 (Modifikasi UTF-8)" di atas untuk detail dan diskusi tentang format data. Catatan: Dapat diterima untuk memiliki string yang mencakup (bentuk yang dikodekan dari) unit kode pengganti UTF-16 (yaitu, |
ketik_id_item
Muncul di bagian type_ids
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
deskriptor_idx | tidak | indeks ke dalam daftar string_ids untuk string deskriptor jenis ini. String harus sesuai dengan sintaks TypeDescriptor yang didefinisikan di atas. |
proto_id_item
Muncul di bagian proto_ids
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
shorty_idx | tidak | indeks ke dalam daftar string_ids untuk string deskriptor bentuk pendek prototipe ini. String harus sesuai dengan sintaks ShortyDescriptor , yang ditentukan di atas, dan harus sesuai dengan tipe kembalian dan parameter item ini. |
return_type_idx | tidak | indeks ke dalam daftar type_ids untuk tipe kembalian prototipe ini |
parameter_mati | tidak | offset dari awal file ke daftar tipe parameter untuk prototipe ini, atau 0 jika prototipe ini tidak memiliki parameter. Offset ini, jika bukan nol, harus ada di bagian data , dan data di sana harus dalam format yang ditentukan oleh "type_list" di bawah. Selain itu, tidak boleh ada referensi ke tipe void dalam daftar. |
bidang_id_item
Muncul di bagian field_ids
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
kelas_idx | pendek | indeks ke dalam daftar type_ids untuk penentu bidang ini. Ini harus berupa tipe kelas, dan bukan tipe array atau primitif. |
ketik_idx | pendek | indeks ke dalam daftar type_ids untuk jenis bidang ini |
nama_idx | tidak | indeks ke dalam daftar string_ids untuk nama bidang ini. String harus sesuai dengan sintaks MemberName , yang didefinisikan di atas. |
metode_id_item
Muncul di bagian method_ids
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
kelas_idx | pendek | indeks ke dalam daftar type_ids untuk penentu metode ini. Ini harus berupa tipe kelas atau array, dan bukan tipe primitif. |
proto_idx | pendek | indeks ke dalam daftar proto_ids untuk prototipe metode ini |
nama_idx | tidak | indeks ke dalam daftar string_ids untuk nama metode ini. String harus sesuai dengan sintaks MemberName , yang didefinisikan di atas. |
kelas_def_item
Muncul di bagian class_defs
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
kelas_idx | tidak | indeks ke dalam daftar type_ids untuk kelas ini. Ini harus berupa tipe kelas, dan bukan tipe array atau primitif. |
access_flags | tidak | tanda akses untuk kelas ( public , final , dll.). Lihat " access_flags Definisi" untuk detailnya. |
superclass_idx | tidak | indeks ke dalam daftar type_ids untuk superkelas, atau nilai konstan NO_INDEX jika kelas ini tidak memiliki superkelas (yaitu, kelas root seperti Object ). Jika ada, ini harus berupa tipe kelas, dan bukan tipe array atau primitif. |
antarmuka_mati | tidak | offset dari awal file ke daftar antarmuka, atau 0 jika tidak ada. Offset ini harus ada di bagian data , dan data di sana harus dalam format yang ditentukan oleh " type_list " di bawah. Setiap elemen daftar harus bertipe kelas (bukan array atau tipe primitif), dan tidak boleh ada duplikat. |
sumber_file_idx | tidak | indeks ke dalam daftar string_ids untuk nama file yang berisi sumber asli untuk (setidaknya sebagian besar) kelas ini, atau nilai khusus NO_INDEX untuk menunjukkan kurangnya informasi ini. debug_info_item metode apa pun mungkin menimpa file sumber ini, namun diharapkan sebagian besar kelas hanya akan berasal dari satu file sumber. |
anotasi_mati | tidak | offset dari awal file ke struktur anotasi untuk kelas ini, atau 0 jika tidak ada anotasi pada kelas 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 mengacu pada kelas ini sebagai penentu. |
kelas_data_off | tidak | offset dari awal file ke data kelas terkait untuk item ini, atau 0 jika tidak ada data kelas untuk kelas ini. (Ini mungkin terjadi, misalnya, jika kelas 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 mengacu pada kelas ini sebagai penentu. |
static_values_off | tidak | offset dari awal file ke daftar nilai awal untuk bidang static , atau 0 jika tidak ada (dan semua bidang static harus diinisialisasi dengan 0 atau null ). Offset ini harus ada 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 bidang static yang dideklarasikan oleh kelas ini, dan elemen-elemennya sesuai dengan bidang static dalam urutan yang sama seperti yang dideklarasikan dalam field_list yang sesuai. Tipe setiap elemen array harus sesuai dengan tipe yang dideklarasikan pada kolom terkait. Jika jumlah elemen dalam array lebih sedikit daripada jumlah kolom static , maka kolom sisa akan diinisialisasi dengan tipe 0 atau null yang sesuai. |
panggilan_situs_id_item
Muncul di bagian call_site_ids
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
panggilan_situs_mati | tidak | offset dari awal file untuk memanggil definisi situs. Offsetnya harus ada di bagian data, dan data di sana harus dalam format yang ditentukan oleh "call_site_item" di bawah. |
panggilan_situs_item
Muncul di bagian data
Penyelarasan: tidak ada (selaras byte)
call_site_item adalah encoded_array_item yang elemennya sesuai dengan argumen yang diberikan pada metode bootstrap linker. Tiga argumen pertama adalah:
- Pegangan metode yang mewakili metode bootstrap linker (VALUE_METHOD_HANDLE).
- Nama metode yang harus diselesaikan oleh bootstrap linker (VALUE_STRING).
- Tipe metode yang sesuai dengan tipe nama metode yang akan diselesaikan (VALUE_METHOD_TYPE).
Argumen tambahan apa pun adalah nilai konstan yang diteruskan ke metode bootstrap linker. Argumen ini diteruskan secara berurutan dan tanpa konversi jenis apa pun.
Pegangan metode yang mewakili metode bootstrap linker harus memiliki tipe pengembalian java.lang.invoke.CallSite
. Tiga jenis parameter pertama adalah:
-
java.lang.invoke.Lookup
-
java.lang.String
-
java.lang.invoke.MethodType
Tipe parameter argumen tambahan ditentukan dari nilai konstannya.
metode_pegangan_item
Muncul di bagian method_handles
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
metode_handle_type | pendek | jenis pegangan metode; lihat tabel di bawah |
tidak terpakai | pendek | (tidak terpakai) |
bidang_atau_metode_id | pendek | ID bidang atau metode bergantung pada apakah jenis pegangan metode merupakan pengakses atau pemanggil metode |
tidak terpakai | pendek | (tidak terpakai) |
Metode menangani kode tipe
Konstan | Nilai | Keterangan |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0x00 | Pegangan metode adalah penyetel bidang statis (aksesor) |
METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | Pegangan metode adalah pengambil bidang statis (aksesor) |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | Pegangan metode adalah penyetel bidang instance (aksesor) |
METHOD_HANDLE_TYPE_INSTANCE_GET | 0x03 | Pegangan metode adalah pengambil bidang instance (aksesor) |
METHOD_HANDLE_TYPE_INVOKE_STATIC | 0x04 | Pegangan metode adalah pemanggil metode statis |
METHOD_HANDLE_TYPE_INVOKE_INSTANCE | 0x05 | Pegangan metode adalah pemanggil metode instan |
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR | 0x06 | Pegangan metode adalah pemanggil metode konstruktor |
Method_handle_type_invoke_direct | 0x07 | Pegangan Metode adalah Metode Langsung Invoker |
Method_handle_type_invoke_interface | 0x08 | Pegangan metode adalah Invoker Metode Antarmuka |
class_data_item
Direferensikan dari class_def_item
Muncul di bagian data
Alignment: Tidak Ada (Byte-Aligned)
Nama | Format | Keterangan |
---|---|---|
static_fields_size | Uleb128 | Jumlah bidang statis yang ditentukan dalam item ini |
instance_fields_size | Uleb128 | Jumlah bidang 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] | Bidang statis yang ditentukan, diwakili sebagai urutan elemen yang dikodekan. Bidang harus diurutkan berdasarkan field_idx dalam urutan yang meningkat. |
instance_fields | encoded_field [instance_fields_size] | Bidang instance yang ditentukan, diwakili sebagai urutan elemen yang dikodekan. Bidang harus diurutkan berdasarkan field_idx dalam urutan yang meningkat. |
Direct_methods | encoded_method [direct_methods_size] | Metode langsung (salah satu static , private , atau konstruktor) yang ditentukan, diwakili sebagai urutan elemen yang dikodekan. Metode harus disortir dengan method_idx dalam urutan yang meningkat. |
virtual_methods | encoded_method [virtual_methods_size] | Metode virtual (tidak satu pun dari static , private , atau konstruktor), diwakili sebagai urutan elemen yang dikodekan. Daftar ini tidak boleh termasuk metode yang diwariskan kecuali ditimpa oleh kelas yang diwakili oleh item ini. Metode harus disortir dengan method_idx dalam urutan yang meningkat. method_idx dari metode virtual tidak boleh sama dengan metode langsung apa pun. |
Catatan: Instance field_id
dan method_id
semua elemen harus merujuk ke kelas penentu yang sama.
format encoded_field
Nama | Format | Keterangan |
---|---|---|
field_idx_diff | Uleb128 | Indeks ke dalam daftar field_ids untuk identitas bidang ini (termasuk nama dan deskriptor), diwakili sebagai perbedaan dari indeks elemen sebelumnya dalam daftar. Indeks elemen pertama dalam daftar diwakili secara langsung. |
access_flags | Uleb128 | Bendera akses untuk lapangan ( public , final , dll.). Lihat "Definisi access_flags " untuk detailnya. |
format encoded_method
Nama | Format | Keterangan |
---|---|---|
method_idx_diff | Uleb128 | Indeks ke dalam daftar method_ids untuk identitas metode ini (termasuk nama dan deskriptor), diwakili sebagai perbedaan dari indeks elemen sebelumnya dalam daftar. Indeks elemen pertama dalam daftar diwakili secara langsung. |
access_flags | Uleb128 | Bendera akses untuk metode ini ( public , final , dll.). Lihat "Definisi access_flags " untuk detailnya. |
kode_mati | Uleb128 | Offset dari awal file ke struktur kode untuk metode ini, atau 0 jika metode ini abstract atau native . Offset harus ke lokasi di bagian data . Format data ditentukan oleh " code_item " di bawah ini. |
type_list
Direferensikan dari class_def_item dan proto_id_item
Muncul di bagian data
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
ukuran | tidak | Ukuran daftar, di entri |
daftar | type_item [ukuran] | elemen daftar |
format type_item
Nama | Format | Keterangan |
---|---|---|
type_idx | pendek | indeks ke daftar type_ids |
code_item
Direferensikan dari encoded_method
Muncul di bagian data
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
registers_size | pendek | Jumlah register yang digunakan oleh kode ini |
INS_SIZE | pendek | Jumlah kata argumen yang masuk ke metode kode ini |
outs_size | pendek | Jumlah kata ruang argumen keluar yang diperlukan oleh kode ini untuk doa metode |
tries_size | pendek | Jumlah try_item s untuk contoh ini. Jika bukan nol, maka ini muncul sebagai array tries tepat setelah insns dalam contoh ini. |
debug_info_off | tidak | Offset dari awal file ke info debug (nomor baris + info variabel lokal) untuk kode ini, atau 0 jika tidak ada informasi. Offset, jika bukan nol, harus ke lokasi di bagian data . Format data ditentukan oleh " debug_info_item " di bawah ini. |
INSNS_SIZE | tidak | Ukuran daftar instruksi, dalam unit kode 16-bit |
insns | Ushort [INSNS_SIZE] | Array bytecode yang sebenarnya. Format kode dalam array insns ditentukan oleh dokumen pendamping Dalvik bytecode . Perhatikan bahwa meskipun ini didefinisikan sebagai array ushort , ada beberapa struktur internal yang lebih suka penyelarasan empat byte. Juga, jika ini kebetulan berada dalam file endian-swapped, maka pertukaran hanya dilakukan pada ushort masing-masing dan bukan pada struktur internal yang lebih besar. |
lapisan | Ushort (opsional) = 0 | Dua byte padding untuk membuat tries empat byte disejajarkan. Elemen ini hanya ada jika tries_size tidak nol dan insns_size aneh. |
mencoba | try_item [tries_size] (opsional) | Array menunjukkan di mana dalam pengecualian kode ditangkap dan bagaimana menanganinya. Elemen array harus tidak tumpang tindih dalam jangkauan dan agar dari alamat rendah ke tinggi. Elemen ini hanya ada jika tries_size tidak nol. |
penangan | encoded_catch_handler_list (opsional) | Byte yang mewakili daftar daftar jenis tangkapan dan alamat penangan terkait. Setiap try_item memiliki byte-wise offset ke dalam struktur ini. Elemen ini hanya ada jika tries_size tidak nol. |
format try_item
Nama | Format | Keterangan |
---|---|---|
start_addr | tidak | Mulai alamat blok kode yang dicakup oleh entri ini. Alamat adalah hitungan unit kode 16-bit hingga awal instruksi tertutup pertama. |
INSN_COUNT | pendek | Jumlah unit kode 16-bit yang dicakup oleh entri ini. Unit kode terakhir yang dicakup (inklusif) adalah start_addr + insn_count - 1 . |
Handler_off | pendek | Offset dalam byte dari awal encoded_catch_hander_list yang terkait ke encoded_catch_handler untuk entri ini. Ini harus merupakan offset ke awal encoded_catch_handler . |
format encoded_catch_handler_list
Nama | Format | Keterangan |
---|---|---|
ukuran | Uleb128 | Ukuran daftar ini, dalam entri |
daftar | encoded_catch_handler [handlers_size] | Daftar daftar pawang yang sebenarnya, diwakili secara langsung (bukan sebagai offset), dan disatukan secara berurutan |
format encoded_catch_handler
Nama | Format | Keterangan |
---|---|---|
ukuran | SLEB128 | Jumlah jenis tangkapan dalam daftar ini. Jika non-positif, maka ini adalah negatif dari jumlah jenis tangkapan, dan tangkapan diikuti oleh pawang semua. Sebagai contoh: size 0 berarti bahwa ada tangkapan-semua tetapi tidak ada tangkapan yang diketik secara eksplisit. size 2 berarti ada dua tangkapan yang diketik secara eksplisit dan tidak ada tangkapan-semua. Dan size -1 berarti ada satu tangkapan yang diketik bersama dengan semua tangkapan. |
penangan | encoded_type_addr_pair [abs (size)] | Aliran abs(size) item yang dikodekan, satu untuk setiap jenis yang ditangkap, dalam urutan jenisnya harus diuji. |
catch_all_addr | Uleb128 (opsional) | Alamat bytecode penangan semua. Elemen ini hanya ada jika size tidak positif. |
format encoded_type_addr_pair
Nama | Format | Keterangan |
---|---|---|
type_idx | Uleb128 | indeks ke daftar type_ids untuk jenis pengecualian untuk ditangkap |
tambahan | Uleb128 | Alamat bytecode penangan pengecualian terkait |
debug_info_item
Direferensikan dari code_item
Muncul di bagian data
Alignment: Tidak Ada (Byte-Aligned)
Setiap debug_info_item
mendefinisikan mesin status byte-byte-byte yang terinspirasi oleh kurcaci yang, ketika ditafsirkan, memancarkan tabel posisi dan (berpotensi) informasi variabel lokal untuk code_item
. Urutan dimulai dengan variabel-length header (yang panjangnya tergantung pada jumlah parameter metode), diikuti oleh bytecode mesin negara, dan diakhiri dengan byte DBG_END_SEQUENCE
.
Mesin negara bagian terdiri dari lima register. Daftar address
mewakili instruksi offset di insns_item
yang terkait dalam unit kode 16-bit. Daftar address
dimulai pada 0
pada awal setiap urutan debug_info
dan hanya harus meningkat secara monoton. Daftar line
mewakili nomor baris sumber apa yang harus dikaitkan dengan entri tabel posisi berikutnya yang dipancarkan oleh mesin negara. Ini diinisialisasi dalam 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 bendera boolean (diinisialisasi ke false
) yang menunjukkan apakah posisi berikutnya yang dipancarkan harus dianggap sebagai metode prolog atau epilog. Mesin negara juga harus melacak nama dan jenis variabel lokal terakhir secara langsung di setiap register untuk kode DBG_RESTART_LOCAL
.
Headernya adalah sebagai berikut:
Nama | Format | Keterangan |
---|---|---|
line_start | Uleb128 | Nilai awal untuk register line mesin negara. Tidak mewakili entri posisi aktual. |
parameter_size | Uleb128 | Jumlah nama parameter yang dikodekan. Harus ada satu per parameter per metode, tidak termasuk metode instance this , jika ada. |
parameter_names | Uleb128p1 [parameter_size] | Indeks string dari nama parameter metode. Nilai yang dikodekan dari NO_INDEX menunjukkan bahwa tidak ada nama yang tersedia untuk parameter terkait. Jenis deskriptor dan tanda tangan tersirat dari deskriptor metode dan tanda tangan. |
Nilai kode byte adalah sebagai berikut:
Nama | Nilai | Format | Argumen | Keterangan |
---|---|---|---|---|
DBG_END_SEPERENCE | 0x00 | (tidak ada) | mengakhiri urutan info debug untuk code_item | |
Dbg_advance_pc | 0x01 | Uleb128 addr_diff | addr_diff : Jumlah yang akan ditambahkan ke daftar alamat | memajukan daftar alamat tanpa memancarkan entri posisi |
Dbg_advance_line | 0x02 | SLEB128 LINE_DIFF | line_diff : Jumlah untuk mengubah register line oleh | memajukan register garis tanpa memancarkan entri posisi |
Dbg_start_local | 0x03 | Uleb128 Register_num Uleb128p1 name_idx Uleb128p1 type_idx | register_num : Daftar yang akan berisi lokalname_idx : indeks string namatype_idx : Jenis indeks tipe | memperkenalkan variabel lokal di alamat saat ini. Baik name_idx atau type_idx mungkin NO_INDEX untuk menunjukkan bahwa nilai itu tidak diketahui. |
Dbg_start_local_extended | 0x04 | Uleb128 Register_num Uleb128p1 name_idx Uleb128p1 type_idx Uleb128p1 sig_idx | register_num : Daftar yang akan berisi lokalname_idx : indeks string namatype_idx : Jenis indeks tipesig_idx : indeks string dari tanda tangan tipe | memperkenalkan lokal dengan tanda tangan tipe di alamat saat ini. name_idx , type_idx , atau sig_idx mungkin NO_INDEX untuk menunjukkan bahwa nilai itu tidak diketahui. (Jika sig_idx adalah -1 , data yang sama dapat diwakili secara lebih efisien menggunakan opcode DBG_START_LOCAL .) Catatan: Lihat diskusi di bawah " |
Dbg_end_local | 0x05 | Uleb128 Register_num | register_num : daftar yang berisi lokal | Menandai variabel lokal yang sedang hidup sebagai ruang lingkup di alamat saat ini |
Dbg_restart_local | 0x06 | Uleb128 Register_num | register_num : Daftar untuk memulai kembali | Pengenalan ulang variabel lokal di alamat saat ini. Nama dan jenisnya sama dengan lokal terakhir yang tinggal di register yang ditentukan. |
DBG_SET_PROGUE_END | 0x07 | (tidak ada) | Mengatur register mesin status prologue_end , menunjukkan bahwa entri posisi berikutnya yang ditambahkan harus dianggap sebagai akhir dari prolog metode (tempat yang tepat untuk metode breakpoint). Register prologue_end dihapus oleh opcode khusus ( >= 0x0a ). | |
Dbg_set_epilogue_begin | 0x08 | (tidak ada) | Menetapkan register mesin negara bagian epilogue_begin , yang menunjukkan bahwa entri posisi berikutnya yang ditambahkan harus dianggap sebagai awal dari metode epilog (tempat yang tepat 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 membuat referensi ke nama file sumber ini, alih -alih nama default yang ditentukan dalam code_item |
Opcodes Khusus | 0x0a… 0xff | (tidak ada) | memajukan register line dan address , memancarkan entri posisi, dan membersihkan prologue_end dan epilogue_begin . Lihat di bawah untuk deskripsi. |
Opcodes Khusus
Opcodes dengan nilai antara 0x0a
dan 0xff
(inklusif) Pindahkan kedua line
dan address
register dengan jumlah kecil dan kemudian 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
Direferensikan dari class_def_item
Muncul di bagian data
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
class_annotations_off | tidak | Offset dari awal file ke anotasi yang dibuat langsung di kelas, atau 0 jika kelas tidak memiliki anotasi langsung. Offset, jika bukan nol, harus ke lokasi di bagian data . Format data ditentukan oleh " annotation_set_item " di bawah ini. |
fields_size | tidak | Hitungan bidang yang dianotasi oleh item ini |
annotated_methods_size | tidak | Hitungan metode yang dijelaskan oleh item ini |
annotated_parameters_size | tidak | Hitungan Parameter Metode Daftar yang Dianotasi oleh Item Ini |
field_annotations | field_annotation [fields_size] (opsional) | Daftar anotasi lapangan terkait. Elemen -elemen daftar harus disortir dalam urutan yang meningkat, oleh field_idx . |
method_annotations | method_annotation [Methods_size] (opsional) | Daftar anotasi metode terkait. Elemen -elemen daftar harus diurutkan dalam urutan yang meningkat, dengan method_idx . |
parameter_anotasi | parameter_annotation [parameter_size] (opsional) | Daftar Anotasi Parameter Metode Terkait. Elemen -elemen daftar harus diurutkan dalam urutan yang meningkat, dengan method_idx . |
Catatan: Instance field_id
dan method_id
semua elemen harus merujuk ke kelas penentu yang sama.
format field_annotation
Nama | Format | Keterangan |
---|---|---|
field_idx | tidak | indeks ke dalam daftar field_ids untuk identitas bidang yang dijelaskan |
Annotations_off | tidak | Offset dari awal file ke daftar anotasi untuk bidang ini. Offset harus ke lokasi di bagian data . Format data ditentukan oleh " annotation_set_item " di bawah ini. |
Method_annotation format
Nama | Format | Keterangan |
---|---|---|
method_idx | tidak | indeks ke dalam daftar method_ids untuk identitas metode yang dianotasi |
Annotations_off | tidak | Offset dari awal file ke daftar anotasi untuk metode ini. Offset harus ke lokasi di bagian data . Format data ditentukan oleh " annotation_set_item " di bawah ini. |
format parameter_annotation
Nama | Format | Keterangan |
---|---|---|
method_idx | tidak | indeks ke dalam daftar method_ids untuk identitas metode yang parameternya dianotasi |
Annotations_off | tidak | 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 ini. |
annotation_set_ref_list
Direferensikan dari parameter_annotations_item
Muncul di bagian data
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
ukuran | tidak | Ukuran daftar, di entri |
daftar | annotation_set_ref_item [ukuran] | elemen daftar |
format annotation_set_ref_item
Nama | Format | Keterangan |
---|---|---|
Annotations_off | tidak | Offset dari awal file ke set anotasi yang direferensikan atau 0 jika tidak ada anotasi untuk elemen ini. Offset, jika bukan nol, harus ke lokasi di bagian data . Format data ditentukan oleh " annotation_set_item " di bawah ini. |
annotation_set_item
Direferensikan dari annotations_directory_item, field_annotations_item, method_annotations_item, dan annotation_set_ref_item
Muncul di bagian data
Penyelarasan: 4 byte
Nama | Format | Keterangan |
---|---|---|
ukuran | tidak | Ukuran set, dalam entri |
entri | annotation_off_item [ukuran] | elemen set. Elemen harus disortir dalam urutan yang meningkat, berdasarkan type_idx . |
format annotation_off_item
Nama | Format | Keterangan |
---|---|---|
annotation_off | tidak | Offset dari awal file ke anotasi. Offset harus ke lokasi di bagian data , dan format data di lokasi itu ditentukan oleh " annotation_item " di bawah ini. |
annotation_item
Direferensikan dari annotation_set_item
Muncul di bagian data
Alignment: Tidak Ada (Byte-Aligned)
Nama | Format | Keterangan |
---|---|---|
visibilitas | ubyte | Visibilitas yang dimaksudkan dari anotasi ini (lihat di bawah) |
anotasi | encoded_annotation | Isi anotasi yang dikodekan, dalam format yang dijelaskan oleh "format encoded_annotation " di bawah " encoded_value encoding" di atas. |
Nilai visibilitas
Ini adalah opsi untuk bidang visibility
di annotation_item
:
Nama | Nilai | Keterangan |
---|---|---|
Visibilitas_build | 0x00 | dimaksudkan hanya untuk terlihat pada waktu pembangunan (misalnya, selama kompilasi kode lainnya) |
Visibilitas_runtime | 0x01 | dimaksudkan untuk terlihat saat runtime |
Visibilitas_system | 0x02 | dimaksudkan untuk terlihat saat runtime, tetapi hanya untuk sistem yang mendasarinya (dan bukan untuk kode pengguna biasa) |
encoded_array_item
Direferensikan dari class_def_item
Muncul di bagian data
Alignment: Tidak Ada (Byte-Aligned)
Nama | Format | Keterangan |
---|---|---|
nilai | encoded_array | Byte yang mewakili nilai array yang dikodekan, dalam format yang ditentukan oleh "format encoded_array " di bawah " encoded_value encoding" di atas. |
hiddenapi_class_data_item
Bagian ini berisi data pada antarmuka terbatas yang digunakan oleh setiap kelas.
Catatan: Fitur API Tersembunyi diperkenalkan di Android 10.0 dan hanya berlaku untuk file DEX dari kelas di jalur kelas boot. Daftar bendera yang dijelaskan di bawah ini dapat diperpanjang dalam rilis Android di masa mendatang. Untuk informasi lebih lanjut, lihat pembatasan antarmuka non-SDK .
Nama | Format | Keterangan |
---|---|---|
ukuran | tidak | Ukuran total bagian |
offset | uint [] | Array offset diindeks oleh class_idx . Entri nol array di index class_idx berarti bahwa tidak ada data untuk class_idx ini, atau semua bendera API tersembunyi adalah nol. Kalau tidak, entri array tidak nol dan berisi offset dari awal bagian ke array bendera API tersembunyi untuk class_idx ini. |
bendera | Uleb128 [] | Array yang digabungkan dari bendera API tersembunyi untuk setiap kelas. Nilai bendera yang mungkin dijelaskan dalam tabel di bawah ini. Bendera dikodekan dalam urutan yang sama dengan bidang dan metode dikodekan dalam data kelas. |
Jenis bendera pembatasan:
Nama | Nilai | Keterangan |
---|---|---|
daftar putih | 0 | Antarmuka yang dapat digunakan secara bebas dan didukung sebagai bagian dari indeks paket kerangka kerja Android yang didokumentasikan secara resmi. |
daftar abu-abu | 1 | Antarmuka non-SDK yang dapat digunakan terlepas dari tingkat API target aplikasi. |
daftar hitam | 2 | Antarmuka non-SDK yang tidak dapat digunakan terlepas dari tingkat API target aplikasi. Mengakses salah satu antarmuka ini menyebabkan kesalahan runtime . |
Greylist - Max - O. | 3 | Antarmuka non-SDK yang dapat digunakan untuk Android 8.x dan di bawah kecuali mereka dibatasi. |
Greylist - Max - P. | 4 | Antarmuka non-SDK yang dapat digunakan untuk Android 9.x kecuali mereka dibatasi. |
Greylist - Max -Q | 5 | Antarmuka non-SDK yang dapat digunakan untuk Android 10.x kecuali mereka dibatasi. |
Greylist - Max - R. | 6 | Antarmuka non-SDK yang dapat digunakan untuk Android 11.x kecuali mereka dibatasi. |
Anotasi Sistem
Anotasi sistem digunakan untuk mewakili berbagai informasi reflektif tentang kelas (dan metode dan bidang). Informasi ini umumnya hanya diakses secara tidak langsung oleh kode klien (non-sistem).
Anotasi sistem direpresentasikan dalam file .dex
sebagai anotasi dengan visibilitas yang diatur ke VISIBILITY_SYSTEM
.
Dalvik.Annotation.AnnotationDefault
Muncul pada metode dalam antarmuka anotasi
Anotasi AnnotationDefault
dilampirkan pada setiap antarmuka anotasi yang ingin menunjukkan binding default.
Nama | Format | Keterangan |
---|---|---|
nilai | Anotasi | Binding default untuk anotasi ini, diwakili sebagai anotasi jenis ini. Anotasi tidak perlu termasuk semua nama yang ditentukan oleh anotasi; Nama yang hilang sama sekali tidak memiliki default. |
Dalvik.Annotation.enclosingClass
Muncul di kelas
Anotasi EnclosingClass
melekat pada setiap kelas yang didefinisikan sebagai anggota kelas lain, per se, atau anonim tetapi tidak didefinisikan dalam badan metode (misalnya, kelas dalam sintetis). Setiap kelas yang memiliki anotasi ini juga harus memiliki anotasi InnerClass
. Selain itu, suatu kelas tidak boleh memiliki anotasi EnclosingClass
dan EnclosingMethod
.
Nama | Format | Keterangan |
---|---|---|
nilai | Kelas | Kelas yang paling dekat dengan leksikal mencakup kelas ini |
dalvik.annotation.enclosingmethod
Muncul di kelas
Sebuah anotasi EnclosingMethod
yang melampirkan melekat pada setiap kelas yang didefinisikan di dalam badan metode. Setiap kelas yang memiliki anotasi ini juga harus memiliki anotasi InnerClass
. Selain itu, suatu kelas tidak boleh memiliki anotasi EnclosingClass
dan EnclosingMethod
.
Nama | Format | Keterangan |
---|---|---|
nilai | metode | Metode yang paling dekat secara lexically mencakup kelas ini |
dalvik.annotation.innerclass
Muncul di kelas
Anotasi InnerClass
dilampirkan pada setiap kelas yang didefinisikan dalam ruang lingkup leksikal dari definisi kelas lain. Kelas apa pun yang memiliki anotasi ini juga harus memiliki anotasi EnclosingClass
atau anotasi EnclosingMethod
.
Nama | Format | Keterangan |
---|---|---|
nama | Rangkaian | Nama sederhana yang awalnya dinyatakan dari kelas ini (tidak termasuk awalan paket apa pun). Jika kelas ini anonim, maka namanya null . |
AccessFlags | ke dalam | Bendera akses yang awalnya dideklarasikan dari kelas (yang mungkin berbeda dari bendera efektif karena ketidakcocokan antara model eksekusi bahasa sumber dan mesin virtual target) |
Dalvik.Annotation.Memberclasses
Muncul di kelas
Anotasi MemberClasses
dilampirkan pada setiap kelas yang menyatakan kelas anggota. (Kelas anggota adalah kelas dalam langsung yang memiliki nama.)
Nama | Format | Keterangan |
---|---|---|
nilai | Kelas[] | array kelas anggota |
dalvik.annotation.methodparameters
Muncul pada metode
Catatan: Anotasi ini ditambahkan setelah Android 7.1. Kehadirannya pada rilis Android sebelumnya akan diabaikan.
Anotasi MethodParameters
adalah opsional dan dapat digunakan untuk memberikan metadata parameter seperti nama parameter dan pengubah.
Anotasi dapat dihilangkan dari metode atau konstruktor dengan aman ketika metadata parameter tidak diperlukan saat runtime. java.lang.reflect.Parameter.isNamePresent()
dapat digunakan untuk memeriksa apakah metadata hadir untuk parameter, dan metode refleksi terkait seperti java.lang.reflect.Parameter.getName()
akan kembali ke perilaku default pada saat runtime. Jika informasinya tidak ada.
Saat memasukkan metadata parameter, kompiler harus menyertakan informasi untuk kelas yang dihasilkan seperti enum, karena metadata parameter mencakup apakah parameter itu sintetis atau mandat.
Anotasi MethodParameters
hanya menjelaskan parameter metode individual. Oleh karena itu, kompiler dapat menghilangkan anotasi sepenuhnya untuk konstruktor dan metode yang tidak memiliki parameter, demi ukuran kode dan efisiensi runtime.
Array yang didokumentasikan di bawah ini harus memiliki ukuran yang sama seperti untuk struktur method_id_item
Dex yang terkait dengan metode ini, jika tidak, java.lang.reflect.MalformedParametersException
akan dilemparkan 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 secara eksplisit atau implisit dideklarasikan dalam kode sumber, ukuran array mungkin berbeda dari tanda tangan atau informasi metadata lainnya yang hanya didasarkan pada parameter eksplisit yang dinyatakan dalam kode sumber. MethodParameters
juga tidak akan menyertakan informasi tentang parameter penerima anotasi jenis yang tidak ada dalam tanda tangan metode aktual.
Nama | Format | Keterangan |
---|---|---|
nama | Rangkaian[] | Nama parameter formal untuk metode terkait. Array tidak boleh nol tetapi harus kosong jika tidak ada parameter formal. Nilai dalam array harus nol jika parameter formal dengan indeks itu tidak memiliki nama. Jika string nama parameter kosong atau berisi '.', ';', '[' Atau '/' maka java.lang.reflect.MalformedParametersException akan dilemparkan saat runtime. |
AccessFlags | ke dalam[] | Bendera akses dari parameter formal untuk metode terkait. Array tidak boleh nol tetapi harus kosong jika tidak ada parameter formal. Nilainya sedikit topeng dengan nilai -nilai berikut:
java.lang.reflect.MalformedParametersException akan dilemparkan saat runtime. |
Dalvik.annotation.Signature
Muncul di kelas, bidang, dan metode
Anotasi Signature
dilampirkan pada setiap kelas, bidang, atau metode yang didefinisikan dalam hal tipe yang lebih rumit daripada yang dapat diwakili oleh type_id_item
. Format .dex
tidak menentukan format untuk tanda tangan; Ini hanya dimaksudkan untuk dapat mewakili tanda tangan apa pun yang dibutuhkan bahasa sumber untuk keberhasilan implementasi semantik bahasa itu. Dengan demikian, tanda tangan umumnya tidak diuraikan (atau diverifikasi) oleh implementasi mesin virtual. Tanda tangan hanya diserahkan ke API dan alat tingkat lebih tinggi (seperti debuggers). Setiap penggunaan tanda tangan, oleh karena itu, harus ditulis agar tidak membuat asumsi tentang hanya menerima tanda tangan yang valid, secara eksplisit menjaga dirinya sendiri terhadap kemungkinan menemukan tanda tangan yang tidak valid secara sintaksis.
Karena string tanda tangan cenderung memiliki banyak konten yang digandakan, anotasi Signature
didefinisikan sebagai serangkaian string, di mana unsur -unsur yang digandakan secara alami merujuk pada data yang mendasari yang sama, dan tanda tangan dianggap sebagai gabungan dari semua string dalam array tersebut . Tidak ada aturan tentang cara memisahkan tanda tangan menjadi string terpisah; Itu sepenuhnya tergantung pada alat yang menghasilkan file .dex
.
Nama | Format | Keterangan |
---|---|---|
nilai | Rangkaian[] | tanda tangan kelas atau anggota ini, sebagai serangkaian string yang akan digabungkan bersama |
dalvik.annotation.throws
Muncul pada metode
Sebuah anotasi Throws
pada setiap metode yang dinyatakan melempar satu atau lebih jenis pengecualian.
Nama | Format | Keterangan |
---|---|---|
nilai | Kelas[] | serangkaian jenis pengecualian dilemparkan |