Dalvik yürütülebilir biçimi

Bu belgede, bir dizi sınıf tanımını ve ilişkili ek verilerini depolamak için kullanılan .dex dosyalarının düzeni ve içeriği açıklanmaktadır.

Tür rehberi

Ad Açıklama
bayt 8 bitlik işaretli tam sayı
ubyte 8 bit işaretsiz int
kısa video 16 bit işaretli tam sayı, küçük endian
ushort 16 bit işaretsiz int, küçük endian
int 32 bit işaretli int, küçük endian
uint 32 bitlik işaretsiz int, küçük endian
uzun 64 bitlik işaretli int, küçük endian
ulong 64 bit işaretsiz int, küçük endian
sleb128 imzalı LEB128, değişken uzunluk (aşağıya bakın)
uleb128 işaretsiz LEB128, değişken uzunlukta (aşağıya bakın)
uleb128p1 işaretsiz LEB128 artı 1, değişken uzunlukta (aşağıya bakın)

LEB128

LEB128 ("KüçükEngilizce Bazası 128"), rastgele imzalanan veya imzalanmamış tam sayı miktarları için değişken uzunlukta bir kodlamadır. Biçim, DWARF3 spesifikasyonundan alınmıştır. .dex dosyasında LEB128 yalnızca 32 bitlik miktarları kodlamak için kullanılır.

Her LEB128 kodlu değer, birlikte tek bir 32 bitlik değeri temsil eden bir ila beş bayttan oluşur. Her baytın en önemli biti ayarlıdır. Bunun tek istisnası, en önemli biti temiz olan dizideki son bayttır. Her baytın kalan yedi biti yükü oluşturur. Miktarın en az anlamlı yedi biti ilk baytta, sonraki yedi biti ikinci baytta ve bu şekilde devam eder. İşaretli LEB128 (sleb128) söz konusu olduğunda, sıradaki son baytın en önemli yükü biti, son değeri oluşturmak için işaretli olarak genişletilir. İmzasız durumda (uleb128), açıkça temsil edilmeyen tüm bitler 0 olarak yorumlanır.

İki baytlık LEB128 değerinin bit tabanlı şeması
İlk bayt İkinci bayt
1 bit6 bit5 bit4 bit3 bit2 bit1 bit0 0 bit13 bit12 bit11 bit10 bit9 bit8 bit7

uleb128p1 varyantı, uleb128 olarak kodlanan bir artı bir değerinin temsil edildiği, imzalı bir değeri temsil etmek için kullanılır. Bu, -1 (alternatif olarak işaretsiz değer 0xffffffff olarak düşünülür) kodlamasını (ancak başka hiçbir negatif sayıyı değil) tek bayt yapar ve tam olarak temsil edilen sayının sıfır veya -1 (veya 0xffffffff) olması gereken ve başka negatif değerlere izin verilmeyen (veya büyük işaretsiz değerlere ihtiyaç duyulmayan) durumlarda kullanışlıdır.

Biçimlere dair bazı örnekleri aşağıda bulabilirsiniz:

Kodlanmış Sıralı sleb128 olarak uleb128 olarak uleb128p1 olarak
0000-1
01110
7f-1127)126
80 7f-1281625616255

Dosya düzeni

Ad Biçimi Açıklama
üst bilgi header_item üstbilgi
string_ids string_id_item[] dize tanımlayıcısı listesi. Bunlar, bu dosya tarafından kullanılan tüm dizelerin tanımlayıcılarıdır.Bu tanımlayıcılar, dahili adlandırma (ör. tür tanımlayıcıları) veya kod tarafından başvurulan sabit nesneler için kullanılır. Bu liste, UTF-16 kod noktası değerleri kullanılarak (yerleşime duyarlı bir şekilde değil) dize içeriğine göre sıralanmış olmalı ve yinelenen girişler içermemelidir.
type_ids type_id_item[] tür tanımlayıcısı listesinde bulunabilir. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosya tarafından atıfta bulunulan tüm türlerin (sınıflar, diziler veya ilkel türler) tanımlayıcılarıdır. Bu liste string_id dizinine göre sıralanmış olmalı ve yinelenen girişler içermemelidir.
proto_ids proto_id_item[] yöntem prototipi tanımlayıcısı listesi. Bunlar, bu dosyanın atıfta bulunduğu tüm prototiplerin tanımlayıcılarıdır. Bu liste, döndürülen tür (type_id dizine göre) ana sırasına göre ve ardından bağımsız değişken listesine göre (alfabetik sıralama, bağımsız değişkenler type_id dizine göre sıralanır) sıralanır. Listede yinelenen girişler bulunmamalıdır.
field_ids field_id_item[] alan tanımlayıcısı listesi. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosya tarafından atıfta bulunulan tüm alanların tanımlayıcılarıdır. Bu liste, tanımlama türü (type_id dizine göre) birincil düzen, alan adı (string_id dizine göre) ikincil düzen ve tür (type_id dizine göre) üçüncül düzen olacak şekilde sıralanır. Listede yinelenen girişler bulunmamalıdır.
method_ids method_id_item[] yöntem tanımlayıcısı listesini inceleyin. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosya tarafından atıfta bulunulan tüm yöntemlerin tanımlayıcılarıdır. Bu liste, tanımlama türüne (type_id dizine göre) göre birincil, yöntem adına (string_id dizine göre) göre ikincil ve yöntem prototipine (proto_id dizine göre) göre üçüncül olarak sıralanır. Listede yinelenen girişler bulunmamalıdır.
class_defs class_def_item[] sınıf tanımları listesini görebilirsiniz. Sınıflar, belirli bir sınıfın üst sınıfının ve uygulanan arayüzlerinin, referans veren sınıftan önce listede görüneceği şekilde sıralanmalıdır. Ayrıca, aynı ada sahip sınıfın tanımının listede birden fazla kez görünmesi geçersizdir.
call_site_ids call_site_id_item[] site tanımlayıcısı listesini çağırın. Bunlar, dosya içinde tanımlanmış olsun veya olmasın, bu dosya tarafından atıfta bulunulan tüm çağrı sitelerinin tanımlayıcılarıdır. Bu liste, call_site_off değerine göre artan düzende sıralanmış olmalıdır.
method_handles method_handle_item[] yöntemi herkese açık kullanıcı adı listesi. Dosyada tanımlanmış olsun veya olmasın, bu dosya tarafından başvurulan tüm yöntem tutamaçlarının listesi. Bu liste sıralı değildir ve mantıksal olarak farklı yöntem mülk örneklerine karşılık gelen yinelenen öğeler içerebilir.
aktarma ubyte[] veri alanı, yukarıda listelenen tablolarla ilgili tüm destek verilerini içerir. Farklı öğelerin farklı hizalama koşulları vardır ve doğru hizalamaya ulaşmak için gerekirse her öğenin önüne dolgu baytları eklenir.
link_data ubyte[] statik olarak bağlı dosyalarda kullanılan veriler. Bu bölümdeki verilerin biçimi bu belgede belirtilmemiştir. Bu bölüm, bağlantısı olmayan dosyalarda boştur ve çalışma zamanındaki uygulamalar bu bölümü uygun gördükleri şekilde kullanabilir.

Kapsayıcı biçimi

41. sürümde, yer kazanmak amacıyla DEX verileri için yeni bir kapsayıcı biçimi kullanıma sunulmuştur. Bu kapsayıcı biçimi, birkaç mantıksal DEX dosyasının tek bir fiziksel dosyada birleştirilmesine olanak tanır. Yeni biçim, çoğunlukla önceki biçimteki dosyaların basit bir şekilde birleştirilmesinden oluşur. Bununla birlikte, bazı farklılıklar vardır:

  • file_size, fiziksel dosyanın değil mantıksal dosyanın boyutudur. Bu işlev, kapsayıcıdaki tüm mantıksal dosyaları iterasyonla işlemek için kullanılabilir.
  • Mantıksal dex dosyaları, kapsayıcıdaki daha sonraki verileri referans alabilir (ancak önceki verileri referans alamaz). Bu sayede dex dosyaları, aralarında dize gibi veriler paylaşabilir.
  • Tüm ofsetler fiziksel dosyaya göredir. Üstbilgiye göre hiçbir ofset yoktur. Bu sayede, ofset içeren bölümler mantıksal dosyalar arasında paylaşılabilir.
  • Başlık, kapsayıcının sınırlarını tanımlamak için iki yeni alan ekler. Bu ek bir tutarlılık denetimidir ve kodu yeni biçime taşımayı kolaylaştırır.
  • data_size ve data_off artık kullanılmamaktadır. Veriler birden fazla mantıksal dosyaya yayılabilir ve bitişik olması gerekmez.

Bit alanı, dize ve sabit tanımlar

DEX_FILE_MAGIC

header_item öğesine yerleştirilmiş

Sabit dizi/dize DEX_FILE_MAGIC, .dex dosyası olarak tanınması için dosyanın başında görünmesi gereken baytların listesidir. Değer, belirli bozulma biçimlerinin tespit edilmesine yardımcı olmak için kasıtlı olarak bir satır sonu ("\n" veya 0x0a) ve boş bayt ("\0" veya 0x00) içerir. Değer, biçim sürüm numarasını üç ondalık basamak olarak da kodlar. Bu sayının, biçim geliştikçe zaman içinde tekdüze şekilde artması beklenir.

ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 }
                        = "dex\n039\0"

Not: Android 10.0 sürümünde, biçimin 040 sürümü için destek eklendi. Bu destek, SimpleNames'da izin verilen karakter grubunu genişletti.

