Dalvik yürütülebilir formatı

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

Türlere ilişkin kılavuz

İsim Tanım
bayt 8 bit imzalı dahili
ubayt 8 bit imzasız int
kısa 16-bit imzalı int, küçük-endian
kısa 16-bit işaretsiz int, küçük-endian
int 32-bit imzalı int, küçük-endian
uint 32-bit imzasız int, küçük-endian
uzun 64-bit imzalı int, küçük-endian
uzun 64-bit işaretsiz int, küçük-endian
sleb128 LEB128 imzalı, değişken uzunluklu (aşağıya bakın)
uleb128 işaretsiz LEB128, değişken uzunluklu (aşağıya bakın)
uleb128p1 işaretsiz LEB128 plus 1 , değişken uzunluklu (aşağıya bakın)

LEB128

LEB128 (" L ittle- Endian B ase 128 "), keyfi işaretli veya işaretsiz tamsayı miktarları için değişken uzunluklu bir kodlamadır. Format DWARF3 spesifikasyonundan ödünç alınmıştır. Bir .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, dizideki en önemli biti açık olan son bayt dışında, en önemli bit seti vardır. Her baytın geri kalan yedi biti, miktarın en az önemli yedi biti ilk baytta, sonraki yedi biti ikinci baytta olacak şekilde yüktür. İmzalı bir LEB128 ( sleb128 ) durumunda, dizideki son baytın en önemli veri yükü biti, nihai değeri üretmek için işaretle 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 düzeyinde diyagramı
İlk bayt İkinci bayt
1 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 0 bit 13 bit 12 bit 11 bit 10 bit 9 bit 8 bit 7

uleb128p1 varyantı, işaretli bir değeri temsil etmek için kullanılır; burada temsil, uleb128 olarak kodlanan değer artı bir değerden oluşur. Bu, -1 kodlamasını (alternatif olarak işaretsiz değer 0xffffffff olarak da düşünülür) - ancak başka negatif sayı yok - tek bir bayt haline getirir ve temsil edilen sayının negatif olmaması veya -1 (veya 0xffffffff ) ve başka hiçbir negatif değere izin verilmeyen yerlerde (veya büyük işaretsiz değerlere ihtiyaç duyulmayacağı durumlarda).

İşte formatların bazı örnekleri:

Kodlanmış Sıra sleb128 olarak uleb128 olarak uleb128p1 olarak
00 0 0 -1
01 1 1 0
7f -1 127 126
80 7f -128 16256 16255

Dosya düzeni

İsim Biçim Tanım
başlık başlık_item başlık
string_ids string_id_item[] dize tanımlayıcıları listesi. Bunlar, bu dosya tarafından dahili adlandırma (örn. tür tanımlayıcılar) veya kod tarafından atıfta bulunulan sabit nesneler olarak kullanılan tüm dizelerin tanımlayıcılarıdır. Bu liste, UTF-16 kod noktası değerleri kullanılarak (yerel ayarlara duyarlı olmayan bir şekilde) dize içeriğine göre sıralanmalı ve yinelenen girişler içermemelidir.
type_ids type_id_item[] tür tanımlayıcıları listesi. Bunlar, dosyada tanımlı olsun veya olmasın, bu dosya tarafından atıfta bulunulan tüm türlerin (sınıflar, diziler veya temel türler) tanımlayıcılarıdır. Bu liste string_id indeksine göre sıralanmalı ve yinelenen girişler içermemelidir.
proto_ids proto_id_item[] yöntem prototip tanımlayıcıları listesi. Bunlar, bu dosyanın atıfta bulunduğu tüm prototiplerin tanımlayıcılarıdır. Bu listenin dönüş tipi ( type_id indeksine göre) ana sırasına göre ve ardından argüman listesine (sözlükbilimsel sıralama, type_id indeksine göre sıralanan bireysel argümanlar) göre sıralanması gerekir. Listede yinelenen girişler bulunmamalıdır.
alan_kimlikleri field_id_item[] alan tanımlayıcıları listesi. Bunlar, dosyada tanımlanmış olsun ya da olmasın, bu dosya tarafından başvurulan tüm alanların tanımlayıcılarıdır. Bu listenin, tanımlayıcı türün ( type_id indeksine göre) ana sıra, alan adının ( string_id indeksine göre) ara sıra ve türün ( type_id indeksine göre) alt sıra olduğu şekilde sıralanması gerekir. Listede yinelenen girişler bulunmamalıdır.
yöntem_idleri method_id_item[] yöntem tanımlayıcıları listesi. Bunlar, dosyada tanımlanmış olsun ya da olmasın, bu dosya tarafından atıfta bulunulan tüm yöntemlerin tanımlayıcılarıdır. Bu listenin, tanımlayıcı türün ( type_id indeksine göre) ana sıra, yöntem adının ( string_id indeksine göre) ara sıra ve yöntem prototipinin ( proto_id indeksine göre) küçük sıra olduğu şekilde sıralanması gerekir. 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 listede başvuran sınıftan önce görünecek şekilde sıralanmalıdır. Ayrıca aynı isimli sınıfa ait tanımın listede birden fazla yer alması geçersizdir.
call_site_ids call_site_id_item[] site tanımlayıcıları listesini çağırın. Bunlar, dosyada tanımlanmış olsun ya da olmasın, bu dosya tarafından atıfta bulunulan tüm çağrı sitelerinin tanımlayıcılarıdır. Bu listenin call_site_off göre artan düzende sıralanması gerekir.
metod_handles method_handle_item[] yöntem listeyi yönetir. Dosyada tanımlanmış olsun ya da olmasın, bu dosya tarafından başvurulan tüm yöntem tanıtıcılarının listesi. Bu liste sıralanmamıştır ve mantıksal olarak farklı yöntem tanıtıcı örneklerine karşılık gelecek kopyalar içerebilir.
veri ubayt[] Yukarıda listelenen tablolar için tüm destek verilerini içeren veri alanı. Farklı öğelerin farklı hizalama gereksinimleri vardır ve uygun hizalamayı sağlamak için gerekirse her öğenin önüne dolgu baytları eklenir.
bağlantı_verileri ubayt[] Statik olarak bağlantılı dosyalarda kullanılan veriler. Bu bölümdeki verilerin formatı bu belgede belirtilmemiştir. Bu bölüm bağlantısız dosyalarda boştur ve çalışma zamanı uygulamaları bunu uygun gördükleri şekilde kullanabilir.

Bit alanı, dize ve sabit tanımları

DEX_FILE_MAGIC

Header_item'e gömülü

DEX_FILE_MAGIC sabit dizisi/dizesi, bir .dex dosyasının bu şekilde tanınması için başında görünmesi gereken baytların listesidir. Değer, belirli yolsuzluk biçimlerinin tespit edilmesine yardımcı olmak amacıyla kasıtlı olarak bir yeni satır ( "\n" veya 0x0a ) ve bir boş bayt ( "\0" veya 0x00 ) içerir. Değer aynı zamanda format geliştikçe zaman içinde monoton bir şekilde artması beklenen üç ondalık basamaklı bir format sürüm numarasını da kodlar.

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

Not: Formatın 039 sürümüne yönelik destek, const-method-handle ve const-method-type üzere iki yeni bayt kodu sunan Android 9.0 sürümüne eklendi. (Bunların her biri Bayt kodu kümesi özeti tablosunda açıklanmıştır.) Android 10'da sürüm 039 , DEX dosya formatını yalnızca önyükleme sınıfı yolundaki DEX dosyaları için geçerli olan gizli API bilgilerini içerecek şekilde genişletir.

Not: Formatın 038 sürümüne yönelik destek, Android 8.0 sürümüne eklenmiştir. Sürüm 038 yeni bayt kodları ( invoke-polymorphic ve invoke-custom ) ve yöntem tanıtıcıları için veriler ekledi.

Not: Formatın 037 sürümü desteği Android 7.0 sürümüne eklenmiştir. Sürüm 037 önce Android'in çoğu sürümü, formatın 035 sürümünü kullanı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: Formatın en azından birkaç önceki sürümü, yaygın olarak bulunan kamuya açık 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 sürüm 013 kullanıldı. Formatın bu önceki sürümleri, birçok açıdan bu belgede açıklanan sürümden önemli ölçüde farklıdır.

