Sınırlamalar

.dex dosyası Dalvik bayt kodunun aktarım formatıdır. Bir dosyanın geçerli bir .dex dosyası olması için belirli sözdizimsel 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, bir .dex dosyasının daha büyük yapısıyla ilgilidir.

Tanımlayıcı Tanım
G1 .dex dosyasının magic numarası dex\n035\0 veya dex\n037\0 olmalıdır.
G2 Sağlama toplamı, magic ve checksum alanı dışındaki tüm dosya içeriğinin Adler-32 sağlama toplamı olmalıdır.
G3 İmza, magic , checksum ve signature dışında tüm dosya içeriğinin SHA-1 karması olmalıdır.
G4 file_size , bayt cinsinden gerçek dosya boyutuyla eşleşmelidir.
G5 header_size değeri şu değere sahip olmalıdır: 0x70
G6 endian_tag şu değerden 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ının her ikisi de sıfır olmalı veya her ikisi de sıfırdan farklı olmalıdır. İkinci durumda, uzaklığın dört baytla hizalanması gerekir.
G8 map_off dışındaki başlıktaki tüm uzaklık alanları dört baytla hizalanmalıdır.
G9 map_off alanı ya sıfır olmalı ya da veri bölümüne işaret etmelidir. İkinci durumda, data bölümünün mevcut olması gerekir.
G10 link , string_ids , type_ids , proto_ids , field_ids , method_ids , class_defs ve data bölümlerinin hiçbiri birbiriyle veya başlıkla örtüşmemelidir.
G11 Bir harita mevcutsa 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 mevcutsa, her harita girişinin sıfırdan farklı bir uzaklığı ve boyutu olmalıdır. Uzaklık, dosyanın karşılık gelen bölümüne işaret etmelidir (yani, bir string_id_item string_ids bölümüne işaret etmelidir) ve öğenin açık veya örtülü boyutu, bölümün gerçek içeriği ve boyutuyla eşleşmelidir.
G13 Bir harita mevcutsa, harita girişi n+1 uzaklığı, harita girişi n plus than size of map entry n daha büyük veya eşit olmalıdır. Bu, örtüşmeyen girişler ve düşükten yükseğe sıralama anlamına gelir.
G14 Aşağıdaki giriş türlerinin dört baytla hizalanmış bir uzaklığı 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ı, data bölümüne geçerli bir referans içermelidir. Başvurulan string_data_item için data alanı geçerli bir MUTF-8 dizesi içermeli ve utf16_size dizenin kodu çözülmüş uzunluğuyla eşleşmelidir.
G16 Her type_id_item için descriptor_idx alanının string_ids listesine geçerli bir referans içermesi gerekir. 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ı string_ids listesine geçerli bir referans içermelidir. Başvurulan dize geçerli bir kısa tanımlayıcı olmalıdır. Ayrıca, return_type_idx alanının type_ids bölümünde geçerli bir dizin olması gerekir ve parameters_off alanının sıfır olması veya data bölümüne işaret eden geçerli bir uzaklık olması gerekir. Sıfır değilse parametre listesi geçersiz giriş içermemelidir.
G18 Her field_id_item için hem class_idx hem de type_idx alanlarının type_ids listesinde geçerli dizinler olması gerekir. class_idx tarafından başvurulan giriş, dizi olmayan bir başvuru türü olmalıdır. Ayrıca name_idx alanının string_ids bölümüne geçerli bir referans olması ve başvurulan girdinin içeriğinin MemberName spesifikasyonuna uygun olması gerekir.
G19 Her method_id_item için class_idx alanının type_ids bölümünde geçerli bir dizin olması ve başvurulan girişin dizi olmayan bir başvuru türü olması gerekir. proto_id alanı, proto_ids listesine geçerli bir referans olmalıdır. name_idx alanı string_ids bölümüne geçerli bir referans olmalı ve başvurulan girdinin içeriği MemberName spesifikasyonuna uygun olmalıdır.
G20 Her field_id_item için class_idx alanının type_ids listesinde geçerli bir dizin olması gerekir. Başvurulan giriş, dizi olmayan bir başvuru türü olmalıdır.

