File .dex
adalah format transport untuk Dalvik Bytecode. Ada batasan sintaksis dan semantik tertentu agar file menjadi file .dex
yang valid, dan waktu proses 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 rinci dalam format .dex
.
pengenal | Keterangan |
---|---|
G1 | Angka magic dari file .dex harus dex\n035\0 atau dex\n037\0 . |
G2 | Checksum harus berupa checksum Adler-32 dari seluruh konten file kecuali bidang magic dan checksum . |
G3 | Tanda tangan harus berupa hash SHA-1 dari seluruh isi file kecuali magic , checksum , dan signature . |
G4 | file_size harus sesuai dengan ukuran file sebenarnya dalam byte. |
G5 | header_size harus memiliki nilai: 0x70 |
G6 | endian_tag harus memiliki nilai: ENDIAN_CONSTANT atau REVERSE_ENDIAN_CONSTANT |
G7 | Untuk setiap bagian link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs , dan data , bidang offset dan size harus nol atau keduanya bukan nol. Dalam kasus terakhir, offset harus disejajarkan dengan empat byte. |
G8 | Semua bidang offset di header kecuali map_off harus disejajarkan dengan empat byte. |
G9 | Bidang map_off harus nol atau menunjuk ke bagian data. Dalam kasus terakhir, bagian data harus ada. |
G10 | Tak satu pun dari bagian link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs dan data harus saling tumpang tindih atau header. |
G11 | Jika ada peta, maka setiap entri peta harus memiliki tipe yang valid. Setiap jenis dapat muncul paling banyak satu kali. |
G12 | Jika ada peta, maka setiap entri peta harus memiliki offset dan ukuran bukan nol. Offset harus mengarah ke bagian file yang sesuai (yaitu string_id_item harus mengarah ke bagian string_ids ) dan ukuran item yang eksplisit atau implisit harus sesuai dengan konten dan ukuran bagian yang sebenarnya. |
G13 | Jika ada peta, maka offset entri peta n+1 harus lebih besar atau sama dengan offset entri peta n plus than size of map entry n . Ini menyiratkan entri yang tidak tumpang tindih dan pemesanan rendah ke tinggi. |
G14 | Jenis entri berikut harus memiliki offset yang disejajarkan 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 string_id_item , bidang string_data_off harus berisi referensi yang valid ke dalam bagian data . Untuk string_data_item yang direferensikan, bidang data harus berisi string MUTF-8 yang valid, dan utf16_size harus cocok dengan panjang string yang didekodekan. |
G16 | Untuk setiap type_id_item , bidang descriptor_idx harus berisi referensi yang valid ke dalam daftar string_ids . String yang direferensikan harus berupa deskriptor tipe yang valid. |
G17 | Untuk setiap proto_id_item , bidang shorty_idx harus berisi referensi yang valid ke dalam daftar string_ids . String yang direferensikan harus berupa deskriptor pendek yang valid. Juga, bidang return_type_idx harus berupa indeks yang valid ke dalam bagian type_ids , dan bidang parameters_off harus nol atau offset yang valid yang menunjuk ke bagian data . Jika bukan nol, daftar parameter tidak boleh berisi entri kosong. |
G18 | Untuk setiap field_id_item , baik class_idx dan type_idx harus berupa indeks yang valid ke dalam daftar type_ids . Entri yang direferensikan oleh class_idx harus berupa tipe referensi non-array. Selain itu, bidang name_idx harus menjadi referensi yang valid ke dalam bagian string_ids , dan konten entri yang direferensikan harus sesuai dengan spesifikasi MemberName . |
G19 | Untuk setiap method_id_item , bidang class_idx harus berupa indeks yang valid ke dalam bagian type_ids , dan entri yang direferensikan harus berupa tipe referensi non-array. Bidang proto_id harus menjadi referensi yang valid ke dalam daftar proto_ids . Bidang name_idx harus menjadi referensi yang valid ke bagian string_ids , dan konten entri yang direferensikan harus sesuai dengan spesifikasi MemberName . |
G20 | Untuk setiap field_id_item , field class_idx harus berupa indeks yang valid ke dalam daftar type_ids . Entri yang direferensikan harus berupa tipe referensi non-array. |
Batasan bytecode statis
Kendala statis adalah kendala pada elemen individu dari bytecode. Mereka biasanya dapat diperiksa tanpa menggunakan kontrol atau teknik analisis aliran data.
pengenal | Keterangan |
---|---|
A1 | Array insns wajib diisi. |
A2 | Opcode pertama dalam array insns harus memiliki indeks nol. |
A3 | Array insns hanya boleh berisi opcode Dalvik yang valid. |
A4 | Indeks instruksi n+1 harus sama dengan indeks instruksi n ditambah panjang instruksi n , dengan mempertimbangkan kemungkinan operan. |
A5 | Instruksi terakhir dalam array insns harus diakhiri dengan indeks insns_size-1 . |
A6 | Semua target goto dan if-<kind> harus opcode dalam metode yang sama. |
A7 | Semua target instruksi packet packed-switch harus opcode dalam metode yang sama. Ukuran dan daftar target harus konsisten. |
A8 | Semua target instruksi sparse-switch harus opcode dalam metode yang sama. Tabel yang sesuai harus konsisten dan diurutkan dari rendah ke tinggi. |
A9 | Operand B dari instruksi const-string dan const-string/jumbo harus berupa indeks yang valid ke dalam kumpulan konstanta string. |
A10 | Operand C dari iget<kind> dan iput<kind> harus berupa indeks yang valid ke dalam kumpulan konstanta bidang. Entri yang direferensikan harus mewakili bidang instance. |
A11 | Operand C dari sget<kind> dan sput<kind> harus berupa indeks yang valid ke dalam kumpulan konstanta bidang. Entri yang direferensikan harus mewakili bidang statis. |
A12 | Operand C dari instruksi invoke-virtual , invoke-super , invoke-direct dan invoke-static harus berupa indeks yang valid ke dalam kumpulan konstanta metode. |
A13 | Operan B dari instruksi invoke-virtual/range , invoke-super/range , invoke-direct/range , dan invoke-static/range harus merupakan indeks yang valid ke dalam kumpulan konstanta metode. |
A14 | Metode yang namanya dimulai dengan '<' hanya boleh dipanggil secara implisit oleh VM, bukan dengan kode yang berasal dari file .dex . Satu-satunya pengecualian adalah penginisialisasi instance, yang dapat dipanggil oleh invoke-direct . |
A15 | Operand C dari instruksi invoke-interface harus berupa indeks yang valid ke dalam kumpulan konstanta metode. method_id direferensikan harus milik antarmuka (bukan kelas). |
A16 | Operand B dari instruksi invoke-interface/range harus berupa indeks yang valid ke dalam kumpulan konstanta metode. method_id direferensikan harus milik antarmuka (bukan kelas). |
A17 | Operand B dari instruksi const-class , check-cast , new-instance , dan filled-new-array/range harus berupa indeks yang valid ke dalam kumpulan konstanta tipe. |
A18 | Operand C dari instruksi instance-of , new-array , dan filled-new-array harus berupa indeks yang valid ke dalam kumpulan konstanta tipe. |
A19 | Dimensi array yang dibuat oleh instruksi new-array harus kurang dari 256 . |
A20 | Instruksi new tidak boleh merujuk ke kelas array, antarmuka, atau kelas abstrak. |
A21 | Tipe yang dirujuk oleh instruksi new-array harus valid, tipe non-referensi. |
A22 | Semua register yang dirujuk oleh instruksi dalam mode single-width (non-pair) harus valid untuk metode saat ini. Artinya, indeksnya harus non-negatif dan lebih kecil dari registers_size . |
A23 | Semua register yang dirujuk oleh instruksi 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 instruksi invoke-virtual dan invoke-direct harus dimiliki oleh sebuah kelas (bukan sebuah antarmuka). Dalam file Dex sebelum versi 037 , hal yang sama harus berlaku untuk instruksi invoke-super dan invoke-static . |
A25 | Operand method_id dari instruksi invoke-virtual/range dan invoke-direct/range harus dimiliki oleh suatu kelas (bukan antarmuka). Dalam file Dex sebelum versi 037 , hal yang sama harus berlaku untuk instruksi invoke-super/range dan invoke-static/range . |
Batasan bytecode struktural
Kendala struktural adalah kendala pada hubungan antara beberapa elemen bytecode. Mereka biasanya tidak dapat diperiksa tanpa menggunakan kontrol atau teknik analisis aliran data.
pengenal | Keterangan |
---|---|
B1 | Jumlah dan jenis argumen (register dan nilai langsung) harus selalu sesuai dengan instruksi. |
B2 | Daftar pasangan tidak boleh putus. |
B3 | Register (atau pasangan) harus ditetapkan terlebih dahulu sebelum dapat dibaca. |
B4 | Instruksi invoke-direct harus memanggil penginisialisasi instans atau metode hanya di kelas saat ini atau salah satu superkelasnya. |
B5 | Penginisialisasi instance harus dipanggil hanya pada instance yang tidak diinisialisasi. |
B6 | Metode instans dapat dipanggil hanya pada dan bidang instans hanya dapat diakses pada instans yang sudah diinisialisasi. |
B7 | Register yang menyimpan hasil dari instruksi new-instance tidak boleh digunakan jika instruksi new-instance yang sama dieksekusi lagi sebelum instance diinisialisasi. |
B8 | Penginisialisasi instance harus memanggil penginisialisasi instance lain (kelas atau superclass yang sama) sebelum anggota instance dapat diakses. Pengecualian adalah bidang instance yang tidak diwariskan, yang dapat ditetapkan sebelum memanggil penginisialisasi lain, dan kelas Object secara umum. |
B9 | Semua argumen metode aktual harus kompatibel dengan penugasan dengan argumen formal masing-masing. |
B10 | Untuk setiap pemanggilan metode instance, instance aktual harus kompatibel dengan tugas dengan kelas atau antarmuka yang ditentukan dalam instruksi. |
B11 | Instruksi return<kind> harus cocok dengan tipe pengembalian metodenya. |
B12 | Saat mengakses anggota superclass yang dilindungi, tipe aktual dari instance yang diakses harus berupa kelas saat ini atau salah satu subkelasnya. |
B13 | Jenis nilai yang disimpan ke dalam bidang statis harus kompatibel dengan penetapan atau dapat dikonversi ke jenis bidang. |
B14 | Jenis nilai yang disimpan ke dalam bidang harus kompatibel dengan penetapan atau dapat dikonversi ke jenis bidang. |
B15 | Jenis setiap nilai yang disimpan ke dalam larik harus kompatibel dengan tugas dengan jenis komponen larik. |
B16 | Operand A dari instruksi throw harus kompatibel dengan tugas dengan java.lang.Throwable . |
B17 | Instruksi terakhir yang dapat dijangkau dari suatu metode harus berupa goto atau cabang mundur, return , atau instruksi throw . Tidak mungkin untuk meninggalkan array insns di bagian bawah. |
B18 | Separuh yang belum ditetapkan dari pasangan register sebelumnya tidak dapat dibaca (dianggap tidak valid) sampai telah ditetapkan kembali oleh beberapa instruksi lain. |
B19 | Instruksi move-result<kind> harus segera didahului (dalam array insns ) oleh invoke-<kind> . Satu-satunya pengecualian adalah instruksi move-result-object , yang juga dapat didahului oleh instruksi filled-new-array . |
B20 | Instruksi move-result<kind> harus segera didahului (dalam aliran kontrol aktual) dengan instruksi return-<kind> yang cocok (tidak boleh dilompati). Satu-satunya pengecualian adalah instruksi move-result-object , yang juga dapat didahului oleh instruksi filled-new-array . |
B21 | Instruksi move-exception harus muncul hanya sebagai instruksi pertama dalam exception handler. |
B22 | Pseudo-instruksi packed-switch-data , sparse-switch-data , dan fill-array-data tidak boleh dijangkau oleh aliran kontrol. |