ENDIAN_CONSTANT ve REVERSE_ENDIAN_CONSTANT

Header_item'e gömülü

ENDIAN_CONSTANT sabiti, bulunduğu dosyanın endianlığını belirtmek için kullanılır. Standart .dex formatı little-endian olmasına rağmen uygulamalar bayt değişimi gerçekleştirmeyi seçebilir. Bir uygulama, endian_tag ENDIAN_CONSTANT yerine REVERSE_ENDIAN_CONSTANT olan bir başlıkla karşılaşırsa, dosyanın beklenen formdan bayt değiştirildiğini bilir.

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

NO_INDEX

class_def_item ve debug_info_item'e gömülü

NO_INDEX sabiti bir indeks değerinin bulunmadığını belirtmek için kullanılır.

Not: Bu değer 0 olarak tanımlanmamıştır çünkü bu aslında genellikle geçerli bir dizindir.

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

erişim_flags tanımları

class_def_item, encoded_field, encoded_method ve InnerClass'a gömülüdür

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

İsim Değer Sınıflar için (ve InnerClass ek açıklamaları) Alanlar İçin Yöntemler için
ACC_PUBLIC 0x1 herkese public : her yerde görünür herkese public : her yerde görünür herkese public : her yerde görünür
ACC_PRIVATE 0x2 * private : yalnızca sınıfı tanımlayanlar tarafından görülebilir private : yalnızca sınıfı tanımlayanlar tarafından görülebilir private : yalnızca sınıfı tanımlayanlar 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ıştır static : sınıfı tanımlayana kadar global static : this argümanını almaz
ACC_FINAL 0x10 final : alt sınıflara ayrılamaz final : inşaattan sonra değişmez final : geçersiz kılınamaz
ACC_SYNCHRONIZED 0x20 synchronized : bu yönteme yapılan çağrı etrafında otomatik olarak elde edilen ilgili kilit.

Not: Bu yalnızca ACC_NATIVE aynı zamanda ayarlandığında ayarlamak için geçerlidir.

ACC_VOLATILE 0x40 volatile : iş parçacığı güvenliğine yardımcı olacak özel erişim kuralları
ACC_BRIDGE 0x40 derleyici tarafından tür açısından güvenli bir köprü olarak otomatik olarak eklenen köprü yöntemi
ACC_TRANSIENT 0x80 transient : varsayılan serileştirmeyle kaydedilmeyecek
ACC_VAARGS 0x80 son argüman derleyici tarafından "geri kalan" argüman olarak değerlendirilmelidir
ACC_NATIVE 0x100 native : yerel kodda uygulandı
ACC_INTERFACE 0x200 interface : çoklu-uygulanabilir soyut sınıf
ACC_ABSTRACT 0x400 abstract : doğrudan örneklenemez abstract : bu sınıf tarafından uygulanmadı
ACC_STRICT 0x800 strictfp : kayan nokta aritmetiği için katı kurallar
ACC_SENTETİK 0x1000 kaynak kodunda doğrudan tanımlanmadı kaynak kodunda doğrudan tanımlanmadı kaynak kodunda doğrudan tanımlanmadı
ACC_ANNOTATION 0x2000 ek açıklama sınıfı olarak bildirildi
ACC_ENUM 0x4000 numaralandırılmış bir tür olarak bildirildi numaralandırılmış bir değer olarak bildirildi
(kullanılmıyor) 0x8000
ACC_CONSTRUCTOR 0x10000 yapıcı yöntemi (sınıf veya örnek başlatıcı)
ACC_DECLARED_
SENKRONİZE
0x20000 synchronized bildirdi.

Not: Bunun yürütme üzerinde hiçbir etkisi yoktur (kendi başına bu bayrağın yansıması dışında).

* Yalnızca InnerClass ek açıklamaları için açık olmasına izin verilir ve hiçbir zaman class_def_item içinde açık olmamalıdır.

Değiştirilmiş UTF-8 kodlaması

Daha kolay eski desteğe verilen bir taviz olarak, .dex formatı, dize verilerini fiilen standart olarak değiştirilmiş bir UTF-8 formunda (bundan sonra MUTF-8 olarak anılacaktır) kodlar. Bu form, 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ış bir değer olarak temsil edilen bir yedek çift olarak kodlanır.
  • U+0000 kod noktası iki bayt biçiminde kodlanmıştır.
  • Düz bir boş bayt (değer 0 ), standart C dili yorumunda olduğu gibi bir dizenin sonunu belirtir.

Yukarıdaki ilk iki madde şu şekilde özetlenebilir: MUTF-8, Unicode karakterler için daha doğrudan bir kodlama formatı olmak yerine, UTF-16 için bir kodlama formatıdır.

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

Bununla birlikte, özel U+0000 kodlaması, normal UTF-8'den farklı olarak, bir MUTF-8 dize çifti üzerinde standart C işlevinin strcmp() çağrılması sonucunun, eşit olmayan dizelerin karşılaştırılmasında her zaman düzgün şekilde imzalanmış sonucu göstermediği anlamına gelir. . Sıralama (yalnızca eşitlik değil) söz konusu olduğunda, MUTF-8 dizelerini karşılaştırmanın en basit yolu, bunların kodunu karakter karakter çözmek ve kodu çözülmüş değerleri karşılaştırmaktır. (Ancak daha akıllı 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 (nispeten daha az bilinen) kodlama CESU-8'e UTF-8'den daha yakındır.

kodlanmış_değer kodlaması

annotation_element ve encoded_array_item'e gömülü

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

İsim Biçim Tanım
(value_arg << 5) | değer türü ubayt yüksek dereceli üç bitte isteğe bağlı açıklayıcı bir argümanla birlikte hemen sonraki value türünü belirten bayt. Çeşitli value tanımları için aşağıya bakın. Çoğu durumda, value_arg hemen sonraki value uzunluğunu bayt cinsinden kodlar; (size - 1) gibi; örneğin, 0 , değerin bir bayt gerektirdiği anlamına gelir ve 7 , sekiz bayt gerektirdiği anlamına gelir; ancak aşağıda belirtildiği gibi istisnalar da vardır.
değer ubayt[] değeri temsil eden baytlar, uzunlukları değişkendir ve farklı value_type baytları için farklı şekilde yorumlanırlar, 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 formatları

