Sınırlamalar

.dex dosyası, Dalvik bayt kodu için aktarım biçimidir. Bir dosyanın geçerli bir .dex dosyası olması için belirli söz dizimi ve anlamsal kısıtlamalar vardır ve yalnızca geçerli .dex dosyalarını desteklemek için bir çalışma zamanı gerekir.

Genel .dex bütünlüğü kısıtlamaları

Genel bütünlük kısıtlamaları, .dex biçiminde ayrıntılı olarak açıklandığı gibi, .dex dosyasının daha büyük yapısıyla ilgilidir.

Tanımlayıcı Açıklama
G1 .dex dosyasının magic numarası, 35 sürümü için dex\n035\0 veya sonraki sürümler için benzer olmalıdır.
G2 Kontrol toplamı, magic ve checksum alanı hariç dosya içeriğinin tamamının Adler-32 kontrol toplamı olmalıdır.
G3 İmza, magic, checksum ve signature hariç dosya içeriğinin tamamının SHA-1 karma değeri olmalıdır.
G4

file_size, bayt cinsinden gerçek dosya boyutuyla eşleşmelidir. (v40 veya önceki sürümler)

file_size, kapsayıcıdaki veya fiziksel dosyanın (kapsayıcının) sonundaki sonraki başlığa işaret etmelidir. Bir sonraki başlığı gösteriyorsa dosya boyutu 4 baytlık hizalamaya uygun olmalıdır. Tüm file_size alanlarının toplamı container_size'a eşit olmalıdır. (v41 veya sonraki sürümler)

G5

header_size değerinin 0x70 olması gerekir: (v40 veya önceki sürümler)

header_size şu değeri içermelidir: 0x78 (v41 veya sonraki sürümler)

G6 endian_tag şu değerlerden birine sahip olmalıdır: ENDIAN_CONSTANT veya REVERSE_ENDIAN_CONSTANT
G7

link, string_ids, type_ids, proto_ids, field_ids, method_ids, class_defs ve data bölümlerinin her biri için offset ve size alanları ya sıfır ya da sıfır olmayan olmalıdır. İkinci durumda, ofset dört baytlık hizalanmış olmalıdır.

offset ve size alanları kapsayıcı içinde olmalı ve onları tanımlayan başlığın ardından gelen verilere atıfta bulunmalıdır. (v41 veya sonraki sürümler)

G8 Başlıktaki map_off hariç tüm ofset alanları dört baytlık hizalanmalıdır.
G9 map_off alanı sıfır veya veri bölümüne işaret eden bir değer olmalıdır. İkinci durumda, data bölümü mevcut olmalıdır.
G10 link, string_ids, type_ids, proto_ids, field_ids, method_ids, class_defs ve data bölümlerinden hiçbiri birbirini veya üstbilgiyi örtmemelidir.
G11 Bir harita varsa her harita girişinin geçerli bir türü olmalıdır. Her tür en fazla bir kez görünebilir.
G12 Bir harita varsa her harita girişinin sıfır olmayan bir ofset ve boyutu olmalıdır. Ofset, dosyanın ilgili bölümüne işaret etmelidir (ör. string_id_item, string_ids bölümüne işaret etmelidir) ve öğenin açık veya gizli boyutu, bölümün gerçek içeriği ve boyutuyla eşleşmelidir.
G13 Bir harita varsa n+1 harita girişinin başlangıç değeri, n plus than size of map entry n harita girişinin başlangıç değerinden büyük veya bu değere eşit olmalıdır. Bu, örtüşmeyen girişler ve düşükten yükseğe doğru sıralama anlamına gelir.
G14 Aşağıdaki giriş türleri dört baytlık bir kayda sahip olmalıdır: 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

Her string_id_item için string_data_off alanında data bölümüne yönelik geçerli bir referans bulunmalıdır. (v40 veya önceki sürümler)

Her string_id_item için string_data_off alanı, kapsayıcı içinde ve onu dolaylı olarak kullanan tüm başlıklardan sonra bir ofset olmalıdır. (v41 veya sonraki sürümler)

Başvurulan string_data_item için data alanında geçerli bir MUTF-8 dizesi bulunmalıdır ve utf16_size, dizenin kodunun çözüldüğü uzunlukla eşleşmelidir.