Statik bayt kodu kısıtlamaları

Statik kısıtlamalar, bayt kodunun bireysel öğeleri üzerindeki kısıtlamalardır. Genellikle kontrol veya veri akışı analizi teknikleri kullanılmadan kontrol edilebilirler.

Tanımlayıcı Tanım
A1 insns dizisi boş olmamalıdır.
A2 insns dizisindeki ilk işlem kodunun sıfır dizini olması gerekir.
A3 insns dizisi yalnızca geçerli Dalvik işlem kodlarını içermelidir.
A4 Talimatın indeksi n+1 olası işlenenler dikkate alınarak, talimat indeksi n artı talimatın uzunluğu n 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öntem içindeki işlem kodları olmalıdır.
A7 packed-switch komutunun tüm hedefleri aynı yöntem içindeki işlem kodları olmalıdır. Hedeflerin boyutu ve listesi tutarlı olmalıdır.
A8 Bir sparse-switch komutunun tüm hedefleri aynı yöntem içindeki işlem kodları olmalıdır. İlgili tablonun tutarlı olması ve düşükten yükseğe doğru sıralanması gerekir.
A9 const-string ve const-string/jumbo talimatlarının B işleneni, dize sabit havuzunda geçerli bir dizin olmalıdır.
A10 iget<kind> ve iput<kind> talimatlarının C işleneni, alan sabiti havuzunda geçerli bir dizin olmalıdır. Başvurulan giriş bir örnek alanını temsil etmelidir.
A11 sget<kind> ve sput<kind> talimatlarının C işleneni, alan sabiti havuzunda geçerli bir dizin olmalıdır. Başvurulan giriş statik bir alanı temsil etmelidir.
A12 invoke-virtual , invoke-super , invoke-direct ve invoke-static talimatlarının C işleneni, yöntem sabiti 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 işleneni, yöntem sabiti havuzunda geçerli bir dizin olmalıdır.
A14 Adı '<' ile başlayan bir yöntem, .dex dosyasından kaynaklanan kod tarafından değil, yalnızca VM tarafından örtülü olarak çağrılmalıdır. Bunun tek istisnası, invoke-direct tarafından çağrılabilen örnek başlatıcıdır.
A15 invoke-interface komutunun C işleneni, yöntem sabiti havuzunda geçerli bir dizin olmalıdır. Başvurulan method_id bir arayüze ait olmalıdır (bir sınıfa değil).
A16 invoke-interface/range komutunun B işleneni, yöntem sabit havuzunda geçerli bir dizin olmalıdır. Başvurulan method_id bir arayüze ait olmalıdır (bir sınıfa değil).
A17 const-class , check-cast , new-instance ve filled-new-array/range talimatlarının B işleneni, tür sabiti havuzunda geçerli bir dizin olmalıdır.
A18 instance-of , new-array ve filled-new-array talimatlarının C işleneni, tür sabiti havuzunda geçerli bir dizin olmalıdır.
A19 new-array talimatı tarafından oluşturulan dizinin boyutları 256 küçük olmalıdır.
A20 new talimat dizi sınıflarına, arayüzlere veya soyut sınıflara atıfta bulunmamalıdır.
A21 new-array talimatının atıfta bulunduğu tür, geçerli, referans olmayan bir tür olmalıdır.
A22 Tek genişlikli (çift olmayan) bir talimat tarafından atıfta bulunulan tüm kayıtlar, mevcut yöntem için geçerli olmalıdır. Yani indeksleri negatif olmamalı ve registers_size değerinden küçük olmalıdır.
A23 Bir talimat tarafından çift genişlikli (çift) şekilde atıfta bulunulan tüm kayıtlar, mevcut yöntem için geçerli olmalıdır. Yani indeksleri negatif olmamalı ve registers_size-1 değerinden küçük olmalıdır.
A24 invoke-virtual ve invoke-direct talimatlarının method_id işleneni bir sınıfa (bir arayüze değil) ait olmalıdır. Sürüm 037 önceki Dex dosyalarında aynı durum invoke-super ve invoke-static talimatları için de geçerli olmalıdır.
A25 invoke-virtual/range ve invoke-direct/range talimatlarının method_id işleneni bir sınıfa (bir arayüze değil) ait olmalıdır. Sürüm 037 önceki Dex dosyalarında aynı durum invoke-super/range ve invoke-static/range talimatları için de geçerli olmalıdır.