Adı yazın value_type value_arg Biçimi value Formatı Tanım
VALUE_BYTE 0x00 (yok; 0 olmalıdır) ubayt[1] imzalı bir baytlık tamsayı değeri
VALUE_SHORT 0x02 boyut - 1 (0…1) ubayt[boyut] imzalı iki baytlık tamsayı değeri, işaret genişletilmiş
VALUE_CHAR 0x03 boyut - 1 (0…1) ubayt[boyut] işaretsiz iki baytlık tam sayı değeri, sıfır genişletilmiş
VALUE_INT 0x04 boyut - 1 (0…3) ubayt[boyut] imzalı dört baytlık tamsayı değeri, işaret genişletilmiş
VALUE_LONG 0x06 boyut - 1 (0…7) ubayt[boyut] imzalı sekiz baytlık tamsayı değeri, işaret genişletilmiş
VALUE_FLOAT 0x10 boyut - 1 (0…3) ubayt[boyut] dört baytlık bit modeli, sağa doğru sıfır genişletilmiş ve IEEE754 32 bit kayan nokta değeri olarak yorumlanır
VALUE_DOUBLE 0x11 boyut - 1 (0…7) ubayt[boyut] sekiz baytlık bit modeli, sağa doğru sıfır genişletilmiş ve IEEE754 64 bit kayan nokta değeri olarak yorumlanır
VALUE_METHOD_TYPE 0x15 boyut - 1 (0…3) ubayt[boyut] imzasız (sıfır genişletilmiş) dört baytlık tam sayı 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 boyut - 1 (0…3) ubayt[boyut] işaretsiz (sıfır genişletilmiş) dört baytlık tam sayı değeri, method_handles bölümünde bir dizin olarak yorumlanır ve bir yöntem tanıtıcı değerini temsil eder
VALUE_STRING 0x17 boyut - 1 (0…3) ubayt[boyut] string_ids bölümünde bir dizin olarak yorumlanan ve bir dize değerini temsil eden işaretsiz (sıfır genişletilmiş) dört baytlık tamsayı değeri
DEĞER TÜRÜ 0x18 boyut - 1 (0…3) ubayt[boyut] 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ır genişletilmiş) dört baytlık tamsayı değeri
VALUE_FIELD 0x19 boyut - 1 (0…3) ubayt[boyut] işaretsiz (sıfır genişletilmiş) dört baytlık tam sayı değeri, field_ids bölümünde bir dizin olarak yorumlanır ve yansıtıcı bir alan değerini temsil eder
VALUE_METHOD 0x1a boyut - 1 (0…3) ubayt[boyut] işaretsiz (sıfır genişletilmiş) dört baytlık tam sayı 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 boyut - 1 (0…3) ubayt[boyut] işaretsiz (sıfır genişletilmiş) dört baytlık tam sayı değeri, field_ids bölümünde bir dizin olarak yorumlanır ve numaralandırılmış bir tür sabitinin değerini temsil eder
VALUE_ARRAY 0x1c (yok; 0 olmalı) kodlanmış_dizi aşağıda " encoded_array biçimi" ile belirtilen biçimde bir değerler dizisi. value boyutu kodlamada örtülüdür.
VALUE_ANNOTATION 0x1d (yok; 0 olmalı) kodlanmış_annotation aşağıda " encoded_annotation formatı" ile belirtilen formatta bir alt açıklama. value boyutu kodlamada örtülüdür.
VALUE_NULL 0x1e (yok; 0 olmalı) (hiçbiri) null referans değeri
VALUE_BOOLEAN 0x1f boole (0…1) (hiçbiri) bir bitlik değer; false için 0 , true için 1 . Bit, value_arg dosyasında temsil edilir.

kodlanmış_dizi biçimi

İsim Biçim Tanım
boyut uleb128 dizideki eleman sayısı
değerler kodlanmış_değer[boyut] bu bölümde belirtilen formatta, sırayla birleştirilmiş bir dizi size encoded_value bayt dizisi.

kodlanmış_açıklama biçimi

İsim Biçim Tanım
type_idx uleb128 ek açıklamanın türü. Bu bir sınıf (dizi veya ilkel değil) türü olmalıdır.
boyut uleb128 bu ek açıklamadaki ad-değer eşlemelerinin sayısı
elementler annotation_element[boyut] doğrudan satır içi olarak temsil edilen (ötelikler olarak değil) ek açıklamanın öğeleri. Öğeler string_id indeksine göre artan sırada sıralanmalıdır.

ek açıklama_öğesi biçimi

İsim Biçim Tanım
name_idx uleb128 string_ids bölümünde bir dizin olarak temsil edilen öğe adı. Dizenin yukarıda tanımlanan MemberName sözdizimine uyması gerekir.
değer kodlanmış_değer eleman değeri

Dize sözdizimi

Bir .dex dosyasında sonuçta 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özdizimini gösterir.

Basit Ad

SimpleName, diğer şeylerin adlarının sözdiziminin temelidir. .dex formatı burada oldukça geniş bir serbestliğe izin veriyor (çoğu yaygın kaynak dilden çok daha fazla). Kısaca, basit bir ad herhangi bir düşük ASCII alfabetik karakter veya rakamdan, birkaç belirli düşük ASCII sembolden ve kontrol, boşluk veya özel karakter olmayan çoğu ASCII olmayan kod noktasından oluşur. Sürüm 040 başlayarak format ayrıca boşluk karakterlerine de izin verir (Unicode Zs kategorisi). Yedek kod noktalarının ( U+d800U+dfff aralığında) geçerli ad karakterleri olarak kabul edilmediğini, ancak Unicode tamamlayıcı karakterlerin geçerli olduğunu (bunlar SimpleNameChar kuralının son alternatifiyle temsil edilir) ve bunların geçerli olduğunu unutmayın. MUTF-8 kodlamasında bir dosyada yedek kod noktası çiftleri olarak temsil edilmelidir.

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

Üye adı

field_id_item ve method_id_item tarafından kullanılır

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

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

TamSınıfAdı

FullClassName , isteğe bağlı bir paket belirtici ve ardından gerekli bir adı içeren tam olarak nitelenmiş bir sınıf adıdır.

TamSınıfAdı
İsteğe Bağlı PaketÖneki Basit Ad
İsteğe Bağlı Paket Öneki
( BasitAd '/' )*

Tür Tanımlayıcı

type_id_item tarafından kullanılıyor

TypeDescriptor, temel öğeler, sınıflar, diziler ve void dahil olmak üzere herhangi bir türün temsilidir. Çeşitli versiyonların anlamları için aşağıya bakın.

Tür Tanımlayıcı
'V'
| Alan Türü Tanımlayıcısı
FieldTypeDescriptor
NonArrayFieldTypeDescriptor
| ( '[' * 1…255) NonArrayFieldTypeDescriptor
NonArrayFieldTypeDescriptor
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L' TamSınıfAdı ';'

Kısa Tanımlayıcı

proto_id_item tarafından kullanılıyor

ShortyDescriptor, çeşitli referans (sınıf veya dizi) türleri arasında bir ayrım olmaması dışında, dönüş ve parametre türleri de dahil olmak üzere bir yöntem prototipinin kısa biçimli temsilidir. 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'

Tür Tanımlayıcı semantiği

Bu, TypeDescriptor değişkenlerinin her birinin anlamıdır.

Sözdizimi Anlam
V void ; yalnızca dönüş türleri için geçerlidir
Z boolean
B byte
S short
C char
BEN int
J long
F float
D double
L tam/nitelikli/İsim ; sınıf fully.qualified.Name
[ tanımlayıcı 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üm, bir .dex dosyasında görünebilecek üst düzey öğelerin her birine ilişkin tanımları içerir.

başlık_item

Başlık bölümünde görünür

Hizalama: 4 bayt

İsim Biçim Tanım
büyü ubayt[8] = DEX_FILE_MAGIC sihirli değer. Daha fazla ayrıntı için yukarıdaki " DEX_FILE_MAGIC " başlığı altındaki tartışmaya bakın.
sağlama toplamı uint dosyanın geri kalanının adler32 sağlama toplamı ( magic ve bu alan dışında her şey); dosya bozulmasını tespit etmek için kullanılır
imza ubayt[20] Dosyanın geri kalanının SHA-1 imzası (karma) ( magic , checksum ve bu alan dışındaki her şey); dosyaları benzersiz şekilde tanımlamak için kullanılır
Dosya boyutu uint bayt cinsinden tüm dosyanın boyutu (başlık dahil)
başlık_boyutu uint = 0x70 Bayt cinsinden başlığın boyutu (bu bölümün tamamı). Bu, formatı geçersiz kılmadan en azından sınırlı miktarda geriye/ileriye uyumluluğa izin verir.
endian_tag uint = ENDIAN_CONSTANT endianness etiketi. Daha fazla ayrıntı için yukarıdaki " ENDIAN_CONSTANT ve REVERSE_ENDIAN_CONSTANT " başlığı altındaki tartışmaya bakın.
bağlantı_boyutu uint bağlantı bölümünün boyutu veya bu dosya statik olarak bağlı değilse 0
bağlantı_kapalı uint dosyanın başlangıcından bağlantı bölümüne kadar uzaklık veya link_size == 0 ise 0 . Ofset, eğer sıfır değilse, link_data bölümündeki bir ofset olmalıdır. İşaret edilen verilerin formatı bu belgede belirtilmeden bırakılmıştır; bu başlık alanı (ve önceki), çalışma zamanı uygulamaları tarafından kullanılmak üzere kanca olarak bırakılmıştır.
harita_off uint dosyanın başlangıcından harita öğesine kadar uzaklık. Sıfırdan farklı olması gereken uzaklık, data bölümündeki uzaklığa göre olmalı ve veriler, aşağıda " map_list " ile belirtilen formatta 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 ofset veya string_ids_size == 0 ise 0 (kuşkusuz garip bir uç durum). Uzaklık sıfır değilse string_ids bölümünün başlangıcında 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 ofset veya type_ids_size == 0 ise 0 (kuşkusuz garip bir uç durum). Uzaklık sıfır değilse type_ids bölümünün başlangıcında 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 ofset veya proto_ids_size == 0 ise 0 (kuşkusuz garip bir uç durum). Uzaklık sıfır değilse proto_ids bölümünün başlangıcında 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 uzaklık veya field_ids_size == 0 0 ise 0. Uzaklık sıfır değilse, field_ids bölümünün başlangıcında 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 uzaklık veya method_ids_size == 0 0 . Uzaklık sıfır değilse, method_ids bölümünün başlangıcında 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 ofset veya class_defs_size == 0 ise 0 (kuşkusuz garip bir uç durum). Uzaklık, sıfır değilse, class_defs bölümünün başlangıcında olmalıdır.
veri_boyutu uint Bayt cinsinden data bölümünün boyutu. sizeof(uint) değerinin çift katı olmalıdır.
veri_kapalı uint dosyanın başlangıcından data bölümünün başlangıcına kadar olan uzaklık.

harita_listesi

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

Header_item'den referans alındı

Hizalama: 4 bayt

Bu, bir dosyanın tüm içeriğinin sırayla bir listesidir. header_item ile ilgili bir miktar fazlalık içerir ancak tüm dosya üzerinde yineleme yapmak için kullanımı kolay bir form olması amaçlanmış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 hangi türlerin görünebileceğine dair herhangi bir kısıtlama yoktur (örneğin, önce bir header bölümü görünmeli, ardından bir string_ids gelmelidir) bölüm vb.). Ayrıca harita girişleri başlangıçtaki uzaklığa göre sıralanmalı ve çakışmamalıdır.

