Dalvik yürütülebilir biçimi

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

Türler kılavuzu

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

LEB128

LEB128 ("Little-Endian Base 128"), rastgele işaretli veya işaretsiz tam sayı miktarları için değişken uzunluklu bir kodlamadır. Biçim, DWARF3 spesifikasyonundan alınmıştır. LEB128, .dex dosyasında 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. Dizideki son bayt hariç her baytın en anlamlı biti ayarlanmıştır. Son baytın en anlamlı biti ise temizdir. Her baytın kalan yedi biti yük olur. İlk baytta miktarın en az anlamlı yedi biti, ikinci baytta sonraki yedi biti vb. yer alır. İşaretli bir LEB128 (sleb128) durumunda, dizideki son baytın en anlamlı yük bitine, son değeri oluşturmak için işaret uzatması uygulanır. İşaretsiz durumda (uleb128), açıkça gösterilmeyen tüm bitler 0 olarak yorumlanır.

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

Varyant uleb128p1, işaretli bir değeri temsil etmek için kullanılır. Burada gösterim, uleb128 olarak kodlanmış bir artı değeridir. Bu, -1 (alternatif olarak işaretsiz değer 0xffffffff olarak da düşünülebilir) kodlamasını tek bir bayt haline getirir ancak başka hiçbir negatif sayı için geçerli değildir. Bu, tam olarak temsil edilen sayının negatif olmayan veya -1 (ya da 0xffffffff) olması gerektiği ve başka hiçbir negatif değere izin verilmediği (veya büyük işaretsiz değerlerin gerekli olma ihtimalinin düşük olduğu) durumlarda kullanışlıdır.

Biçimlere ilişkin bazı örnekler:

Kodlanmış Sıra 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ıları listesi. Bunlar, bu dosya tarafından kullanılan tüm dizelerin tanımlayıcılarıdır.Bu dizeler, dahili adlandırma (ör. tür tanımlayıcıları) veya kod tarafından başvurulan sabit nesneler olarak kullanılır. Bu liste, UTF-16 kod noktası değerleri kullanılarak (yerel ayara duyarlı bir şekilde değil) dize içeriklerine göre sıralanmalı ve yinelenen girişler içermemelidir.
type_ids type_id_item[] tanımlayıcı listesi türü. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosyanın referans verdiği tüm türler (sınıflar, diziler veya temel türler) için tanımlayıcılardır. Bu liste string_id indeksine göre sıralanmalı ve yinelenen girişler içermemelidir.
proto_ids proto_id_item[] yöntem prototipi tanımlayıcıları listesi. Bunlar, bu dosyanın referans verdiği tüm prototiplerin tanımlayıcılarıdır. Bu liste, önce type_id dizinine göre dönüş türüne göre, ardından da bağımsız değişken listesine göre (sözlük sırasına göre, type_id dizinine göre sıralanmış bağımsız değişkenler) sıralanmalıdır. Listede yinelenen girişler bulunmamalıdır.
field_ids field_id_item[] alan tanımlayıcıları listesi. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosyanın referans verdiği tüm alanların tanımlayıcılarıdır. Bu liste sıralanmalıdır. Burada, tanımlayan tür (type_id dizinine göre) ana sıra, alan adı (string_id dizinine göre) ara sıra ve tür (type_id dizinine göre) küçük sıradır. Listede yinelenen girişler olmamalıdır.
method_ids method_id_item[] yöntem tanımlayıcıları listesi. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosyanın referans verdiği tüm yöntemlerin tanımlayıcılarıdır. Bu liste sıralanmalıdır. Burada, tanımlayan tür (type_id diziniyle) ana sıra, yöntem adı (string_id diziniyle) ara sıra ve yöntem prototipi (proto_id diziniyle) küçük sıradır. Listede yinelenen girişler bulunmamalıdır.
class_defs class_def_item[] sınıf tanımları listesi. Sınıflar, belirli bir sınıfın üst sınıfı ve uygulanan arayüzleri, referans sınıfından önce listede görünecek şekilde sıralanmalıdır. Ayrıca, aynı adlı sınıfın tanımının listede birden fazla kez görünmesi de geçersizdir.
call_site_ids call_site_id_item[] Site tanımlayıcıları listesini arayın. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosyanın referans verdiği tüm arama sitelerinin tanımlayıcılarıdır. Bu liste, call_site_off artan düzende sıralanmalıdır.
method_handles method_handle_item[] yöntem işleyicileri listesi. Dosyada tanımlanmış olsun veya olmasın, bu dosyanın referans verdiği tüm yöntem işleyicilerinin listesi. Bu liste sıralanmamıştır ve farklı yöntem işleme örneklerine mantıksal olarak karşılık gelecek yinelenen girişler içerebilir.
aktarma ubyte[] Yukarıda listelenen tablolarla ilgili tüm destek verilerini içeren veri alanı. Farklı öğelerin farklı hizalama koşulları vardır ve uygun hizalamayı sağlamak için gerekirse her öğeden önce 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ı kaldırılmış dosyalarda boştur ve çalışma zamanı uygulamaları bu bölümü uygun gördükleri şekilde kullanabilir.

Kapsayıcı biçimi

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

  • file_size, fiziksel dosyanın değil, mantıksal dosyanın boyutudur. Kapsayıcıdaki tüm mantıksal dosyaları yinelemek için kullanılabilir.
  • Mantıksal dex dosyaları, kapsayıcıdaki daha sonraki verileri (ancak daha önceki verileri değil) referans alabilir. Bu sayede dex dosyaları, aralarında dizeler gibi verileri paylaşabilir.
  • Tüm uzaklıklar fiziksel dosyaya göre belirlenir. Başlığa göre göreli bir uzaklık yok. Bu, ofsetli bölümlerin mantıksal dosyalar arasında paylaşılabilmesini sağlar.
  • Başlık, kapsayıcının sınırlarını açıklamak için iki yeni alan ekler. Bu, ek bir tutarlılık kontrolüdür ve kodun yeni biçime taşınmasını kolaylaştırır.
  • data_size ve data_off artık kullanılmıyor. 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ının başında görünmesi gereken baytların listesidir. Bu baytlar, dosyanın bu şekilde tanınması için gereklidir. Değer, belirli bozulma biçimlerinin tespit edilmesine yardımcı olmak için kasıtlı olarak yeni satır ("\n" veya 0x0a) ve boş bayt ("\0" veya 0x00) içeriyor. Değer ayrıca, biçim geliştikçe zaman içinde tekdüze şekilde artması beklenen üç ondalık basamaklı bir biçim sürüm numarasını da kodlar.

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

Not: Biçimin 041 sürümü için destek, Android 16 sürümüne eklenerek kapsayıcı biçimi desteklenmiştir.

Not: Biçimin 040 sürümü için destek, Android 10.0 sürümünde eklenmiş olup SimpleNames'te izin verilen karakterler kümesini genişletmiştir.