G16 Her type_id_item için descriptor_idx alanında string_ids listesine geçerli bir referans bulunmalıdır. Başvurulan dize geçerli bir tür tanımlayıcısı olmalıdır.
G17 Her proto_id_item için shorty_idx alanında string_ids listesine geçerli bir referans bulunmalıdır. Referans verilen dize geçerli bir kısa açıklama olmalıdır. Ayrıca, return_type_idx alanı type_ids bölümünde geçerli bir dizin, parameters_off alanı ise sıfır veya data bölümüne işaret eden geçerli bir ofset olmalıdır. Sıfırdan farklıysa parametre listesi boş giriş içermemelidir.
G18 Her field_id_item için hem class_idx hem de type_idx alanları, type_ids listesinde geçerli dizinler olmalıdır. class_idx tarafından referans verilen giriş, dizi olmayan bir referans türü olmalıdır. Ayrıca, name_idx alanı string_ids bölümüne geçerli bir referans olmalı ve referans verilen girişin içeriği MemberName spesifikasyonuna uygun olmalıdır.
G19 Her method_id_item için class_idx alanı, type_ids bölümüne yönelik geçerli bir dizin olmalıdır ve referans verilen giriş, dizi olmayan bir referans türü olmalıdır. proto_id alanı, proto_ids listesinde geçerli bir referans olmalıdır. name_idx alanı, string_ids bölümüne geçerli bir referans olmalıdır ve referans verilen girişin içeriği MemberName spesifikasyonuna uygun olmalıdır.
G20 Her field_id_item için class_idx alanı, type_ids listesinde geçerli bir dizin olmalıdır. Referans verilen giriş, dizi olmayan bir referans türü olmalıdır.

Statik bayt kodu kısıtlamaları

Statik kısıtlamalar, bayt kodunun ayrı öğeleriyle ilgili kısıtlamalardır. Bunlar genellikle kontrol veya veri akışı analiz teknikleri kullanılmadan kontrol edilebilir.

Tanımlayıcı Açıklama
A1 insns dizisi boş olmamalıdır.
A2 insns dizisindeki ilk işlem kodu sıfır dizine sahip olmalıdır.
A3 insns dizisi yalnızca geçerli Dalvik kodları içermelidir.
A4 n+1 talimatının dizini, olası operandlar dikkate alınarak n talimatının dizinine artı n talimatının uzunluğuna eşit olmalıdır.
A5 insns dizisindeki son talimat, insns_size-1 dizininde bitmelidir.
A6 Tüm goto ve if-<kind> hedefleri aynı yöntemdeki opcode'lar olmalıdır.
A7 Bir packed-switch talimatının tüm hedefleri aynı yöntemdeki opcode'lar olmalıdır. Hedeflerin boyutu ve listesi tutarlı olmalıdır.
A8 Bir sparse-switch talimatının tüm hedefleri aynı yöntemdeki opcode'lar olmalıdır. İlgili tablo tutarlı olmalı ve düşükten yükseğe doğru sıralanmış olmalıdır.
A9 const-string ve const-string/jumbo talimatlarının B operandoru, dize sabit değer havuzunda geçerli bir dizin olmalıdır.
A10 iget<kind> ve iput<kind> talimatlarının C operanı, alan sabit havuzunda geçerli bir dizin olmalıdır. Referans verilen giriş bir örnek alanı temsil etmelidir.
A11 sget<kind> ve sput<kind> talimatlarının C operanı, alan sabit havuzunda geçerli bir dizin olmalıdır. Referans verilen giriş statik bir alanı temsil etmelidir.
A12 invoke-virtual, invoke-super, invoke-direct ve invoke-static talimatlarının C operandı, yöntem sabit değer havuzunda geçerli bir dizin olmalıdır.
A13 invoke-virtual/range, invoke-super/range, invoke-direct/range ve invoke-static/range talimatlarının B operandoru, yöntem sabit değer havuzunda geçerli bir dizin olmalıdır.
A14 Adı "<' ile başlayan bir yöntem, .dex dosyasından gelen kod tarafından değil, yalnızca VM tarafından dolaylı olarak çağrılmalıdır. Tek istisna, invoke-direct tarafından çağrılabilecek örnek başlatıcısıdır.
A15 invoke-interface talimatının C operandoru, yöntem sabit değer havuzunda geçerli bir dizin olmalıdır. Atıf yapılan method_id, sınıfa değil bir arayüze ait olmalıdır.
A16 invoke-interface/range talimatının B operandoru, yöntem sabit değer havuzunda geçerli bir dizin olmalıdır. Referans verilen method_id bir sınıfa değil, bir arayüze ait olmalıdır.
A17 const-class, check-cast, new-instance ve filled-new-array/range talimatlarının B operandı, tür sabit havuzunda geçerli bir dizin olmalıdır.
A18 instance-of, new-array ve filled-new-array talimatlarının C operandı, tür sabit havuzunda geçerli bir dizin olmalıdır.
A19 new-array talimatı ile oluşturulan bir dizi boyutu 256 değerinden küçük olmalıdır.
A20 new talimatı dizi sınıflarına, arayüzlere veya soyut sınıflara referans vermemelidir.
A21 new-array talimatı tarafından atıfta bulunulan tür, geçerli ve referans olmayan bir tür olmalıdır.
A22 Bir talimat tarafından tek genişlikte (çift olmayan) şekilde atıfta bulunulan tüm kaydediciler geçerli yöntem için geçerli olmalıdır. Yani, dizinleri negatif olmamalı ve registers_size değerinden küçük olmalıdır.
A23 Bir talimat tarafından çift genişlikte (çift) referans verilen tüm kaydediciler geçerli yöntem için geçerli olmalıdır. Yani dizinleri negatif olmamalı ve registers_size-1'ten küçük olmalıdır.
A24 invoke-virtual ve invoke-direct talimatlarının method_id operandı bir sınıfa (arayüze değil) ait olmalıdır. 037 sürümünden önceki Dex dosyalarında da invoke-super ve invoke-static talimatları için aynı durum geçerli olmalıdır.
A25 invoke-virtual/range ve invoke-direct/range talimatlarının method_id operandı bir sınıfa (arayüze değil) ait olmalıdır. 037 sürümünden önceki Dex dosyalarında da invoke-super/range ve invoke-static/range talimatları için aynı durum geçerli olmalıdır.