İsim Biçim Tanım
boyut uint listenin boyutu, girişlerde
liste harita_öğesi[boyut] listenin unsurları

harita_öğesi biçimi

İsim Biçim Tanım
tip kısa öğelerin türü; aşağıdaki tabloya bakınız
kullanılmayan kısa (kullanılmıyor)
boyut 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

Kodları yazın

Öğe türü Devamlı Değer Bayt Cinsinden Öğe Boyutu
başlık_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
harita_listesi TYPE_MAP_LIST 0x1000 4 + (ürün boyutu * 12)
tür_listesi TYPE_TYPE_LIST 0x1001 4 + (ürün boyutu * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (ürün boyutu * 4)
annotation_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (ürün boyutu * 4)
class_data_item TYPE_CLASS_DATA_ITEM 0x2000 örtülü; ayrıştırmalı
code_item TYPE_CODE_ITEM 0x2001 örtülü; ayrıştırmalı
string_data_item TYPE_STRING_DATA_ITEM 0x2002 örtülü; ayrıştırmalı
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 örtülü; ayrıştırmalı
ek açıklama_item TYPE_ANNOTATION_ITEM 0x2004 örtülü; ayrıştırmalı
kodlanmış_array_item TYPE_ENCODED_ARRAY_ITEM 0x2005 örtülü; ayrıştırmalı
annotations_directory_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 örtülü; ayrıştırmalı
Hiddenapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 örtülü; ayrıştırmalı

string_id_item

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

Hizalama: 4 bayt

İsim Biçim Tanım
string_data_off uint dosyanın başlangıcından bu öğenin dize verilerine kadar olan uzaklık. Uzaklık, data bölümündeki bir konumda olmalı ve veriler, aşağıda " string_data_item " tarafından belirtilen formatta olmalıdır. Ofset için herhangi bir hizalama gereksinimi yoktur.

string_data_item

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

Hizalama: yok (bayt hizalı)

İsim Biçim Tanım
utf16_size uleb128 bu dizenin UTF-16 kod birimleri cinsinden boyutu (birçok sistemde "dize uzunluğu" anlamına gelir). Yani bu, dizenin kodu çözülmüş uzunluğudur. (Kodlanmış uzunluk 0 baytın konumuyla belirtilir.)
veri ubayt[] bir dizi MUTF-8 kod birimi (diğer adıyla sekizli, diğer adıyla bayt) ve ardından 0 değerinde bir bayt gelir. Veri formatıyla ilgili ayrıntılar ve tartışmalar için yukarıdaki "MUTF-8 (Değiştirilmiş UTF-8) Kodlaması" konusuna bakın.

Not: UTF-16 yedek kod birimlerini (yani, U+d800U+dfff ) içeren (kodlanmış biçimini) ya ayrı olarak ya da olağan kodlamaya göre sıra dışı olarak içeren bir dizeye sahip olmak kabul edilebilir. Unicode'un UTF-16'ya dönüştürülmesi. Bu tür geçersiz kodlamaları reddetmek, eğer uygunsa, dizelerin daha üst düzey kullanımına bağlıdır.

type_id_item

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

Hizalama: 4 bayt

İsim Biçim Tanım
tanımlayıcı_idx uint bu türün tanımlayıcı dizesi için string_ids listesine dizin ekleyin. Dizenin yukarıda tanımlanan TypeDescriptor sözdizimine uyması gerekir.

proto_id_item

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

Hizalama: 4 bayt

İsim Biçim Tanım
shorty_idx uint Bu prototipin kısa biçimli tanımlayıcı dizesi için string_ids listesine indeksleyin. Dizenin yukarıda tanımlanan ShortyDescriptor sözdizimine uyması ve bu öğenin dönüş türüne ve parametrelerine karşılık gelmesi gerekir.
return_type_idx uint bu prototipin dönüş tipi için type_ids listesine indeksleyin
parametreler_off uint dosyanın başlangıcından bu prototip için parametre türleri listesine kadar ofset veya bu prototipin parametresi yoksa 0 . Bu uzaklık, eğer sıfır değilse, data bölümünde olmalı ve buradaki veriler, aşağıda "type_list" ile belirtilen formatta olmalıdır. Ayrıca listede void türüne referans olmamalıdır.

field_id_item

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

Hizalama: 4 bayt

İsim Biçim Tanım
class_idx kısa bu alanın tanımlayıcısı için type_ids listesine indeksleyin. Bu bir dizi veya temel tür değil, bir sınıf türü olmalıdır.
type_idx kısa bu alanın türü için type_ids listesine dizin
name_idx uint bu alanın adı için string_ids listesine dizin ekleyin. Dizenin yukarıda tanımlanan MemberName sözdizimine uyması gerekir.

method_id_item

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

Hizalama: 4 bayt

İsim Biçim Tanım
class_idx kısa Bu yöntemin tanımlayıcısı için type_ids listesine indeksleyin. Bu, ilkel bir tür değil, bir sınıf veya dizi türü olmalıdır.
proto_idx kısa bu yöntemin prototipi için proto_ids listesine indeksleyin
name_idx uint Bu yöntemin adı için string_ids listesine indeksleyin. Dizenin yukarıda tanımlanan MemberName sözdizimine uyması gerekir.

class_def_item

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

Hizalama: 4 bayt

İsim Biçim Tanım
class_idx uint bu sınıfın type_ids listesine indeksleyin. Bu bir dizi veya temel tür değil, bir sınıf türü olmalıdır.
erişim_flag'leri uint sınıf için erişim bayrakları ( public , final vb.). Ayrıntılar için " access_flags Tanımları"na bakın.
süpersınıf_idx uint üst sınıf için type_ids listesine dizin ekleyin veya bu sınıfın üst sınıfı yoksa (yani, Object gibi bir kök sınıfsa) NO_INDEX sabit değerini kullanın. Varsa, bu bir dizi veya temel tür değil, bir sınıf türü olmalıdır.
arayüzler_off uint dosyanın başlangıcından arayüz listesine kadar ofset veya yoksa 0 . Bu ofset data bölümünde olmalı ve oradaki veriler aşağıda " type_list " ile belirtilen formatta olmalıdır. Listenin öğelerinin her biri bir sınıf türü olmalı (dizi veya temel tür değil) ve herhangi bir kopya olmamalıdır.
kaynak_dosya_idx uint Bu sınıfın orijinal kaynağını (en azından çoğunu) içeren dosyanın adı için string_ids listesine indeks ekleyin veya bu bilginin eksikliğini temsil etmek için NO_INDEX özel değerini kullanın. Herhangi bir yöntemin debug_info_item bu kaynak dosyayı geçersiz kılabilir, ancak beklenti çoğu sınıfın yalnızca bir kaynak dosyadan gelmesidir.
ek açıklamalar_off uint dosyanın başlangıcından bu sınıfın ek açıklama yapısına kadar ofset veya bu sınıfta ek açıklama yoksa 0 . Bu uzaklık, sıfır değilse, data bölümünde olmalı ve buradaki veriler, tüm öğelerin tanımlayıcı olarak bu sınıfa gönderme yapmasıyla birlikte, aşağıda " annotations_directory_item " tarafından belirtilen formatta olmalıdır.
class_data_off uint dosyanın başlangıcından bu öğe için ilişkili sınıf verilerine kadar ofset 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.) Ofset, sıfır değilse, data bölümünde olmalı ve oradaki veriler, aşağıda " class_data_item " ile belirtilen formatta olmalıdır, tüm öğeler tanımlayıcı olarak bu sınıfa atıfta bulunur.
static_values_off uint dosyanın başlangıcından static alanlar için başlangıç ​​değerleri listesine kadar ofset veya hiçbiri yoksa 0 (ve tüm static alanlar 0 veya null ile başlatılmalıdır). Bu ofset data bölümünde olmalı ve oradaki veriler aşağıda " encoded_array_item " ile belirtilen formatta olmalıdır. Dizinin boyutu, bu sınıf tarafından bildirilen static alanların sayısından daha büyük olmamalıdır ve öğeler, karşılık gelen field_list dosyasında bildirilen sırayla static alanlara karşılık gelir. Her dizi öğesinin türü, ilgili alanın bildirilen türüyle eşleşmelidir. Dizide static alanlardan daha az öğe varsa, kalan alanlar türe uygun 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