Not: Android 9.0 sürümünde, biçimin 039 sürümü için destek eklendi. Bu sürümde const-method-handle ve const-method-type olmak üzere iki yeni bayt kodu kullanıma sunuldu. (Bunların her biri Kod birimi kümesinin özeti tablosunda açıklanmıştır.) Android 10'daki 039 sürümü, DEX dosya biçimini yalnızca önyükleme sınıfı yolundaki DEX dosyaları için geçerli olan gizli API bilgilerini içerecek şekilde genişletir.

Not: Biçimin 038 sürümü, Android 8.0 sürümünde desteklenmeye başlandı. 038 sürümünde, yöntem tutamaçlarına yönelik yeni bayt kodları (invoke-polymorphic ve invoke-custom) ve veriler eklendi.

Not: Bu biçimin 037 sürümü için destek, Android 7.0 sürümünde eklenmiştir. 037 sürümünden önceki Android sürümlerinin çoğu, biçimin 035 sürümünü kullanıyordu. 035 ve 037 sürümleri arasındaki tek fark, varsayılan yöntemlerin eklenmesi ve invoke değerinin ayarlanmasıdır.

Not: Bu biçimin en az birkaç önceki sürümü, herkese açık olarak yayınlanan yazılım sürümlerinde kullanılmıştır. Örneğin, Android platformunun M3 sürümleri (Kasım-Aralık 2007) için 009 sürümü, Android platformunun M5 sürümleri (Şubat-Mart 2008) için ise 013 sürümü kullanıldı. Bu biçimin önceki sürümleri, bu belgede açıklanan sürümden çeşitli açılardan önemli ölçüde farklıdır.

ENDIAN_CONSTANT ve REVERSE_ENDIAN_CONSTANT

header_item öğesine yerleştirilmiş

ENDIAN_CONSTANT sabit değeri, bulunduğu dosyanın büyük endian veya küçük endian olduğunu belirtmek için kullanılır. Standart .dex biçimi küçük endian olsa da uygulamalar bayt değiştirmeyi tercih edebilir. Bir uygulama, endian_tag değeri ENDIAN_CONSTANT yerine REVERSE_ENDIAN_CONSTANT olan bir başlıkla karşılaşırsa dosyanın beklenen biçimden bayt değişimi geçirdiğini bilir.

uint ENDIAN_CONSTANT = 0x12345678;
uint REVERSE_ENDIAN_CONSTANT = 0x78563412;

NO_INDEX

class_def_item ve debug_info_item öğelerine yerleştirilir.

NO_INDEX sabit değeri, bir dizin değerinin bulunmadığını belirtmek için kullanılır.

Not: Bu değer, genellikle geçerli bir dizin olduğu için 0 olarak tanımlanmaz.

NO_INDEX için seçilen değer, uleb128p1 kodlamasında tek bir bayt olarak temsil edilebilir.

uint NO_INDEX = 0xffffffff;    // == -1 if treated as a signed int

access_flags tanımları

class_def_item, encoded_field, encoded_method ve InnerClass öğelerine yerleştirilir.

Bu işaretlerin bit alanları, sınıfların ve sınıf üyelerinin erişilebilirliğini ve genel özelliklerini belirtmek için kullanılır.

Ad Değer Sınıflar (ve InnerClass ek açıklamaları) için Alanlar İçin Yöntemler için
ACC_PUBLIC 0x1 public: her yerde görünür public: her yerde görünür public: her yerde görünür
ACC_PRIVATE 0x2 * private: yalnızca tanımlayan sınıf tarafından görülebilir private: yalnızca tanımlayan sınıf tarafından görülebilir private: yalnızca tanımlayan sınıf tarafından görülebilir
ACC_PROTECTED 0x4 * protected: paket ve alt sınıflar tarafından görülebilir protected: Paket ve alt sınıflar tarafından görülebilir protected: Paket ve alt sınıflar tarafından görülebilir
ACC_STATIC 0x8 * static: Dış this referansıyla oluşturulmaz static: Tanımlayıcı sınıf için global static: this bağımsız değişkeni almıyor
ACC_FINAL 0x10 final: alt sınıfa ayrılamaz final: Oluşturulduktan sonra değiştirilemez final: geçersiz kılınamaz
ACC_SYNCHRONIZED 0x20     synchronized: ilişkili kilit, bu yönteme yapılan çağrının etrafında otomatik olarak edinilir.

Not: Bu ayar yalnızca ACC_NATIVE de ayarlandığında geçerlidir.

ACC_VOLATILE 0x40   volatile: Mesaj dizisinin güvenliğine yardımcı olacak özel erişim kuralları  
ACC_BRIDGE 0x40     tür güvenli bir köprü olarak derleyici tarafından otomatik olarak eklenen köprü yöntemi
ACC_TRANSIENT 0x80   transient: Varsayılan olarak serileştirme ile kaydedilmez.  
ACC_VARARGS 0x80     son bağımsız değişken, derleyici tarafından "geri kalan" bağımsız değişken olarak değerlendirilmelidir
ACC_NATIVE 0x100     native: Yerel kodda uygulanır.
ACC_INTERFACE 0x200 interface: birden fazla şekilde uygulanabilen soyut sınıf    
ACC_ABSTRACT 0x400 abstract: Doğrudan oluşturulamaz.   abstract: Bu sınıf tarafından uygulanmadı
ACC_STRICT 0x800     strictfp: kayan noktalı aritmetik için katı kurallar
ACC_SYNTHETIC 0x1000 Doğrudan kaynak kodunda tanımlanmamışsa Doğrudan kaynak kodunda tanımlanmamışsa Doğrudan kaynak kodunda tanımlanmamışsa
ACC_ANNOTATION 0x2000 bir ek açıklama sınıfı olarak tanımlanmışsa    
ACC_ENUM 0x4000 Listelenmiş tür olarak tanımlanmış Listelenen değer olarak tanımlanmış  
(unused) 0x8000      
ACC_CONSTRUCTOR 0x10000     oluşturucu yöntemi (sınıf veya örnek başlatıcı)
ACC_DECLARED_
SYNCHRONIZED
0x20000     synchronized öğesini tanımladınız.

Not: Bu, yürütmeyi etkilemez (bu işaretin yansıtılması dışında).

* Yalnızca InnerClass ek açıklamalarında kullanılabilir ve hiçbir zaman class_def_item'da etkin olmamalıdır.

Değiştirilmiş UTF-8 kodlaması

Eski sürümlerin daha kolay desteklenmesi için .dex biçimi, dize verilerini de facto standart değiştirilmiş UTF-8 biçiminde (bundan sonra MUTF-8 olarak anılacaktır) kodlar. Bu biçim, aşağıdakiler dışında standart UTF-8 ile aynıdır:

  • Yalnızca bir, iki ve üç baytlık kodlamalar kullanılır.
  • U+10000U+10ffff aralığındaki kod noktaları, her biri üç baytlık kodlanmış değer olarak temsil edilen bir vekil çifti olarak kodlanır.
  • U+0000 kod noktası iki baytlık biçimde kodlanır.
  • Standart C dili yorumunda olduğu gibi, boş bir bayt (0 değeri) bir dizenin sonunu gösterir.

Yukarıdaki ilk iki öğe şu şekilde özetlenebilir: MUTF-8, Unicode karakterleri için daha doğrudan bir kodlama biçimi olmak yerine UTF-16 için bir kodlama biçimidir.

Yukarıdaki son iki öğe, U+0000 kod noktasını bir dizeye dahil etmeyi ve aynı zamanda C tarzı boş karakterle sonlandırılmış bir dize olarak değiştirmeyi aynı anda mümkün kılar.

Ancak U+0000'ün özel kodlaması, normal UTF-8'den farklı olarak, bir çift MUTF-8 dizesinde standart C işlevi strcmp()'ün çağrılmasının sonucunun her zaman eşit olmayan dizelerin karşılaştırmasının doğru şekilde imzalanmış sonucunu göstermediği anlamına gelir. Sıralama (yalnızca eşitlik değil) önemliyse MUTF-8 dizelerini karşılaştırmanın en kolay yolu, bunları karakter karakter kodlarını çözmek ve kodları çözülmüş değerleri karşılaştırmaktır. (Ancak daha akıllıca uygulamalar da mümkündür.)

Karakter kodlaması hakkında daha fazla bilgi için lütfen Unicode Standardı'na bakın. MUTF-8, aslında UTF-8'e kıyasla (nispeten daha az bilinen) CESU-8 kodlamasına daha yakındır.

encoded_value kodlaması

annotation_element ve encoded_array_item öğelerine yerleştirilir.

encoded_value, (neredeyse) keyfi olarak hiyerarşik olarak yapılandırılmış verilerin kodlanmış bir parçasıdır. Kodlamanın hem kompakt hem de ayrıştırması kolay olması gerekir.

Ad Biçimi Açıklama
(value_arg << 5) | value_type ubyte hemen sonraki value değerinin türünü belirten bir bayt ve üst değerli üç bitte isteğe bağlı bir açıklayıcı bağımsız değişken. Çeşitli value tanımları için aşağıya bakın. Çoğu durumda value_arg, hemen ardından gelen value değerinin uzunluğunu bayt cinsinden (size - 1) olarak kodlar. Örneğin: 0, değerin bir bayt gerektirdiği, 7 ise sekiz bayt gerektirdiği anlamına gelir. Ancak aşağıda belirtildiği gibi istisnalar vardır.
değer ubyte[] Değeri temsil eden baytlar. Uzunluk değişkendir ve farklı value_type baytları için farklı şekilde yorumlanır ancak her zaman küçük endiandır. Ayrıntılar için aşağıdaki çeşitli değer tanımlarına bakın.

Değer biçimleri