Yapısal bayt kodu kısıtlamaları

Yapısal kısıtlamalar, bytecode'ın çeşitli öğeleri arasındaki ilişkilerle ilgili kısıtlamalardır. Genellikle kontrol veya veri akışı analiz teknikleri kullanılmadan kontrol edilemezler.

Tanımlayıcı Açıklama
B1 Parametrelerin sayısı ve türleri (kayıtlar ve anında değerler) her zaman talimatla eşleşmelidir.
B2 Kayıt çiftleri hiçbir zaman bölünmemelidir.
B3 Bir kayıt (veya çift) okunmadan önce atanmalıdır.
B4 invoke-direct talimatı, yalnızca mevcut sınıfta veya üst sınıflarından birinde bir örnek başlatıcıyı ya da yöntemi çağırmalıdır.
B5 Örnek başlatıcı yalnızca başlatılmamış bir örnekte çağrılmalıdır.
B6 Örnek yöntemleri yalnızca örnek alanlarından çağrılabilir ve örnek alanlarına yalnızca başlatılmış örneklerde erişilebilir.
B7 Bir new-instance talimatının sonucunu tutan bir kaydedici, örnek başlatılmadan önce aynı new-instance talimatı tekrar yürütülürse kullanılmamalıdır.
B8 Örnek başlatıcının, örnek üyelerine erişilebilmesi için başka bir örnek başlatıcıyı (aynı sınıf veya üst sınıf) çağırması gerekir. İstisnalar, başka bir başlatıcıyı çağırmadan önce atanabilen ve genel olarak Object sınıfı olan devralınmayan örnek alanlarıdır.
B9 Tüm gerçek yöntem bağımsız değişkenleri, ilgili resmi bağımsız değişkenleriyle atama açısından uyumlu olmalıdır.
B10 Her örnek yöntem çağrısı için gerçek örnek, talimatta belirtilen sınıf veya arayüzle atama uyumlu olmalıdır.
B11 return<kind> talimatı, yönteminin döndürme türüyle eşleşmelidir.
B12 Bir üst sınıfın korunan üyelerine erişirken erişilen örneğin gerçek türü, mevcut sınıf veya alt sınıflarından biri olmalıdır.
B13 Statik bir alana depolanan değerin türü, atamaya uygun veya alanın türüyle dönüştürülebilir olmalıdır.
B14 Bir alana depolanan değerin türü, atama açısından alan türüyle uyumlu veya alan türüne dönüştürülebilir olmalıdır.
B15 Bir dizi içine depolanan her değerin türü, atamaya uygun olarak dizi bileşen türüyle uyumlu olmalıdır.
B16 Bir throw talimatının A operandoru, java.lang.Throwable ile atama uyumlu olmalıdır.
B17 Bir yöntemin erişilebilen son talimatı, geriye dönük bir goto veya dal, return ya da throw talimatı olmalıdır. insns dizisini alt kısımda bırakmak mümkün olmamalıdır.
B18 Eski bir kayıt çiftinin atanmamış yarısı, başka bir talimatla yeniden atanana kadar okunamaz (geçersiz kabul edilir).
B19 move-result<kind> talimatının hemen öncesinde (insns dizisinde) bir invoke-<kind> talimatı bulunmalıdır. Bunun tek istisnası, filled-new-array talimatının da gelebileceği move-result-object talimatıdır.
B20 move-result<kind> talimatından hemen önce (gerçek kontrol akışında) eşleşen bir return-<kind> talimatı gelmelidir (bu talimata atlanmamalıdır). Bunun tek istisnası, move-result-object talimatıdır. Bu talimatın önünde bir filled-new-array talimatı da bulunabilir.
B21 move-exception talimatı yalnızca bir istisna işleyicisindeki ilk talimat olarak görünmelidir.
B22 packed-switch-data, sparse-switch-data ve fill-array-data sözde talimatları, kontrol akışı tarafından erişilebilir olmamalıdır.