Not: Biçimin 039 sürümü için destek, iki yeni bayt kodu olan const-method-handle ve const-method-type'ı kullanıma sunan Android 9.0 sürümünde eklenmiştir. (Bunların her biri Bayt kodu kümesi özeti tablosunda açıklanmıştır.) Android 10'daki 039 sürümü, DEX dosya biçimini genişleterek yalnızca önyükleme sınıfı yolundaki DEX dosyaları için geçerli olan gizli API bilgilerini de içerir.

Not: Biçimin 038 sürümü için destek, Android 8.0 sürümünde eklenmiştir. Sürüm 038, yeni bayt kodları (invoke-polymorphic ve invoke-custom) ve yöntem işleyicileri için veriler ekledi.

Not: Biçimin 037 sürümü için destek, Android 7.0 sürümünde eklenmiştir. Android'in 037 sürümünden önceki çoğu sürümde biçimin 035 sürümü kullanılıyordu. 035 ve 037 sürümleri arasındaki tek fark, varsayılan yöntemlerin eklenmesi ve invoke ayarının yapılmasıdır.

Not: Biçimin en az birkaç önceki sürümü, herkese açık olarak sunulan yazılımlarda yaygın şekilde kullanılmıştır. Örneğin, Android platformunun M3 sürümlerinde (Kasım-Aralık 2007) 009 sürümü, Android platformunun M5 sürümlerinde (Şubat-Mart 2008) ise 013 sürümü kullanılmıştır. Biçimin bu önceki sürümleri, bu belgede açıklanan sürümden birçok açıdan önemli ölçüde farklıdır.

ENDIAN_CONSTANT ve REVERSE_ENDIAN_CONSTANT

header_item öğesine yerleştirilmiş

ENDIAN_CONSTANT sabiti, bulunduğu dosyanın endianness'ini belirtmek için kullanılır. Standart .dex biçimi little-endian olsa da uygulamalar bayt değişimi yapmayı tercih edebilir. Bir uygulama, ENDIAN_CONSTANT yerine endian_tag değeri REVERSE_ENDIAN_CONSTANT olan bir başlıkla karşılaşırsa dosyanın beklenen biçimden bayt değiştirilmiş olduğunu anlar.

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

NO_INDEX

class_def_item ve debug_info_item öğelerine yerleştirilmiş

NO_INDEX sabiti, bir dizin değerinin olmadığını belirtmek için kullanılır.

Not: Bu değer, aslında genellikle geçerli bir dizin olduğundan 0 olarak tanımlanmamıştır.

NO_INDEX için seçilen değer, uleb128p1 kodlamasında tek bir bayt olarak gösterilebilir.

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

access_flags tanımları

class_def_item, encoded_field, encoded_method ve InnerClass'a yerleştirilmiş

Bu işaretlerin bit alanları, sınıfların ve sınıf üyelerinin erişilebilirlik 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 İç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ıfa görünür 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şturulmamış static: global to defining class static: this bağımsız değişkenini almıyor
ACC_FINAL 0x10 final: alt sınıf oluşturulamaz final: oluşturulduktan sonra değiştirilemez final: geçersiz kılınamaz
ACC_SYNCHRONIZED 0x20     synchronized: Bu yönteme yapılan çağrı sırasında ilişkili kilit otomatik olarak edinilir.

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

ACC_VOLATILE 0x40   volatile: ileti dizisi güvenliğine yardımcı olacak özel erişim kuralları  
ACC_BRIDGE 0x40     Derleyici tarafından tür güvenli bir köprü olarak otomatik olarak eklenen köprü yöntemi
ACC_TRANSIENT 0x80   transient: varsayılan serileştirme ile kaydedilmez  
ACC_VARARGS 0x80     Son bağımsız değişken, derleyici tarafından "rest" bağımsız değişkeni olarak değerlendirilmelidir.
ACC_NATIVE 0x100     native: yerel kodda uygulanır
ACC_INTERFACE 0x200 interface: birden çok kez 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 nokta aritmetiği için katı kurallar
ACC_SYNTHETIC 0x1000 kaynak kodunda doğrudan tanımlanmamış kaynak kodunda doğrudan tanımlanmamış kaynak kodunda doğrudan tanımlanmamış
ACC_ANNOTATION 0x2000 açıklama sınıfı olarak tanımlanmış    
ACC_ENUM 0x4000 numaralandırılmış tür olarak tanımlanmış numaralandırılmış değer olarak beyan edilmişse  
(kullanılmıyor) 0x8000      
ACC_CONSTRUCTOR 0x10000     oluşturucu yöntemi (sınıf veya örnek başlatıcı)
ACC_DECLARED_
SYNCHRONIZED
0x20000     synchronized öğesini tanımladıysanız

Not: Bunun, yürütme üzerinde (bu işaretin yansıması dışında) hiçbir etkisi yoktur.

* Yalnızca InnerClass ek açıklamalarında izin verilir. class_def_item içinde hiçbir zaman bulunmamalıdır.

Değiştirilmiş UTF-8 kodlaması

Eski sistemlerde daha kolay destek sağlamak için .dex biçimi, dize verilerini fiili bir standart olan değiştirilmiş UTF-8 biçiminde kodlar. Bu biçime bundan sonra MUTF-8 olarak atıfta bulunulacaktır. Bu form, aşağıdakiler hariç 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ış bir değer olarak gösterilen bir yedek çift olarak kodlanır.
  • U+0000 kod noktası iki baytlık biçimde kodlanır.
  • Düz bir boş bayt (değer 0), standart C dili yorumlamasında olduğu gibi 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, kod noktasının U+0000 bir dizeye dahil edilmesini ve C tarzı null ile sonlandırılmış bir dize olarak işlenmesini aynı anda mümkün kılar.

Ancak U+0000 özel kodlaması nedeniyle, normal UTF-8'den farklı olarak, bir çift MUTF-8 dizesinde standart C işlevinin strcmp() çağrılmasının sonucu her zaman eşit olmayan dizelerin karşılaştırılmasının uygun şekilde imzalanmış sonucunu göstermez. Sıralama (yalnızca eşitlik değil) önemli olduğunda MUTF-8 dizelerini karşılaştırmanın en basit yolu, bunları karakter karakter kodunu çözmek ve çözülen değerleri karşılaştırmaktır. (Ancak daha akıllı uygulamalar da mümkündür.)

Karakter kodlama hakkında daha fazla bilgi için lütfen The Unicode Standard'ı inceleyin. MUTF-8, UTF-8'den ziyade (nispeten daha az bilinen) CESU-8 kodlamasına daha yakındır.

encoded_value kodlaması

annotation_element ve encoded_array_item öğelerine yerleştirilmiş

encoded_value, (neredeyse) rastgele hiyerarşik olarak yapılandırılmış verilerin kodlanmış bir parçasıdır. Kodlama hem kompakt hem de ayrıştırılması kolay olacak şekilde tasarlanmıştır.

