Dokumen ini menjelaskan tata letak dan konten .dex
, yang digunakan untuk menyimpan sekumpulan definisi class dan file terkait
data tambahan.
Panduan jenis-jenis
Nama | Deskripsi |
---|---|
byte | Int login 8 bit |
{i>ubyte<i} | Int 8-bit yang tidak ditandatangani |
short | Int login 16-bit, little-endian |
singkat | 16-bit tanpa tanda tangan int, little-endian |
int | Int login 32-bit, little-endian |
Uint | 32-bit tanpa tanda tangan int, little-endian |
long | Int 64-bit bertanda tangan, little-endian |
Ulong | 64-bit tanpa tanda tangan int, little-endian |
sleb128 | LEB128 bertanda tangan, panjang variabel (lihat di bawah) |
uleb128 | LEB128 yang tidak ditandatangani, panjang-variabel (lihat di bawah) |
uleb128p1 | LEB128 yang tidak ditandatangani ditambah 1 , panjang variabel (lihat di bawah) |
LEB128
LEB128 ("Little-Endian Base 128") adalah
encoding panjang variabel
kuantitas bilangan bulat yang ditandatangani atau tidak
ditandatangani secara arbitrer. Formatnya adalah
yang dipinjam dari DWARF3
spesifikasi
pendukung. Dalam file .dex
, LEB128 hanya digunakan untuk
mengenkode jumlah 32-bit.
Setiap nilai yang dienkode dengan LEB128 terdiri dari satu hingga lima
{i>byte<i}, yang bersama-sama
mewakili nilai 32-bit tunggal. Masing-masing
memiliki set bit yang paling signifikan kecuali untuk byte terakhir dalam
, yang memiliki bagian paling jelas yang jelas. Sisa
tujuh bit dari setiap byte adalah {i>payload<i},
dengan tujuh bit yang paling tidak signifikan
bit jumlah di byte pertama, tujuh berikutnya dalam byte kedua
dan seterusnya. Dalam kasus LEB128 yang ditandatangani (sleb128
),
bit {i>payload<i} paling signifikan dari byte
terakhir dalam urutan ini adalah
{i>sign-extended<i} untuk
menghasilkan nilai akhir. Dalam kasus yang tidak ditandatangani
(uleb128
), setiap bit yang tidak
diwakili secara eksplisit adalah
ditafsirkan sebagai 0
.
Diagram bitwise dari nilai LEB128 dua byte | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Byte pertama | Byte kedua | ||||||||||||||
1 |
bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | 0 |
bit13 | bit12 | bit11 | bit10 | bit9 | bit8 | bit7 |
Varian uleb128p1
digunakan untuk merepresentasikan
, dengan representasi yang dienkode adalah nilai plus satu yang dienkode
sebagai uleb128
. Hal ini membuat encoding -1
(atau juga dianggap sebagai nilai yang tidak ditandatangani 0xffffffff
)
— tetapi tidak ada angka negatif lainnya — satu byte, dan
berguna dalam kasus tertentu
di mana angka yang diwakili harus
bukan negatif atau -1
(atau 0xffffffff
),
dan yang nilai-nilai negatifnya tidak dibolehkan (atau jika nilai besar yang tidak ditandatangani
kemungkinan nilai tersebut tidak diperlukan).
Berikut beberapa contoh formatnya:
Urutan yang Dienkodekan | Sebagai sleb128 |
Sebagai uleb128 |
Sebagai uleb128p1 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
Tata letak file
Nama | Format | Deskripsi |
---|---|---|
header | item_header | {i>header<i} |
string_id [id_string] | string_id_item[] | daftar ID string. Ini adalah ID untuk semua {i>string<i} digunakan oleh file ini, baik untuk penamaan internal (mis., deskriptor jenis) atau sebagai objek konstan yang dirujuk oleh kode. Daftar ini harus diurutkan menurut isi string, menggunakan nilai poin kode UTF-16 (bukan dalam sensitif terhadap lokalitas), dan tidak boleh berisi entri duplikat. |
jenis_id | type_id_item[] | daftar ID jenis. Ini adalah pengenal untuk semua jenis (class,
(jenis primitif) yang dirujuk oleh file ini, baik yang telah ditentukan
dalam file atau tidak. Daftar ini harus diurutkan menurut string_id
indeks, dan tidak boleh berisi entri duplikat.
|
id_proto | proto_id_item[] | daftar ID prototipe metode. Ini adalah ID untuk semua
prototipe yang dirujuk
oleh file ini. Daftar ini harus disortir dalam
urutan utama jenis nilai yang ditampilkan (berdasarkan indeks type_id ), lalu
berdasarkan daftar argumen (pengurutan leksikografis, argumen individual
diurutkan menurut indeks type_id ). Daftar tidak boleh
berisi entri duplikat.
|
id_kolom | field_id_item[] | daftar ID kolom. Ini adalah ID untuk semua kolom
yang dirujuk oleh file ini, baik
yang didefinisikan dalam file atau tidak. Ini
daftar harus diurutkan, dengan jenis pendefinisian (berdasarkan type_id
indeks) adalah urutan utama, nama kolom (berdasarkan indeks string_id )
adalah urutan perantara, dan jenis (berdasarkan indeks type_id )
adalah pesanan minor. Daftar tidak boleh berisi entri duplikat.
|
id_metode | method_id_item[] | daftar ID metode. Ini adalah ID untuk semua metode
yang dirujuk oleh file ini, baik
yang didefinisikan dalam file atau tidak. Ini
daftar harus diurutkan, dengan jenis pendefinisian (berdasarkan type_id
indeks) adalah urutan utama, nama metode (berdasarkan string_id
indeks) adalah urutan perantara, dan purwarupa metode (berdasarkan
proto_id ) adalah pesanan minor. Daftar tidak boleh
berisi entri duplikat.
|
class_def | class_def_item[] | daftar definisi class. Class harus diurutkan sedemikian rupa sehingga superclass class dan antarmuka yang diimplementasikan akan muncul di lebih awal daripada kelas perujuk. Selain itu, token tidak valid untuk definisi untuk kelas dengan nama yang sama muncul lebih dari sekali dalam daftar. |
id_situs_panggilan | call_site_id_item[] | panggil daftar ID situs. Ini merupakan ID untuk semua situs panggilan
yang dirujuk oleh file ini, baik
yang didefinisikan dalam file atau tidak. Daftar ini
harus diurutkan dalam urutan call_site_off menaik.
|
metode_menangani | method_handle_item[] | metode yang menangani daftar. Daftar semua nama sebutan channel yang dirujuk oleh file ini, yang ditentukan dalam file atau tidak. Daftar ini tidak diurutkan dan mungkin berisi duplikasi yang secara logis akan berhubungan dengan instance penanganan metode yang berbeda. |
data | ubyte[] | area data, yang berisi semua data dukungan untuk tabel yang tercantum di atas. Item yang berbeda memiliki persyaratan penyelarasan yang berbeda, dan byte padding disisipkan sebelum setiap item jika diperlukan untuk mencapai keselarasan yang tepat. |
link_data [data_link] | ubyte[] | data yang digunakan dalam file yang terhubung secara statis. Format data pada bagian ini tidak ditetapkan oleh dokumen ini. Bagian ini kosong dalam file yang dibatalkan tautannya, dan implementasi runtime dapat menggunakannya sesuai kebutuhan. |
Definisi bitfield, string, dan konstanta
DEX_FILE_MAGIC
Disematkan di header_item
Array/string konstanta DEX_FILE_MAGIC
adalah daftar
byte yang harus muncul di awal file .dex
agar dapat dikenali sebagaimana mestinya. Nilai ini sengaja
berisi baris baru ("\n"
atau 0x0a
) dan
null byte ("\0"
atau 0x00
) untuk membantu
dalam mendeteksi bentuk-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 perkembangan format.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
Catatan: Dukungan untuk versi 039
format baru ini ditambahkan dalam rilis Android 9.0, yang memperkenalkan
bytecode baru, const-method-handle
, dan
const-method-type
. (Masing-masing dijelaskan dalam
Ringkasan kumpulan bytecode
tabel.) Di Android 10, versi 039
memperluas format file DEX untuk menyertakan
Informasi API yang hanya berlaku untuk file DEX di jalur class booting.
Catatan: Dukungan untuk versi
038
format ditambahkan di Android 8.0
data. Versi 038
menambahkan bytecode baru
(invoke-polymorphic
dan invoke-custom
) dan
untuk nama sebutan channel.
Catatan: Dukungan untuk versi 037
format ini ditambahkan dalam
rilis Android 7.0. Sebelum versi 037
paling sering
versi Android telah menggunakan format 035
. Satu-satunya
perbedaan antara versi 035
dan 037
adalah
penambahan metode default dan penyesuaian invoke
.
Catatan: Setidaknya beberapa versi format sebelumnya memiliki
telah digunakan dalam rilis perangkat
lunak publik yang tersedia secara luas. Misalnya,
versi 009
digunakan untuk rilis M3 dari
Platform Android (November–Desember 2007),
dan versi 013
digunakan untuk rilis M5 Android
(Februari–Maret 2008). Dalam beberapa hal,
versi berbeda secara signifikan berbeda dengan versi yang dijelaskan dalam
dokumen.
ENDIAN_CONSTANT dan REVERSE_ENDIAN_CONSTANT
Disematkan di header_item
Konstanta ENDIAN_CONSTANT
digunakan untuk menunjukkan
endianness dari file tempat file itu ditemukan. Meskipun standar
Format .dex
adalah little-endian, implementasi dapat memilih
untuk melakukan pertukaran byte. Jika implementasi menemukan
header yang endian_tag
-nya adalah REVERSE_ENDIAN_CONSTANT
bukannya ENDIAN_CONSTANT
, sistem akan mengetahui bahwa file tersebut
telah {i>byte-swap <i}dari bentuk yang diharapkan.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
TIDAK ADA INDEKS
Disematkan di class_def_item dan debug_info_item
Konstanta NO_INDEX
digunakan untuk menunjukkan bahwa
nilai indeks tidak ada.
Catatan: Nilai ini tidak ditetapkan sebagai
0
, karena sebenarnya ini adalah indeks yang valid.
Nilai yang dipilih untuk NO_INDEX
adalah
dapat diwakili sebagai byte tunggal dalam encoding uleb128p1
.
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
definisi access_flags
Disematkan di class_def_item, coded_field, encrypted_method, dan Dalam Kelas
{i>Bitfield<i} dari penanda 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 : dapat dilihat di mana saja |
public : dapat dilihat di mana saja |
public : dapat dilihat di mana saja |
ACC_PRIVATE | 0x2 | private : hanya terlihat oleh class yang menentukan
|
private : hanya terlihat oleh menentukan class |
private : hanya terlihat oleh menentukan class |
{i>ACC_PROTECTED<i} | 0x4 | protected : terlihat oleh paket dan subclass
|
protected : terlihat oleh paket dan subclass |
protected : terlihat oleh paket dan subclass |
{i>ACC_STATIC<i} | 0x8 | static : tidak dibuat dengan lapisan luar
Referensi this |
static : class global ke class pendefinisi |
static : tidak menerima argumen this |
ACC_FINAL | 0x10 | final : tidak dapat dibuat subclass |
final : tidak dapat diubah setelah dibangun |
final : tidak dapat diganti |
ACC_SYNCHRONIZED | 0x20 | synchronized : kunci terkait yang diperoleh secara otomatis
pada panggilan ke metode ini. Catatan: Ini hanya valid jika disetel jika
|
||
ACC_VOLATILE | 0x40 | volatile : aturan akses khusus untuk membantu rangkaian pesan
melakukan safety |
||
{i>ACC_ tua<i} | 0x40 | metode bridge, ditambahkan secara otomatis oleh compiler sebagai metode keamanan jenis jembatan | ||
ACC_TRANSIENT | 0x80 | transient : tidak disimpan secara default |
||
ACC_VARARGS | 0x80 | argumen terakhir harus diperlakukan sebagai "rest" argumen berdasarkan compiler | ||
ACC_NATIVE | 0x100 | native : diimplementasikan dalam kode native |
||
ACC_INTERFACE | 0x200 | interface : class abstrak yang dapat diimplementasikan dan dilipatgandakan |
||
ACC_ABSTRAK | 0x400 | abstract : tidak dapat dibuat instance-nya secara langsung |
abstract : tidak diterapkan oleh class ini |
|
ACC_STRICT | 0x800 | strictfp : aturan ketat untuk aritmetika floating point |
||
{i>ACC_SYNTHETIC<i} | 0x1000 | tidak didefinisikan secara langsung dalam kode sumber | tidak didefinisikan secara langsung dalam kode sumber | tidak didefinisikan secara langsung dalam kode sumber |
ACC_Creator | 0x2000 | yang dideklarasikan sebagai class anotasi | ||
ACC_ENUM | 0x4000 | dideklarasikan sebagai jenis terenumerasi | dideklarasikan sebagai nilai yang dienumerasi | |
(tidak digunakan) | 0x8.000 | |||
AKC_CONSTRUCTOR | 0x10.000 | metode konstruktor (penginisialisasi class atau instance) | ||
ACC_DECLARED_ SYNCHRONIZED |
0x20.000 | mendeklarasikan synchronized . Catatan: Penetapan ini tidak akan memengaruhi eksekusi (selain dari refleksi tanda ini, itu sendiri). |
InnerClass
,
dan tidak boleh aktif di class_def_item
.
Encoding UTF-8 yang dimodifikasi
Untuk mempermudah dukungan lama, format .dex
mengenkode data string-nya dalam bentuk UTF-8 modifikasi standar de facto, selanjutnya
yang disebut sebagai MUTF-8. Format ini identik dengan UTF-8 standar, kecuali:
- Hanya encoding satu, dua, dan tiga byte yang digunakan.
- Titik kode dalam rentang
U+10000
...U+10ffff
dienkode sebagai pasangan surrogate, masing-masing yang direpresentasikan sebagai nilai yang dienkode dengan tiga byte. - Titik kode
U+0000
dienkode dalam bentuk dua byte. - Byte null biasa (nilai
0
) menunjukkan akhir dari sebuah {i>string<i}, sebagaimana interpretasi bahasa C standar.
Dua item pertama di atas dapat diringkas sebagai: MUTF-8 adalah format encoding untuk UTF-16, bukan format format encoding untuk karakter Unicode.
Dua item terakhir di atas memungkinkan
secara bersamaan untuk menyertakan
titik kode U+0000
dalam string dan tetap memanipulasi
itu sebagai string yang dihentikan {i>null<i} 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 yang ditandatangani dengan benar dari perbandingan string yang tidak sama.
Saat memesan (tidak hanya kesetaraan) adalah masalah, yang paling lugas
cara membandingkan {i>string<i} MUTF-8 adalah
dengan mendekodenya karakter demi karakter,
dan membandingkan
nilai-nilai yang telah didekode. (Namun, implementasi yang lebih cerdas
juga dimungkinkan.)
Harap lihat Unicode Standar untuk informasi lebih lanjut tentang encoding karakter. MUTF-8 sebenarnya lebih dekat dengan encoding (yang relatif kurang dikenal) CESU-8 daripada UTF-8 biayanya per s.
encoding encoding_value
Disematkan di annotation_element dan encoding_array_item
encoded_value
adalah bagian yang dienkode dari (hampir)
data terstruktur secara hierarkis yang arbitrer. Pengkodean ini dimaksudkan untuk
ringkas dan mudah diurai.
Nama | Format | Deskripsi |
---|---|---|
(value_arg << 5) | nilai_tipe | {i>ubyte<i} | byte yang menunjukkan jenis peristiwa
value bersama
dengan argumen klarifikasi opsional
dalam tiga bit urutan tinggi.
Lihat di bawah untuk mengetahui berbagai definisi value .
Pada umumnya, value_arg mengenkode panjang
value berikutnya dalam byte, seperti
(size - 1) , misalnya, 0 berarti bahwa
nilainya memerlukan satu byte, dan 7 berarti memerlukan
delapan {i>byte<i}; namun, ada pengecualian seperti yang tercantum di bawah ini.
|
nilai | ubyte[] | {i>byte<i} yang mewakili nilai, panjangnya bervariasi, dan
secara berbeda untuk value_type byte yang berbeda,
selalu little-endian. Lihat berbagai definisi nilai di bawah ini untuk
spesifikasi
pendukung.
|
Format nilai
Ketik Nama | value_type |
Format value_arg |
Format value |
Deskripsi |
---|---|---|---|---|
NILAI_BYTE | 0x00 | (none; harus 0 ) |
ubyte[1] | nilai bilangan bulat satu byte yang ditandatangani |
NILAI_SHORTS | 0x02 | ukuran - 1 (0...1) | ubyte[size] | nilai bilangan bulat dua byte yang ditandatangani, {i>sign-extended<i} |
NILAI_CHAR | 0x03 | ukuran - 1 (0...1) | ubyte[size] | nilai bilangan bulat dua byte yang tidak ditandatangani, nol-diperluas |
VALUE_INT | 0x04 | ukuran - 1 (0...3) | ubyte[size] | nilai bilangan bulat empat byte yang ditandatangani, {i>sign-extended<i} |
NILAI_PANJANG | 0x06 | ukuran - 1 (0...7) | ubyte[size] | nilai bilangan bulat delapan byte yang ditandatangani, {i>sign-extended<i} |
NILAI_FLOAT | 0x10 | ukuran - 1 (0...3) | ubyte[size] | pola bit empat byte, dipanjangkan nol ke kanan, dan ditafsirkan sebagai nilai floating point 32-bit IEEE754 |
NILAI_Ganda | 0x11 | ukuran - 1 (0...7) | ubyte[size] | pola bit delapan byte, memanjang 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 (nol-diperluas),
ditafsirkan sebagai indeks ke dalam
bagian proto_ids dan merepresentasikan nilai jenis metode
|
VALUE_METHOD_HANDLE | 0x16 | ukuran - 1 (0...3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas),
ditafsirkan sebagai indeks ke dalam
bagian method_handles dan merepresentasikan nilai pengendalian metode
|
VALUE_STRING | 0x17 | ukuran - 1 (0...3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas),
ditafsirkan sebagai indeks ke dalam
bagian string_ids dan merepresentasikan nilai string
|
NILAI_JENIS | 0x18 | ukuran - 1 (0...3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas),
ditafsirkan sebagai indeks ke dalam
bagian type_ids dan merepresentasikan
nilai jenis/class
|
KOLOM_VALUE | 0x19 | ukuran - 1 (0...3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas),
ditafsirkan sebagai indeks ke dalam
bagian field_ids dan merepresentasikan
nilai kolom
|
VALUE_METHOD | 0x1a | ukuran - 1 (0...3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas),
ditafsirkan sebagai indeks ke dalam
bagian method_ids dan merepresentasikan
nilai metode
|
VALUE_ENUM | 0x1b | ukuran - 1 (0...3) | ubyte[size] | nilai bilangan bulat empat byte yang tidak ditandatangani (nol-diperluas),
ditafsirkan sebagai indeks ke dalam
bagian field_ids dan mewakili nilai
konstanta jenis yang dienumerasi
|
NILAI_ARRAY | 0x1c | (none; harus 0 ) |
array_enkode | array nilai, dalam format yang ditentukan oleh
"Format encoded_array " di bawah ini. Ukuran
value bersifat implisit dalam encoding.
|
NILAI | 0x1h | (none; harus 0 ) |
anotasi_yang_dikodekan | sub-anotasi, dalam format
yang ditentukan oleh
"Format encoded_annotation " di bawah ini. Ukuran
value bersifat implisit dalam encoding.
|
VALUE_NULL | 0x1e | (none; harus 0 ) |
(tidak ada) | Nilai referensi null |
NILAI_BOOLEAN | 0x1f | boolean (0...1) | (tidak ada) | nilai satu bit; 0 untuk false dan
1 untuk true . Bit diwakili dalam
value_arg .
|
format encode_array
Nama | Format | Deskripsi |
---|---|---|
ukuran | uleb128 | jumlah elemen dalam array |
nilai-nilai | nilai_dikodekan[size] | rangkaian size encoded_value byte
urutan dalam format yang ditentukan oleh bagian ini, yang disambungkan
secara berurutan.
|
format encoding_annotation
Nama | Format | Deskripsi |
---|---|---|
jenis_idx | uleb128 | jenis anotasi. Ini harus berupa class (bukan array atau primitif) . |
ukuran | uleb128 | jumlah pemetaan nilai nama dalam anotasi ini |
elemen | anotasi_elemen[size] | anotasi, yang direpresentasikan langsung di baris (tidak seperti
). Elemen harus diurutkan dalam urutan meningkat berdasarkan
Indeks string_id .
|
format annotate_element
Nama | Format | Deskripsi |
---|---|---|
nama_idx | uleb128 | nama elemen, direpresentasikan sebagai indeks ke dalam
string_ids . String harus sesuai dengan
untuk MemberName, yang ditentukan di atas.
|
nilai | nilai_yang_dikodekan | nilai elemen |
Sintaksis string
Ada beberapa jenis item dalam file .dex
yang
pada akhirnya merujuk
pada suatu {i>string<i}. Definisi gaya BNF berikut
menunjukkan sintaks yang dapat diterima untuk {i>string<i} ini.
NamaSederhana
SimpleName adalah dasar sintaksis nama
banyak hal. Format .dex
memungkinkan garis lintang yang cukup
di sini (jauh lebih banyak daripada bahasa sumber yang paling umum). Singkatnya, proses
terdiri dari karakter atau angka alfabet ASCII rendah, beberapa
simbol ASCII rendah tertentu, dan sebagian
besar poin kode non-ASCII yang tidak
kontrol, spasi, atau karakter khusus. Mulai dari versi 040
format ini juga memungkinkan karakter spasi (Unicode Zs
kategori). Perhatikan bahwa poin kode surrogate
(dalam rentang U+d800
... U+dfff
) tidak
dianggap sebagai karakter nama yang valid,
tetapi perangkat tambahan Unicode
karakter valid (yang diwakili oleh
alternatif dari aturan SimpleNameChar), dan parameter tersebut harus
direpresentasikan dalam file sebagai pasangan
titik kode pengganti dalam MUTF-8
encoding.
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 |
NamaAnggota
digunakan oleh field_id_item dan method_id_item
MemberName adalah nama dari anggota kelas, anggota yang {i>field<i}, metode, dan {i>inner class<i}.
MemberName → | |
NamaSederhana | |
| | '<' SimpleName '>' |
{i>FullClassName<i}
FullClassName adalah nama class yang sepenuhnya memenuhi syarat, termasuk penentu paket opsional diikuti dengan nama yang diperlukan.
FullClassName → | |
OptionalPackagePrefix SimpleName | |
OptionalPackagePrefix → | |
(SimpleName '/' )* |
TypeDescriptor
Digunakan menurut type_id_item
TypeDescriptor adalah representasi jenis apa pun, termasuk
primitif, class, array, dan void
. Lihat di bawah untuk
arti dari berbagai versi.
TypeDescriptor → | |
'V' |
|
| | FieldTypeDescriptor |
FieldTypeDescriptor → | |
NonArrayFieldTypeDescriptor | |
| | ('[' * 1...255)
NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor→ | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' NamaKelas Penuh ';' |
Deskripsi Shorty
Digunakan oleh proto_id_item
ShortyDescriptor adalah representasi bentuk singkat dari suatu metode
termasuk tipe pengembalian dan parameter, kecuali jika ada
tidak ada perbedaan antara berbagai jenis referensi (class atau array). Sebagai gantinya,
semua jenis referensi direpresentasikan 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 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 |
Sepenuhnya/memenuhi syarat/Nama; | kelas fully.qualified.Name |
[deskriptor | array descriptor , dapat digunakan secara rekursif untuk
array-of-array, meskipun tidak valid untuk memiliki lebih dari 255
dimensi kustom.
|
Item dan struktur terkait
Bagian ini mencakup definisi untuk setiap item tingkat atas yang
dapat muncul dalam file .dex
.
item_header
Muncul di bagian header
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
sihir | ubyte[8] = DEX_FILE_MAGIC | nilai ajaib. Lihat diskusi di atas pada "DEX_FILE_MAGIC "
untuk mengetahui detail selengkapnya.
|
{i>checksum<i} | Uint | {i>checksum<i} adler32 dari sisa file (semua kecuali
magic dan kolom ini); digunakan untuk mendeteksi kerusakan file
|
tanda tangan | ubyte[20] | Tanda tangan SHA-1 (hash) dari sisa file (semua kecuali
magic , checksum , dan kolom ini); digunakan
untuk mengidentifikasi file secara unik
|
ukuran_file | Uint | ukuran seluruh file (termasuk {i>header<i}), dalam byte |
ukuran_header | uint = 0x70 | ukuran {i>header<i} (seluruh bagian ini), dalam byte. Hal ini memungkinkan di memiliki sedikit kompatibilitas mundur/ke depan tanpa membuat format menjadi tidak valid. |
tag_endian | uint = ENDIAN_CONSTANT | tag endianness. Lihat diskusi di atas pada "ENDIAN_CONSTANT
dan REVERSE_ENDIAN_CONSTANT " untuk mengetahui detail selengkapnya.
|
link_size [ukuran_link] | Uint | ukuran bagian link, atau 0 jika file ini bukan
tertaut secara statis |
link_off | Uint | offset dari awal file ke bagian link, atau
0 jika link_size == 0 . {i>Offset<i}, jika bukan nol,
harus di-offset ke bagian link_data . Tujuan
format data yang ditunjuk tidak ditentukan oleh dokumen ini;
isian {i>header<i} ini (dan sebelumnya) dibiarkan
sebagai hook untuk digunakan oleh
implementasi runtime.
|
map_off | Uint | offset dari awal file ke item peta. Offset, yang harus
bukan nol, harus untuk di-offset ke bagian data ,
dan data harus dalam format yang ditentukan oleh "map_list "
di bawah ini.
|
string_ids_size [ukuran_id_string] | Uint | jumlah string dalam daftar ID string |
string_id_off | Uint | dari awal file ke
daftar ID string, atau
0 jika string_ids_size == 0 (tentunya
{i>edge case<i} yang aneh). {i>Offset<i}, jika bukan nol,
harus di awal bagian string_ids .
|
type_ids_size [ukuran_id_jenis] | Uint | jumlah elemen dalam daftar ID jenis, maksimal 65535 |
type_ids_off | Uint | dari awal file ke
daftar pengidentifikasi jenis, atau
0 jika type_ids_size == 0 (tentunya
{i>edge case<i} yang aneh). {i>Offset<i}, jika bukan nol,
seharusnya ke awal type_ids
bagian.
|
proto_ids_size [ukuran_id_proto] | Uint | jumlah elemen dalam daftar pengidentifikasi prototipe, maksimal 65535 |
proto_ids_off | Uint | kompensasi dari awal file ke
daftar pengidentifikasi prototipe, atau
0 jika proto_ids_size == 0 (tentunya
{i>edge case<i} yang aneh). {i>Offset<i}, jika bukan nol,
seharusnya ke awal proto_ids
bagian.
|
ukuran_id_kolom | Uint | jumlah elemen dalam daftar ID kolom |
field_ids_off | Uint | dari awal file ke daftar ID kolom, atau
0 jika field_ids_size == 0 . Offset, jika
bukan nol, harus sejak awal field_ids
bagian. |
ukuran_id_metode | Uint | jumlah elemen dalam daftar ID metode |
id_metode_nonaktif | Uint | dari awal file ke daftar ID metode, atau
0 jika method_ids_size == 0 . Offset, jika
bukan nol, harus sejak awal method_ids
bagian. |
{i>class_defs_size<i} | Uint | jumlah elemen dalam daftar definisi class |
class_defs_off | Uint | dari awal file ke daftar definisi class, atau
0 jika class_defs_size == 0 (tentunya
{i>edge case<i} yang aneh). {i>Offset<i}, jika bukan nol,
harus di awal bagian class_defs .
|
ukuran_data | Uint | Ukuran bagian data dalam byte. Harus genap
kelipatan dari sizeof(uint). |
data_nonaktif | Uint | dari awal file hingga awal
data .
|
map_list (daftar_peta)
Muncul di bagian data
Direferensikan dari header_item
Perataan: 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 melakukan iterasi pada seluruh
. Jenis tertentu harus muncul paling banyak sekali di peta, tetapi tidak ada
batasan terkait jenis pesanan yang akan ditampilkan, selain
batasan yang tersirat oleh format lainnya (mis.,
Bagian header
harus muncul terlebih dahulu, diikuti dengan
string_ids
, dll.). Selain itu, entri peta harus
diurutkan berdasarkan offset awal dan tidak boleh tumpang-tindih.
Nama | Format | Deskripsi |
---|---|---|
ukuran | Uint | ukuran daftar, dalam entri |
daftar | map_item[size] | elemen daftar |
format map_item
Nama | Format | Deskripsi |
---|---|---|
type | singkat | jenis item; lihat tabel di bawah |
unused | singkat | (tidak digunakan) |
ukuran | Uint | hitungan jumlah item yang akan ditemukan pada offset yang ditunjukkan |
offset | Uint | offset dari awal file hingga item yang dipermasalahkan |
Ketik kode
Tipe Item | Konstanta | Nilai | Ukuran Item Dalam Byte |
---|---|---|---|
item_header | ITEM_Header_TYPE | 0x0.000 | 0x70 |
string_id_item [item_id_string] | ITEM_ITEM_STRING_STRING | 0x0001 | 0x04 |
type_id_item [item_id_jenis] | ITEM_ID_TYPE_TYPE | 0x0002 | 0x04 |
proto_id_item [item_id_prototipe] | JENIS_ITEM_ID_PROTO | 0x0003 | 0x0c |
field_id_item | TYPE_FIELD_ID_ITEM | 0x0004 | 0x08 |
item_id_metode | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
class_def_item [item_defini_kelas] | ITEM_DEF_CLASS_TYPE_CLASS_DEF | 0x0006 | 0x20 |
call_site_id_item [item_id_situs] | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x04 |
method_handle_item [item_handle_item] | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
map_list (daftar_peta) | TYPE_MAP_LIST | 0x1000 | 4 + (item.size * 12) |
type_list (daftar jenis) | TYPE_TYPE_LIST | 0x1001 | 4 + (item.size * 2) |
anotasi_set_ref_list | TYPE_7.SET_REF_LIST | 0x1002 | 4 + (item.size * 4) |
anotasi_set_item | TYPE_edu_SET_ITEM | 0x1003 | 4 + (item.size * 4) |
class_data_item [item_data_kelas] | ITEM_DATA_CLASS_TYPE_CLASS_DATA | 0x2000 | implisit; harus diurai |
item_kode | ITEM_KODE_TYPE | 0x2001 | implisit; harus diurai |
string_data_item [item_data_string] | ITEM_DATA_TYPE_STRING | 0x2002 | implisit; harus diurai |
debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | implisit; harus diurai |
anotasi_item | TYPE_ usia ITEM | 0x2004 | implisit; harus diurai |
item_array_yang_dikodekan | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | implisit; harus diurai |
anotasi_direktori_item | {i>TYPE_CreatorS_DIRECTORY_ITEM<i} | 0x2006 | implisit; harus diurai |
tersembunyiapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | implisit; harus diurai |
string_id_item [item_id_string]
Muncul di bagian string_ids
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
string_data_off | Uint | dari awal file ke data {i>string <i}untuk
yang bermanfaat. Offset harus ke lokasi
di bagian data , dan data harus berada di
format yang ditentukan oleh "string_data_item " di bawah ini.
Tidak ada persyaratan perataan untuk offset.
|
string_data_item [item_data_string]
Muncul di bagian data
Perataan: tidak ada (diselaraskan byte)
Nama | Format | Deskripsi |
---|---|---|
ukuran_utf16 | uleb128 | ukuran string ini, dalam unit kode UTF-16 (yang merupakan "string
panjang" dalam banyak sistem). Artinya, ini adalah panjang {i>dekode<i} dari
{i>string<i}. (Panjang yang dienkode ditunjukkan oleh posisi
byte 0 .) |
data | ubyte[] | serangkaian unit kode MUTF-8 (alias oktet, alias byte)
diikuti dengan byte nilai 0 . Lihat
"Encoding MUTF-8 (UTF-8 Modifikasi)" di atas untuk mengetahui detail dan
diskusi tentang
format data.
Catatan: Anda dapat memiliki string yang berisi
(bentuk yang dienkode dari) unit kode pengganti UTF-16 (yaitu,
|
type_id_item [item_id_jenis]
Muncul di bagian type_ids
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
deskriptor_idx | Uint | indeks ke dalam daftar string_ids untuk deskriptor
{i>string<i} dari jenis ini. String ini harus sesuai dengan
sintaks untuk
TypeDescriptor, ditentukan di atas.
|
proto_id_item [item_id_prototipe]
Muncul di bagian proto_ids
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
{i>shorty_idx<i} | Uint | indeks ke dalam daftar string_ids untuk video pendek
string deskriptor prototipe ini. String harus sesuai dengan
untuk ShortyDescriptor, didefinisikan di atas, dan harus sesuai
jenis nilai yang ditampilkan dan parameter item ini.
|
return_type_idx | Uint | indeks ke dalam daftar type_ids untuk jenis nilai yang ditampilkan
dari prototipe ini.
|
parameter_off | Uint | offset dari awal file ke daftar tipe parameter
untuk prototipe ini, atau 0 jika prototipe ini tidak memiliki
parameter. Selisih ini, jika bukan nol, harus berada dalam
data , dan data yang seharusnya ada di
yang ditentukan oleh "type_list" di bawah ini. Selain itu, ada
seharusnya tidak ada referensi ke jenis void dalam daftar.
|
field_id_item
Muncul di bagian field_ids
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
kelas_idx | singkat | indeks ke dalam daftar type_ids untuk
penentunya
kolom tersebut. Ini harus berupa jenis class, dan bukan array atau jenis primitif.
|
jenis_idx | singkat | indeks ke dalam daftar type_ids untuk jenis
kolom ini
|
nama_idx | Uint | indeks ke dalam daftar string_ids sesuai dengan
kolom tersebut. String harus sesuai dengan sintaksis untuk MemberName,
didefinisikan di atas.
|
item_id_metode
Muncul di bagian method_ids
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
kelas_idx | singkat | indeks ke dalam daftar type_ids untuk
penentunya
. Ini harus berupa class atau jenis array, dan bukan jenis primitif.
|
proto_idx | singkat | indeks ke dalam daftar proto_ids untuk prototipe
metode ini
|
nama_idx | Uint | indeks ke dalam daftar string_ids sesuai dengan
. String harus sesuai dengan sintaksis untuk MemberName,
didefinisikan di atas.
|
class_def_item [item_defini_kelas]
Muncul di bagian class_defs
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
kelas_idx | Uint | indeks ke dalam daftar type_ids untuk class ini.
Ini harus berupa jenis class, dan bukan array atau jenis primitif.
|
tanda_akses | Uint | flag akses untuk class (public , final ,
dll.). Lihat "access_flags Definisi" untuk mengetahui detailnya.
|
{i>superclass_idx<i} | Uint | indeks ke dalam daftar type_ids untuk superclass, atau
nilai konstanta NO_INDEX jika class ini tidak memiliki
superclass (yaitu, ini adalah class root seperti Object ).
Jika ada, ini harus berupa jenis class, dan bukan array atau jenis primitif.
|
interface_off | Uint | offset dari awal file ke
daftar antarmuka, atau
0 jika tidak ada. Offset ini
harus berada di bagian data , dan datanya
harus ada dalam format yang ditentukan oleh
"type_list " di bawah ini. Setiap elemen daftar
harus berupa jenis kelas (bukan tipe primitif atau larik), dan ada
tidak boleh ada duplikat.
|
idx_file_sumber | Uint | indeks ke dalam daftar string_ids untuk nama
yang berisi sumber asli untuk (setidaknya sebagian besar dari) class ini,
atau nilai khusus NO_INDEX untuk menunjukkan kurangnya
informasi ini. debug_info_item dari metode tertentu
dapat menimpa file sumber ini, tetapi harapannya adalah sebagian besar kelas
hanya akan berasal dari
satu file sumber.
|
anotasi_nonaktif | Uint | offset dari awal file ke struktur anotasi
untuk class ini, atau 0 jika tidak ada anotasi di
di kelas ini. Selisih ini, jika bukan nol, harus berada dalam
data , dan data yang seharusnya ada di
format yang ditentukan oleh "annotations_directory_item " di bawah,
dengan semua item yang mengacu ke class ini sebagai penentu.
|
class_data_off | Uint | dari awal file ke elemen yang terkait
data class untuk item ini, atau 0 jika tidak ada class
data untuk class ini. (Ini mungkin terjadi, misalnya, jika kelas ini
adalah antarmuka penanda.) Offset, jika bukan nol, harus berada di
data , dan data yang seharusnya ada di
format yang ditentukan oleh "class_data_item " di bawah, dengan semua
item yang mengacu ke class ini sebagai penentu.
|
nilai_statis_nonaktif | Uint | dari awal file ke daftar awal
nilai untuk kolom static , atau 0 jika ada
tidak ada (dan semua kolom static harus diinisialisasi dengan
0 atau null ). Offset ini harus dalam
data , dan data harus ada di
format yang ditentukan oleh "encoded_array_item " di bawah ini. Ukuran
array tidak boleh lebih besar dari jumlah static
yang dideklarasikan oleh class ini, dan elemen sesuai dengan
static kolom dengan urutan yang sama seperti yang dideklarasikan dalam
field_list yang sesuai. Jenis setiap array
harus cocok dengan jenis yang dideklarasikan dari bidang terkait.
Jika jumlah elemen di {i>array<i} lebih sedikit daripada jumlah
Kolom static , lalu kolom yang tersisa akan diinisialisasi
dengan 0 atau null yang sesuai.
|
call_site_id_item [item_id_situs]
Muncul di bagian call_site_ids
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
call_site_off | Uint | dari awal file untuk memanggil definisi situs. Offset harus di bagian data, dan data itu harus ada dalam format yang ditentukan oleh "item_situs_panggilan" di bawah ini. |
call_site_item [item_situs_panggilan]
Muncul di bagian data
Perataan: tidak ada (sejajar byte)
Call_site_item adalah item yang dienkode_array_item yang elemennya sesuai dengan argumen yang disediakan untuk metode penaut bootstrap. Tiga argumen pertama adalah:
- Tuas metode yang mewakili metode penaut bootstrap (VALUE_METHOD_HANDLE).
- Nama metode yang harus diselesaikan oleh penaut bootstrap (VALUE_STRING).
- Jenis metode yang sesuai dengan jenis nama metode yang akan diselesaikan (VALUE_METHOD_TYPE).
Argumen tambahan apa pun adalah nilai konstanta yang diteruskan ke metode penaut bootstrap. Argumen tersebut adalah diteruskan secara berurutan dan tanpa konversi jenis apa pun.
Tuas metode yang mewakili metode penaut bootstrap harus memiliki jenis nilai yang ditampilkan java.lang.invoke.CallSite
. Tiga jenis parameter pertama adalah:
java.lang.invoke.Lookup
java.lang.String
java.lang.invoke.MethodType
Jenis parameter argumen tambahan ditentukan dari nilai konstantanya.
method_handle_item [item_handle_item]
Muncul di bagian method_handles
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
method_handle_type (tipe penanganan) | singkat | jenis handle metode; lihat tabel di bawah |
unused | singkat | (tidak digunakan) |
field_or_method_id | singkat | ID kolom atau metode, bergantung pada apakah jenis nama sebutan channel adalah pengakses atau invoker metode |
unused | singkat | (tidak digunakan) |
Kode jenis penanganan metode
Konstanta | Nilai | Deskripsi |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0x00 | Tuas metode adalah penyetel kolom statis (aksesor) |
METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | Handle metode adalah pengambil kolom statis (aksesor) |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | Penanganan metode adalah penyetel kolom instance (aksesor) |
METHOD_HANDLE_TYPE_INSTANCE_GET | 0x03 | Handle metode adalah pengambil kolom instance (aksesor) |
METHOD_HANDLE_TYPE_INVOKE_STATIC | 0x04 | Tuas metode adalah invoker metode statis |
METHOD_HANDLE_TYPE_INVOKE_INSTANCE | 0x05 | Tuas metode adalah invoker metode instance |
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR | 0x06 | Tuas metode adalah invoker metode konstruktor |
METHOD_HANDLE_TYPE_INVOKE_DIRECT | 0x07 | Penanganan metode adalah invoker metode langsung |
METHOD_HANDLE_TYPE_INVOKE_INTERFACE | 0x08 | Tuas metode adalah invoker metode antarmuka |
class_data_item [item_data_kelas]
Direferensikan dari class_def_item
Muncul di bagian data
Perataan: tidak ada (diselaraskan byte)
Nama | Format | Deskripsi |
---|---|---|
{i>static_fields_size<i} | uleb128 | jumlah kolom statis yang ditentukan dalam item ini |
ukuran_kolom_instance | uleb128 | jumlah kolom instance yang ditentukan dalam item ini |
direct_metode_size | uleb128 | jumlah metode langsung yang ditentukan dalam item ini |
virtual_method_size [ukuran_metode_virtual] | uleb128 | jumlah metode virtual yang ditentukan dalam item ini |
{i>static_fields<i} | kolom_enkode[static_fields_size] | isian statis yang didefinisikan, direpresentasikan sebagai urutan
elemen yang dienkode. {i>Field<i} harus diurutkan menurut
field_idx dalam urutan yang meningkat.
|
kolom_instance | kolom_enkode[instance_fields_size] | bidang instance yang ditentukan, direpresentasikan sebagai urutan
elemen yang dienkode. {i>Field<i} harus diurutkan menurut
field_idx dalam urutan yang meningkat.
|
direct_method | encoding_method[direct_method_size] | langsung yang ditentukan (salah satu dari static , private ,
atau konstruktor), direpresentasikan sebagai urutan
elemen yang dienkode. Metode harus diurutkan berdasarkan
method_idx dalam urutan yang meningkat.
|
metode_virtual | encoding_method[virtual_method_size] | virtual yang ditentukan (tidak satu pun dari static , private ,
atau konstruktor), direpresentasikan sebagai urutan
elemen yang dienkode. Daftar ini tidak boleh menyertakan turunan
kecuali jika diganti oleh class yang diwakili oleh item ini. Tujuan
harus diurutkan berdasarkan method_idx dalam urutan yang meningkat.
method_idx dari metode virtual tidak boleh sama
sebagai metode langsung.
|
Catatan: Semua elemen field_id
dan
Instance method_id
harus merujuk pada class penentu yang sama.
format encoding_field
Nama | Format | Deskripsi |
---|---|---|
{i>field_idx_diff<i} | uleb128 | indeks ke dalam daftar field_ids untuk identitas
(mencakup nama dan deskripsi), yang direpresentasikan sebagai perbedaan
dari indeks elemen sebelumnya dalam daftar. Indeks
elemen pertama dalam
daftar direpresentasikan secara langsung.
|
tanda_akses | uleb128 | flag akses untuk kolom (public , final ,
dll.). Lihat "access_flags Definisi" untuk mengetahui detailnya.
|
format encoding_method
Nama | Format | Deskripsi |
---|---|---|
metode_idx_diff | uleb128 | indeks ke dalam daftar method_ids untuk identitas
metode (mencakup nama dan deskripsi), direpresentasikan sebagai perbedaan
dari indeks elemen sebelumnya dalam daftar. Indeks
elemen pertama dalam
daftar direpresentasikan secara langsung.
|
tanda_akses | uleb128 | flag akses untuk metode (public , final ,
dll.). Lihat "access_flags Definisi" untuk mengetahui detailnya.
|
kode_nonaktif | uleb128 | dari awal file ke struktur kode untuk
, atau 0 jika metode ini adalah abstract
atau native . Offset harus ke lokasi di
data . Format data ditentukan oleh
"code_item " di bawah ini.
|
type_list (daftar jenis)
Direferensikan dari class_def_item dan proto_id_item
Muncul di bagian data
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
ukuran | Uint | ukuran daftar, dalam entri |
daftar | type_item[size] | elemen daftar |
format type_item
Nama | Format | Deskripsi |
---|---|---|
jenis_idx | singkat | indeks ke dalam daftar type_ids |
item_kode
Direferensikan dari encoding_method
Muncul di bagian data
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
registers_size [ukuran_daftar] | singkat | jumlah register yang digunakan oleh kode ini |
ins_size [ukuran_ins] | singkat | jumlah kata dari argumen yang masuk ke metode yang kode ditujukan untuk |
outs_size [ukuran_besar] | singkat | jumlah kata dari ruang argumen keluar yang dibutuhkan oleh kode untuk pemanggilan metode |
mencoba_ukuran | singkat | jumlah try_item untuk instance ini. Jika bukan nol,
ini akan muncul sebagai array tries tepat setelah
insns dalam instance ini.
|
debug_info_off | Uint | offset dari awal file ke info debug (nomor baris +
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 [ukuran_insns] | Uint | ukuran daftar instruksi, dalam unit kode 16-bit |
Insns | ushort[insns_size] | array bytecode aktual. Format kode dalam insns
array ditentukan oleh dokumen pendamping
Bytecode Dalvik. Catatan
meskipun ini didefinisikan sebagai array ushort , ada
ada beberapa struktur internal yang lebih memilih penyelarasan empat byte. Selain itu,
jika ini terjadi dalam file {i>endian-swapped<i}, maka proses {i>swapping<i}
hanya dilakukan pada instance ushort individual, bukan pada
struktur internal yang lebih besar.
|
padding | ushort (opsional) = 0 | dua byte padding untuk membuat tries diselaraskan dengan empat byte.
Elemen ini hanya ada jika tries_size bukan nol
dan insns_size ganjil.
|
mencoba | try_item[tries_size] (opsional) | array yang menunjukkan di mana
pengecualian kode diambil dan
bagaimana menanganinya. Elemen himpunan tidak boleh tumpang tindih
dalam rentang dan dalam urutan dari
alamat rendah ke tinggi. Elemen ini hanya
ada jika tries_size bukan nol.
|
pengendali | encoding_catch_handler_list (opsional) | {i>byte<i} yang mewakili daftar daftar
jenis tangkapan dan elemen terkait
alamat pengendali. Setiap try_item memiliki offset berdasarkan byte
ke dalam struktur ini. Elemen ini hanya ada jika
tries_size bukan nol.
|
format try_item
Nama | Format | Deskripsi |
---|---|---|
{i>start_addr<i} | Uint | alamat awal blok kode yang dicakup oleh entri ini. Alamat adalah hitungan 16-bit unit kode ke awal dari yang pertama dibahas instruksi. |
insn_count | singkat | jumlah unit kode 16-bit
yang dicakup oleh entri ini. Kode terakhir
unit yang dicakup (inklusif) adalah start_addr + insn_count - 1 .
|
handler_off | singkat | offset dalam byte dari awal proses
encoded_catch_hander_list menjadi
encoded_catch_handler untuk entri ini. Ini harus berupa
offset ke awal encoded_catch_handler .
|
format encode_catch_handler_list
Nama | Format | Deskripsi |
---|---|---|
ukuran | uleb128 | ukuran daftar ini, dalam entri |
daftar | terenkode_catch_handler[handlers_size] | daftar aktual dari daftar pengendali, yang direpresentasikan secara langsung (bukan sebagai offset), dan digabungkan secara berurutan |
format encode_catch_handler
Nama | Format | Deskripsi |
---|---|---|
ukuran | sleb128 | jumlah jenis tangkapan dalam daftar ini. Jika non-positif, maka ini
adalah negatif dari jumlah jenis
tangkapan, dan hasil tangkapan diikuti
oleh pengendali generik. Misalnya: size dari 0
berarti bahwa ada tangkapan semua, tetapi
tidak ada tangkapan yang diketik secara eksplisit.
size dari 2 berarti ada dua secara eksplisit
yang diketik dan tidak ada generik. Dan size dari -1
berarti ada satu tangkapan yang diketik bersama dengan {i>catch-all<i}.
|
pengendali | pasangan_tipe_addr_yang dienkode[abs(ukuran)] | aliran abs(size) item yang dienkode, satu untuk setiap item yang tertangkap
sesuai dengan urutan
jenis yang harus diuji.
|
menangkap_semua_addr | uleb128 (opsional) | alamat bytecode pengendali generik. Elemen ini hanya
ada jika size non-positif.
|
format encode_type_addr_pair
Nama | Format | Deskripsi |
---|---|---|
jenis_idx | uleb128 | indeks ke dalam daftar type_ids untuk jenis
pengecualian untuk menangkap
|
addr | uleb128 | alamat bytecode pengendali pengecualian yang terkait |
debug_info_item
Direferensikan dari code_item
Muncul di bagian data
Perataan: tidak ada (diselaraskan byte)
Setiap debug_info_item
menentukan kode byte yang terinspirasi DWARF3
mesin status yang, jika diinterpretasikan, akan memunculkan posisi
tabel dan (kemungkinan) informasi variabel lokal untuk
code_item
. Urutan dimulai dengan panjang-variabel
(yang panjangnya bergantung pada jumlah metode
parameter), diikuti oleh bytecode mesin status, dan berakhir
dengan DBG_END_SEQUENCE
byte.
Mesin status terdiri dari lima register. Tujuan
Register address
merepresentasikan offset petunjuk dalam
insns_item
yang terkait dalam unit kode 16-bit. Tujuan
Pendaftaran address
dimulai pada 0
di awal setiap pendaftaran
urutan debug_info
dan hanya boleh meningkat secara monoton.
Register line
mewakili nomor baris sumber
harus dikaitkan dengan entri tabel posisi berikutnya yang dimunculkan oleh
mesin status. Ini diinisialisasi dalam header urutan, dan mungkin
perubahan ke arah positif atau negatif tetapi tidak boleh kurang dari
1
. Register source_file
mewakili
{i>file<i} sumber yang dirujuk oleh entri nomor baris. Inisialisasi dilakukan 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 dimunculkan
harus dianggap sebagai
metode prolog atau epilog. Mesin status
juga harus melacak nama dan jenis
variabel lokal terakhir yang berada
setiap register untuk kode DBG_RESTART_LOCAL
.
{i>Header<i}-nya adalah sebagai berikut:
Nama | Format | Deskripsi |
---|---|---|
line_start | uleb128 | nilai awal untuk register line mesin status.
Tidak menunjukkan entri posisi yang sebenarnya.
|
parameter_size | uleb128 | jumlah nama parameter
yang dienkode. Seharusnya ada
satu per parameter metode, dengan mengecualikan this metode instance,
jika ada.
|
nama_parameter | uleb128p1[parameters_size] | indeks string dari nama parameter metode. Nilai yang dienkode dari
NO_INDEX menunjukkan bahwa tidak ada nama
yang tersedia untuk parameter terkait. Deskripsi jenis
dan tanda tangan tersirat dari deskriptor dan tanda tangan metode.
|
Nilai kode byte adalah sebagai berikut:
Nama | Nilai | Format | Argumen | Deskripsi |
---|---|---|---|---|
DBG_END_SEQUENCE | 0x00 | (tidak ada) | menghentikan urutan info debug untuk code_item |
|
PC_ADVANCE_DBG | 0x01 | uleb128 addr_diff | addr_diff : jumlah yang akan ditambahkan ke daftar alamat |
memajukan register alamat tanpa memunculkan entri posisi |
DBG_ADVANCE_LINE | 0x02 | sleb128 line_diff | line_diff : jumlah yang akan diubah ke jalur pendaftaran |
memajukan register baris tanpa memunculkan entri posisi |
DBG_START_LOCAL | 0x03 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx |
register_num : daftar yang akan berisi informasi lokalname_idx : indeks string namatype_idx : indeks jenis jenis
|
memperkenalkan variabel lokal pada alamat saat ini. Keduanya
name_idx atau type_idx mungkin
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 : daftar yang akan berisi informasi lokalname_idx : indeks string namatype_idx : indeks jenis jenissig_idx : indeks string tanda tangan jenis
|
memperkenalkan sebuah lokal dengan tanda tangan
tipe di alamat saat ini.
Salah satu dari name_idx , type_idx , atau
sig_idx mungkin NO_INDEX
untuk menunjukkan bahwa
nilai tersebut tidak diketahui. (Jika sig_idx adalah
Namun, -1 , data yang sama dapat ditampilkan dengan
secara efisien menggunakan opcode DBG_START_LOCAL .)
Catatan: Lihat diskusi di
|
DBG_END_LOCAL | 0x05 | uleb128 register_num | register_num : daftar yang berisi informasi lokal |
menandai variabel lokal yang aktif saat ini sebagai di luar cakupan pada kondisi saat ini Anda |
DBG_RESTART_LOCAL | 0x06 | uleb128 register_num | register_num : daftar untuk memulai ulang |
memperkenalkan kembali variabel lokal di alamat saat ini. Nama dan jenisnya sama dengan lokal terakhir yang ditampilkan di mendaftar. |
DBG_SET_PROLOGUE_END | 0x07 | (tidak ada) | menetapkan register mesin status prologue_end ,
yang menunjukkan bahwa entri
posisi berikutnya yang ditambahkan harus
dianggap sebagai akhir dari prolog metode (tempat yang tepat untuk
titik henti sementara metode). Register prologue_end merupakan
dihapus oleh opcode khusus (>= 0x0a ).
|
|
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 dari epilog metode (tempat yang sesuai
untuk menangguhkan eksekusi sebelum metode keluar).
Pendaftaran epilogue_begin dihapus oleh entitas khusus apa pun
(>= 0x0a ).
|
|
DBG_SET_FILE | 0x09 | uleb128p1 name_idx | name_idx : indeks string dari nama file sumber;
NO_INDEX jika tidak diketahui
|
menunjukkan bahwa semua entri nomor baris berikutnya merujuk ke
nama file sumber, alih-alih nama {i>
default<i} yang ditentukan dalam
code_item
|
Opcode Khusus | 0x0a...0xff | (tidak ada) | melanjutkan register line dan address ,
memunculkan entri posisi, dan menghapus prologue_end dan
epilogue_begin . Lihat di bawah untuk deskripsinya.
|
Opcode khusus
Opcode dengan nilai antara 0x0a
dan 0xff
(inklusif) memindahkan line
dan address
mendaftar dalam jumlah kecil dan kemudian
menghasilkan entri tabel posisi baru.
Rumus untuk penambahan 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)
anotasi_direktori_item
Direferensikan dari class_def_item
Muncul di bagian data
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
class_annotations_off | Uint | offset dari awal file ke anotasi yang dibuat secara langsung
di class, atau 0 jika class tidak memiliki anotasi langsung.
Offset, jika bukan nol, harus ke lokasi di
data . Format data sudah ditentukan
oleh "annotation_set_item " di bawah ini.
|
ukuran_kolom | Uint | jumlah kolom yang dianotasi oleh item ini |
dianotasi_metode_size | Uint | jumlah metode yang dianotasi oleh item ini |
dianotasi_parameters_size | Uint | jumlah daftar parameter metode yang dianotasi oleh item ini |
kolom_anotasi | field_annotation[fields_size] (opsional) | daftar anotasi kolom terkait. Elemen-elemen daftar harus
diurutkan dalam urutan yang meningkat, menurut field_idx .
|
anotasi_metode | method_annotation[method_size] (opsional) | daftar anotasi metode yang terkait. Elemen-elemen daftar harus
diurutkan dalam urutan yang meningkat, menurut method_idx .
|
parameter_anotasi | parameter_annotation[parameters_size] (opsional) | daftar anotasi parameter metode yang terkait. Elemen-elemen dari
daftar harus diurutkan secara meningkat, menurut method_idx .
|
Catatan: Semua elemen field_id
dan
Instance method_id
harus merujuk pada class penentu yang sama.
format field_annotation
Nama | Format | Deskripsi |
---|---|---|
{i>field_idx<i} | Uint | indeks ke dalam daftar field_ids untuk identitas
kolom yang dianotasi
|
anotasi_nonaktif | Uint | offset dari awal file
ke daftar anotasi untuk
bidang Anda. Offset harus ke lokasi di data
bagian. Format data ditentukan oleh
"annotation_set_item " di bawah ini.
|
format method_annotation
Nama | Format | Deskripsi |
---|---|---|
metode_idx | Uint | indeks ke dalam daftar method_ids untuk identitas
metode yang dianotasi
|
anotasi_nonaktif | Uint | offset dari awal file
ke daftar anotasi untuk
metode tersebut. Offset harus ke lokasi di
data . Format data ditentukan oleh
"annotation_set_item " di bawah ini.
|
format parameter_annotation
Nama | Format | Deskripsi |
---|---|---|
metode_idx | Uint | indeks ke dalam daftar method_ids untuk identitas
yang parameternya sedang dianotasi
|
anotasi_nonaktif | Uint | offset dari awal file
ke daftar anotasi untuk
parameter metode. Offset harus ke lokasi di
data . Format data ditentukan oleh
"annotation_set_ref_list " di bawah ini.
|
anotasi_set_ref_list
Direferensikan dari parameter_annotations_item
Muncul di bagian data
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
ukuran | Uint | ukuran daftar, dalam entri |
daftar | anotasi_set_ref_item[ukuran] | elemen daftar |
format anotasi_set_ref_item
Nama | Format | Deskripsi |
---|---|---|
anotasi_nonaktif | Uint | offset dari awal file ke kumpulan anotasi yang direferensikan
atau 0 jika tidak ada anotasi untuk elemen ini.
Offset, jika bukan nol, harus ke lokasi di data
bagian. Format data ditentukan oleh
"annotation_set_item " di bawah ini.
|
anotasi_set_item
Direferensikan dari annotation_directory_item, field_annotations_item, method_annotations_item, dan annotation_set_ref_item
Muncul di bagian data
Perataan: 4 byte
Nama | Format | Deskripsi |
---|---|---|
ukuran | Uint | ukuran set, dalam entri |
entri | anotasi_off_item[ukuran] | elemen dari himpunan tersebut. Elemen harus diurutkan dalam
urutan yang meningkat,
paling lambat type_idx .
|
format anotasi_off_item
Nama | Format | Deskripsi |
---|---|---|
anotasi_nonaktif | Uint | 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.
|
anotasi_item
Direferensikan dari annotation_set_item
Muncul di bagian data
Perataan: tidak ada (diselaraskan byte)
Nama | Format | Deskripsi |
---|---|---|
visibilitas | {i>ubyte<i} | visibilitas yang diinginkan dari anotasi ini (lihat di bawah) |
annotation | anotasi_yang_dikodekan | konten anotasi yang dienkode, dalam format yang dijelaskan oleh
"Format encoded_annotation " di bawah
"Encoding encoded_value " di atas.
|
Nilai visibilitas
Ini adalah opsi untuk kolom visibility
di
annotation_item
:
Nama | Nilai | Deskripsi |
---|---|---|
BANGUN_VISIBILITY_BUILD | 0x00 | dimaksudkan agar hanya terlihat pada waktu build (misalnya, selama kompilasi kode lain) |
VISIBILITY_RUNTIME | 0x01 | yang dimaksudkan untuk terlihat pada runtime |
SISTEM_VISIBILITY | 0x02 | dimaksudkan untuk terlihat saat runtime, tetapi hanya untuk sistem yang mendasarinya (dan bukan kode pengguna biasa) |
item_array_yang_dikodekan
Direferensikan dari class_def_item
Muncul di bagian data
Perataan: tidak ada (diselaraskan byte)
Nama | Format | Deskripsi |
---|---|---|
nilai | array_enkode | byte yang mewakili nilai array yang dienkode, dalam format yang ditentukan
menurut "Format encoded_array " pada "encoded_value
Enkode" di atas.
|
tersembunyiapi_class_data_item
Bagian ini berisi data tentang antarmuka yang dibatasi 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 tanda yang dijelaskan di bawah dapat diperluas dalam rilis mendatang Android. Untuk informasi selengkapnya, lihat batasan untuk antarmuka non-SDK.
Nama | Format | Deskripsi |
---|---|---|
ukuran | Uint | total ukuran bagian |
offset | uint[] | array offset yang diindeks oleh class_idx .
Entri array nol pada indeks class_idx berarti bahwa
tidak ada data untuk class_idx ini, atau semua API tersembunyi
penanda adalah nol.
Jika tidak, entri array bukan nol dan berisi offset dari
awal bagian ke array tanda API tersembunyi
untuk class_idx ini.
|
flags | uleb128[] | array gabungan flag API tersembunyi untuk setiap class. Kemungkinan nilai flag dijelaskan dalam tabel di bawah. Tanda dienkode dalam urutan yang sama seperti kolom dan metode dienkode dalam data class. |
Jenis tanda pembatasan:
Nama | Nilai | Deskripsi |
---|---|---|
daftar putih | 0 | Antarmuka yang dapat digunakan secara bebas dan didukung sebagai bagian dari framework Android yang didokumentasikan secara resmi Indeks Paket. |
daftar abu-abu | 1 | Antarmuka non-SDK yang dapat digunakan terlepas dari level API target Anda. |
daftar hitam | 2 | Antarmuka non-SDK yang tidak dapat digunakan, apa pun persyaratan aplikasi level API target Anda. Mengakses salah satu antarmuka ini menyebabkan error runtime. |
daftar abu-abu‐max‐o | 3 | Antarmuka non-SDK yang dapat digunakan untuk Android 8.x dan yang lebih lama kecuali jika dibatasi. |
daftar abu-abu‐max‐p | 4 | Antarmuka non-SDK yang dapat digunakan untuk Android 9.x kecuali jika dibatasi. |
daftar abu-abu‐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 reflektif informasi tentang class (serta metode dan 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 disetel ke VISIBILITY_SYSTEM
.
dalvik.annotation.AnnotationDefault
Muncul di metode dalam antarmuka anotasi
Anotasi AnnotationDefault
dilampirkan ke setiap
yang ingin menunjukkan binding default.
Nama | Format | Deskripsi |
---|---|---|
nilai | Annotation | binding default untuk anotasi ini, yang direpresentasikan sebagai anotasi dari jenis ini. Anotasi tidak perlu menyertakan semua nama yang ditentukan oleh anotasi; nama yang hilang tidak memiliki {i>default<i}. |
dalvik.annotation.EnclosingClass
Muncul di kelas
Anotasi EnclosingClass
dilampirkan ke setiap class
yang bisa didefinisikan sebagai anggota kelas lain, atau
anonim tetapi tidak didefinisikan dalam isi metode (mis., komponen
inner class). Setiap class yang memiliki anotasi ini juga harus memiliki
anotasi InnerClass
. Selain itu, class tidak boleh memiliki
EnclosingClass
dan
anotasi EnclosingMethod
.
Nama | Format | Deskripsi |
---|---|---|
nilai | Class | class yang paling mendekati cakupan 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 juga harus memiliki anotasi InnerClass
.
Selain itu, class tidak boleh memiliki EnclosingClass
dan anotasi EnclosingMethod
.
Nama | Format | Deskripsi |
---|---|---|
nilai | Metode | metode yang paling mendekati cakupan class ini |
dalvik.annotation.InnerClass
Muncul di kelas
Anotasi InnerClass
dilampirkan ke setiap class
yang didefinisikan dalam cakupan leksikal dari definisi class lain.
Setiap class yang memiliki anotasi ini juga harus memiliki salah satu
EnclosingClass
atau
anotasi EnclosingMethod
.
Nama | Format | Deskripsi |
---|---|---|
nama | String | nama sederhana class ini yang dideklarasikan semula (tidak termasuk
). Jika kelas ini anonim, maka namanya
null .
|
accessFlags | int | flag akses class yang pertama kali dideklarasikan (yang mungkin berbeda dari flag efektif karena ketidakcocokan antara eksekusi model 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 | Kelas[] | array class anggota |
dalvik.annotation.MethodParameters
Muncul di metode
Catatan: Anotasi ini ditambahkan setelah Android 7.1. Kehadirannya pada rilis Android sebelumnya akan diabaikan.
Anotasi MethodParameters
bersifat opsional dan dapat digunakan untuk
menyediakan metadata parameter seperti
nama parameter dan pengubah.
Anotasi dapat dihilangkan dari metode atau konstruktor dengan aman jika
metadata parameter tidak diperlukan saat runtime.
java.lang.reflect.Parameter.isNamePresent()
dapat digunakan untuk memeriksa
apakah metadata ada untuk suatu parameter, dan refleksi terkait
metode seperti java.lang.reflect.Parameter.getName()
akan jatuh
kembali ke perilaku default saat runtime jika informasinya tidak ada.
Saat menyertakan metadata parameter, compiler harus menyertakan informasi untuk class yang dihasilkan seperti enum, karena metadata parameter mencakup apakah suatu parameter sintetis atau dimandatkan atau tidak.
Anotasi MethodParameters
hanya menjelaskan metode individual
parameter. Oleh karena itu, compiler dapat menghilangkan anotasi sepenuhnya
untuk konstruktor dan metode yang tidak memiliki parameter, demi ukuran kode
dan efisiensi runtime.
Himpunan yang didokumentasikan di bawah ini harus berukuran sama dengan
Struktur dex method_id_item
yang terkait dengan metode, jika tidak
java.lang.reflect.MalformedParametersException
akan ditampilkan dengan
waktu beroperasi.
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 metode formal
parameter, bahkan yang tidak dideklarasikan secara eksplisit
atau implisit dalam kode sumber,
ukuran himpunan mungkin berbeda dari Tanda Tangan
atau {i>metadata <i}lainnya
informasi yang hanya didasarkan pada parameter eksplisit yang dideklarasikan dalam sumber
pada kode sumber. MethodParameters
juga tidak akan menyertakan informasi apa pun tentang
jenis parameter penerima anotasi yang tidak ada di metode sebenarnya
tanda tangan.
Nama | Format | Deskripsi |
---|---|---|
nama | String[] | Nama-nama parameter formal untuk metode terkait. Array (array)
tidak boleh nol, tetapi harus kosong jika tidak ada parameter formal. Sebuah nilai di
array harus bernilai null jika parameter formal dengan indeks tersebut tidak memiliki nama. Jika string nama parameter kosong atau berisi '.', ';', '[' atau '/' lalu java.lang.reflect.MalformedParametersException akan ditampilkan pada
waktu beroperasi.
|
accessFlags | int[] | Tanda akses parameter formal untuk metode terkait. Tujuan
array tidak boleh null, tetapi harus kosong jika tidak ada parameter formal. Nilainya adalah bit mask dengan nilai berikut:
java.lang.reflect.MalformedParametersException akan ditampilkan saat runtime.
|
dalvik.annotation.Tanda tangan
Muncul di class, kolom, dan metode
Anotasi Signature
dilampirkan ke setiap class,
{i>field<i}, atau metode yang didefinisikan
dalam jenis tipe yang lebih rumit
daripada yang dapat diwakili oleh type_id_item
. Tujuan
Format .dex
tidak menentukan format untuk tanda tangan; ini
hanya dimaksudkan untuk dapat
mewakili tanda tangan apa pun
bahasa membutuhkan keberhasilan implementasi
semantik. Dengan demikian, tanda tangan umumnya tidak diuraikan (atau diverifikasi)
dengan implementasi virtual machine. Tanda tangan itu langsung diserahkan
ke alat dan API dengan level lebih tinggi (seperti debugger). Setiap penggunaan
tanda tangan, oleh karena itu, harus ditulis sedemikian
rupa untuk tidak memberikan
asumsi tentang hanya untuk menerima tanda tangan
yang valid, secara eksplisit menjaga
terhadap kemungkinan munculnya sintaksis
tanda tangan tidak valid.
Karena {i>string <i}tanda tangan cenderung
memiliki banyak konten duplikat,
anotasi Signature
ditentukan sebagai array dari
{i>string<i}, di mana elemen duplikat secara alami merujuk pada
data yang mendasarinya, dan tanda tangan
dianggap sebagai penyambungan dari
semua {i>string<i} dalam {i>array<i}. Tidak ada aturan tentang
cara menarik
memisahkan tanda tangan
menjadi {i>string<i} terpisah; yang sepenuhnya bergantung pada
alat yang menghasilkan file .dex
.
Nama | Format | Deskripsi |
---|---|---|
nilai | String[] | tanda tangan class atau anggota ini, sebagai array string yang adalah digabungkan bersama |
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 | Kelas[] | array jenis pengecualian yang ditampilkan |