Format Dalvik yang dapat dieksekusi

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_NATIVE juga disetel.

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).

* Hanya diperbolehkan untuk anotasi 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+10000U+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+d800U+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+00a1U+1fff
| U+2000U+200a sejak DEX versi 040
| U+2010U+2027
| U+202f sejak DEX versi 040
| U+2030U+d7ff
| U+e000U+ffef
| U+10000U+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, U+d800U+dfff ) baik secara terpisah atau tidak berurutan dibandingkan dengan pengkodean biasa dari Unicode menjadi UTF-16. Jika perlu, terserah pada penggunaan string di tingkat yang lebih tinggi untuk menolak pengkodean yang tidak valid tersebut.

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:

  1. Pegangan metode yang mewakili metode bootstrap linker (VALUE_METHOD_HANDLE).
  2. Nama metode yang harus diselesaikan oleh bootstrap linker (VALUE_STRING).
  3. 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:

  1. java.lang.invoke.Lookup
  2. java.lang.String
  3. 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 lokal
name_idx : indeks string nama
type_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 lokal
name_idx : indeks string nama
type_idx : Jenis indeks tipe
sig_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 " dalvik.annotation.Signature " di bawah ini untuk peringatan tentang menangani tanda tangan.

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:
  • 0x0010: Final, parameter dinyatakan final
  • 0x1000: Sintetis, parameter diperkenalkan oleh kompiler
  • 0x8000: Mandat, parameternya sintetis tetapi juga tersirat oleh spesifikasi bahasa
Jika ada bit yang diatur di luar set ini maka 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