Batasan

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

file_size harus cocok dengan ukuran file sebenarnya dalam byte. (v40 atau yang lebih lama)

file_size harus mengarah ke header berikutnya dalam penampung, atau di akhir file fisik (penampung). Jika mengarah ke header berikutnya, ukuran file harus sejajar 4 byte. Jumlah semua kolom file_size harus sama dengan container_size. (v41 atau yang lebih baru)

G5

header_size harus memiliki nilai: 0x70 (v40 atau yang lebih lama)

header_size harus memiliki nilai: 0x78 (v41 atau yang lebih baru)

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, kolom offset dan size harus nol atau keduanya bukan nol. Dalam kasus terakhir, offset harus sejajar empat byte.

Kolom offset dan size harus berada dalam penampung dan merujuk ke data yang terletak setelah header yang menentukannya. (v41 atau yang lebih baru)

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 string_id_item, kolom string_data_off harus berisi referensi yang valid ke bagian data. (v40 atau yang lebih lama)

Untuk setiap string_id_item, kolom string_data_off harus berupa offset dalam penampung dan setelah header apa pun yang menggunakannya secara transitif. (v41 atau yang lebih baru)

Untuk string_data_item yang dirujuk, kolom data harus berisi string MUTF-8 yang valid, dan utf16_size harus cocok dengan panjang string yang didekode.

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.