Yapısal bayt kodu kısıtlamaları

Yapısal kısıtlamalar, bayt kodunun çeşitli öğeleri arasındaki ilişkilere ilişkin kısıtlamalardır. Genellikle kontrol veya veri akışı analizi teknikleri kullanılmadan kontrol edilemezler.

Tanımlayıcı Tanım
B1 Bağımsız değişkenlerin sayısı ve türleri (kayıtlar ve anlık değerler) her zaman talimatla eşleşmelidir.
B2 Kayıt çiftleri asla parçalanmamalıdır.
B3 Okunabilmesi için öncelikle bir kayıt (veya çift) atanmalıdır.
B4 invoke-direct talimatı, yalnızca geçerli sınıfta veya onun üst sınıflarından birinde bir örnek başlatıcıyı veya yöntemi çağırmalıdır.
B5 Bir örnek başlatıcı yalnızca başlatılmamış bir örnekte çağrılmalıdır.
B6 Örnek yöntemleri yalnızca üzerinde çağrılabilir ve örnek alanlarına yalnızca önceden başlatılmış örneklerde erişilebilir.
B7 new-instance komutunun sonucunu tutan bir kayıt, ö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 herhangi bir örnek üyesine 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ı çağrılmadan önce atanabilen, devralınmayan örnek alanları ve genel olarak Object sınıfıdır.
B9 Tüm gerçek yöntem argümanları, ilgili resmi argümanlarıyla atamayla uyumlu olmalıdır.
B10 Her örnek yöntemi çağrısı için, gerçek örneğin, talimatta belirtilen sınıf veya arayüzle atama uyumlu olması gerekir.
B11 Bir return<kind> talimatı, yönteminin dönüş türüyle eşleşmelidir.
B12 Bir üst sınıfın korumalı üyelerine erişirken, erişilen örneğin gerçek türü ya geçerli sınıf ya da onun alt sınıflarından biri olmalıdır.
B13 Statik alanda depolanan değerin türü, alanın türüyle atamayla uyumlu veya dönüştürülebilir olmalıdır.
B14 Bir alanda saklanan değerin türü, alanın türüyle atamayla uyumlu veya dönüştürülebilir olmalıdır.
B15 Bir dizide saklanan her değerin türü, dizinin bileşen türüyle atamayla uyumlu olmalıdır.
B16 throw komutunun A işleneni, java.lang.Throwable ile atamayla uyumlu olmalıdır.
B17 Bir yöntemin ulaşılabilir son talimatı ya bir geriye goto ya da dallanma, bir return ya da bir throw talimatı olmalıdır. insns dizisini altta bırakmak mümkün olmamalıdır.
B18 Önceki bir yazmaç çiftinin atanmamış yarısı, başka bir komutla yeniden atanıncaya kadar okunamayabilir (geçersiz kabul edilir).
B19 Bir 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 öncesinde de move-result-object talimatıdır.
B20 Bir move-result<kind> talimatının hemen öncesinde (gerçek kontrol akışında) eşleşen bir return-<kind> talimatı bulunmalıdır (buna atlanmamalıdır). Bunun tek istisnası, filled-new-array talimatının öncesinde de move-result-object talimatıdır.
B21 Bir move-exception talimatı, bir istisna işleyicide yalnızca ilk talimat olarak görünmelidir.
B22 packed-switch-data , sparse-switch-data ve fill-array-data sözde talimatlarına kontrol akışı tarafından erişilememelidir.