İsim Biçim Tanım
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ı ve buradaki veriler, aşağıda "call_site_item" tarafından belirtilen formatta olmalıdır.

call_site_item

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

Hizalama: yok (bayt hizalanmış)

Call_site_item, öğeleri bir önyükleme bağlayıcı yöntemine sağlanan argümanlara karşılık gelen bir kodlanmış_dizi_itemdir. İlk üç argüman:

  1. Önyükleme bağlayıcı yöntemini (VALUE_METHOD_HANDLE) temsil eden bir yöntem tanıtıcısı.
  2. Önyükleme bağlayıcısının çözümlemesi gereken bir yöntem adı (VALUE_STRING).
  3. Çözümlenecek 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üşümü olmadan iletilir.

Önyükleme bağlayıcı yöntemini temsil eden yöntem tanıtıcısı, 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

Hizalama: 4 bayt

İsim Biçim Tanım
method_handle_type kısa yöntem tanıtıcısının türü; aşağıdaki tabloya bakınız
kullanılmayan kısa (kullanılmıyor)
field_or_method_id kısa Yöntem tanıtıcısı türünün erişimci mi yoksa yöntem çağırıcı mı olduğuna bağlı olarak alan veya yöntem kimliği
kullanılmayan kısa (kullanılmıyor)

Yöntem tanıtıcı türü kodları

Devamlı Değer Tanım
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 Yöntem tanıtıcısı statik bir alan ayarlayıcıdır (erişimci)
METHOD_HANDLE_TYPE_STATIC_GET 0x01 Yöntem tanıtıcısı statik bir alan alıcısıdır (erişimci)
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 Yöntem tanıtıcısı bir örnek alan ayarlayıcıdır (erişimci)
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 Yöntem tanıtıcısı bir örnek alan alıcısıdır (erişimci)
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 Yöntem tanıtıcısı statik bir yöntem çağırıcıdır
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 Yöntem Kulpu, bir örnek yöntem invoker
Method_handle_type_invoke_constructor 0x06 Yöntem Kulpu bir yapıcı yöntem invoker
Method_handle_type_invoke_direct 0x07 Yöntem Kulpu doğrudan bir yöntem invoker
Method_handle_type_invoke_interface 0x08 Yöntem Kulpu bir arabirim yöntemi Invoker

class_data_item

Class_def_item'den atıfta bulunuldu

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

Hizalama: Yok (bayt hizalanmış)

İsim Biçim Tanım
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öntem sayısı
sanal_methods_size Uleb128 Bu öğede tanımlanan sanal yöntemlerin sayısı
static_fields encoded_field [static_fields_size] Kodlanmış elemanların bir dizisi olarak temsil edilen tanımlanmış statik alanlar. Alanlar artan sırada field_idx tarafından sıralanmalıdır.
örnek_fields encoded_field [örnek_fields_size] Kodlanmış öğelerin bir dizisi olarak temsil edilen tanımlı örnek alanları. Alanlar artan sırada field_idx tarafından sıralanmalıdır.
Direct_methods encoded_method [direct_methods_size] Kodlanmış eleman dizisi olarak temsil edilen tanımlanmış doğrudan ( static , private veya yapıcı) yöntemler. Yöntemler, artan sırada method_idx tarafından sıralanmalıdır.
sanal_methods encoded_method [virtual_methods_size] Kodlanmış elementlerin bir dizisi olarak temsil edilen tanımlanmış sanal ( static , private veya yapıcı hiçbiri) yöntem. Bu liste, bu öğenin temsil ettiği sınıf tarafından geçersiz kılınmadıkça kalıtsal yöntemler içermemelidir . Yöntemler, artan sırada method_idx tarafından sıralanmalıdır. Sanal bir yöntemin method_idx herhangi bir doğrudan yöntemle aynı olmamalıdır .

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

encoded_field formatı

İsim Biçim Tanım
field_idx_diff Uleb128 Listedeki önceki öğenin dizininden bir fark olarak temsil edilen bu alanın kimliği (ad ve tanımlayıcı içerir) için field_ids listesine dizin. Bir listedeki ilk öğenin dizini doğrudan temsil edilir.
Access_flags Uleb128 Alan için Access bayrakları ( public , final vb.). Ayrıntılar için bkz. " access_flags Tanımları".

encoded_method biçimi

İsim Biçim Tanım
Method_idx_diff Uleb128 Listedeki önceki öğenin dizininden bir fark olarak temsil edilen bu yöntemin kimliği (ad ve tanımlayıcı içerir) için method_ids listesine dizin. Bir listedeki ilk öğenin dizini doğrudan temsil edilir.
Access_flags Uleb128 Yöntem için Access bayrakları ( public , final vb.). Ayrıntılar için bkz. " access_flags Tanımları".
kod_off Uleb128 Dosyanın başlangıcından bu yöntem için kod yapısına veya bu yöntem abstract veya native 0 . Ofset, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " code_item " ile belirtilmiştir.

type_list

Class_def_item ve proto_id_item'den atıfta bulunuldu

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

Hizalama: 4 bayt

İsim Biçim Tanım
boyut uint listenin boyutu, girişlerde
liste type_item [boyut] Listenin unsurları

type_item biçimi

İsim Biçim Tanım
type_idx kısa type_ids listesine dizin

code_item

Encoded_method'dan atıfta bulunuldu

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

Hizalama: 4 bayt