Tür Adı value_type value_arg Biçim value Biçim Açıklama
VALUE_BYTE 0x00 (none; must be 0) ubyte[1] imzalı bir baytlık tam sayı değeri
VALUE_SHORT 0x02 boyut - 1 (0…1) ubyte[size] işaretli iki baytlık tam sayı değeri, işaretli olarak genişletilmiş
VALUE_CHAR 0x03 boyut - 1 (0…1) ubyte[size] sıfıra genişletilmiş, imzasız iki baytlık tam sayı değeri
VALUE_INT 0x04 boyut - 1 (0…3) ubyte[size] işaretli dört baytlık tam sayı değeri, işaretli olarak genişletilmiş
VALUE_LONG 0x06 boyut - 1 (0…7) ubyte[size] işaretli sekiz baytlık tam sayı değeri, işaretli olarak genişletilmiş
VALUE_FLOAT 0x10 boyut - 1 (0…3) ubyte[size] dört baytlık bit kalıbı, sağa sıfırla genişletilmiş ve IEEE754 32 bitlik kayan nokta değeri olarak yorumlanır
VALUE_DOUBLE 0x11 boyut - 1 (0…7) ubyte[size] sekiz baytlık bit kalıbı, sağa sıfır uzatılır ve IEEE754 64 bit kayan nokta değeri olarak yorumlanır
VALUE_METHOD_TYPE 0x15 boyut - 1 (0…3) ubyte[size] proto_ids bölümüne yönelik bir dizin olarak yorumlanan ve yöntem türü değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tamsayı değeri
VALUE_METHOD_HANDLE 0x16 boyut - 1 (0…3) ubyte[size] method_handles bölümüne yönelik bir dizin olarak yorumlanan ve bir yöntem tutamaç değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tam sayı değeri
VALUE_STRING 0x17 boyut - 1 (0…3) ubyte[size] string_ids bölümüne ait bir dizin olarak yorumlanan ve dize değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tam sayı değeri
VALUE_TYPE 0x18 boyut - 1 (0…3) ubyte[size] type_ids bölümüne ait bir dizin olarak yorumlanan ve yansıtıcı bir tür/sınıf değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tamsayı değeri
VALUE_FIELD 0x19 boyut - 1 (0…3) ubyte[size] field_ids bölümüne ait bir dizin olarak yorumlanan ve yansıtıcı alan değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tamsayı değeri
VALUE_METHOD 0x1a boyut - 1 (0…3) ubyte[size] method_ids bölümüne ait bir dizin olarak yorumlanan ve yansıtıcı yöntem değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tam sayı değeri
VALUE_ENUM 0x1b boyut - 1 (0…3) ubyte[size] field_ids bölümüne yönelik bir dizin olarak yorumlanan ve listelenmiş tür sabitinin değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tamsayı değeri
VALUE_ARRAY 0x1c (none; must be 0) encoded_array Aşağıdaki "encoded_array biçimi" ile belirtilen biçimde bir değer dizisi. value boyutu, kodlamaya dahildir.
VALUE_ANNOTATION 0x1d (none; must be 0) encoded_annotation Aşağıdaki "encoded_annotation biçimi" ile belirtilen biçimde bir alt ek açıklama. value boyutu, kodlamaya dahildir.
VALUE_NULL 0x1e (none; must be 0) (yok) null referans değeri
VALUE_BOOLEAN 0x1f boole (0…1) (yok) bir bitlik değer; false için 0 ve true için 1. Bit, value_arg içinde temsil edilir.

encoded_array biçimi

Ad Biçimi Açıklama
beden uleb128 dizindeki öğe sayısı
değerler encoded_value[size] Bu bölümde belirtilen biçimde, ardışık olarak birleştirilmiş bir dizi size encoded_value bayt dizisi.

encoded_annotation biçimi

Ad Biçimi Açıklama
type_idx uleb128 ek açıklama türü. Bu, bir sınıf (dizi veya ilkel değil) türü olmalıdır.
beden uleb128 Bu ek açıklamadaki ad/değer eşlemelerinin sayısı
öğeler annotation_element[size] doğrudan satır içi olarak gösterilen (ofset olarak değil) ek açıklama öğeleri. Öğeler string_id dizine göre artan düzende sıralanır.

annotation_element biçimi

Ad Biçimi Açıklama
name_idx uleb128 string_ids bölümündeki bir dizin olarak temsil edilen öğe adı. Dize, yukarıda tanımlanan ÜyeAdı söz dizimine uymalıdır.
değer encoded_value öğe değeri

Dize söz dizimi

.dex dosyasında, sonuçta bir dizeyi belirten birkaç tür öğe vardır. Aşağıdaki BNF stilindeki tanımlar, bu dizeler için kabul edilen söz dizimini belirtir.

SimpleName

SimpleName, diğer öğelerin adlarının söz dizimi için temeldir. .dex biçimi, burada oldukça fazla esneklik sağlar (en yaygın kaynak dillerden çok daha fazla). Basit bir ad, kısa ASCII alfabe karakterleri veya rakamları, birkaç özel kısa ASCII sembolü ve kontrol, boşluk veya özel karakter olmayan ASCII olmayan kod noktalarının çoğundan oluşur. 040 sürümünden itibaren biçim, boşluk karakterlerine (Unicode Zs kategorisi) de izin verir. Vekil kod noktalarının (U+d800U+dfff aralığında) kendi başına geçerli ad karakterleri olarak kabul edilmediğini, ancak Unicode ek karakterlerinin geçerli olduğunu (SimpleNameChar kuralı için nihai alternatifle temsil edilirler) ve bir dosyada MUTF-8 kodlamasında vekil kod noktası çiftleri olarak temsil edilmeleri gerektiğini unutmayın.

BasitAd
SimpleNameChar (SimpleNameChar)*
SimpleNameChar
'A''Z'
| 'a''z'
| '0''9'
| ' ' DEX 040 sürümünden itibaren
| '$'
| '-'
| '_'
| U+00a0 DEX 040 sürümünden itibaren
| U+00a1U+1fff
| U+2000U+200a DEX 040 sürümünden itibaren
| U+2010U+2027
| U+202f DEX 040 sürümünden itibaren
| U+2030U+d7ff
| U+e000U+ffef
| U+10000U+10ffff

Üye Adı

field_id_item ve method_id_item tarafından kullanılır

MemberName, bir sınıfın üyesinin adıdır. Üyeler alanlar, yöntemler ve iç sınıflardır.

ÜyeAdı
BasitAd
| '<' BasitAd '>'

FullClassName

TamAd, isteğe bağlı bir paket belirteci ve ardından zorunlu bir ad içeren tam nitelikli bir sınıf adıdır.

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(BasitAd '/')*

TypeDescriptor

type_id_item tarafından kullanılır

TypeDescriptor, ilkel türler, sınıflar, diziler ve void dahil olmak üzere herhangi bir türün temsilidir. Farklı sürümlerin anlamlarını aşağıda bulabilirsiniz.

TypeDescriptor
'V'
| FieldTypeDescriptor
FieldTypeDescriptor
NonArrayFieldTypeDescriptor
| ('[' * 1…255) NonArrayFieldTypeDescriptor
NonArrayFieldTypeDescriptor
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L' FullClassName ';'

ShortyDescriptor

proto_id_item tarafından kullanılır

ShortyDescriptor, döndürülen değer ve parametre türleri dahil olmak üzere bir yöntem prototipinin kısa biçimli temsilidir. Bununla birlikte, çeşitli referans (sınıf veya dizi) türleri arasında ayrım yapılmaz. Bunun yerine, tüm referans türleri tek bir 'L' karakteriyle temsil edilir.

ShortyDescriptor
ShortyReturnType (ShortyFieldType)*
ShortyReturnType
'V'
| ShortyFieldType
ShortyFieldType
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L'

TypeDescriptor semantiği

TypeDescriptor varyantlarının her birinin anlamı budur.