Ad Biçimi Açıklama
(value_arg << 5) | value_type ubyte byte, hemen sonraki value türünü gösterir. Yüksek sıralı üç bit içinde isteğe bağlı bir açıklama argümanı bulunur. Çeşitli value tanımları için aşağıya bakın. Çoğu durumda value_arg, hemen sonraki value öğesinin bayt cinsinden uzunluğunu (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 endian'dı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 (yok; 0 olmalıdır) ubyte[1] işaretli tek 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şaret genişletilmiş
VALUE_CHAR 0x03 boyut - 1 (0…1) ubyte[size] işaretsiz iki baytlık tam sayı değeri, sıfırla genişletilmiş
VALUE_INT 0x04 size - 1 (0…3) ubyte[size] işaretli dört baytlık tam sayı değeri, işaret genişletilmiş
VALUE_LONG 0x06 boyut - 1 (0…7) ubyte[size] işaretli sekiz baytlık tam sayı değeri, işaret genişletilmiş
VALUE_FLOAT 0x10 size - 1 (0…3) ubyte[size] dört baytlık bit kalıbı, sağa doğru sıfırla genişletilmiş ve IEEE754 32 bitlik kayan nokta değeri olarak yorumlanmış
VALUE_DOUBLE 0x11 boyut - 1 (0…7) ubyte[size] sekiz baytlık bit deseni, sağa doğru sıfırla genişletilmiş ve IEEE754 64 bitlik kayan nokta değeri olarak yorumlanmış
VALUE_METHOD_TYPE 0x15 size - 1 (0…3) ubyte[size] İşaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri, proto_ids bölümünde bir dizin olarak yorumlanır ve bir yöntem türü değerini temsil eder.
VALUE_METHOD_HANDLE 0x16 size - 1 (0…3) ubyte[size] method_handles bölümünde bir dizin olarak yorumlanan ve yöntem işleyici değerini temsil eden, işaretsiz (sıfırla genişletilmiş) dört baytlık tam sayı değeri.
VALUE_STRING 0x17 size - 1 (0…3) ubyte[size] string_ids bölümünde dizin olarak yorumlanan ve dize değerini temsil eden, işaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri.
VALUE_TYPE 0x18 size - 1 (0…3) ubyte[size] type_ids bölümünde bir dizin olarak yorumlanan ve yansıtıcı bir tür/sınıf değerini temsil eden, işaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri
VALUE_FIELD 0x19 size - 1 (0…3) ubyte[size] field_ids bölümünde dizin olarak yorumlanan ve yansıtıcı bir alan değerini temsil eden, işaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri
VALUE_METHOD 0x1a size - 1 (0…3) ubyte[size] İşaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri, method_ids bölümünde bir dizin olarak yorumlanır ve yansıtıcı bir yöntem değerini temsil eder.
VALUE_ENUM 0x1b size - 1 (0…3) ubyte[size] field_ids bölümünde dizin olarak yorumlanan ve numaralandırılmış türdeki bir sabitin değerini temsil eden, işaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri
VALUE_ARRAY 0x1c (yok; 0 olmalıdır) encoded_array Aşağıdaki "encoded_array biçimi" ile belirtilen biçimde bir değer dizisi. value boyutunun şifrelemede örtülü olarak belirtilmesi gerekir.
VALUE_ANNOTATION 0x1d (yok; 0 olmalıdır) encoded_annotation Aşağıdaki "encoded_annotation biçimi" ile belirtilen biçimde bir alt açıklama. value boyutunun şifrelemede örtülü olarak belirtilmesi gerekir.
VALUE_NULL 0x1e (yok; 0 olmalıdır) (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 gösterilir.

encoded_array biçimi

Ad Biçimi Açıklama
size uleb128 dizideki öğe sayısı
değerler encoded_value[size] Bu bölümde belirtilen biçimde, sırayla birleştirilmiş bir dizi size encoded_value baytlık sıra.

encoded_annotation biçimi

Ad Biçimi Açıklama
type_idx uleb128 ek açıklamanın türü. Bu bir sınıf (dizi veya ilkel değil) türü olmalıdır.
size uleb128 Bu ek açıklamada bulunan ad-değer eşlemelerinin sayısı
öğeler annotation_element[size] açıklama öğeleri doğrudan satır içinde (kaydırma olarak değil) gösterilir. Öğeler, string_id dizinine göre artan sırada sıralanmalıdır.

annotation_element biçimi

Ad Biçimi Açıklama
name_idx uleb128 string_ids bölümünde dizin olarak gösterilen öğe adı. Dize, yukarıda tanımlanan MemberName söz dizimine uygun olmalıdır.
değer encoded_value öğe değeri

Dize söz dizimi

.dex dosyasında, nihayetinde bir dizeye atıfta bulunan çeşitli öğe türleri vardır. Aşağıdaki BNF tarzı tanımlar, bu dizeler için kabul edilebilir söz dizimini gösterir.

SimpleName

SimpleName, diğer şeylerin adlarının söz diziminin temelini oluşturur. .dex biçimi, bu konuda oldukça fazla esneklik sunar (en yaygın kaynak dillerden çok daha fazla). Kısaca, basit bir ad; herhangi bir düşük ASCII alfabesi karakteri veya rakamı, birkaç belirli düşük ASCII sembolü ve kontrol, boşluk ya da özel karakter olmayan çoğu ASCII dışı kod noktasından oluşur. 040 sürümünden itibaren biçim, boşluk karakterlerine (Unicode Zs kategorisi) de izin vermektedir. Vekil kod noktalarının (U+d800U+dfff aralığında) geçerli ad karakterleri olarak kabul edilmediğini, ancak Unicode ek karakterlerinin geçerli olduğunu (SimpleNameChar kuralının son alternatifiyle temsil edilir) ve MUTF-8 kodlamasında vekil kod noktaları çiftleri olarak bir dosyada temsil edilmesi gerektiğini unutmayın.

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

MemberName

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.

MemberName
SimpleName
| '<' SimpleName '>'

FullClassName

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

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(SimpleName '/')*

TypeDescriptor

type_id_item tarafından kullanılıyor

TypeDescriptor, ilkel türler, sınıflar, diziler ve void dahil olmak üzere herhangi bir türün gösterimidir. Çeşitli sürümlerin anlamı için aşağıya bakın.

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ıyor

ShortyDescriptor, çeşitli referans (sınıf veya dizi) türleri arasında ayrım yapılmaması dışında, dönüş ve parametre türleri de dahil olmak üzere bir yöntem prototipinin kısa biçimli gösterimidir. Bunun yerine, tüm referans türleri tek bir 'L' karakteriyle gösterilir.

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

TypeDescriptor anlamı

TypeDescriptor'ın her bir varyantının anlamı aşağıda verilmiştir.

Sözdizimi Anlamı
V void; yalnızca dönüş türleri için geçerlidir
Z boolean
B byte
G short
C char
I int
J long
F float
D double
Lfully/qualified/Name; sınıf fully.qualified.Name
[descriptor descriptor dizisi. 255'ten fazla boyutun olması geçersiz olsa da dizi dizileri için yinelemeli olarak kullanılabilir.

Öğeler ve ilgili yapılar

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

header_item

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

Eşleşme: 4 bayt

Ad Biçimi Açıklama
sihir ubyte[8] = DEX_FILE_MAGIC sihirli değer. 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ç) adler32 sağlama toplamı; dosya bozulmasını tespit etmek için kullanılır.
signature ubyte[20] Dosyanın geri kalanının (magic, checksum ve bu alan hariç) SHA-1 imzası (karması); dosyaları benzersiz şekilde tanımlamak için kullanılır.
file_size uint

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

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

header_size uint

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

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" başlıklı tartışmaya bakın.
link_size uint bağlantı bölümünün boyutu veya bu dosya statik olarak bağlanmamışsa 0
link_off uint dosyanın başlangıcından bağlantı bölümüne olan uzaklık veya 0 ise link_size == 0. Sıfır olmayan başlangıç, link_data bölümündeki bir başlangıç olmalıdır. Bu belgede, işaret edilen verilerin biçimi belirtilmemiştir. Bu başlık alanı (ve önceki), çalışma zamanı uygulamaları tarafından kullanılmak üzere kancalar olarak bırakılmıştır.
map_off uint Dosyanın başlangıcından harita öğesine kadar olan uzaklık. Sıfır olmayan bir uzaklık, data bölümündeki bir uzaklığa olmalıdır ve veriler, aşağıda "map_list" tarafından belirtilen biçimde olmalıdır.
string_ids_size uint Dize tanımlayıcıları listesindeki dizelerin sayısı
string_ids_off uint Dosyanın başlangıcından dize tanımlayıcıları listesine kadar olan uzaklık veya 0 string_ids_size == 0 ise (bu, kabul etmek gerekir ki garip bir uç durumdur). Sıfır olmayan bir ofset varsa string_ids bölümünün başlangıcına doğru olmalıdır.
type_ids_size uint Tür tanımlayıcıları listesindeki öğelerin sayısı (en fazla 65535)
type_ids_off uint Dosyanın başlangıcından tür tanımlayıcıları listesine kadar olan uzaklık veya 0 ise type_ids_size == 0 (açıkçası tuhaf bir uç durum). Sıfır olmayan bir ofset varsa type_ids bölümünün başlangıcına doğru olmalıdır.
proto_ids_size uint Prototip tanımlayıcılar listesindeki öğelerin sayısı (en fazla 65535)
proto_ids_off uint Dosyanın başlangıcından prototip tanımlayıcıları listesine kadar olan uzaklık veya 0 (açıkçası garip bir uç durum) ise proto_ids_size == 0. Sıfır olmayan bir ofset varsa proto_ids bölümünün başlangıcına doğru olmalıdır.
field_ids_size uint Alan tanımlayıcıları listesindeki öğelerin sayısı
field_ids_off uint Dosyanın başlangıcından alan tanımlayıcıları listesine kadar olan uzaklık veya 0 ise field_ids_size == 0. Sıfır olmayan bir ofset varsa field_ids bölümünün başlangıcına doğru olmalıdır.
method_ids_size uint Yöntem tanımlayıcıları listesindeki öğelerin sayısı
method_ids_off uint Dosyanın başlangıcından yöntem tanımlayıcıları listesine kadar olan uzaklık veya 0 ise method_ids_size == 0. Sıfır olmayan bir ofset varsa method_ids bölümünün başlangıcına doğru olmalıdır.
class_defs_size uint Sınıf tanımları listesindeki öğelerin sayısı
class_defs_off uint dosyanın başlangıcından sınıf tanımları listesine kadar olan uzaklık veya 0 ise class_defs_size == 0 (açıkçası garip bir uç durum). Sıfır olmayan bir ofset varsa class_defs bölümünün başlangıcına doğru olmalıdır.
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şlangıcına kadar olan uzaklık (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)

Diğer dex başlıkları ve verileri dahil olmak üzere dosyanın tamamının boyutu. (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şlangıcına kadar olan uzaklık. (v41 veya sonraki sürümler)

map_list

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

header_item öğesinden referans alınmıştır.

Eşleşme: 4 bayt

Bu, bir dosyanın tüm içeriğinin sıralı listesidir. header_item ile ilgili olarak bazı gereksiz bilgiler içerir ancak dosyanın tamamında yineleme yapmak için kolayca kullanılabilecek bir form olması amaçlanmıştır. Belirli bir tür, haritada en fazla bir kez görünebilir. Ancak, biçimin geri kalanında belirtilen kısıtlamalar dışında (ör. header bölümü önce, ardından string_ids bölümü görünmelidir) türlerin hangi sırada görünebileceği konusunda bir kısıtlama yoktur. Ayrıca, harita girişleri ilk ofsete göre sıralanmalı ve çakışmamalıdır.

Ad Biçimi Açıklama
size uint Listenin giriş sayısı 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 (kullanılmıyor)
size uint Belirtilen ofsette bulunacak öğe sayısının sayısı
telafi etmek uint dosyanın başlangıcından söz konusu öğelere kadar olan uzaklık

Tür 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 implicit; must parse
code_item TYPE_CODE_ITEM 0x2001 implicit; must parse
string_data_item TYPE_STRING_DATA_ITEM 0x2002 implicit; must parse
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 implicit; must parse
annotation_item TYPE_ANNOTATION_ITEM 0x2004 implicit; must parse
encoded_array_item TYPE_ENCODED_ARRAY_ITEM 0x2005 implicit; must parse
annotations_directory_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 implicit; must parse
hiddenapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 implicit; must parse

string_id_item

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

Eşleşme: 4 bayt

Ad Biçimi Açıklama
string_data_off uint Bu öğenin dize verileri için dosyanın başlangıcından itibaren olan uzaklık. Ofset, data bölümündeki bir konuma olmalı ve veriler, aşağıda "string_data_item" ile belirtilen biçimde olmalıdır. Ofset için hizalama şartı yoktur.

string_data_item

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

Hizalama: yok (bayt hizalı)

Ad Biçimi Açıklama
utf16_size uleb128 Bu dizenin UTF-16 kod birimlerindeki boyutu (birçok sistemde "dize uzunluğu" olarak bilinir). Yani bu, dizenin kodunun çözülmüş uzunluğudur. (Kodlanan uzunluk, 0 baytının konumuyla belirlenir.)
aktarma ubyte[] 0 değerinde bir baytla birlikte bir dizi MUTF-8 kod birimi (diğer adıyla sekizli, diğer adıyla bayt). Veri biçimiyle ilgili ayrıntılar ve tartışma için yukarıdaki "MUTF-8 (Değiştirilmiş UTF-8) Kodlaması" bölümüne bakın.

Not: UTF-16 yedek kod birimlerinin (yani U+d800U+dfff) (kodlanmış biçimi) tek başına veya Unicode'un UTF-16'ya normal kodlanmasına göre sırası bozulmuş şekilde yer aldığı bir dize kabul edilebilir. Gerekirse bu tür geçersiz kodlamaları reddetmek, daha üst düzeyde kullanılan dizelerin sorumluluğundadır.

type_id_item

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

Eşleşme: 4 bayt

Ad Biçimi Açıklama
descriptor_idx uint Bu türün açıklayıcı dizesi için string_ids listesinde dizin oluşturun. Dize, yukarıda tanımlanan TypeDescriptor söz dizimine uygun olmalıdır.

proto_id_item

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

Eşleşme: 4 bayt

Ad Biçimi Açıklama
shorty_idx uint Bu prototipin kısa içerik tanımlayıcı dizesi için string_ids listesinde dizin oluşturur. Dize, yukarıda tanımlanan ShortyDescriptor söz dizimine uygun olmalı ve bu öğenin dönüş türü ile parametrelerine karşılık gelmelidir.
return_type_idx uint Bu prototipin dönüş türü için type_ids listesinde dizin oluşturma
parameters_off uint Bu prototip için dosyanın başlangıcından parametre türleri listesine kadar olan uzaklık veya bu prototipte parametre yoksa 0. Sıfır olmayan bu ofset, data bölümünde olmalı ve buradaki veriler, aşağıda "type_list" tarafından belirtilen biçimde olmalıdır. Ayrıca, listede void türüne de atıfta bulunulmamalıdır.

field_id_item

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

Eşleşme: 4 bayt

Ad Biçimi Açıklama
class_idx ushort Bu alanın tanımlayıcısı için type_ids listesindeki dizin. Bu bir sınıf türü olmalı, dizi veya temel tür olmamalıdır.
type_idx ushort Bu alanın türü için type_ids listesindeki dizin
name_idx uint Bu alanın adı için string_ids listesinde dizin oluşturun. Dize, yukarıda tanımlanan MemberName söz dizimine uygun olmalıdır.

method_id_item

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

Eşleşme: 4 bayt

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

class_def_item

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

Eşleşme: 4 bayt

Ad Biçimi Açıklama
class_idx uint Bu sınıfın type_ids listesinde dizine eklenir. Bu bir sınıf türü olmalı, dizi veya temel tür olmamalıdır.
access_flags uint Sınıfın 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 listesinde dizin oluşturma veya bu sınıfın üst sınıfı yoksa (ör. Object gibi bir kök sınıftır) NO_INDEX sabit değeri. Varsa dizi veya temel tür değil, sınıf türü olmalıdır.
interfaces_off uint Dosyanın başlangıcından arayüzler listesine kadar olan uzaklık veya 0 arayüz yoksa. Bu ofset, data bölümünde olmalı ve buradaki veriler, aşağıda "type_list" ile belirtilen biçimde olmalıdır. Listenin her öğesi bir sınıf türü olmalıdır (dizi veya temel tür değil) ve yinelenen öğe olmamalıdır.
source_file_idx uint Bu sınıfın orijinal kaynağını (en azından çoğunu) içeren dosyanın adı için string_ids listesinde dizin oluşturun veya bu bilginin eksikliğini temsil etmek için NO_INDEX özel değerini kullanın. Belirli bir yöntemin debug_info_item bu kaynak dosyanın yerini alabilir ancak çoğu sınıfın yalnızca bir kaynak dosyasından gelmesi beklenir.
annotations_off uint Bu sınıf için dosyanın başlangıcından açıklama yapısına kadar olan uzaklık veya bu sınıfta açıklama yoksa 0. Sıfır olmayan bu uzaklık, data bölümünde olmalı ve buradaki veriler, aşağıda "annotations_directory_item" ile belirtilen biçimde olmalıdır. Ayrıca, tüm öğeler bu sınıfı tanımlayıcı olarak referans vermelidir.
class_data_off uint Dosyanın başlangıcından bu öğeyle ilişkili sınıf verilerine kadar olan uzaklık veya bu sınıf için sınıf verisi yoksa 0. (Örneğin, bu sınıf bir işaretleyici arayüzü ise bu durum geçerli olabilir.) Sıfır olmayan bir uzaklık varsa bu uzaklık data bölümünde olmalı ve buradaki veriler, aşağıda "class_data_item" ile belirtilen biçimde olmalıdır. Tüm öğeler, tanımlayıcı olarak bu sınıfa referans vermelidir.
static_values_off uint Dosyanın başlangıcından static alanlarının ilk değerleri listesine kadar olan uzaklık veya hiç yoksa 0 (ve tüm static alanları 0 veya null ile başlatılacaksa). Bu uzaklık data bölümünde olmalı ve buradaki veriler aşağıda "encoded_array_item" ile belirtilen biçimde olmalıdır. Dizinin boyutu, bu sınıf tarafından bildirilen static alanlarının sayısından büyük olmamalıdır ve öğeler, karşılık gelen field_list içinde bildirilenlerle aynı sırada static alanlarına karşılık gelmelidir. Her dizi öğesinin türü, karşılık gelen alanın belirtilen türüyle eşleşmelidir. Dizide static alan sayısından daha az öğe varsa 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

Eşleşme: 4 bayt

Ad Biçimi Açıklama
call_site_off uint Dosyanın başlangıcından çağrı sitesi tanımına kadar olan uzaklık. Ofset, veri bölümünde olmalı ve buradaki veriler aşağıdaki "call_site_item" tarafından belirtilen biçimde olmalıdır.

call_site_item

Veri 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'dır. İlk üç bağımsız değişken şunlardır:

  1. Önyükleme bağlayıcı yöntemini (VALUE_METHOD_HANDLE) temsil eden bir yöntem işleyici.
  2. Bootstrap bağlayıcının çözmesi 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, bootstrap bağlayıcı yöntemine aktarılan sabit değerlerdir. Bu bağımsız değişkenler, herhangi bir tür dönüşümü olmadan sırayla iletilir.

Bootstrap bağlayıcı yöntemini temsil eden yöntem işleyicisi, java.lang.invoke.CallSite dönüş 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ğerlerinden belirlenir.

method_handle_item

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

Eşleşme: 4 bayt

Ad Biçimi Açıklama
method_handle_type ushort yöntem tutma yerinin türü; aşağıdaki tabloya bakın
unused ushort (kullanılmıyor)
field_or_method_id ushort Yöntem işleyici 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 (kullanılmıyor)

Yöntem işleme türü kodları

Sabit Değer Açıklama
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 Yöntem işleyici, statik alan ayarlayıcıdır (erişimci).
METHOD_HANDLE_TYPE_STATIC_GET 0x01 Yöntem tutma yeri, statik alan alıcısıdır (erişimci).
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 Yöntem işleyici, bir örnek alan ayarlayıcısıdır (erişimci)
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 Yöntem işleyici, bir örnek alan alıcısıdır (erişimci).
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 Yöntem işleyici, statik yöntem çağırıcıdır
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 Yöntem işleyici, örnek yöntemi çağıran bir öğedir.
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 Yöntem işleyici, oluşturucu yöntemi çağırıcıdır
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 Yöntem işleyici, doğrudan yöntem çağırıcıdır
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 Yöntem tutacağı, arayüz yöntemi çağırıcıdır

class_data_item

class_def_item öğesinden referans alınmıştır.

Veri 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 alanlarının 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] Tanımlı statik alanlar, kodlanmış öğeler dizisi olarak gösterilir. Alanlar, field_idx sütununa göre artan düzende sıralanmalıdır.
instance_fields encoded_field[instance_fields_size] Tanımlanan örnek alanları, kodlanmış öğeler dizisi olarak gösterilir. Alanlar, field_idx sütununa göre artan düzende sıralanmalıdır.
direct_methods encoded_method[direct_methods_size] kodlanmış öğeler dizisi olarak gösterilen, tanımlanmış doğrudan (static, private veya oluşturucu) yöntemler. Yöntemler, method_idx sütununa göre artan düzende sıralanmalıdır.
virtual_methods encoded_method[virtual_methods_size] tanımlanan sanal (static, private veya oluşturucu olmayan) yöntemler, kodlanmış öğeler dizisi olarak gösterilir. 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 değerine göre artan düzende sıralanmalıdır. Sanal bir yöntemin method_idx, doğrudan bir yöntemle aynı olmamalıdır.

Not: Tüm öğelerin field_id ve method_id örnekleri aynı tanımlayıcı sınıfa referansta bulunmalıdır.

encoded_field biçimi

Ad Biçimi Açıklama
field_idx_diff uleb128 Bu alanın kimliği için field_ids listesindeki dizin (ad ve tanımlayıcıyı içerir), listedeki önceki öğenin dizininden fark olarak gösterilir. Bir listedeki ilk öğenin dizini doğrudan gösterilir.
access_flags uleb128 alanın 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 oluşturur (ad ve tanımlayıcıyı içerir). Bu, listedeki önceki öğenin dizininden fark olarak gösterilir. Bir listedeki ilk öğenin dizini doğrudan gösterilir.
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 Bu yöntem için dosyanın başlangıcından kod yapısına olan uzaklık veya bu yöntem abstract ya da native ise 0. Başlangıç, data bölümündeki bir konumda olmalıdır. Verilerin biçimi aşağıdaki "code_item" ile belirtilir.

type_list

class_def_item ve proto_id_item öğelerinden referans alınır.

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

Eşleşme: 4 bayt

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

type_item biçimi

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

code_item

encoded_method öğesinden referans alınmıştır.

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

Eşleşme: 4 bayt

Ad Biçimi Açıklama
registers_size ushort Bu kod tarafından kullanılan kayıt 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 Bu kodun yöntem çağrısı için gerektirdiği giden bağımsız değişken alanının kelime sayısı
tries_size ushort Bu örnek için try_item sayısı. Sıfır değilse bu öğeler, bu örnekte tries dizisi olarak insns öğesinden hemen sonra görünür.
debug_info_off uint Bu kod için dosyanın başlangıcından hata ayıklama bilgileri (satır numaraları + yerel değişken bilgileri) dizisine olan uzaklık veya bilgi yoksa 0. Sıfır olmayan bir ofset varsa data bölümündeki bir konuma gitmelidir. Verilerin biçimi, aşağıdaki "debug_info_item" ile belirtilir.
insns_size uint talimat listesinin boyutu (16 bitlik kod birimleriyle)
insns ushort[insns_size] bayt kodunun gerçek dizisi. insns dizisindeki kodun biçimi, Dalvik bytecode adlı yardımcı dokümanda belirtilir. Note that though this is defined as an array of ushort, there are some internal structures that prefer four-byte alignment. Ayrıca, bu durum endian değiştirilmiş bir dosyada söz konusuysa değiştirme yalnızca tek tek ushort örneklerinde yapılır ve daha büyük dahili yapılarda yapılmaz.
padding ushort (isteğe bağlı) = 0 tries dört baytlık hizalama için iki baytlık dolgu. Bu öğe yalnızca tries_size sıfır değilse ve insns_size tek sayıysa bulunur.
dener try_item[tries_size] (isteğe bağlı) Kodda istisnaların nerede yakalandığını ve nasıl ele alınacağını gösteren dizi. Dizinin öğeleri aralıkta çakışmamalı ve düşük adresten yüksek adrese doğru sıralanmalıdır. Bu öğe yalnızca tries_size sıfır değilse 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 uzaklığa sahiptir. into this structure. Bu öğe yalnızca tries_size sıfır değilse bulunur.

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şlangıcına kadar olan 16 bitlik kod birimlerinin sayısıdır.
insn_count ushort Bu girişin kapsadığı 16 bitlik kod birimi sayısı. Kapsanan son kod birimi start_addr + insn_count - 1.
handler_off ushort İlişkili encoded_catch_hander_list başlangıcından bu girişin encoded_catch_handler konumuna kadar olan bayt cinsinden uzaklık. Bu, bir encoded_catch_handler başlangıcına göre ofset olmalıdır.

encoded_catch_handler_list biçimi

Ad Biçimi Açıklama
size uleb128 Bu listenin giriş cinsinden boyutu
liste encoded_catch_handler[handlers_size] işleyici listelerinin gerçek listesi, doğrudan (ofset olarak değil) temsil edilir ve sırayla birleştirilir

encoded_catch_handler biçimi

Ad Biçimi Açıklama
size sleb128 Bu listedeki yakalama türlerinin sayısı. Pozitif olmayan bir değerse bu, yakalama türlerinin sayısının negatifi olur ve yakalamaların ardından genel bir işleyici gelir. Örneğin: 0 size, genel bir yakalama olduğu ancak açıkça yazılmış yakalamaların olmadığı anlamına gelir. size 2, açıkça yazılmış iki yakalama olduğu ve genel yakalama olmadığı anlamına gelir. size -1 ise genel yakalama ile birlikte yazılmış bir yakalama olduğu anlamına gelir.
işleyiciler encoded_type_addr_pair[abs(size)] Her yakalanan tür için bir tane olmak üzere, türlerin test edilmesi gereken sırayla abs(size) kodlu öğe akışı.
catch_all_addr uleb128 (isteğe bağlı) Tümünü yakalama işleyicisinin bayt kodu adresi. Bu öğe yalnızca size pozitif olmayan bir değerse 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 oluşturma
addr uleb128 ilişkilendirilmiş istisna işleyicinin bayt kodu adresi

debug_info_item

code_item öğesinden referans alınmıştır.

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

Hizalama: yok (bayt hizalı)

Her debug_info_item, yorumlandığında code_item için konumlar tablosunu ve (muhtemelen) yerel değişken bilgilerini yayan, DWARF3'ten esinlenilmiş bir bayt kodlu durum makinesi tanımlar. Sıra, değişken uzunlukta bir başlıkla (uzunluğu yöntem parametrelerinin sayısına bağlıdır) başlar, durum makinesi bayt kodlarıyla devam eder ve DBG_END_SEQUENCE baytıyla sona erer.

Durum makinesi beş kayıttan oluşur. address kaydı, 16 bitlik kod birimlerinde ilişkili insns_item içindeki talimat ofsetini temsil eder. address kaydı, her debug_info dizisinin başında 0 ile başlar ve yalnızca monoton bir şekilde artmalıdır. line kaydı, durum makinesi tarafından yayılan bir sonraki konum tablosu girişiyle hangi kaynak satır numarasının ilişkilendirilmesi gerektiğini gösterir. Sıra üstbilgisinde başlatılır ve pozitif veya negatif yönde değişebilir ancak asla 1 değerinden küçük olmamalıdır. source_file kaydı, satır numarası girişlerinin ifade ettiği kaynak dosyayı gösterir. class_def_item içindeki source_file_idx değerine eşit olacak şekilde başlatılır. Diğer iki değişken olan prologue_end ve epilogue_begin, bir sonraki konumun bir yöntem prologu veya epilogu olarak kabul edilip edilmeyeceğini belirten Boole işaretleridir (false olarak başlatılır). Durum makinesi, DBG_RESTART_LOCAL kodu için her kayıtta canlı olan son yerel değişkenin adını ve türünü de izlemelidir.

Üstbilgi aşağıdaki gibidir:

Ad Biçimi Açıklama
line_start uleb128 Durum makinesinin line kaydının başlangıç değeri. Gerçek bir pozisyon girişi değildir.
parameters_size uleb128 Kodlanan parametre adlarının sayısı. Her yöntem parametresi için bir tane olmalıdır (varsa örnek yöntemin this hariç).
parameter_names uleb128p1[parameters_size] Yöntem parametresi adının dize dizini. NO_INDEX kodlanmış değeri, ilişkili parametre için ad olmadığını gösterir. Tür tanımlayıcısı ve imza, yöntem tanımlayıcısı ve imzadan 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 bilgisi dizisini sonlandırır.
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff: adres kaydına eklenecek tutar konum girişi vermeden adres kaydını ilerletir
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: Satır kaydının değiştirileceği tutar Konum girişi vermeden satır kaydını ilerletir
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: yerel öğeleri 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 tanımlar. Değerin bilinmediğini belirtmek için name_idx veya type_idx NO_INDEX olabilir.
DBG_START_LOCAL_EXTENDED 0x04 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
uleb128p1 sig_idx
register_num: Yerel
değerini içerecek kayıt name_idx: Adın dize dizini
type_idx: Türün tür dizini
sig_idx: Tür imzasının dize dizini
Geçerli adreste tür imzası olan bir yerel değişken oluşturur. name_idx, type_idx veya sig_idx değerlerinden herhangi biri, değerin bilinmediğini belirtmek için NO_INDEX olabilir. (Ancak sig_idx -1 ise aynı veriler DBG_START_LOCAL işlem kodu kullanılarak daha verimli bir şekilde gösterilebilir.)

Not: İmzaların işlenmesiyle 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 bir yerel 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 geçerli adreste yerel bir değişkeni yeniden kullanıma sunar. Ad ve tür, belirtilen kayıt defterinde etkin olan son yerel ayarla aynıdır.
DBG_SET_PROLOGUE_END 0x07 (yok) prologue_end durum makinesi kaydını ayarlar. Bu, eklenen bir sonraki konum girişinin bir yöntem prologunun sonu olarak (yöntem kesme noktası için uygun bir yer) kabul edilmesi gerektiğini gösterir. prologue_end kaydı, herhangi bir özel (>= 0x0a) işlem koduyla temizlenir.
DBG_SET_EPILOGUE_BEGIN 0x08 (yok) epilogue_begin durum makinesi kaydını ayarlar. Bu kayıt, eklenen bir 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 kaydı, herhangi bir özel (>= 0x0a) işlem koduyla temizlenir.
DBG_SET_FILE 0x09 uleb128p1 name_idx name_idx: Kaynak dosya adının dize dizini; NO_INDEX bilinmiyorsa , sonraki tüm satır numarası girişlerinin code_item içinde belirtilen varsayılan ad yerine bu kaynak dosya adına referans verdiğini gösterir.
Özel İşlem Kodları 0x0a…0xff (yok) line ve address kayıtlarını ilerletir, 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 (dahil) arasındaki değerlere sahip işlem kodları, hem line hem de address kayıtlarını küçük bir miktarda hareket ettirir ve ardından yeni bir konum tablosu girişi yayar. Artışlarla ilgili 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 öğesinden referans alınmıştır.

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

Eşleşme: 4 bayt

Ad Biçimi Açıklama
class_annotations_off uint dosyanın başlangıcından doğrudan sınıfa yapılan açıklamalara kadar olan uzaklık veya 0 sınıfın doğrudan açıklaması yoksa. Sıfır olmayan bir ofset varsa bu, data bölümündeki bir konuma yönelik olmalıdır. Verilerin biçimi aşağıdaki "annotation_set_item" ile belirtilir.
fields_size uint Bu öğeyle açıklama eklenen alanların sayısı
annotated_methods_size uint Bu öğeyle açıklama eklenen yöntemlerin sayısı
annotated_parameters_size uint Bu öğe tarafından açıklama eklenen yöntem parametresi listelerinin sayısı
field_annotations field_annotation[fields_size] (isteğe bağlı) ilişkili alan açıklamalarının listesi. Listenin öğeleri, field_idx'ya göre artan düzende sıralanmalı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'ya göre artan düzende sıralanmalı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'ya göre artan düzende sıralanmalıdır.

Not: Tüm öğelerin field_id ve method_id örnekleri aynı tanımlayıcı sınıfa referansta bulunmalıdır.

field_annotation biçimi

Ad Biçimi Açıklama
field_idx uint Açıklama eklenen alanın kimliği için field_ids listesindeki dizin
annotations_off uint alanın açıklama listesi için dosyanın başlangıcından itibaren olan uzaklık. Başlangıç, data bölümündeki bir konumda 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 Notlandırılan yöntemin kimliği için method_ids listesinde dizin oluşturma
annotations_off uint Dosyanın başlangıcından yöntemin açıklama listesine kadar olan uzaklık. Başlangıç, data bölümündeki bir konumda olmalı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 açıklama eklenen yöntemin kimliği için method_ids listesindeki dizin
annotations_off uint dosyanın başlangıcından yöntem parametrelerinin ek açıklamaları listesine kadar olan uzaklık. Başlangıç, data bölümündeki bir konumda olmalıdır. Verilerin biçimi aşağıdaki "annotation_set_ref_list" ile belirtilir.

annotation_set_ref_list

parameter_annotations_item öğesinden referans alınmıştır.

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

Eşleşme: 4 bayt

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

annotation_set_ref_item biçimi

Ad Biçimi Açıklama
annotations_off uint Dosyanın başlangıcından referans verilen açıklama grubuna kadar olan uzaklık veya bu öğe için açıklama yoksa 0. Sıfır olmayan bir ofset varsa bu, data bölümündeki bir konuma yönelik olmalıdır. 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ınmıştır.

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

Eşleşme: 4 bayt

Ad Biçimi Açıklama
size uint kümenin giriş cinsinden boyutu
entries annotation_off_item[size] kümenin öğeleri. Öğeler, type_idx'ya göre artan düzende sıralanmalıdır.

annotation_off_item biçimi

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

annotation_item

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

Veri 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 kodlaması" bölümünde "encoded_annotation biçimi" ile açıklanan biçimde kodlanmış ek açıklama içerikleri.

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

visibility alanındaki seçenekler şunlardır: annotation_item:

Ad Değer Açıklama
VISIBILITY_BUILD 0x00 yalnızca derleme sırasında (ör. diğer kodların derlenmesi sırasında) görünür olması amaçlananlar
VISIBILITY_RUNTIME 0x01 çalışma zamanında görünür olması amaçlanmıştır
VISIBILITY_SYSTEM 0x02 Çalışma zamanında görünür olması amaçlanır ancak yalnızca temel sisteme (normal kullanıcı koduna değil)

encoded_array_item

class_def_item öğesinden referans alınmıştır.

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

Hizalama: yok (bayt hizalı)

Ad Biçimi Açıklama
değer encoded_array Yukarıdaki "encoded_array Kodlama" bölümündeki "encoded_value Biçim" ile belirtilen biçimde, kodlanmış dizi değerini temsil eden baytlar.

hiddenapi_class_data_item

Bu bölümde, her sınıf tarafından kullanılan kısıtlanmış arayüzlerle ilgili 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 başlıklı makaleyi inceleyin.

Ad Biçimi Açıklama
size uint bölümün toplam boyutu
telafi etme uint[] class_idx ile dizine eklenmiş uzaklık dizisi. class_idx dizinindeki 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ır değildir ve bölümün başlangıcından bu class_idx için gizli API işaretleri dizisine kadar olan bir ofseti 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, alanlarla aynı sırada kodlanır ve yöntemler sınıf verilerinde kodlanır.

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

Ad Değer Açıklama
beyaz liste 0 Resmi olarak belgelenmiş Android çerçevesi Paket Dizini'nin bir parçası olarak desteklenen ve serbestçe kullanılabilen 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ıkları sürece Android 8.x ve önceki sürümlerde kullanılabilen SDK dışı arayüzler.
greylist‑max‑p 4 Kısıtlanmadıkları sürece Android 9.x'te kullanılabilecek SDK olmayan arayüzler.
greylist‑max‑q 5 Kısıtlanmadığı sürece Android 10.x'te kullanılabilecek SDK dışı arayüzler.
greylist‑max‑r 6 Kısıtlanmadıkları sürece Android 11.x'te kullanılabilecek SDK olmayan arayüzler.

Sistem ek açıklamaları

Sistem açıklamaları, sınıflarla (ve yöntemler ve alanlarla) ilgili çeşitli yansıtıcı bilgileri göstermek için kullanılır. Bu bilgilere genellikle yalnızca istemci (sistem dışı) kodu tarafından dolaylı olarak erişilir.

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

dalvik.annotation.AnnotationDefault

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

Varsayılan bağlamaları belirtmek isteyen her bir AnnotationDefault ek açıklama arayüzüne 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 gösterilir. Açıklama, açıklama tarafından tanımlanan tüm adları içermeyebilir. Eksik adlar varsayılan değerlere sahip değildir.

dalvik.annotation.EnclosingClass

Sınıflarda görünme

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

Ad Biçimi Açıklama
değer Sınıf Bu sınıfı en yakından kapsayan sınıf

dalvik.annotation.EnclosingMethod

Sınıflarda görünme

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

Ad Biçimi Açıklama
değer Yöntem Bu sınıfı en yakından sözcüksel olarak kapsayan yöntem

dalvik.annotation.InnerClass

Sınıflarda görünme

Başka bir sınıfın tanımının sözcüksel kapsamı içinde tanımlanan her sınıfa InnerClass ek açıklaması eklenir. Bu ek açıklamaya sahip tüm sınıflarda ya EnclosingClass ek açıklaması ya da EnclosingMethod ek açıklaması olmalıdır.

Ad Biçimi Açıklama
ad Dize Bu sınıfın başlangıçta belirtilen basit adı (paket öneki içermez). Bu sınıf anonimse ad null olur.
accessFlags int sınıfın başlangıçta beyan edilen 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örünme

Üye sınıfları bildiren her sınıfa MemberClasses ek açıklaması 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

Göründüğü yöntemler

Not: Bu ek açıklama, Android 7.1'den sonra eklenmiştir. Bu özellik, önceki Android sürümlerinde yok sayılır.

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

Parametre meta verileri çalışma zamanında gerekli olmadığında açıklama, bir yöntemden veya oluşturucudan güvenli bir şekilde çıkarılabilir. java.lang.reflect.Parameter.isNamePresent(), bir parametre için meta verilerin mevcut olup olmadığını kontrol etmek üzere kullanılabilir. 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 eklerken numaralandırmalar gibi oluşturulan sınıflarla ilgili bilgileri de eklemelidir.

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

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

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ı olan İmza veya diğer meta veri bilgilerinden farklı olabilir. MethodParameters, gerçek yöntem imzasında bulunmayan tür ek açıklaması alıcı parametreleri hakkında herhangi bir bilgi de içermez.

Ad Biçimi Açıklama
adlar Dize[] İlişkili yöntemin resmi parametrelerinin adları. Dizi boş olmamalıdır ancak resmi parametre yoksa boş olmalıdır. Dizideki bir değer, bu dizine sahip resmi parametrenin adı yoksa null olmalıdır.
Parametre adı dizeleri boşsa veya ".", ";", "[" ya da "/" içeriyorsa çalışma zamanında java.lang.reflect.MalformedParametersException hatası verilir.
accessFlags int[] İlişkili yöntemin biçimsel parametrelerinin erişim işaretleri. Dizi boş olmamalıdır ancak resmi parametre yoksa boş olmalıdır.
Değer, aşağıdaki değerlere sahip bir bit maskesidir:
  • 0x0010 : final, parametre final olarak tanımlandı
  • 0x1000 : yapay, parametre derleyici tarafından kullanıma sunuldu
  • 0x8000 : zorunlu, parametre sentetik ancak dil spesifikasyonu tarafından da ima ediliyor
Bu kümenin dışında herhangi bir bit ayarlanırsa çalışma zamanında java.lang.reflect.MalformedParametersException istisnası oluşturulur.

dalvik.annotation.Signature

Sınıflarda, alanlarda ve yöntemlerde görünür.

Signature ile gösterilebilenden daha karmaşık bir tür açısından tanımlanan her sınıf, alan veya yönteme Signature ek açıklaması eklenir.type_id_item .dex biçimi, imzaların biçimini tanımlamaz. Yalnızca bir kaynak dilin semantiğinin başarılı bir şekilde uygulanması için gereken imzaları temsil etmek amacıyla kullanılı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, imza kullanımı yalnızca geçerli imzaların alınacağıyla ilgili herhangi bir varsayımda bulunmayacak şekilde yazılmalı ve söz dizimi açısından geçersiz bir imzayla karşılaşma olasılığına karşı açıkça korunmalıdır.

İmza dizeleri çok fazla yinelenen içeriğe sahip olma eğiliminde olduğundan, Signature ek açıklaması bir dize dizisi olarak tanımlanır. Yinelenen öğeler doğal olarak aynı temel verileri ifade eder ve imza, dizideki tüm dizelerin birleştirilmesi olarak kabul edilir. İmzaların ayrı dizelere nasıl ayrılacağıyla ilgili kurallar yoktur. Bu tamamen .dex dosyalarını oluşturan araçlara bağlıdır.

Ad Biçimi Açıklama
değer Dize[] Bu sınıfın veya üyenin imzası, birleştirilecek dizeler dizisi olarak

dalvik.annotation.Throws

Göründüğü yöntemler

Bir veya daha fazla istisna türü oluşturduğu belirtilen her yönteme Throws ek açıklaması eklenir.

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