İsim Biçim Tanım
RECISTERS_SIZE kısa Bu kod tarafından kullanılan kayıt sayısı
ins_size kısa Bu kodun için olduğu yönteme gelen argümanların kelimelerinin sayısı
outs_size kısa Yöntem çağırma için bu kodun gerektirdiği giden argüman alanının kelime sayısı
tries_size kısa Bu örnek için try_item s sayısı. Sıfır değilse, bunlar bu örnekteki insns hemen sonra tries dizisi olarak görünür.
debug_info_off uint Dosyanın başından bu kod için hata ayıklama bilgisi (satır numaraları + yerel değişken bilgi) dizisine veya herhangi bir bilgi yoksa 0 ofset. Ofset, sıfır değilse, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " debug_info_item " ile belirtilmiştir.
insns_size uint 16 bit kod birimlerinde talimatlar listesinin boyutu
insns USHORT [INSNS_SIZE] gerçek bayt kodu. Bir insns dizisindeki kod biçimi , Dalvik Bytecode refakatçi belgesi tarafından belirtilir. Bunun bir ushort dizisi olarak tanımlanmasına rağmen, dört baytlık hizalamayı tercih eden bazı iç yapılar olduğunu unutmayın. Ayrıca, bu endian-sween bir dosyada olursa, değiştirme daha büyük iç yapılarda değil, yalnızca bireysel ushort örneklerinde yapılır.
dolgu malzemesi Ushort (isteğe bağlı) = 0 Dört baytlık tries yapmak için iki bayt dolgu. Bu öğe yalnızca tries_size sıfır değilse ve insns_size garipse mevcuttur.
çalışır try_item [tries_size] (isteğe bağlı) Kod istisnalarının nerede yakalandığını ve bunların nasıl ele alınacağını gösteren dizi. Dizinin elemanları menzilde ve düşükten yüksek adrese göre örtüşmemelidir. Bu öğe yalnızca tries_size sıfır değilse mevcuttur.
idareciler Encoded_catch_handler_list (isteğe bağlı) Yakalama türleri ve ilişkili işleyici adresleri listelerinin bir listesini temsil eden baytlar. Her try_item bu yapıya bayt bilgisiz bir ofsete sahiptir. Bu öğe yalnızca tries_size sıfır değilse mevcuttur.

try_item biçimi

İsim Biçim Tanım
start_addr uint Bu girişin kapsadığı kod bloğunun adresini başlatın. Adres, ilk kapsamlı talimatın başlangıcına kadar 16 bit kod birimleridir.
insn_count kısa Bu girişin kapsadığı 16 bit kod birimlerinin sayısı. Kapsanan son kod birimi (dahil) start_addr + insn_count - 1 .
handler_off kısa Bu giriş için encoded_catch_hander_list encoded_catch_handler başlamasından itibaren bayt cinsinden ofset. Bu, encoded_catch_handler başlangıcında bir ofset olmalıdır.

Encoded_catch_handler_list formatı

İsim Biçim Tanım
boyut Uleb128 Bu listenin boyutu, girişlerde
liste encoded_catch_handler [handlers_size] Doğrudan temsil edilen (ofset olarak değil) ve sırayla birleştirilmiş işleyici listelerinin gerçek listesi

encoded_catch_handler biçimi

İsim Biçim Tanım
boyut SLOB128 Bu listedeki yakalama türlerinin sayısı. Pozitif değilse, bu yakalama türlerinin sayısının negatifidir ve yakalamaları bir yakalama işleyicisi takip eder. Örneğin: 0 size , bir yakalama var, ancak açıkça yazılmış bir yakalama olduğu anlamına gelir. 2 size açıkça yazılmış iki yakalama ve yakalama olmadığı anlamına gelir. Ve -1 size bir yakalama ile birlikte yazılmış bir yakalama olduğu anlamına gelir.
idareciler encoded_type_addr_pair [abs (boyut)] abs(size) kodlanmış öğelerin akışı, her bir tür yakalanan tür için, türlerin test edilmesi gerektiği sırayla.
catch_all_addr Uleb128 (isteğe bağlı) Catch-All Handler'ın bayt kodu adresi. Bu öğe yalnızca size pozitif değilse mevcuttur.

encoded_type_addr_pair formatı

İsim Biçim Tanım
type_idx Uleb128 Catch için istisna türü için type_ids listesine dizini
adres Uleb128 İlişkili istisna işleyicisinin bayt kodu adresi

debug_info_item

Code_item'den atıfta bulunuldu

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

Hizalama: Yok (bayt hizalanmış)

Her debug_info_item , yorumlandığında konum tablosunu ve (potansiyel olarak) bir code_item için yerel değişken bilgilerini yayan cüce3 esintili bayt kodlu bir durum makinesi tanımlar. Dizi, değişken uzunlukta bir başlık ile başlar (uzunluğu yöntem parametrelerinin sayısına bağlı), bunu durum makinesi bayt modları takip eder ve bir DBG_END_SEQUENCE baytıyla biter.

Devlet makinesi beş kayıttan oluşur. address kaydı, 16 bit kod birimlerinde ilişkili insns_item talimat ofsetini temsil eder. address kaydı, her bir debug_info dizisinin başında 0 başlar ve yalnızca monoton olarak artmalıdır. line kaydı, hangi kaynak satır numarasının durum makinesi tarafından yayılan bir sonraki konum tablo girişiyle ilişkilendirilmesi gerektiğini temsil eder. Sıra başlığında başlatılır ve pozitif veya negatif yönlerde değişebilir, ancak asla 1 az olmamalıdır. source_file kayıt, satır numarası girişlerinin başvurduğu kaynak dosyayı temsil eder. class_def_item source_file_idx değerine başlatılır. Diğer iki değişken olan prologue_end ve epilogue_begin , yayılan bir sonraki pozisyonun bir yöntem prologu veya epilog olarak kabul edilip edilmeyeceğini gösteren boole bayraklarıdır ( false olarak başlatılır). Durum makinesi ayrıca DBG_RESTART_LOCAL KODU için her kayıtta canlı son yerel değişkenin adını ve türünü izlemelidir.

Başlık aşağıdaki gibidir:

İsim Biçim Tanım
line_start Uleb128 Durum makinesinin line kaydı için başlangıç ​​değeri. Gerçek bir konum girişini temsil etmez.
parametreler_size Uleb128 kodlanan parametre adlarının sayısı. Metod başına bir parametre başına bir örnek, this bir örnek yöntem hariç olmalıdır.
parametre_names Uleb128p1 [parametreler_size] Yöntem parametresi adının dize dizin. NO_INDEX kodlanmış bir değeri, ilişkili parametre için hiçbir adın bulunmadığını gösterir. Tip tanımlayıcı ve imza yöntem tanımlayıcı ve imzasından ima edilir.

Bayt kodu değerleri aşağıdaki gibidir:

İsim Değer Biçim Argümanlar Tanım
DBG_END_SEXENCE 0x00 (hiçbiri) bir code_item için bir hata ayıklama bilgi dizisini sonlandırır
Dbg_advance_pc 0x01 Uleb128 addr_diff addr_diff : Adres kaydına eklenecek tutar Konum girişi yaymadan adres kaydını geliştirir
Dbg_advance_line 0x02 slear128 line_diff line_diff : Satır kaydını değiştirme tutarı Bir konum girişi yaymadan çizgi kaydını geliştirir
Dbg_start_local 0x03 Uleb128 register_num
Uleb128p1 Name_idx
Uleb128p1 type_idx
register_num : Yerel içerecek kayıt
name_idx : adın dize dizin
type_idx : Türün Tür Dizini
Geçerli adreste yerel bir değişken sunar. name_idx veya type_idx bu değerin bilinmediğini belirtmek için NO_INDEX olabilir.
Dbg_start_local_extended 0x04 Uleb128 register_num
Uleb128p1 Name_idx
Uleb128p1 type_idx
Uleb128p1 SIG_IDX
register_num : Yerel içerecek kayıt
name_idx : adın dize dizin
type_idx : Türün Tür Dizini
sig_idx : Tip İmzasının Dize Dizin
Geçerli adreste tip imzalı bir yerel tanıtılır. name_idx , type_idx veya sig_idx herhangi biri, bu değerin bilinmediğini belirtmek için NO_INDEX olabilir. ( sig_idx -1 ise, aynı veriler opcode DBG_START_LOCAL kullanılarak daha verimli bir şekilde temsil edilebilir.)

Not: İmzaları ele alma konusunda uyarılar için aşağıdaki " dalvik.annotation.Signature " altındaki tartışmaya bakın.