Sözdizimi Anlamı
V void; yalnızca iade türleri için geçerlidir
Z boolean
B byte
S short
C char
İ int
J long
C float
D double
Ltam/nitelikli/ad; fully.qualified.Name sınıfı
[descriptor descriptor dizisi, dizi dizileri için yinelemeli olarak kullanılabilir ancak 255'ten fazla boyuta sahip olmak geçersizdir.

Öğeler ve ilgili yapılar

Bu bölümde, .dex dosyasında görünebilecek üst düzey öğelerin her birinin tanımı yer alır.

header_item

Üstbilgi bölümünde görünür

Hizalama: 4 bayt

Ad Biçimi Açıklama
sihir ubyte[8] = DEX_FILE_MAGIC magic value. Daha fazla bilgi için yukarıdaki "DEX_FILE_MAGIC" bölümündeki tartışmaya bakın.
denetim toplamı uint Dosyanın geri kalanının (magic ve bu alan hariç her şey) adler32 kontrol
signature ubyte[20] Dosyanın geri kalanının (magic, checksum ve bu alan hariç her şey) SHA-1 imzası (karması); dosyaları benzersiz şekilde tanımlamak için kullanılır
file_size uint

Dosyanın tamamının (başlık dahil) bayt cinsinden boyutu (v40 veya önceki sürümler)

Bu başlığın başlangıcından sonraki başlığa veya dosyanın tamamının (kapsayıcının) sonuna kadar olan mesafe (bayt cinsinden). (v41 veya sonraki sürümler)

header_size uint

üstbilginin (bu bölümün tamamının) bayt cinsinden boyutu. Bu sayede, biçimi geçersiz kılmaksızın en azından sınırlı miktarda geriye/ileriye dönük uyumluluk sağlanabilir.

0x70 (112) bayt olmalıdır (v40 veya önceki sürümler)

0x78 (120) bayt olmalıdır (v41 veya sonraki sürümler)

endian_tag uint = ENDIAN_CONSTANT endianness etiketi. Daha fazla bilgi için yukarıdaki "ENDIAN_CONSTANT ve REVERSE_ENDIAN_CONSTANT" bölümündeki tartışmaya bakın.
link_size uint bağlantı bölümünün boyutu veya bu dosya statik olarak bağlı değilse 0
link_off uint dosyanın başlangıcından bağlantı bölümüne kadar olan ofset veya link_size == 0 ise 0. Başlangıç, sıfırdan farklıysa link_data bölümündeki bir başlangıç olmalıdır. İşaretlenen verilerin biçimi bu dokümanda belirtilmez. Bu başlık alanı (ve önceki) çalışma zamanındaki uygulamalar tarafından kullanılmak üzere kanca olarak bırakılır.
map_off uint dosya başlangıcından harita öğesine kadar olan ofset. Sıfır olmayan ofset, data bölümündeki bir ofset olmalıdır ve veriler aşağıdaki "map_list" ile belirtilen biçimde olmalıdır.
string_ids_size uint dize tanımlayıcılar listesindeki dizelerin sayısı
string_ids_off uint dosya başlangıcından dize tanımlayıcılar listesine kadar olan ofset veya string_ids_size == 0 ise 0 (bu durumun sıra dışı bir uç durum olduğunu kabul etmek gerekir). Sıfır olmayan ofset, string_ids bölümünün başına yönlendirilmelidir.
type_ids_size uint tür tanımlayıcıları listesindeki öğelerin sayısı (en fazla 65.535)
type_ids_off uint dosya başlangıcından tür tanımlayıcıları listesine kadar olan ofset veya type_ids_size == 0 ise 0 (bu durumun sıra dışı bir uç durum olduğunu kabul etmek gerekir). Sıfır olmayan ofset, type_ids bölümünün başına yönlendirilmelidir.
proto_ids_size uint prototip tanımlayıcılar listesindeki öğelerin sayısı (en fazla 65.535)
proto_ids_off uint dosya başlangıcından prototip tanımlayıcıları listesine kadar olan ofset veya proto_ids_size == 0 ise 0 (bu durumun sıra dışı bir uç durum olduğunu kabul etmek gerekir). Sıfır olmayan ofset, proto_ids bölümünün başına yönlendirilmelidir.
field_ids_size uint alan tanımlayıcıları listesindeki öğelerin sayısı
field_ids_off uint dosya başlangıcından alan tanımlayıcılar listesine kadar olan ofset veya field_ids_size == 0 ise 0. Sıfır olmayan ofset, field_ids bölümünün başına yönlendirilmelidir.
method_ids_size uint yöntem tanımlayıcıları listesindeki öğelerin sayısı
method_ids_off uint dosya başlangıcından yöntem tanımlayıcılar listesine kadar olan ofset veya method_ids_size == 0 ise 0. Sıfır olmayan ofset, method_ids bölümünün başına yönlendirilmelidir.
class_defs_size uint sınıf tanımları listesindeki öğelerin sayısı
class_defs_off uint dosya başlangıcından sınıf tanımları listesine kadar olan ofset veya class_defs_size == 0 ise 0 (bu durumun sıra dışı bir uç durum olduğunu kabul etmek gerekir). Sıfır olmayan ofset, class_defs bölümünün başına yönlendirilmelidir.
data_size uint

data bölümünün bayt cinsinden boyutu. sizeof(uint) değerinin çift katı olmalıdır. (v40 veya önceki sürümler)

Kullanılmayan (v41 veya sonraki sürümler)

data_off uint

dosyanın başlangıcından data bölümünün başına kadar olan ofset (v40 veya önceki sürümler)

Kullanılmayan (v41 veya sonraki sürümler)

container_size uint

bu alan mevcut değil. file_size değerine eşit olduğu varsayılabilir. (v40 veya önceki sürümler)

dosyanın tamamının boyutu (diğer dex başlıkları ve verileri dahil). (v41 veya sonraki sürümler)

header_offset uint

bu alan mevcut değil. 0 değerine eşit olduğu varsayılabilir. (v40 veya önceki sürümler)

dosyanın başlangıcından bu başlığın başına kadar olan ofset. (v41 veya sonraki sürümler)

map_list

Veriler bölümünde görünür.

header_item öğesinden referans verilen

Hizalama: 4 bayt

Bu, bir dosyanın tüm içeriğinin sıralı bir listesidir. header_item ile ilgili bazı yedek bilgiler içerir ancak dosyanın tamamında iterasyon yapmak için kullanımı kolay bir form olarak tasarlanmıştır. Belirli bir tür, bir haritada en fazla bir kez görünmelidir ancak biçimin geri kalanının ima ettiği kısıtlamalar dışında (ör. önce bir header bölümü, ardından bir string_ids bölümü vb.) türlerin hangi sırada görünebileceğiyle ilgili bir kısıtlama yoktur. Ayrıca, harita girişleri ilk ofsete göre sıralanmış olmalı ve çakışmamalıdır.

Ad Biçimi Açıklama
beden uint listenin giriş cinsinden boyutu
liste map_item[size] listenin öğeleri

map_item biçimi

Ad Biçimi Açıklama
tür ushort öğelerin türü (aşağıdaki tabloya bakın)
unused ushort (unused)
beden uint Belirtilen ofsette bulunacak öğelerin sayısı
ofset uint Dosyanın başlangıcından söz konusu öğelere kadar olan ofset

Kodlar

Öğe Türü Sabit Değer Öğe Boyutu (Bayt)
header_item TYPE_HEADER_ITEM 0x0000 0x70
string_id_item TYPE_STRING_ID_ITEM 0x0001 0x04
type_id_item TYPE_TYPE_ID_ITEM 0x0002 0x04
proto_id_item TYPE_PROTO_ID_ITEM 0x0003 0x0c
field_id_item TYPE_FIELD_ID_ITEM 0x0004 0x08
method_id_item TYPE_METHOD_ID_ITEM 0x0005 0x08
class_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
call_site_id_item TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
method_handle_item TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
map_list TYPE_MAP_LIST 0x1000 4 + (item.size * 12)
type_list TYPE_TYPE_LIST 0x1001 4 + (item.size * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (item.size * 4)
annotation_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (item.size * 4)
class_data_item TYPE_CLASS_DATA_ITEM 0x2000 örtük; ayrıştırılmalıdır
code_item TYPE_CODE_ITEM 0x2001 örtük; ayrıştırılmalıdır
string_data_item TYPE_STRING_DATA_ITEM 0x2002 örtük; ayrıştırılmalıdır
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 örtülü; ayrıştırılmalıdır
annotation_item TYPE_ANNOTATION_ITEM 0x2004 örtülü; ayrıştırılmalıdır
encoded_array_item TYPE_ENCODED_ARRAY_ITEM 0x2005 örtülü; ayrıştırılmalıdır
annotations_directory_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 örtülü; ayrıştırılmalıdır
hiddenapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 örtük; ayrıştırılmalıdır

string_id_item

string_ids bölümünde görünür.

Hizalama: 4 bayt

Ad Biçimi Açıklama
string_data_off uint dosya başlangıcından bu öğenin dize verilerine kadar olan ofset. Ofset, data bölümündeki bir konuma ait olmalı ve veriler aşağıdaki "string_data_item" ile belirtilen biçimde olmalıdır. Ofset için hizalama koşulu yoktur.

string_data_item

Veriler bölümünde görünür.

Hizalama: yok (bayt hizalı)

Ad Biçimi Açıklama
utf16_size uleb128 UTF-16 kod birimleri cinsinden bu dizenin boyutu (birçok sistemde "dize uzunluğu"dur). Yani bu, dizenin kod çözülmüş uzunluğudur. (Kodlanan uzunluk, 0 baytının konumuyla belirtilir.)
aktarma ubyte[] Bir dizi MUTF-8 kod birimi (diğer adıyla sekizli, diğer adıyla bayt) ve ardından 0 değerine sahip bir bayt. Veri biçimiyle ilgili ayrıntılar ve tartışma için yukarıdaki "MUTF-8 (Değiştirilmiş UTF-8) Kodlaması"na bakın.

Not: UTF-16 yedek kod birimleri (yani U+d800U+dfff) içeren bir dizenin (kodlanmış biçimi) tek başına veya Unicode'un UTF-16'ya normal kodlamasına göre sıra dışı olması kabul edilir. Uygun durumlarda, bu tür geçersiz kodlamaları reddetmek için dizelerin daha üst düzey kullanımlarına bağlıdır.

type_id_item

type_ids bölümünde görünür.

Hizalama: 4 bayt

Ad Biçimi Açıklama
descriptor_idx uint Bu türdeki tanımlayıcı dizesi için string_ids listesinde dizin Dize, yukarıda tanımlanan TypeDescriptor sözdizimine uygun olmalıdır.

proto_id_item

proto_ids bölümünde görünür.

Hizalama: 4 bayt

Ad Biçimi Açıklama
shorty_idx uint bu prototipin kısa açıklama dizesi için string_ids listesinde dizin oluşturma Dize, yukarıda tanımlanan ShortyDescriptor sözdizimine uygun olmalı ve bu öğenin döndürülen türüne ve parametrelerine karşılık gelmelidir.
return_type_idx uint bu prototipin döndürülen türü için type_ids listesinde dizin
parameters_off uint dosya başlangıcından bu prototipin parametre türleri listesine kadar olan mesafeyi veya bu prototipin parametresi yoksa 0 değerini döndürür. Sıfırdan farklıysa bu ofset data bölümünde olmalı ve buradaki veriler aşağıda "type_list" ile belirtilen biçimde olmalıdır. Ayrıca, listede void türüne referans

field_id_item

field_ids bölümünde görünür.

Hizalama: 4 bayt

Ad Biçimi Açıklama
class_idx ushort Bu alanın tanımlayıcısı için type_ids listesinde dizin. Bu, dizi veya ilkel tür değil, sınıf türü olmalıdır.
type_idx ushort Bu alanın türü için type_ids listesinde dizin
name_idx uint bu alanın adı için string_ids listesinde dizin oluşturma Dize, yukarıda tanımlanan ÜyeAdı söz dizimine uymalıdır.

method_id_item

method_ids bölümünde görünür.

Hizalama: 4 bayt

Ad Biçimi Açıklama
class_idx ushort Bu yöntemin tanımlayıcısı için type_ids listesinde dizin. Bu, ilkel tür değil, sınıf veya dizi türü olmalıdır.
proto_idx ushort Bu yöntemin prototipi için proto_ids listesinde dizin
name_idx uint bu yöntemin adı için string_ids listesinde dizin oluşturma Dize, yukarıda tanımlanan ÜyeAdı söz dizimine uymalıdır.

class_def_item

class_defs bölümünde görünür

Hizalama: 4 bayt

Ad Biçimi Açıklama
class_idx uint bu sınıfın type_ids listesinde dizin. Bu, dizi veya ilkel tür değil, sınıf türü olmalıdır.
access_flags uint sınıf için erişim işaretleri (public, final vb.). Ayrıntılar için "access_flags Tanımlar" bölümüne bakın.
superclass_idx uint üst sınıf için type_ids listesindeki dizin veya bu sınıfın üst sınıfı yoksa (yani Object gibi bir kök sınıfsa) sabit değer NO_INDEX. Mevcutsa bu, dizi veya ilkel tür değil, sınıf türü olmalıdır.
interfaces_off uint dosya başlangıcından arayüz listesine kadar olan ofset veya böyle bir arayüz yoksa 0. Bu ofset, data bölümünde olmalıdır ve buradaki veriler aşağıdaki "type_list" ile belirtilen biçimde olmalıdır. Listenin her bir öğesi sınıf türü olmalıdır (dizi veya ilkel tür olmamalıdır) ve yinelenen öğe bulunmamalıdır.
source_file_idx uint sınıfın (en azından büyük bir kısmının) orijinal kaynağını içeren dosyanın adı için string_ids listesinde dizin veya bu bilgilerin eksikliğini temsil eden özel değer NO_INDEX. Belirli bir yöntemin debug_info_item, bu kaynak dosyayı geçersiz kılabilir ancak çoğu sınıfın yalnızca bir kaynak dosyadan gelmesi beklenir.
annotations_off uint dosya başlangıcından bu sınıfın ek açıklama yapısına kadar olan ofset veya bu sınıfta ek açıklama yoksa 0. Bu ofset, sıfırdan farklıysa data bölümünde olmalıdır ve buradaki veriler, aşağıda "annotations_directory_item" ile belirtilen biçimde olmalıdır. Tüm öğeler, tanımlayıcısı olarak bu sınıfa atıfta bulunur.
class_data_off uint dosya başlangıcından bu öğeyle ilişkili sınıf verilerine kadar olan ofset veya bu sınıf için sınıf verisi yoksa 0. (Örneğin, bu sınıf bir işaretçi arayüzüyse bu durum söz konusu olabilir.) Sıfır olmayan ofset, data bölümünde olmalıdır ve buradaki veriler aşağıdaki "class_data_item" ile belirtilen biçimde olmalıdır. Tüm öğeler, tanımlayıcısı olarak bu sınıfa atıfta bulunmalıdır.
static_values_off uint dosyanın başlangıcından static alanlarının ilk değer listesine veya hiç yoksa 0'a (ve tüm static alanları 0 veya null ile başlatılacaksa) olan ofset. Bu ofset data bölümünde olmalı ve buradaki veriler aşağıdaki "encoded_array_item" ile belirtilen biçimde olmalıdır. Dizi boyutu, bu sınıf tarafından tanımlanan static alanlarının sayısından büyük olmamalıdır ve öğeler, ilgili field_list içinde tanımlandığı sırayla static alanlarına karşılık gelir. Her dizi öğesinin türü, karşılık gelen alanının bildirilen türüyle eşleşmelidir. Dizideki öğe sayısı static alanından azsa kalan alanlar, türe uygun bir 0 veya null ile başlatılır.

call_site_id_item

call_site_ids bölümünde görünür

Hizalama: 4 bayt

Ad Biçimi Açıklama
call_site_off uint Site tanımını çağırmak için dosyanın başlangıcından itibaren ofset. Ofset, veri bölümünde olmalıdır ve buradaki veriler aşağıdaki "call_site_item" tarafından belirtilen biçimde olmalıdır.

call_site_item

Veriler bölümünde görünür.

Hizalama: yok (bayt hizalı)

call_site_item, öğeleri bir bootstrap bağlayıcı yöntemine sağlanan bağımsız değişkenlere karşılık gelen bir encoded_array_item öğesidir. İlk üç bağımsız değişken şunlardır:

  1. Önyükleme bağlayıcı yöntemini temsil eden bir yöntem tutamaç (VALUE_METHOD_HANDLE).
  2. Önyükleme bağlayıcısının çözümlemesi gereken bir yöntem adı (VALUE_STRING).
  3. Çözülecek yöntem adının türüne karşılık gelen bir yöntem türü (VALUE_METHOD_TYPE).

Ek bağımsız değişkenler, önyükleme bağlayıcı yöntemine iletilen sabit değerlerdir. Bu bağımsız değişkenler sırayla ve herhangi bir tür dönüştürme işlemi yapılmadan iletilir.

Bootstrap bağlayıcı yöntemini temsil eden yöntem adı, java.lang.invoke.CallSite döndürme türüne sahip olmalıdır. İlk üç parametre türü şunlardır:

  1. java.lang.invoke.Lookup
  2. java.lang.String
  3. java.lang.invoke.MethodType

Ek bağımsız değişkenlerin parametre türleri, sabit değerlerine göre belirlenir.

method_handle_item

method_handles bölümünde görünür

Hizalama: 4 bayt

Ad Biçimi Açıklama
method_handle_type ushort yöntem tutamacının türü (aşağıdaki tabloya bakın)
unused ushort (unused)
field_or_method_id ushort Yöntem adı türünün erişim yöntemi mi yoksa yöntem çağırıcı mı olduğuna bağlı olarak alan veya yöntem kimliği
unused ushort (unused)

Yöntem herkese açık kullanıcı adı türü kodları

Sabit Değer Açıklama
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 Yöntem adı, statik bir alan ayarlayıcısıdır (erişimci).
METHOD_HANDLE_TYPE_STATIC_GET 0x01 Yöntem adı, statik bir alan alıcısıdır (erişimci).
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 Yöntem adı, örnek alan ayarlayıcısıdır (erişimci).
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 Yöntem adı, bir örnek alan alıcısıdır (erişimci).
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 Yöntem adı, statik bir yöntem çağırıcıdır
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 Yöntem adı, bir örnek yöntemi çağırıcısıdır
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 Yöntem adı, bir kurucu yöntemi çağırıcısıdır
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 Yöntem adı, doğrudan yöntem çağırıcıdır
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 Yöntem herkese açık kullanıcı adı, bir arayüz yöntemi çağırıcısıdır

class_data_item

class_def_item tarafından referans verilen

Veriler bölümünde görünür.

Hizalama: yok (bayt hizalı)

Ad Biçimi Açıklama
static_fields_size uleb128 Bu öğede tanımlanan statik alanların sayısı
instance_fields_size uleb128 Bu öğede tanımlanan örnek alanı sayısı
direct_methods_size uleb128 Bu öğede tanımlanan doğrudan yöntemlerin sayısı
virtual_methods_size uleb128 Bu öğede tanımlanan sanal yöntemlerin sayısı
static_fields encoded_field[static_fields_size] Kodlanmış öğeler dizisi olarak temsil edilen tanımlanmış statik alanlar. Alanlar field_idx sütununa göre artan düzende sıralanmış olmalıdır.
instance_fields encoded_field[instance_fields_size] Kodlanmış öğe dizisi olarak temsil edilen tanımlanmış örnek alanları. Alanlar field_idx sütununa göre artan düzende sıralanmış olmalıdır.
direct_methods encoded_method[direct_methods_size] Kodlanmış öğelerin dizisi olarak temsil edilen, tanımlanmış doğrudan (static, private veya yapıcıdan herhangi biri) yöntemler. Yöntemler method_idx sütununa göre artan düzende sıralanmalıdır.
virtual_methods encoded_method[virtual_methods_size] Kodlanmış öğelerin dizisi olarak temsil edilen, tanımlanmış sanal (static, private veya yapıcı yöntemlerinden hiçbiri) yöntemler. Bu liste, bu öğenin temsil ettiği sınıf tarafından geçersiz kılınmadığı sürece devralınan yöntemleri içermemelidir. Yöntemler, method_idx sütununa göre artan düzende sıralanmalıdır. Sanal yöntemin method_idx değeri, doğrudan yöntemlerle aynı olmamalıdır.

Not: Tüm öğelerin field_id ve method_id örnekleri aynı tanımlama sınıfına referans vermelidir.

encoded_field biçimi

Ad Biçimi Açıklama
field_idx_diff uleb128 Bu alanın kimliği için field_ids listesinde dizin (adı ve tanımlayıcıyı içerir), listedeki önceki öğenin dizininden fark olarak temsil edilir. Bir listedeki ilk öğenin dizini doğrudan temsil edilir.
access_flags uleb128 alan için erişim işaretleri (public, final vb.). Ayrıntılar için "access_flags Tanımlar" bölümüne bakın.

encoded_method biçimi

Ad Biçimi Açıklama
method_idx_diff uleb128 Bu yöntemin kimliği için method_ids listesinde dizin (adı ve tanımlayıcıyı içerir), listedeki önceki öğenin dizininden fark olarak temsil edilir. Bir listedeki ilk öğenin dizini doğrudan temsil edilir.
access_flags uleb128 yöntemin erişim işaretleri (public, final vb.). Ayrıntılar için "access_flags Tanımlar" bölümüne bakın.
code_off uleb128 dosyanın başlangıcından bu yöntemin kod yapısına kadar olan ofset veya bu yöntem abstract veya native ise 0. Başlangıç, data bölümündeki bir konuma ayarlanmalıdır. Verilerin biçimi aşağıdaki "code_item" ile belirtilir.

type_list

class_def_item ve proto_id_item öğelerinden referans alınmıştır

Veriler bölümünde görünür.

Hizalama: 4 bayt

Ad Biçimi Açıklama
beden uint listenin giriş cinsinden boyutu
liste type_item[size] listenin öğeleri

type_item biçimi

Ad Biçimi Açıklama
type_idx ushort type_ids listesinde dizin

code_item

encoded_method tarafından referans verilen

Veriler bölümünde görünür.

Hizalama: 4 bayt

Ad Biçimi Açıklama
registers_size ushort Bu kod tarafından kullanılan kaydedici sayısı
ins_size ushort Bu kodun ait olduğu yönteme gelen bağımsız değişkenlerin kelime sayısı
outs_size ushort yöntem çağrısı için bu kod tarafından gereken çıkış bağımsız değişkeni alanının kelime sayısı
tries_size ushort Bu örnek için try_item sayısı. Sıfırdan farklıysa bu değerler, bu örnekte insns değerinin hemen ardından tries dizisi olarak görünür.
debug_info_off uint dosya başlangıcından bu kod için hata ayıklama bilgisine (satır numaraları + yerel değişken bilgisi) kadar olan ofset veya bilgi yoksa 0. Başlangıç değeri sıfırdan farklıysa data bölümündeki bir konuma yönlendirmelidir. Verilerin biçimi, aşağıdaki "debug_info_item" ile belirtilir.
insns_size uint talimat listesinin boyutu (16 bit kod birimi cinsinden)
insns ushort[insns_size] gerçek bayt kodu dizisi. insns dizisindeki kod biçimi, Dalvik bytecode adlı tamamlayıcı doküman tarafından belirtilir. Bu, ushort dizisi olarak tanımlanmış olsa da dört baytlık hizalamayı tercih eden bazı dahili yapılar olduğunu unutmayın. Ayrıca, bu işlem bir endian değişimli dosyada gerçekleşirse değişim yalnızca daha büyük dahili yapılarda değil, ayrı ushort örneklerde yapılır.
padding ushort (isteğe bağlı) = 0 tries dört baytlık hizalı hale getirmek için iki baytlık dolgu. Bu öğe yalnızca tries_size sıfırdan farklıysa ve insns_size tek sayıysa bulunur.
deneme try_item[tries_size] (isteğe bağlı) istisnaların kodun neresinde yakalandığını ve nasıl ele alınacağını belirten bir dizi. Dizideki öğeler, aralık içinde çakışmamalı ve düşükten yükseğe doğru adres sırasına göre olmalıdır. Bu öğe yalnızca tries_size sıfırdan farklıysa bulunur.
işleyiciler encoded_catch_handler_list (isteğe bağlı) Yakalama türlerinin ve ilişkili işleyici adreslerinin listelerinin listesini temsil eden baytlar. Her try_item, bu yapıda bayt bazında bir ofsete sahiptir. Bu öğe yalnızca tries_size sıfırdan farklıysa mevcuttur.

try_item biçimi

Ad Biçimi Açıklama
start_addr uint Bu girişin kapsadığı kod bloğunun başlangıç adresi. Adres, kapsanan ilk talimatın başına kadar olan 16 bitlik kod birimlerinin sayısıdır.
insn_count ushort Bu girişin kapsadığı 16 bit kod birimi sayısı. Kapsanan son kod birimi (dahil) start_addr + insn_count - 1.
handler_off ushort Bu girişin ilişkili encoded_catch_hander_list başlangıcından encoded_catch_handler sonuna kadar olan baytlık ofset. Bu, encoded_catch_handler başlangıcına göre bir ofset olmalıdır.

encoded_catch_handler_list biçimi

Ad Biçimi Açıklama
beden uleb128 Bu listenin giriş cinsinden boyutu
liste encoded_catch_handler[handlers_size] Doğrudan (ofset olarak değil) temsil edilen ve sırayla birleştirilen gerçek işleyici listeleri

encoded_catch_handler biçimi

Ad Biçimi Açıklama
beden sleb128 Bu listedeki yakalama türlerinin sayısı. Pozitif değilse bu, yakalama türlerinin sayısının negatif değeridir ve yakalamaların ardından her şeyi yakalayan bir işleyici gelir. Örneğin: 0 için size ifadesi, her şeyi yakalayan bir yakalama olduğunu ancak açıkça yazılmış yakalama olmadığını gösterir. 2 of 2, açıkça yazılmış iki yakalama olduğunu ve her şeyi yakalayan bir yakalama olmadığını gösterir.size size of -1 ise her şeye uyan bir yakalama ifadesiyle birlikte bir tane yazılmış yakalama ifadesi olduğu anlamına gelir.
işleyiciler encoded_type_addr_pair[abs(size)] abs(size) kodlanmış öğe akışı (her yakalanan tür için bir tane, türlerin test edilme sırasına göre).
catch_all_addr uleb128 (isteğe bağlı) Tümünü yakalama işleyicisinin bayt kodu adresi. Bu öğe yalnızca size pozitif değilse bulunur.

encoded_type_addr_pair biçimi

Ad Biçimi Açıklama
type_idx uleb128 yakalanacak istisna türü için type_ids listesinde dizin
addr uleb128 İlişkili istisna işleyicinin bayt kodu adresi

debug_info_item

code_item öğesinden referans verilen

Veriler bölümünde görünür.

Hizalama: yok (bayt hizalı)

Her debug_info_item, yorumlandığında bir code_item için konum tablosunu ve (potansiyel olarak) yerel değişken bilgilerini yayan, DWARF3'ten esinlenilmiş bir bayt kodlu durum makinesi tanımlar. Dize, değişken uzunlukta bir başlık (uzunluğu yöntem parametrelerinin sayısına bağlıdır) ile başlar, durum makinesi bayt kodlarıyla devam eder ve DBG_END_SEQUENCE baytıyla biter.

Durum makinesi beş kayıttan oluşur. address kaydedicisi, ilişkili insns_item'daki talimat ofsetini 16 bitlik kod birimlerinde temsil eder. address kaydedicisi, her debug_info dizisinin başında 0 ile başlar ve yalnızca tekdüze artmalıdır. line yazma kaydedicisi, durum makinesi tarafından yayınlanan bir sonraki konumlar tablosu girişiyle ilişkilendirilmesi gereken kaynak satır numarasını temsil eder. Sıralı üstbilgide başlatılır ve pozitif veya negatif yönde değişebilir ancak hiçbir zaman 1'ten az olmamalıdır. source_file yazma kaydedicisi, satır numarası girişlerinin atıfta bulunduğu kaynak dosyayı temsil eder. class_def_item bağımsız değişkeni, class_def_item içindeki source_file_idx değerine ayarlanır. Diğer iki değişken olan prologue_end ve epilogue_begin, oluşturulan bir sonraki konumun yöntem prologu mu yoksa epilogu mu olarak kabul edileceğini belirten boole işaretleridir (false olarak başlatılır). Durum makinesi, DBG_RESTART_LOCAL kodu için her kayıtta bulunan son yerel değişkenin adını ve türünü de izlemelidir.

Üstbilgi şu şekildedir:

Ad Biçimi Açıklama
line_start uleb128 durum makinesinin line yazmacısının başlangıç değeri. Gerçek bir pozisyon girişini temsil etmez.
parameters_size uleb128 Kodlanan parametre adlarının sayısı. Varsa örnek yönteminin this parametresi hariç, her yöntem parametresi için bir tane olmalıdır.
parameter_names uleb128p1[parameters_size] yöntem parametresi adının dize dizini. NO_INDEX kodlu bir değer, ilişkili parametre için ad kullanılamadığını gösterir. Tür tanımlayıcısı ve imzası, yöntem tanımlayıcısı ve imzasından anlaşılır.

Bayt kodu değerleri şunlardır:

Ad Değer Biçim Argümanlar Açıklama
DBG_END_SEQUENCE 0x00 (yok) code_item için hata ayıklama bilgileri sırasını sonlandırır
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff: Adres siciline eklenecek tutar Bir konum girişi yayınlamadan adres kaydını ilerletir.
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: satır kaydını değiştirecek tutar Bir konum girişi yayınlamadan satır kaydediciyi ilerletir.
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: yerel dizini içeren kayıt
name_idx: adın dize dizini
type_idx: türün tür dizini
mevcut adreste yerel bir değişken oluşturur. Değerin bilinmediğini belirtmek için name_idx veya type_idx yerine NO_INDEX kullanılabilir.
DBG_START_LOCAL_EXTENDED 0x04 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
uleb128p1 sig_idx
register_num: yerel dizini içeren kayıt
name_idx: adın dize dizini
type_idx: türün dize dizini
sig_idx: tür imzasının dize dizini
Mevcut adreste bir tür imzası olan yerel bir öğe tanıtır. name_idx, type_idx veya sig_idx değerlerinden biri, değerin bilinmediğini belirtmek için NO_INDEX olabilir. (Ancak sig_idx -1 ise aynı veriler DBG_START_LOCAL kod komutu kullanılarak daha verimli bir şekilde temsil edilebilir.)

Not: İmzaları işlemeyle ilgili uyarılar için aşağıdaki "dalvik.annotation.Signature" bölümündeki tartışmaya bakın.

DBG_END_LOCAL 0x05 uleb128 register_num register_num: yerel içeren kayıt Şu anda etkin olan yerel bir değişkeni, geçerli adreste kapsam dışında olarak işaretler
DBG_RESTART_LOCAL 0x06 uleb128 register_num register_num: Yeniden başlatmak için kaydolun Mevcut adreste yerel bir değişkeni yeniden tanıtır. Ad ve tür, belirtilen kayıt defterinde etkin olan son yerel kayıtla aynıdır.
DBG_SET_PROLOGUE_END 0x07 (yok) prologue_end durum makinesi kaydını ayarlayarak, eklenen sonraki konum girişinin bir yöntem prologunun (yöntem kesme noktası için uygun bir yer) sonu olarak kabul edilmesi gerektiğini belirtir. prologue_end kaydedicisi, herhangi bir özel (>= 0x0a) işlem kodu tarafından silinir.
DBG_SET_EPILOGUE_BEGIN 0x08 (yok) epilogue_begin durum makinesi kaydını ayarlayarak, eklenen sonraki konum girişinin bir yöntem epilogunun başlangıcı (yöntemden çıkmadan önce yürütmeyi askıya almak için uygun bir yer) olarak kabul edilmesi gerektiğini belirtir. epilogue_begin kaydedicisi, herhangi bir özel (>= 0x0a) işlem koduyla silinir.
DBG_SET_FILE 0x09 uleb128p1 name_idx name_idx: kaynak dosya adının dize dizini; bilinmiyorsa NO_INDEX code_item içinde belirtilen varsayılan ad yerine, sonraki tüm satır numarası girişlerinin bu kaynak dosya adını referans aldığını belirtir.
Özel İşlem Kodları 0x0a…0xff (yok) line ve address kaydedicilerini ileri götürür, bir konum girişi verir ve prologue_end ile epilogue_begin'ı temizler. Açıklama için aşağıya bakın.

Özel işlem kodları

0x0a ile 0xff arasında (dahil) değerlere sahip kod komutları hem line hem de address kaydedicilerini küçük bir miktarda hareket ettirir ve ardından yeni bir konum tablosu girişi yayınlar. Artışların formülü aşağıdaki gibidir:

DBG_FIRST_SPECIAL = 0x0a  // the smallest special opcode
DBG_LINE_BASE   = -4      // the smallest line number increment
DBG_LINE_RANGE  = 15      // the number of line increments represented

adjusted_opcode = opcode - DBG_FIRST_SPECIAL

line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE)
address += (adjusted_opcode / DBG_LINE_RANGE)

annotations_directory_item

class_def_item tarafından referans verilen

Veriler bölümünde görünür.

Hizalama: 4 bayt

Ad Biçimi Açıklama
class_annotations_off uint sınıfın doğrudan ek açıklamaları varsa dosyanın başlangıcından sınıfa yapılan ek açıklamalara kadar olan ofset veya sınıfta doğrudan ek açıklama yoksa 0. Başlangıç değeri sıfırdan farklıysa data bölümündeki bir konuma yönlendirmelidir. Verilerin biçimi aşağıdaki "annotation_set_item" ile belirtilir.
fields_size uint Bu öğe tarafından ek açıklama eklenmiş alanların sayısı
annotated_methods_size uint Bu öğe tarafından ek açıklama eklenmiş yöntemlerin sayısı
annotated_parameters_size uint Bu öğe tarafından ek açıklama eklenmiş yöntem parametresi listelerinin sayısı
field_annotations field_annotation[fields_size] (isteğe bağlı) ilişkili alan ek açıklamalarının listesi. Listenin öğeleri field_idx değerine göre artan düzende sıralanmış olmalıdır.
method_annotations method_annotation[methods_size] (isteğe bağlı) ilişkili yöntem ek açıklamalarının listesi. Listenin öğeleri method_idx değerine göre artan düzende sıralanmış olmalıdır.
parameter_annotations parameter_annotation[parameters_size] (isteğe bağlı) ilişkili yöntem parametresi ek açıklamalarının listesi. Listenin öğeleri method_idx değerine göre artan düzende sıralanmış olmalıdır.

Not: Tüm öğelerin field_id ve method_id örnekleri aynı tanımlama sınıfına referans vermelidir.

field_annotation biçimi

Ad Biçimi Açıklama
field_idx uint Açıklama yapılan alanın kimliği için field_ids listesinde dizin
annotations_off uint dosya başlangıcından alanın ek açıklamaları listesine kadar olan mesafedir. Başlangıç, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki "annotation_set_item" ile belirtilir.

method_annotation biçimi

Ad Biçimi Açıklama
method_idx uint Açıklama yapılan yöntemin kimliği için method_ids listesinde dizin
annotations_off uint dosya başlangıcından yöntemin ek açıklamaları listesine kadar olan mesafedir. Başlangıç, data bölümündeki bir konuma ayarlanmalıdır. Verilerin biçimi aşağıdaki "annotation_set_item" ile belirtilir.

parameter_annotation biçimi

Ad Biçimi Açıklama
method_idx uint Parametreleri ek açıklamaya tabi tutulan yöntemin kimliği için method_ids listesinde dizin
annotations_off uint dosya başlangıcından yöntem parametrelerinin ek açıklamaları listesine kadar olan mesafe. Başlangıç, data bölümündeki bir konuma ayarlanmalıdır. Verilerin biçimi aşağıdaki "annotation_set_ref_list" ile belirtilir.

annotation_set_ref_list

parameter_annotations_item kaynağından referans alınmıştır

Veriler bölümünde görünür.

Hizalama: 4 bayt

Ad Biçimi Açıklama
beden uint listenin giriş cinsinden boyutu
liste annotation_set_ref_item[size] listenin öğeleri

annotation_set_ref_item biçimi

Ad Biçimi Açıklama
annotations_off uint dosya başlangıcından referans verilen ek açıklama setine kadar olan ofset veya bu öğe için ek açıklama yoksa 0. Başlangıç değeri sıfırdan farklıysa data bölümündeki bir konuma yönlendirmelidir. Verilerin biçimi aşağıdaki "annotation_set_item" ile belirtilir.

annotation_set_item

annotations_directory_item, field_annotations_item, method_annotations_item ve annotation_set_ref_item öğelerinden referans alır.

Veriler bölümünde görünür.

Hizalama: 4 bayt

Ad Biçimi Açıklama
beden uint kümenin giriş cinsinden boyutu
girişler annotation_off_item[size] öğelerini içerir. Öğeler type_idx sütununa göre artan düzende sıralanmış olmalıdır.

annotation_off_item biçimi

Ad Biçimi Açıklama
annotation_off uint dosyanın başlangıcından bir ek açıklamaya kadar olan mesafe. Ofset, data bölümündeki bir konuma ait olmalıdır ve bu konumdaki verilerin biçimi aşağıdaki "annotation_item" ile belirtilir.

annotation_item

annotation_set_item öğesinden referans alınmıştır

Veriler bölümünde görünür.

Hizalama: yok (bayt hizalı)

Ad Biçimi Açıklama
görünürlük ubyte bu ek açıklamanın amaçlanan görünürlüğü (aşağıya bakın)
ek açıklama encoded_annotation Yukarıdaki "encoded_value kodlama" bölümündeki "encoded_annotation biçimi" bölümünde açıklanan biçimte kodlanmış ek açıklama içerikleri.

Görünürlük değerleri

annotation_item içindeki visibility alanı için seçenekler şunlardır:

Ad Değer Açıklama
VISIBILITY_BUILD 0x00 Yalnızca derleme zamanında (ör. diğer kodun derlenmesi sırasında) görünmesi amaçlanan
VISIBILITY_RUNTIME 0x01 çalışma zamanında görünmesi amaçlanan
VISIBILITY_SYSTEM 0x02 Çalışma zamanında görünmesi amaçlanmasına rağmen yalnızca temel sistem tarafından görülebilen (normal kullanıcı kodu tarafından görülemeyen)

encoded_array_item

class_def_item tarafından referans verilen

Veriler bölümünde görünür.

Hizalama: yok (bayt hizalı)

Ad Biçimi Açıklama
değer encoded_array Yukarıdaki "encoded_value Kodlama" bölümündeki "encoded_array

hiddenapi_class_data_item

Bu bölümde, her sınıfın kullandığı kısıtlanmış arayüzlere ilişkin veriler yer alır.

Not: Gizli API özelliği Android 10.0'da kullanıma sunulmuştur ve yalnızca önyükleme sınıfı yolundaki sınıfların DEX dosyaları için geçerlidir. Aşağıda açıklanan işaretlerin listesi, Android'in gelecekteki sürümlerinde genişletilebilir. Daha fazla bilgi için SDK olmayan arayüzlerdeki kısıtlamalar bölümüne bakın.

Ad Biçimi Açıklama
beden uint bölümün toplam boyutu
ofsetler uint[] class_idx tarafından dizine eklenen bir uzaklık dizisi. class_idx dizininde sıfır dizi girişi, bu class_idx için veri olmadığı veya tüm gizli API işaretlerinin sıfır olduğu anlamına gelir. Aksi takdirde dizi girişi sıfırdan farklıdır ve bölümün başından bu class_idx için gizli API işaretleri dizisine kadar olan bir ofset içerir.
flags uleb128[] her sınıf için gizli API işaretlerinin birleştirilmiş dizileri. Olası işaret değerleri aşağıdaki tabloda açıklanmıştır. İşaretler, sınıf verilerindeki alanlar ve yöntemlerle aynı sırada kodlanır.

Kısıtlama işareti türleri:

Ad Değer Açıklama
beyaz liste 0 Resmi olarak belgelenmiş Android çerçevesinin Paket Dizini kapsamında özgürce kullanılabilen ve desteklenen arayüzler.
gri liste 1 Uygulamanın hedef API düzeyinden bağımsız olarak kullanılabilen SDK dışı arayüzler.
kara listeye al 2 Uygulamanın hedef API düzeyinden bağımsız olarak kullanılamayan SDK dışı arayüzler. Bu arayüzlerden birine erişmek çalışma zamanı hatasına neden olur.
greylist‑max‑o 3 Kısıtlanmadığı sürece Android 8.x ve önceki sürümlerde kullanılabilen SDK dışı arayüzler.
greylist‑max‑p 4 Kısıtlanmadığı sürece Android 9.x için kullanılabilen SDK dışı arayüzler.
greylist‑max‑q 5 Kısıtlanmadığı sürece Android 10.x için kullanılabilen SDK dışı arayüzler.
greylist‑max‑r 6 Kısıtlanmadığı sürece Android 11.x için kullanılabilen SDK dışı arayüzler.

Sistem ek açıklamaları

Sistem ek açıklamaları, sınıflar (ve yöntemler ve alanlar) hakkında çeşitli yansıtıcı bilgi parçalarını temsil etmek için kullanılır. Bu bilgilere genellikle yalnızca istemci (sistem dışı) kodu tarafından dolaylı olarak erişilir.

Sistem ek açıklamaları, .dex dosyalarında görünürlüğü VISIBILITY_SYSTEM olarak ayarlanmış ek açıklamalar olarak gösterilir.

dalvik.annotation.AnnotationDefault

Ek açıklama arayüzlerindeki yöntemlerde görünür.

Varsayılan bağlamaları belirtmek isteyen her ek açıklama arayüzüne bir AnnotationDefault ek açıklaması eklenir.

Ad Biçimi Açıklama
değer Ek Açıklama Bu ek açıklamanın varsayılan bağlamaları (bu türde bir ek açıklama olarak temsil edilir). Ek açıklamanın, ek açıklama tarafından tanımlanan tüm adları içermesi gerekmez. Eksik adlar için varsayılan değer atanmaz.

dalvik.annotation.EnclosingClass

Sınıflarda gösterilir

Her sınıfa, başka bir sınıfın üyesi olarak tanımlanan veya anonim olan ancak bir yöntem gövdesinde tanımlanmayan (ör. sentetik bir iç sınıf) bir EnclosingClass ek açıklama eklenir. Bu ek açıklamaya sahip her sınıfta InnerClass ek açıklaması da olmalıdır. Ayrıca, bir sınıfta hem EnclosingClass hem de EnclosingMethod ek açıklaması bulunmamalıdır.

Ad Biçimi Açıklama
değer Sınıf Bu sınıfa en yakın söz dizimi kapsamına sahip sınıf

dalvik.annotation.EnclosingMethod

Sınıflarda gösterilir

Bir yöntem gövdesinde tanımlanan her sınıfa bir EnclosingMethod ek açıklama eklenir. Bu ek açıklamaya sahip her sınıfta InnerClass ek açıklaması da olmalıdır. Ayrıca, bir sınıfta hem EnclosingClass hem de EnclosingMethod ek açıklaması bulunmamalıdır.

Ad Biçimi Açıklama
değer Yöntem Bu sınıfın söz dizimi kapsamını en iyi şekilde belirleyen yöntem

dalvik.annotation.InnerClass

Sınıflarda gösterilir

Her sınıfa, başka bir sınıfın tanımının sözlük kapsamında tanımlanan bir InnerClass ek açıklama eklenir. Bu ek açıklamaya sahip tüm sınıflarda EnclosingClass veya EnclosingMethod ek açıklaması da olmalıdır.

Ad Biçimi Açıklama
ad Dize Bu sınıfın başlangıçta bildirilen basit adı (paket ön ekiyle birlikte değil). Bu sınıf anonimse ad null olur.
accessFlags int sınıfın başlangıçta bildirilen erişim işaretleri (kaynak dilin ve hedef sanal makinenin yürütme modelleri arasındaki uyuşmazlık nedeniyle etkili işaretlerden farklı olabilir)

dalvik.annotation.MemberClasses

Sınıflarda gösterilir

Her sınıfa, üye sınıfları açıklayan bir MemberClasses ek açıklama eklenir. (Üye sınıfı, adı olan doğrudan bir iç sınıftır.)

Ad Biçimi Açıklama
değer Sınıf[] üye sınıflarının dizisi

dalvik.annotation.MethodParameters

Yöntemlerde gösterilir

Not: Bu ek açıklama, Android 7.1'den sonra eklenmiştir. Bu sürüm, önceki Android sürümlerinde mevcut olsa bile yoksayılır.

MethodParameters ek açıklama isteğe bağlıdır ve parametre adları ve değiştiriciler gibi parametre meta verileri sağlamak için kullanılabilir.

Parametre meta verileri çalışma zamanında gerekli olmadığında ek açıklama, bir yöntemden veya oluşturucudan güvenli bir şekilde çıkarılabilir. java.lang.reflect.Parameter.isNamePresent(), bir parametrede meta verilerin bulunup bulunmadığını kontrol etmek için kullanılabilir ve bilgiler mevcut değilse java.lang.reflect.Parameter.getName() gibi ilişkili yansıtma yöntemleri çalışma zamanında varsayılan davranışa geri döner.

Parametre meta verileri, bir parametrenin sentetik olup olmadığını veya zorunlu olup olmadığını içerdiğinden derleyiciler, parametre meta verilerini dahil ederken enum gibi oluşturulan sınıflarla ilgili bilgileri de dahil etmelidir.

MethodParameters ek açıklamaları yalnızca yöntem parametrelerini açıklar. Bu nedenle derleyiciler, kod boyutu ve çalışma zamanı verimliliği için parametresi olmayan kurucular ve yöntemler için ek açıklamayı tamamen atlayabilir.

Aşağıda açıklanan diziler, yöntemle ilişkili method_id_item dex yapısıyla aynı boyutta olmalıdır. Aksi takdirde, çalışma zamanında bir java.lang.reflect.MalformedParametersException atılır.

Yani: method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size, names().length ve accessFlags().length ile aynı olmalıdır.

MethodParameters, kaynak kodda açıkça veya dolaylı olarak tanımlanmayanlar da dahil olmak üzere tüm resmi yöntem parametrelerini tanımladığından, dizilerin boyutu, yalnızca kaynak kodda tanımlanan açık parametrelere dayalı İmza veya diğer meta veri bilgilerinden farklı olabilir. MethodParameters, gerçek yöntem imzasında bulunmayan tür ek açıklama alıcı parametreleri hakkında herhangi bir bilgi de içermez.

Ad Biçimi Açıklama
isimler Dize[] İlişkili yöntemin resmi parametrelerinin adları. Dizi boş olmamalıdır ancak resmi parametre yoksa boş olmalıdır. Söz konusu dizinle ilişkili resmi parametrenin adı yoksa dizideki bir değer null olmalıdır.
Parametre adı dizeleri boşsa veya ".", ";', "[" veya "/" içeriyorsa çalışma zamanında bir java.lang.reflect.MalformedParametersException atılır.
accessFlags int[] İlişkili yöntemin resmi parametrelerinin erişim işaretleri. Dizi boş olmamalıdır ancak resmi parametre yoksa boş olmalıdır.
Değer, aşağıdaki değerleri içeren bir bit maskesidir:
  • 0x0010 : final, parametre nihai olarak tanımlandı
  • 0x1000 : sentetik, parametre derleyici tarafından tanıtıldı
  • 0x8000 : Zorunlu, parametre sentetiktir ancak dil spesifikasyonu tarafından da ima edilir
Bu kümenin dışında herhangi bir bit ayarlanırsa çalışma zamanında bir java.lang.reflect.MalformedParametersException atılır.

dalvik.annotation.Signature

Sınıflarda, alanlarda ve yöntemlerde gösterilir

type_id_item ile temsil edilebilenden daha karmaşık bir tür açısından tanımlanan her sınıfa, alana veya yönteme bir Signature ek açıklama eklenir. .dex biçimi, imzalar için biçimi tanımlamaz; yalnızca bir kaynak dilin semantiklerinin başarılı bir şekilde uygulanması için ihtiyaç duyduğu tüm imzaları temsil edebilmek amacıyla tasarlanmıştır. Bu nedenle, imzalar genellikle sanal makine uygulamaları tarafından ayrıştırılmaz (veya doğrulanmaz). İmzalar, daha üst düzey API'lere ve araçlara (ör. hata ayıklayıcılar) aktarılır. Bu nedenle, imzaların kullanımı, yalnızca geçerli imzalar alınacağı varsayımı yapılmadan yazılmalıdır. Böylece, söz dizimi açısından geçersiz bir imzayla karşılaşma olasılığına karşı kendinizi açıkça koruyabilirsiniz.

İmza dizelerinde çok fazla yinelenen içerik bulunduğundan Signature ek açıklama, yinelenen öğelerin doğal olarak aynı temel verilere atıfta bulunduğu ve imzanın dizindeki tüm dizelerin bir araya getirilmesi olarak kabul edildiği bir dize dizisi olarak tanımlanır. İmzaların ayrı dizelere nasıl ayrılacağıyla ilgili herhangi bir kural yoktur. Bu tamamen .dex dosyaları oluşturan araçlara bağlıdır.

Ad Biçimi Açıklama
değer Dize[] Birleştirilecek bir dize dizisi olarak bu sınıfın veya üyenin imzası

dalvik.annotation.Throws

Yöntemlerde gösterilir

Bir veya daha fazla istisna türü atacağı beyan edilen her yönteme bir Throws ek açıklama eklenir.

Ad Biçimi Açıklama
değer Sınıf[] oluşturulan istisna türü dizisi