.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 |
|
G5 |
|
G6 |
endian_tag şu değerlerden birine sahip olmalıdır:
ENDIAN_CONSTANT veya REVERSE_ENDIAN_CONSTANT
|
G7 |
|
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 Her Başvurulan |
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.
|