Dbg_end_local 0x05 Uleb128 register_num register_num : Yerel içeren kayıt Şu anda canlı bir yerel değişkeni, geçerli adreste kapsam dışı 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 tanıtır. Adı ve türü, belirtilen kayıtta canlı olan son yerel ile aynıdır.
Dbg_set_pologue_end 0x07 (hiçbiri) Bir sonraki konum girişinin bir yöntem prologunun (bir yöntem kesme noktası için uygun bir yer) olarak düşünülmesi gerektiğini belirten prologue_end durum makinesi kaydını ayarlar. prologue_end kaydı herhangi bir özel ( >= 0x0a ) opcode ile temizlenir.
Dbg_set_epilogue_begin 0x08 (hiçbiri) epilogue_begin Durum Makine kaydını ayarlar, bu da eklenen bir sonraki konum girişinin bir yöntem epilogunun başlangıcı olarak düşünülmesi gerektiğini gösterir (yöntem çıkışından önce yürütmeyi askıya almak için uygun bir yer). epilogue_begin kaydı herhangi bir özel ( >= 0x0a ) opcode ile temizlenir.
Dbg_set_file 0x09 Uleb128p1 Name_idx name_idx : Kaynak dosya adının dize dizin; Bilinmiyorsa NO_INDEX code_item belirtilen varsayılan ad yerine, sonraki tüm satır numarası girişlerinin bu kaynak dosya adına referans verdiğini gösterir
Özel Opcodes 0x0a… 0xff (hiçbiri) line ve address kayıtlarını geliştirir, bir konum girişi yayar ve prologue_end ve epilogue_begin temizler. Açıklama için aşağıya bakın.

Özel Opcodes

0x0a ve 0xff (dahil) arasındaki değerlere sahip opcodlar hem line hem de address kayıtlarını küçük bir miktar taşır ve ardından yeni bir konum tablosu girişi yayar. 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'den atıfta bulunuldu

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

Hizalama: 4 bayt

İsim Biçim Tanım
class_annotations_off uint Dosyanın başlangıcından doğrudan sınıfta yapılan ek açıklamalara veya sınıfın doğrudan ek açıklamaları yoksa 0 denk gelin. Ofset, sıfır değilse, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " annotation_set_item " ile belirtilmiştir.
Fields_size uint Bu öğe tarafından açıklanan alanların sayısı
Annotated_methods_size uint Bu öğe tarafından açıklanan yöntemlerin sayısı
Annotated_parameters_size uint Bu öğe tarafından açıklanan yöntem parametre listelerinin sayısı
Field_annotations Field_annotation [Fields_size] (isteğe bağlı) İlişkili alan ek açıklamalarının listesi. Listenin öğeleri field_idx tarafından artan sırada sıralanmalıdır.
Method_annotations Method_Annotation [Methy_size] (isteğe bağlı) İlişkili yöntem ek açıklamalarının listesi. Listenin öğeleri, method_idx tarafından artan sırada sıralanmalıdır.
parametre_annotasyonları parametre_annotasyon [parametreler_size] (isteğe bağlı) İlişkili yöntem parametre ek açıklamalarının listesi. Listenin öğeleri, method_idx tarafından artan sırada sıralanmalıdır.

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

field_annotasyon biçimi

İsim Biçim Tanım
Field_idx uint Açıklaman alanın kimliği için field_ids listesine indeks
ek açıklamalar_off uint Dosyanın başlangıcından alan için ek açıklamalar listesine ofset. Ofset, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " annotation_set_item " ile belirtilmiştir.

Method_annotasyon biçimi

İsim Biçim Tanım
Method_idx uint Açıklaman yöntemin kimliği için method_ids listesine index
ek açıklamalar_off uint Dosyanın başlangıcından yöntemin ek açıklamaları listesine dengelenin. Ofset, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " annotation_set_item " ile belirtilmiştir.

parametre_annotasyon biçimi

İsim Biçim Tanım
Method_idx uint Parametreleri açıklanan yöntemin kimliği için method_ids listesine index
ek açıklamalar_off uint Dosyanın başlangıcından yöntem parametreleri için ek açıklamalar listesine ofset. Ofset, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " annotation_set_ref_list " ile belirtilmiştir.

Annotation_set_ref_list

Parametreden_annotasyonlar_item'den atıfta bulunuldu

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

Hizalama: 4 bayt

İsim Biçim Tanım
boyut uint listenin boyutu, girişlerde
liste Annotation_set_ref_item [boyut] Listenin unsurları

Annotation_set_ref_item biçimi

İsim Biçim Tanım
ek açıklamalar_off uint Bu öğe için ek açıklama yoksa dosyanın başlamasından referans verilen ek açıklama setine veya 0 dengelenir. Ofset, sıfır değilse, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " annotation_set_item " ile belirtilmiştir.

Annotation_set_item

Annotations_directory_item, Field_annotations_item, Method_annotations_item ve Annotation_set_ref_item'den atıfta bulunuldu

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

Hizalama: 4 bayt

İsim Biçim Tanım
boyut uint Girişlerde setin boyutu
girdileri Annotation_off_item [boyut] setin unsurları. Elemanlar, type_idx ile artan sırada sıralanmalıdır.

ek açıklama_off_item biçimi

İsim Biçim Tanım
ek açıklama_off uint Dosyanın başlangıcından ek açıklama. Ofset, data bölümündeki bir konuma olmalı ve bu konumdaki verilerin biçimi aşağıdaki " annotation_item " ile belirtilmelidir.

ek açıklama_item

Annotation_set_item'den atıfta bulunuldu

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

Hizalama: Yok (bayt hizalanmış)

İsim Biçim Tanım
görünürlük Ubyte Bu ek açıklamanın amaçlanan görünürlüğü (aşağıya bakın)
dipnot encoded_annotation Kodlanmış ek açıklama içeriği, yukarıdaki " encoded_annotation Format" altında " encoded_value Format" ile açıklanan formatta.

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

Bunlar, bir annotation_item visibility alanı için seçeneklerdir:

İsim Değer Tanım
Visibility_build 0x00 sadece yapı zamanında görünür olması amaçlanmıştır (örneğin, diğer kodun derlenmesi sırasında)
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, ancak yalnızca temel sistemde (ve normal kullanıcı koduna değil)

encoded_array_item

Class_def_item'den atıfta bulunuldu

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

Hizalama: Yok (bayt hizalanmış)

İsim Biçim Tanım
değer Encoded_array Kodlanmış dizi değerini temsil eden baytlar, yukarıdaki " encoded_value Kodlama" altında " encoded_array Format" tarafından belirtilen formatta.

hiddenapi_class_data_item

Bu bölüm, her sınıf tarafından kullanılan kısıtlı arayüzler hakkında veriler içerir.

Not: Gizli API özelliği Android 10.0'da tanıtıldı ve yalnızca önyükleme sınıfı yolundaki sınıfların DEX dosyaları için geçerlidir. Aşağıda açıklanan bayrakların listesi Android'in gelecekteki sürümlerinde genişletilebilir. Daha fazla bilgi için bkz. SDK olmayan arabirimlerdeki kısıtlamalar .

İsim Biçim Tanım
boyut uint Bölümün toplam boyutu
ofsets Uint [] Ofset dizisi class_idx tarafından endekslendi. class_idx dizininde sıfır dizi girişi, bu class_idx için veri olmadığı veya tüm gizli API bayraklarının 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 bir dizi gizli API bayrağına bir ofset içerir.
bayraklar Uleb128 [] Her sınıf için gizli API bayraklarının birleştirilmiş dizileri. Olası bayrak değerleri aşağıdaki tabloda açıklanmaktadır. Bayraklar alanlarla aynı sırayla kodlanır ve yöntemler sınıf verilerinde kodlanır.

Kısıtlama bayrağı türleri:

