File .dex
adalah format transpor untuk bytecode Dalvik. Ada batasan sintaksis dan semantik tertentu agar file menjadi file .dex
yang valid, dan runtime diperlukan untuk hanya mendukung file .dex yang valid.
Batasan integritas .dex umum
Batasan integritas umum berkaitan dengan struktur file .dex
yang lebih besar, seperti yang dijelaskan secara mendetail dalam format
.dex
.
ID | Deskripsi |
---|---|
G1 |
Nomor magic file .dex harus
dex\n035\0 untuk versi 35, atau serupa untuk versi yang lebih baru.
|
G2 |
Checksum harus berupa checksum Adler-32 dari seluruh konten file
kecuali kolom magic dan checksum .
|
G3 |
Tanda tangan harus berupa hash SHA-1 dari seluruh konten file kecuali magic ,
checksum , dan signature .
|
G4 |
|
G5 |
|
G6 |
endian_tag harus memiliki nilai:
ENDIAN_CONSTANT atau REVERSE_ENDIAN_CONSTANT
|
G7 |
Untuk setiap bagian
Kolom |
G8 |
Semua kolom offset di header kecuali map_off harus sejajar dengan empat byte.
|
G9 |
Kolom map_off harus nol atau mengarah ke
bagian data. Dalam kasus terakhir, bagian data harus ada.
|
G10 |
Tidak ada bagian link , string_ids ,
type_ids , proto_ids , field_ids ,
method_ids , class_defs , dan data
yang boleh tumpang-tindih satu sama lain atau dengan header.
|
G11 | Jika peta ada, setiap entri peta harus memiliki jenis yang valid. Setiap jenis dapat muncul maksimal sekali. |
G12 |
Jika peta ada, setiap entri peta harus memiliki offset dan ukuran yang bukan nol. Offset harus mengarah ke bagian file yang sesuai (yaitu
string_id_item harus mengarah ke bagian string_ids ) dan ukuran item eksplisit atau
implisit harus cocok dengan konten dan ukuran sebenarnya
bagian.
|
G13 |
Jika peta ada, offset entri peta n+1 harus lebih besar atau
sama dengan offset entri peta n plus than size of map entry n . Hal ini menyiratkan
entri yang tidak tumpang-tindih dan pengurutan rendah ke tinggi.
|
G14 |
Jenis entri berikut harus memiliki offset yang
sejajar dengan empat byte: string_id_item ,
type_id_item , proto_id_item ,
field_id_item ,
method_id_item , class_def_item ,
type_list , code_item ,
annotations_directory_item .
|
G15 |
Untuk setiap Untuk setiap Untuk |
G16 |
Untuk setiap type_id_item , kolom descriptor_idx harus berisi referensi yang valid ke daftar string_ids . String yang dirujuk harus berupa deskripsi jenis yang valid.
|
G17 |
Untuk setiap proto_id_item , kolom shorty_idx harus berisi referensi yang valid ke daftar string_ids . String yang dirujuk harus berupa
deskripsi singkat yang valid. Selain itu, kolom return_type_idx harus berupa indeks yang valid ke
bagian type_ids , dan kolom parameters_off harus berupa nol atau
offset yang valid yang mengarah ke bagian data . Jika bukan nol, daftar parameter
tidak boleh berisi entri yang tidak valid.
|
G18 |
Untuk setiap field_id_item , kolom class_idx dan type_idx harus
berupa indeks yang valid ke dalam daftar type_ids . Entri yang dirujuk oleh class_idx
harus berupa jenis referensi non-array. Selain itu, kolom name_idx harus berupa
referensi yang valid ke bagian string_ids , dan konten entri
yang dirujuk harus sesuai dengan spesifikasi MemberName .
|
G19 |
Untuk setiap method_id_item , kolom class_idx harus berupa indeks yang valid
ke bagian type_ids , dan entri yang dirujuk harus berupa jenis referensi
non-array. Kolom proto_id harus berupa referensi yang valid ke daftar
proto_ids . Kolom name_idx harus berupa referensi yang valid ke bagian string_ids ,
dan konten entri yang dirujuk harus sesuai dengan spesifikasi
MemberName .
|
G20 |
Untuk setiap field_id_item , kolom class_idx harus berupa indeks yang valid
ke dalam daftar type_ids . Entri yang dirujuk harus berupa jenis referensi
non-array.
|
Batasan bytecode statis
Batasan statis adalah batasan pada setiap elemen bytecode. Biasanya, hal ini dapat diperiksa tanpa menggunakan teknik kontrol atau analisis alur data.
ID | Deskripsi |
---|---|
A1 |
Array insns tidak boleh kosong.
|
A2 |
Opcode pertama dalam array insns harus memiliki indeks nol.
|
A3 |
Array insns hanya boleh berisi opcode Dalvik yang valid.
|
A4 |
Indeks petunjuk n+1 harus sama dengan indeks
petunjuk n ditambah panjang petunjuk
n , dengan mempertimbangkan kemungkinan operand.
|
A5 |
Petunjuk terakhir dalam array insns harus diakhiri pada indeks
insns_size-1 .
|
A6 |
Semua target goto dan if-<kind> harus
berupa opcode dalam metode yang sama.
|
A7 |
Semua target petunjuk packed-switch harus berupa opcode dalam metode yang sama. Ukuran dan daftar target
harus konsisten.
|
A8 |
Semua target petunjuk sparse-switch harus berupa opcode dalam metode yang sama. Tabel yang sesuai harus konsisten dan diurutkan dari rendah ke tinggi.
|
A9 |
Operand B dari petunjuk const-string dan
const-string/jumbo harus berupa indeks yang valid
ke dalam kumpulan konstanta string.
|
A10 |
Operand C dari petunjuk iget<kind> dan
iput<kind> harus berupa indeks yang valid ke dalam
kumpulan konstanta kolom. Entri yang dirujuk harus mewakili
kolom instance.
|
A11 |
Operand C dari petunjuk sget<kind> dan
sput<kind> harus berupa indeks yang valid ke dalam
kumpulan konstanta kolom. Entri yang dirujuk harus mewakili kolom statis.
|
A12 |
Operand C dari petunjuk invoke-virtual ,
invoke-super , invoke-direct , dan
invoke-static harus berupa indeks yang valid ke dalam
kumpulan konstanta metode.
|
A13 |
Operand B dari petunjuk invoke-virtual/range ,
invoke-super/range , invoke-direct/range , dan
invoke-static/range harus berupa indeks yang valid
ke dalam kumpulan konstanta metode.
|
A14 |
Metode yang namanya diawali dengan '<' hanya boleh dipanggil
secara implisit oleh VM, bukan oleh kode yang berasal dari file .dex . Satu-satunya pengecualian adalah penginisialisasi instance, yang dapat dipanggil oleh invoke-direct .
|
A15 |
Operand C dari petunjuk
invoke-interface harus berupa indeks yang valid ke dalam kumpulan konstanta metode. method_id
yang dirujuk harus merupakan bagian dari antarmuka (bukan
class).
|
A16 |
Operand B dari petunjuk
invoke-interface/range harus berupa indeks yang valid ke dalam kumpulan konstanta metode.
method_id yang dirujuk harus merupakan bagian dari antarmuka (bukan
class).
|
A17 |
Operand B dari petunjuk const-class ,
check-cast , new-instance , dan
filled-new-array/range harus berupa indeks yang valid
ke dalam kumpulan konstanta jenis.
|
A18 |
Operand C dari petunjuk instance-of ,
new-array , dan filled-new-array
harus berupa indeks yang valid ke dalam kumpulan konstanta jenis.
|
A19 |
Dimensi array yang dibuat oleh petunjuk new-array
harus kurang dari 256 .
|
A20 |
Petunjuk new tidak boleh merujuk ke class array, antarmuka, atau class abstrak.
|
A21 |
Jenis yang dirujuk oleh petunjuk new-array harus
berupa jenis non-referensi yang valid.
|
A22 |
Semua register yang dirujuk oleh petunjuk dalam mode lebar tunggal
(non-pasangan) harus valid untuk metode saat ini. Artinya,
indeksnya harus non-negatif dan lebih kecil dari
registers_size .
|
A23 |
Semua register yang dirujuk oleh petunjuk dalam mode lebar ganda (pasangan)
harus valid untuk metode saat ini. Artinya, indeksnya
harus non-negatif dan lebih kecil dari registers_size-1 .
|
A24 |
Operand method_id dari petunjuk invoke-virtual
dan invoke-direct harus termasuk dalam class
(bukan antarmuka). Dalam file Dex sebelum versi 037 ,
hal yang sama harus berlaku untuk petunjuk invoke-super dan
invoke-static .
|
A25 |
Operand method_id dari
petunjuk invoke-virtual/range dan
invoke-direct/range harus termasuk dalam class
(bukan antarmuka). Dalam file Dex sebelum versi 037 ,
hal yang sama harus berlaku untuk petunjuk invoke-super/range dan
invoke-static/range .
|
Batasan bytecode struktural
Batasan struktural adalah batasan pada hubungan antara beberapa elemen bytecode. Biasanya, hal ini tidak dapat diperiksa tanpa menggunakan teknik analisis alur data atau kontrol.
ID | Deskripsi |
---|---|
B1 | Jumlah dan jenis argumen (register dan nilai langsung) harus selalu cocok dengan petunjuk. |
B2 | Pasangan register tidak boleh dipecah. |
B3 | Register (atau pasangan) harus ditetapkan terlebih dahulu sebelum dapat dibaca. |
B4 |
Petunjuk invoke-direct hanya boleh memanggil penginisialisasi
instance atau metode di class saat ini atau salah satu
superclass-nya.
|
B5 | Penginisialisasi instance hanya boleh dipanggil pada instance yang belum diinisialisasi. |
B6 | Metode instance hanya dapat dipanggil di dan kolom instance hanya dapat diakses di instance yang telah diinisialisasi. |
B7 |
Register yang menyimpan hasil petunjuk new-instance
tidak boleh digunakan jika petunjuk
new-instance yang sama dieksekusi lagi sebelum
instance diinisialisasi.
|
B8 |
Penginisialisasi instance harus memanggil penginisialisasi instance lain (class atau
superclass yang sama) sebelum anggota instance dapat diakses.
Pengecualian adalah kolom instance yang tidak diwarisi, yang dapat ditetapkan
sebelum memanggil penginisialisasi lain, dan class Object
secara umum.
|
B9 | Semua argumen metode yang sebenarnya harus kompatibel dengan penetapan argumen formalnya masing-masing. |
B10 | Untuk setiap pemanggilan metode instance, instance sebenarnya harus kompatibel dengan tugas dengan class atau antarmuka yang ditentukan dalam petunjuk. |
B11 |
Petunjuk return<kind> harus cocok dengan jenis nilai yang ditampilkan metodenya.
|
B12 | Saat mengakses anggota superclass yang dilindungi, jenis instance yang sebenarnya diakses harus berupa class saat ini atau salah satu subclass-nya. |
B13 | Jenis nilai yang disimpan ke dalam kolom statis harus kompatibel dengan penetapan atau dapat dikonversi ke jenis kolom. |
B14 | Jenis nilai yang disimpan ke dalam kolom harus kompatibel dengan penetapan atau dapat dikonversi ke jenis kolom. |
B15 | Jenis setiap nilai yang disimpan ke dalam array harus kompatibel dengan penetapan jenis komponen array. |
B16 |
Operand A dari petunjuk throw harus
kompatibel dengan penetapan java.lang.Throwable .
|
B17 |
Instruksi terakhir yang dapat dijangkau dari suatu metode harus berupa goto atau cabang
mundur, return , atau
throw . Array insns tidak boleh dibiarkan
di bagian bawah.
|
B18 | Setengah dari pasangan register sebelumnya yang tidak ditetapkan mungkin tidak dapat dibaca (dianggap tidak valid) hingga ditetapkan ulang oleh beberapa instruksi lain. |
B19 |
Petunjuk move-result<kind> harus segera
didahului (dalam array insns ) oleh
petunjuk invoke-<kind> . Satu-satunya pengecualian adalah
petunjuk move-result-object , yang juga dapat
didahului oleh petunjuk filled-new-array .
|
B20 |
Instruksi move-result<kind> harus segera
didahului (dalam alur kontrol sebenarnya) oleh instruksi
return-<kind> yang cocok (tidak boleh dilompati
ke). Satu-satunya pengecualian adalah petunjuk move-result-object , yang juga dapat didahului oleh petunjuk filled-new-array .
|
B21 |
Petunjuk move-exception hanya boleh muncul sebagai
petunjuk pertama dalam pengendali pengecualian.
|
B22 |
Pseudo-petunjuk packed-switch-data , sparse-switch-data ,
dan fill-array-data tidak boleh
dapat dijangkau oleh alur kontrol.
|