İsim Değer Tanım
beyaz liste 0 Özgür olarak kullanılabilen ve resmi olarak belgelenmiş Android Framework Paketi dizininin bir parçası olarak desteklenen arayüzler.
gri liste 1 Uygulamanın hedef API seviyesinden bağımsız olarak kullanılabilen SDK olmayan arabirimler.
kara liste 2 Uygulamanın hedef API seviyesinden bağımsız olarak kullanılamayan SDK olmayan arabirimler. Bu arabirimlerden birine erişmek çalışma zamanı hatasına neden olur.
Greylist - MAX - O 3 Kısıtlanmadıkça Android 8.x ve daha düşük bir süre için kullanılabilen SDK olmayan arayüzler.
Greylist - Max - P 4 Kısıtlanmadıkça Android 9.x için kullanılabilen SDK olmayan arayüzler.
Greylist - MAX - Q 5 Kısıtlanmadıkça Android 10.x için kullanılabilen SDK olmayan arayüzler.
Greylist - MAX - R 6 Kısıtlanmadıkça Android 11.x için kullanılabilen SDK olmayan 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ı bilgileri temsil etmek için kullanılır. Bu bilgilere genellikle yalnızca Müşteri (Sistem Olmayan) Kodu ile dolaylı olarak erişilir.

Sistem ek açıklamaları, .dex dosyalarında görünürlük ile VISIBILITY_SYSTEM olarak ayarlanmış ek açıklamalar olarak temsil edilir.

Dalvik.Annotation.AnnotationDefault

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

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

İsim Biçim Tanım
değer Dipnot Bu ek açıklama için varsayılan bağlamalar, bu tür bir ek açıklama olarak temsil edilir. Ek açıklamanın ek açıklama ile tanımlanan tüm isimleri içermesi gerekmez; Eksik isimlerin varsayılanları yoktur.

Dalvik.Annotation.EnclosingClass

Sınıflarda görünür

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

İsim Biçim Tanım
değer Sınıf Bu sınıfı en yakından kapsamlı bir şekilde kapsamlı olan sınıf

Dalvik.Annotation.EnsLosingMethod

Sınıflarda görünür

Bir yöntem gövdesi içinde tanımlanan her sınıfa bir EnclosingMethod belirtisi eklenmiştir. Bu ek açıklamaya sahip olan her sınıfta da bir InnerClass eklemesi olmalıdır. Ek olarak, bir sınıfın hem bir EnclosingClass hem de bir EnclosingMethod açıklaması olmamalıdır.

İsim Biçim Tanım
değer Yöntem Bu sınıfı en yakından kapsamlı bir şekilde kapsamlı bir yöntem

Dalvik.Annotation.innerClass

Sınıflarda görünür

Başka bir sınıfın tanımının sözcüksel kapsamında tanımlanan her sınıfa bir InnerClass ek açıklaması eklenir. Bu ek açıklamaya sahip herhangi bir sınıfın, bir EnclosingClass eklemi veya EnclosingMethod ek açıklaması olması gerekir.

İsim Biçim Tanım
isim Sicim Başlangıçta bu sınıfın basit adı bildirildi (herhangi bir paket öneki dahil değil). Bu sınıf anonim ise, adı null .
AccessFlags int Başlangıçta beyan edilen sınıfın erişim bayrakları (kaynak dilinin yürütme modelleri ile hedef sanal makinenin yürütme modelleri arasındaki uyumsuzluk nedeniyle etkili bayraklardan farklı olabilir)

Dalvik.Annotation.Memberclasses

Sınıflarda görünür

Üye sınıflarını beyan eden her sınıfa bir MemberClasses ek açıklaması eklenmiştir. (Üye sınıfı, adı olan doğrudan bir iç sınıftır.)

İsim Biçim Tanım
değer Sınıf[] Üye sınıflarının dizisi

Dalvik.Annotation.MethodParameter

Yöntemlerde görünür

Not: Bu ek açıklama Android 7.1'den sonra eklendi. Daha önceki Android sürümlerindeki varlığı göz ardı edilecektir.

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

Ek açıklama, çalışma zamanında parametre meta verileri gerekmediğinde bir yöntemden veya yapıcıdan güvenli bir şekilde atlanabilir. java.lang.reflect.Parameter.isNamePresent() bir parametre için meta verilerin olup olmadığını kontrol etmek için kullanılabilir ve java.lang.reflect.Parameter.getName() gibi ilişkili yansıma yöntemleri çalışma zamanında varsayılan davranışa geri döner. Bilgi mevcut değilse.

Parametre meta verileri dahil ederken, derleyiciler, bir parametrenin sentetik veya zorunlu olup olmadığını içerdiğinden, derleyiciler mezarlar gibi oluşturulan sınıflar için bilgiler içermelidir.

Bir MethodParameters ek açıklaması yalnızca bireysel yöntem parametrelerini açıklar. Bu nedenle, derleyiciler, kod büyüklüğü ve çalışma zamanı verimliliği uğruna parametresi olmayan yapıcılar ve yöntemler için ek açıklamayı atlayabilir.

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

Yani: method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size names().length ve accessFlags().length .

MethodParameters tüm resmi yöntem parametrelerini açıkladığından, kaynak kodunda açıkça veya dolaylı olarak bildirilmeyenler bile, dizilerin boyutu yalnızca kaynak kodunda bildirilen açık parametrelere dayanan imza veya diğer meta veri bilgilerinden farklı olabilir. MethodParameters ayrıca, gerçek yöntem imzasında bulunmayan tip açıklama alıcı parametreleri hakkında herhangi bir bilgi içermez.

İsim Biçim Tanım
isimler Sicim[] İlişkili yöntem için resmi parametrelerin adları. Dizi boş olmamalı, ancak resmi parametre yoksa boş olmalıdır. Bu dizine sahip resmi parametrenin adı yoksa, dizideki bir değer boş olmalıdır.
Parametre adı dizeleri boşsa veya '', ';' '[' veya '/' içeriyorsa, java.lang.reflect.MalformedParametersException çalışma zamanında atılır.
AccessFlags int[] İlişkili yöntem için resmi parametrelerin erişim bayrakları. Dizi boş olmamalı, ancak resmi parametre yoksa boş olmalıdır.
Değer, aşağıdaki değerlerle biraz maskedir:
  • 0x0010: Final, parametre final ilan edildi
  • 0x1000: Sentetik, parametre derleyici tarafından tanıtıldı
  • 0x8000: Zorunlu, parametre sentetik ama aynı zamanda dil spesifikasyonu ile de ima ediliyor
Bu setin dışında herhangi bir bit ayarlanırsa, bir java.lang.reflect.MalformedParametersException çalışma zamanında atılır.

Dalvik.Annotation.Signature

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

Bir type_id_item tarafından temsil edilebileceğinden daha karmaşık bir tür olarak tanımlanan her sınıfa, alana veya yönteme bir Signature açıklaması eklenir. .dex biçimi imzalar için biçimi tanımlamaz; Sadece bir kaynak dilinin bu dilin semantiğinin başarılı bir şekilde uygulanması için ihtiyaç duyduğu imzaları temsil edebilmesi anlamına gelir. Bu nedenle, imzalar sanal makine uygulamaları tarafından genellikle ayrıştırılmaz (veya doğrulanmaz). İmzalar, daha üst düzey API'lere ve araçlara (hata ayıklayıcılar gibi) teslim edilir. Bu nedenle, bir imzanın herhangi bir kullanımı, yalnızca geçerli imzalar alma hakkında herhangi bir varsayım yapmamak ve açıkça kendisini sözdizimsel olarak geçersiz bir imzaya ulaşma olasılığına karşı korumak için yazılmalıdır.

İmza dizeleri çok fazla yinelenen içeriğe sahip olma eğiliminde olduğundan, bir Signature ek açıklaması, kopyalanan öğelerin doğal olarak aynı temel verilere atıfta bulunduğu ve imzanın dizideki tüm dizelerin birleştirilmesi olarak alındığı bir dizi dizisi olarak tanımlanır. . Bir imzanın ayrı iplere nasıl ayıracağına dair hiçbir kural yoktur; Bu tamamen .dex dosyalarını oluşturan araçlara bağlıdır.

İsim Biçim Tanım
değer Sicim[] Bu sınıfın veya üyenin imzası, birlikte birleştirilecek bir dizi dizgi olarak

Dalvik.Annotation.Throws

Yöntemlerde görünür

Bir veya daha fazla istisna türü attığı bildirilen her yönteme Throws açıklaması eklenir.

İsim Biçim Tanım
değer Sınıf[] atılan istisna türleri dizisi