Bu belgede, bir dizi sınıf tanımını ve ilişkili ek verilerini depolamak için kullanılan .dex
dosyalarının düzeni ve içeriği açıklanmaktadır.
Tür rehberi
Ad | Açıklama |
---|---|
bayt | 8 bitlik işaretli tam sayı |
ubyte | 8 bit işaretsiz int |
kısa video | 16 bit işaretli tam sayı, küçük endian |
ushort | 16 bit işaretsiz int, küçük endian |
int | 32 bit işaretli int, küçük endian |
uint | 32 bitlik işaretsiz int, küçük endian |
uzun | 64 bitlik işaretli int, küçük endian |
ulong | 64 bit işaretsiz int, küçük endian |
sleb128 | imzalı LEB128, değişken uzunluk (aşağıya bakın) |
uleb128 | işaretsiz LEB128, değişken uzunlukta (aşağıya bakın) |
uleb128p1 | işaretsiz LEB128 artı 1 , değişken uzunlukta (aşağıya bakın) |
LEB128
LEB128 ("KüçükEngilizce Bazası 128"), rastgele imzalanan veya imzalanmamış tam sayı miktarları için değişken uzunlukta bir kodlamadır. Biçim, DWARF3 spesifikasyonundan alınmıştır. .dex
dosyasında LEB128 yalnızca 32 bitlik miktarları kodlamak için kullanılır.
Her LEB128 kodlu değer, birlikte tek bir 32 bitlik değeri temsil eden bir ila beş bayttan oluşur. Her baytın en önemli biti ayarlıdır. Bunun tek istisnası, en önemli biti temiz olan dizideki son bayttır. Her baytın kalan yedi biti yükü oluşturur. Miktarın en az anlamlı yedi biti ilk baytta, sonraki yedi biti ikinci baytta ve bu şekilde devam eder. İşaretli LEB128 (sleb128
) söz konusu olduğunda, sıradaki son baytın en önemli yükü biti, son değeri oluşturmak için işaretli olarak genişletilir. İmzasız durumda (uleb128
), açıkça temsil edilmeyen tüm bitler 0
olarak yorumlanır.
İki baytlık LEB128 değerinin bit tabanlı şeması | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
İlk bayt | İkinci bayt | ||||||||||||||
1 |
bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | 0 |
bit13 | bit12 | bit11 | bit10 | bit9 | bit8 | bit7 |
uleb128p1
varyantı, uleb128
olarak kodlanan bir artı bir değerinin temsil edildiği, imzalı bir değeri temsil etmek için kullanılır. Bu, -1
(alternatif olarak işaretsiz değer 0xffffffff
olarak düşünülür) kodlamasını (ancak başka hiçbir negatif sayıyı değil) tek bayt yapar ve tam olarak temsil edilen sayının sıfır veya -1
(veya 0xffffffff
) olması gereken ve başka negatif değerlere izin verilmeyen (veya büyük işaretsiz değerlere ihtiyaç duyulmayan) durumlarda kullanışlıdır.
Biçimlere dair bazı örnekleri aşağıda bulabilirsiniz:
Kodlanmış Sıralı | sleb128 olarak |
uleb128 olarak |
uleb128p1 olarak |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127) | 126 |
80 7f | -128 | 16256 | 16255 |
Dosya düzeni
Ad | Biçimi | Açıklama |
---|---|---|
üst bilgi | header_item | üstbilgi |
string_ids | string_id_item[] | dize tanımlayıcısı listesi. Bunlar, bu dosya tarafından kullanılan tüm dizelerin tanımlayıcılarıdır.Bu tanımlayıcılar, dahili adlandırma (ör. tür tanımlayıcıları) veya kod tarafından başvurulan sabit nesneler için kullanılır. Bu liste, UTF-16 kod noktası değerleri kullanılarak (yerleşime duyarlı bir şekilde değil) dize içeriğine göre sıralanmış olmalı ve yinelenen girişler içermemelidir. |
type_ids | type_id_item[] | tür tanımlayıcısı listesinde bulunabilir. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosya tarafından atıfta bulunulan tüm türlerin (sınıflar, diziler veya ilkel türler) tanımlayıcılarıdır. Bu liste string_id
dizinine göre sıralanmış olmalı ve yinelenen girişler içermemelidir.
|
proto_ids | proto_id_item[] | yöntem prototipi tanımlayıcısı listesi. Bunlar, bu dosyanın atıfta bulunduğu tüm prototiplerin tanımlayıcılarıdır. Bu liste, döndürülen tür (type_id dizine göre) ana sırasına göre ve ardından bağımsız değişken listesine göre (alfabetik sıralama, bağımsız değişkenler type_id dizine göre sıralanır) sıralanır. Listede yinelenen girişler bulunmamalıdır.
|
field_ids | field_id_item[] | alan tanımlayıcısı listesi. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosya tarafından atıfta bulunulan tüm alanların tanımlayıcılarıdır. Bu liste, tanımlama türü (type_id dizine göre) birincil düzen, alan adı (string_id dizine göre) ikincil düzen ve tür (type_id dizine göre) üçüncül düzen olacak şekilde sıralanır. Listede yinelenen girişler bulunmamalıdır.
|
method_ids | method_id_item[] | yöntem tanımlayıcısı listesini inceleyin. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosya tarafından atıfta bulunulan tüm yöntemlerin tanımlayıcılarıdır. Bu liste, tanımlama türüne (type_id dizine göre) göre birincil, yöntem adına (string_id dizine göre) göre ikincil ve yöntem prototipine (proto_id dizine göre) göre üçüncül olarak sıralanır. Listede yinelenen girişler bulunmamalıdır.
|
class_defs | class_def_item[] | sınıf tanımları listesini görebilirsiniz. Sınıflar, belirli bir sınıfın üst sınıfının ve uygulanan arayüzlerinin, referans veren sınıftan önce listede görüneceği şekilde sıralanmalıdır. Ayrıca, aynı ada sahip sınıfın tanımının listede birden fazla kez görünmesi geçersizdir. |
call_site_ids | call_site_id_item[] | site tanımlayıcısı listesini çağırın. Bunlar, dosya içinde tanımlanmış olsun veya olmasın, bu dosya tarafından atıfta bulunulan tüm çağrı sitelerinin tanımlayıcılarıdır. Bu liste, call_site_off değerine göre artan düzende sıralanmış olmalıdır.
|
method_handles | method_handle_item[] | yöntemi herkese açık kullanıcı adı listesi. Dosyada tanımlanmış olsun veya olmasın, bu dosya tarafından başvurulan tüm yöntem tutamaçlarının listesi. Bu liste sıralı değildir ve mantıksal olarak farklı yöntem mülk örneklerine karşılık gelen yinelenen öğeler içerebilir. |
aktarma | ubyte[] | veri alanı, yukarıda listelenen tablolarla ilgili tüm destek verilerini içerir. Farklı öğelerin farklı hizalama koşulları vardır ve doğru hizalamaya ulaşmak için gerekirse her öğenin önüne dolgu baytları eklenir. |
link_data | ubyte[] | statik olarak bağlı dosyalarda kullanılan veriler. Bu bölümdeki verilerin biçimi bu belgede belirtilmemiştir. Bu bölüm, bağlantısı olmayan dosyalarda boştur ve çalışma zamanındaki uygulamalar bu bölümü uygun gördükleri şekilde kullanabilir. |
Kapsayıcı biçimi
41. sürümde, yer kazanmak amacıyla DEX verileri için yeni bir kapsayıcı biçimi kullanıma sunulmuştur. Bu kapsayıcı biçimi, birkaç mantıksal DEX dosyasının tek bir fiziksel dosyada birleştirilmesine olanak tanır. Yeni biçim, çoğunlukla önceki biçimteki dosyaların basit bir şekilde birleştirilmesinden oluşur. Bununla birlikte, bazı farklılıklar vardır:
file_size
, fiziksel dosyanın değil mantıksal dosyanın boyutudur. Bu işlev, kapsayıcıdaki tüm mantıksal dosyaları iterasyonla işlemek için kullanılabilir.- Mantıksal dex dosyaları, kapsayıcıdaki daha sonraki verileri referans alabilir (ancak önceki verileri referans alamaz). Bu sayede dex dosyaları, aralarında dize gibi veriler paylaşabilir.
- Tüm ofsetler fiziksel dosyaya göredir. Üstbilgiye göre hiçbir ofset yoktur. Bu sayede, ofset içeren bölümler mantıksal dosyalar arasında paylaşılabilir.
- Başlık, kapsayıcının sınırlarını tanımlamak için iki yeni alan ekler. Bu ek bir tutarlılık denetimidir ve kodu yeni biçime taşımayı kolaylaştırır.
data_size
vedata_off
artık kullanılmamaktadır. Veriler birden fazla mantıksal dosyaya yayılabilir ve bitişik olması gerekmez.
Bit alanı, dize ve sabit tanımlar
DEX_FILE_MAGIC
header_item öğesine yerleştirilmiş
Sabit dizi/dize DEX_FILE_MAGIC
, .dex
dosyası olarak tanınması için dosyanın başında görünmesi gereken baytların listesidir. Değer, belirli bozulma biçimlerinin tespit edilmesine yardımcı olmak için kasıtlı olarak bir satır sonu ("\n"
veya 0x0a
) ve boş bayt ("\0"
veya 0x00
) içerir. Değer, biçim sürüm numarasını üç ondalık basamak olarak da kodlar. Bu sayının, biçim geliştikçe zaman içinde tekdüze şekilde artması beklenir.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
Not: Android 10.0 sürümünde, biçimin 040
sürümü için destek eklendi. Bu destek, SimpleNames'da izin verilen karakter grubunu genişletti.
Not: Android 9.0 sürümünde, biçimin 039
sürümü için destek eklendi. Bu sürümde const-method-handle
ve const-method-type
olmak üzere iki yeni bayt kodu kullanıma sunuldu. (Bunların her biri Kod birimi kümesinin özeti tablosunda açıklanmıştır.) Android 10'daki 039
sürümü, DEX dosya biçimini yalnızca önyükleme sınıfı yolundaki DEX dosyaları için geçerli olan gizli API bilgilerini içerecek şekilde genişletir.
Not: Biçimin 038
sürümü, Android 8.0 sürümünde desteklenmeye başlandı. 038
sürümünde, yöntem tutamaçlarına yönelik yeni bayt kodları (invoke-polymorphic
ve invoke-custom
) ve veriler eklendi.
Not: Bu biçimin 037
sürümü için destek, Android 7.0 sürümünde eklenmiştir. 037
sürümünden önceki Android sürümlerinin çoğu, biçimin 035
sürümünü kullanıyordu. 035
ve 037
sürümleri arasındaki tek fark, varsayılan yöntemlerin eklenmesi ve invoke
değerinin ayarlanmasıdır.
Not: Bu biçimin en az birkaç önceki sürümü, herkese açık olarak yayınlanan yazılım sürümlerinde kullanılmıştır. Örneğin, Android platformunun M3 sürümleri (Kasım-Aralık 2007) için 009
sürümü, Android platformunun M5 sürümleri (Şubat-Mart 2008) için ise 013
sürümü kullanıldı. Bu biçimin önceki sürümleri, bu belgede açıklanan sürümden çeşitli açılardan önemli ölçüde farklıdır.
ENDIAN_CONSTANT ve REVERSE_ENDIAN_CONSTANT
header_item öğesine yerleştirilmiş
ENDIAN_CONSTANT
sabit değeri, bulunduğu dosyanın büyük endian veya küçük endian olduğunu belirtmek için kullanılır. Standart .dex
biçimi küçük endian olsa da uygulamalar bayt değiştirmeyi tercih edebilir. Bir uygulama, endian_tag
değeri ENDIAN_CONSTANT
yerine REVERSE_ENDIAN_CONSTANT
olan bir başlıkla karşılaşırsa dosyanın beklenen biçimden bayt değişimi geçirdiğini bilir.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
NO_INDEX
class_def_item ve debug_info_item öğelerine yerleştirilir.
NO_INDEX
sabit değeri, bir dizin değerinin bulunmadığını belirtmek için kullanılır.
Not: Bu değer, genellikle geçerli bir dizin olduğu için 0
olarak tanımlanmaz.
NO_INDEX
için seçilen değer, uleb128p1
kodlamasında tek bir bayt olarak temsil edilebilir.
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
access_flags tanımları
class_def_item, encoded_field, encoded_method ve InnerClass öğelerine yerleştirilir.
Bu işaretlerin bit alanları, sınıfların ve sınıf üyelerinin erişilebilirliğini ve genel özelliklerini belirtmek için kullanılır.
Ad | Değer | Sınıflar (ve InnerClass ek açıklamaları) için |
Alanlar İçin | Yöntemler için |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : her yerde görünür |
public : her yerde görünür |
public : her yerde görünür |
ACC_PRIVATE | 0x2 | private : yalnızca tanımlayan sınıf tarafından görülebilir
|
private : yalnızca tanımlayan sınıf tarafından görülebilir |
private : yalnızca tanımlayan sınıf tarafından görülebilir |
ACC_PROTECTED | 0x4 | protected : paket ve alt sınıflar tarafından görülebilir
|
protected : Paket ve alt sınıflar tarafından görülebilir |
protected : Paket ve alt sınıflar tarafından görülebilir |
ACC_STATIC | 0x8 | static : Dış this referansıyla oluşturulmaz |
static : Tanımlayıcı sınıf için global |
static : this bağımsız değişkeni almıyor |
ACC_FINAL | 0x10 | final : alt sınıfa ayrılamaz |
final : Oluşturulduktan sonra değiştirilemez |
final : geçersiz kılınamaz |
ACC_SYNCHRONIZED | 0x20 | synchronized : ilişkili kilit, bu yönteme yapılan çağrının etrafında otomatik olarak edinilir. Not: Bu ayar yalnızca |
||
ACC_VOLATILE | 0x40 | volatile : Mesaj dizisinin güvenliğine yardımcı olacak özel erişim kuralları |
||
ACC_BRIDGE | 0x40 | tür güvenli bir köprü olarak derleyici tarafından otomatik olarak eklenen köprü yöntemi | ||
ACC_TRANSIENT | 0x80 | transient : Varsayılan olarak serileştirme ile kaydedilmez. |
||
ACC_VARARGS | 0x80 | son bağımsız değişken, derleyici tarafından "geri kalan" bağımsız değişken olarak değerlendirilmelidir | ||
ACC_NATIVE | 0x100 | native : Yerel kodda uygulanır. |
||
ACC_INTERFACE | 0x200 | interface : birden fazla şekilde uygulanabilen soyut sınıf |
||
ACC_ABSTRACT | 0x400 | abstract : Doğrudan oluşturulamaz. |
abstract : Bu sınıf tarafından uygulanmadı |
|
ACC_STRICT | 0x800 | strictfp : kayan noktalı aritmetik için katı kurallar |
||
ACC_SYNTHETIC | 0x1000 | Doğrudan kaynak kodunda tanımlanmamışsa | Doğrudan kaynak kodunda tanımlanmamışsa | Doğrudan kaynak kodunda tanımlanmamışsa |
ACC_ANNOTATION | 0x2000 | bir ek açıklama sınıfı olarak tanımlanmışsa | ||
ACC_ENUM | 0x4000 | Listelenmiş tür olarak tanımlanmış | Listelenen değer olarak tanımlanmış | |
(unused) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | oluşturucu yöntemi (sınıf veya örnek başlatıcı) | ||
ACC_DECLARED_ SYNCHRONIZED |
0x20000 | synchronized öğesini tanımladınız. Not: Bu, yürütmeyi etkilemez (bu işaretin yansıtılması dışında). |
InnerClass
ek açıklamalarında kullanılabilir ve hiçbir zaman class_def_item
'da etkin olmamalıdır.
Değiştirilmiş UTF-8 kodlaması
Eski sürümlerin daha kolay desteklenmesi için .dex
biçimi, dize verilerini de facto standart değiştirilmiş UTF-8 biçiminde (bundan sonra MUTF-8 olarak anılacaktır) kodlar. Bu biçim, aşağıdakiler dışında standart UTF-8 ile aynıdır:
- Yalnızca bir, iki ve üç baytlık kodlamalar kullanılır.
U+10000
…U+10ffff
aralığındaki kod noktaları, her biri üç baytlık kodlanmış değer olarak temsil edilen bir vekil çifti olarak kodlanır.U+0000
kod noktası iki baytlık biçimde kodlanır.- Standart C dili yorumunda olduğu gibi, boş bir bayt (
0
değeri) bir dizenin sonunu gösterir.
Yukarıdaki ilk iki öğe şu şekilde özetlenebilir: MUTF-8, Unicode karakterleri için daha doğrudan bir kodlama biçimi olmak yerine UTF-16 için bir kodlama biçimidir.
Yukarıdaki son iki öğe, U+0000
kod noktasını bir dizeye dahil etmeyi ve aynı zamanda C tarzı boş karakterle sonlandırılmış bir dize olarak değiştirmeyi aynı anda mümkün kılar.
Ancak U+0000
'ün özel kodlaması, normal UTF-8'den farklı olarak, bir çift MUTF-8 dizesinde standart C işlevi strcmp()
'ün çağrılmasının sonucunun her zaman eşit olmayan dizelerin karşılaştırmasının doğru şekilde imzalanmış sonucunu göstermediği anlamına gelir.
Sıralama (yalnızca eşitlik değil) önemliyse MUTF-8 dizelerini karşılaştırmanın en kolay yolu, bunları karakter karakter kodlarını çözmek ve kodları çözülmüş değerleri karşılaştırmaktır. (Ancak daha akıllıca uygulamalar da mümkündür.)
Karakter kodlaması hakkında daha fazla bilgi için lütfen Unicode Standardı'na bakın. MUTF-8, aslında UTF-8'e kıyasla (nispeten daha az bilinen) CESU-8 kodlamasına daha yakındır.
encoded_value kodlaması
annotation_element ve encoded_array_item öğelerine yerleştirilir.
encoded_value
, (neredeyse) keyfi olarak hiyerarşik olarak yapılandırılmış verilerin kodlanmış bir parçasıdır. Kodlamanın hem kompakt hem de ayrıştırması kolay olması gerekir.
Ad | Biçimi | Açıklama |
---|---|---|
(value_arg << 5) | value_type | ubyte | hemen sonraki value değerinin türünü belirten bir bayt ve üst değerli üç bitte isteğe bağlı bir açıklayıcı bağımsız değişken.
Çeşitli value tanımları için aşağıya bakın.
Çoğu durumda value_arg , hemen ardından gelen value değerinin uzunluğunu bayt cinsinden (size - 1) olarak kodlar. Örneğin: 0 , değerin bir bayt gerektirdiği, 7 ise sekiz bayt gerektirdiği anlamına gelir. Ancak aşağıda belirtildiği gibi istisnalar vardır.
|
değer | ubyte[] | Değeri temsil eden baytlar. Uzunluk değişkendir ve farklı value_type baytları için farklı şekilde yorumlanır ancak her zaman küçük endiandır. Ayrıntılar için aşağıdaki çeşitli değer tanımlarına bakın.
|
Değer biçimleri
Tür Adı | value_type |
value_arg Biçim |
value Biçim |
Açıklama |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (none; must be 0 ) |
ubyte[1] | imzalı bir baytlık tam sayı değeri |
VALUE_SHORT | 0x02 | boyut - 1 (0…1) | ubyte[size] | işaretli iki baytlık tam sayı değeri, işaretli olarak genişletilmiş |
VALUE_CHAR | 0x03 | boyut - 1 (0…1) | ubyte[size] | sıfıra genişletilmiş, imzasız iki baytlık tam sayı değeri |
VALUE_INT | 0x04 | boyut - 1 (0…3) | ubyte[size] | işaretli dört baytlık tam sayı değeri, işaretli olarak genişletilmiş |
VALUE_LONG | 0x06 | boyut - 1 (0…7) | ubyte[size] | işaretli sekiz baytlık tam sayı değeri, işaretli olarak genişletilmiş |
VALUE_FLOAT | 0x10 | boyut - 1 (0…3) | ubyte[size] | dört baytlık bit kalıbı, sağa sıfırla genişletilmiş ve IEEE754 32 bitlik kayan nokta değeri olarak yorumlanır |
VALUE_DOUBLE | 0x11 | boyut - 1 (0…7) | ubyte[size] | sekiz baytlık bit kalıbı, sağa sıfır uzatılır ve IEEE754 64 bit kayan nokta değeri olarak yorumlanır |
VALUE_METHOD_TYPE | 0x15 | boyut - 1 (0…3) | ubyte[size] | proto_ids bölümüne yönelik bir dizin olarak yorumlanan ve yöntem türü değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tamsayı değeri
|
VALUE_METHOD_HANDLE | 0x16 | boyut - 1 (0…3) | ubyte[size] | method_handles bölümüne yönelik bir dizin olarak yorumlanan ve bir yöntem tutamaç değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tam sayı değeri
|
VALUE_STRING | 0x17 | boyut - 1 (0…3) | ubyte[size] | string_ids bölümüne ait bir dizin olarak yorumlanan ve dize değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tam sayı değeri
|
VALUE_TYPE | 0x18 | boyut - 1 (0…3) | ubyte[size] | type_ids bölümüne ait bir dizin olarak yorumlanan ve yansıtıcı bir tür/sınıf değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tamsayı değeri
|
VALUE_FIELD | 0x19 | boyut - 1 (0…3) | ubyte[size] | field_ids bölümüne ait bir dizin olarak yorumlanan ve yansıtıcı alan değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tamsayı değeri
|
VALUE_METHOD | 0x1a | boyut - 1 (0…3) | ubyte[size] | method_ids bölümüne ait bir dizin olarak yorumlanan ve yansıtıcı yöntem değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tam sayı değeri
|
VALUE_ENUM | 0x1b | boyut - 1 (0…3) | ubyte[size] | field_ids bölümüne yönelik bir dizin olarak yorumlanan ve listelenmiş tür sabitinin değerini temsil eden, imzalanmamış (sıfıra genişletilmiş) dört baytlık tamsayı değeri
|
VALUE_ARRAY | 0x1c | (none; must be 0 ) |
encoded_array | Aşağıdaki "encoded_array biçimi" ile belirtilen biçimde bir değer dizisi. value boyutu, kodlamaya dahildir.
|
VALUE_ANNOTATION | 0x1d | (none; must be 0 ) |
encoded_annotation | Aşağıdaki "encoded_annotation biçimi" ile belirtilen biçimde bir alt ek açıklama. value boyutu, kodlamaya dahildir.
|
VALUE_NULL | 0x1e | (none; must be 0 ) |
(yok) | null referans değeri |
VALUE_BOOLEAN | 0x1f | boole (0…1) | (yok) | bir bitlik değer; false için 0 ve true için 1 . Bit, value_arg içinde temsil edilir.
|
encoded_array biçimi
Ad | Biçimi | Açıklama |
---|---|---|
beden | uleb128 | dizindeki öğe sayısı |
değerler | encoded_value[size] | Bu bölümde belirtilen biçimde, ardışık olarak birleştirilmiş bir dizi size encoded_value bayt dizisi.
|
encoded_annotation biçimi
Ad | Biçimi | Açıklama |
---|---|---|
type_idx | uleb128 | ek açıklama türü. Bu, bir sınıf (dizi veya ilkel değil) türü olmalıdır. |
beden | uleb128 | Bu ek açıklamadaki ad/değer eşlemelerinin sayısı |
öğeler | annotation_element[size] | doğrudan satır içi olarak gösterilen (ofset olarak değil) ek açıklama öğeleri. Öğeler string_id dizine göre artan düzende sıralanır.
|
annotation_element biçimi
Ad | Biçimi | Açıklama |
---|---|---|
name_idx | uleb128 | string_ids bölümündeki bir dizin olarak temsil edilen öğe adı. Dize, yukarıda tanımlanan ÜyeAdı söz dizimine uymalıdır.
|
değer | encoded_value | öğe değeri |
Dize söz dizimi
.dex
dosyasında, sonuçta bir dizeyi belirten birkaç tür öğe vardır. Aşağıdaki BNF stilindeki tanımlar, bu dizeler için kabul edilen söz dizimini belirtir.
SimpleName
SimpleName, diğer öğelerin adlarının söz dizimi için temeldir. .dex
biçimi, burada oldukça fazla esneklik sağlar (en yaygın kaynak dillerden çok daha fazla). Basit bir ad, kısa ASCII alfabe karakterleri veya rakamları, birkaç özel kısa ASCII sembolü ve kontrol, boşluk veya özel karakter olmayan ASCII olmayan kod noktalarının çoğundan oluşur. 040
sürümünden itibaren biçim, boşluk karakterlerine (Unicode Zs
kategorisi) de izin verir. Vekil kod noktalarının (U+d800
… U+dfff
aralığında) kendi başına geçerli ad karakterleri olarak kabul edilmediğini, ancak Unicode ek karakterlerinin geçerli olduğunu (SimpleNameChar kuralı için nihai alternatifle temsil edilirler) ve bir dosyada MUTF-8 kodlamasında vekil kod noktası çiftleri olarak temsil edilmeleri gerektiğini unutmayın.
BasitAd → | ||
SimpleNameChar (SimpleNameChar)* | ||
SimpleNameChar → | ||
'A' … 'Z' |
||
| | 'a' … 'z' |
|
| | '0' … '9' |
|
| | ' ' |
DEX 040 sürümünden itibaren |
| | '$' |
|
| | '-' |
|
| | '_' |
|
| | U+00a0 |
DEX 040 sürümünden itibaren |
| | U+00a1 … U+1fff |
|
| | U+2000 … U+200a |
DEX 040 sürümünden itibaren |
| | U+2010 … U+2027 |
|
| | U+202f |
DEX 040 sürümünden itibaren |
| | U+2030 … U+d7ff |
|
| | U+e000 … U+ffef |
|
| | U+10000 … U+10ffff |
Üye Adı
field_id_item ve method_id_item tarafından kullanılır
MemberName, bir sınıfın üyesinin adıdır. Üyeler alanlar, yöntemler ve iç sınıflardır.
ÜyeAdı → | |
BasitAd | |
| | '<' BasitAd '>' |
FullClassName
TamAd, isteğe bağlı bir paket belirteci ve ardından zorunlu bir ad içeren tam nitelikli bir sınıf adıdır.
FullClassName → | |
OptionalPackagePrefix SimpleName | |
OptionalPackagePrefix → | |
(BasitAd '/' )* |
TypeDescriptor
type_id_item tarafından kullanılır
TypeDescriptor, ilkel türler, sınıflar, diziler ve void
dahil olmak üzere herhangi bir türün temsilidir. Farklı sürümlerin anlamlarını aşağıda bulabilirsiniz.
TypeDescriptor → | |
'V' |
|
| | FieldTypeDescriptor |
FieldTypeDescriptor → | |
NonArrayFieldTypeDescriptor | |
| | ('[' * 1…255)
NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor→ | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' FullClassName ';' |
ShortyDescriptor
proto_id_item tarafından kullanılır
ShortyDescriptor, döndürülen değer ve parametre türleri dahil olmak üzere bir yöntem prototipinin kısa biçimli temsilidir. Bununla birlikte, çeşitli referans (sınıf veya dizi) türleri arasında ayrım yapılmaz. Bunun yerine, tüm referans türleri tek bir 'L'
karakteriyle temsil edilir.
ShortyDescriptor → | |
ShortyReturnType (ShortyFieldType)* | |
ShortyReturnType → | |
'V' |
|
| | ShortyFieldType |
ShortyFieldType → | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
TypeDescriptor semantiği
TypeDescriptor varyantlarının her birinin anlamı budur.
Sözdizimi | Anlamı |
---|---|
V | void ; yalnızca iade türleri için geçerlidir |
Z | boolean |
B | byte |
S | short |
C | char |
İ | int |
J | long |
C | float |
D | double |
Ltam/nitelikli/ad; | fully.qualified.Name sınıfı |
[descriptor | descriptor dizisi, dizi dizileri için yinelemeli olarak kullanılabilir ancak 255'ten fazla boyuta sahip olmak geçersizdir.
|
Öğeler ve ilgili yapılar
Bu bölümde, .dex
dosyasında görünebilecek üst düzey öğelerin her birinin tanımı yer alır.
header_item
Üstbilgi bölümünde görünür
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
sihir | ubyte[8] = DEX_FILE_MAGIC | magic value. Daha fazla bilgi için yukarıdaki "DEX_FILE_MAGIC " bölümündeki tartışmaya bakın.
|
denetim toplamı | uint | Dosyanın geri kalanının (magic ve bu alan hariç her şey) adler32 kontrol
|
signature | ubyte[20] | Dosyanın geri kalanının (magic , checksum ve bu alan hariç her şey) SHA-1 imzası (karması); dosyaları benzersiz şekilde tanımlamak için kullanılır
|
file_size | uint |
Dosyanın tamamının (başlık dahil) bayt cinsinden boyutu (v40 veya önceki sürümler) Bu başlığın başlangıcından sonraki başlığa veya dosyanın tamamının (kapsayıcının) sonuna kadar olan mesafe (bayt cinsinden). (v41 veya sonraki sürümler) |
header_size | uint |
üstbilginin (bu bölümün tamamının) bayt cinsinden boyutu. Bu sayede, biçimi geçersiz kılmaksızın en azından sınırlı miktarda geriye/ileriye dönük uyumluluk sağlanabilir. 0x70 (112) bayt olmalıdır (v40 veya önceki sürümler) 0x78 (120) bayt olmalıdır (v41 veya sonraki sürümler) |
endian_tag | uint = ENDIAN_CONSTANT | endianness etiketi. Daha fazla bilgi için yukarıdaki "ENDIAN_CONSTANT
ve REVERSE_ENDIAN_CONSTANT " bölümündeki tartışmaya bakın.
|
link_size | uint | bağlantı bölümünün boyutu veya bu dosya statik olarak bağlı değilse 0 |
link_off | uint | dosyanın başlangıcından bağlantı bölümüne kadar olan ofset veya link_size == 0 ise 0 . Başlangıç, sıfırdan farklıysa link_data bölümündeki bir başlangıç olmalıdır. İşaretlenen verilerin biçimi bu dokümanda belirtilmez. Bu başlık alanı (ve önceki) çalışma zamanındaki uygulamalar tarafından kullanılmak üzere kanca olarak bırakılır.
|
map_off | uint | dosya başlangıcından harita öğesine kadar olan ofset. Sıfır olmayan ofset, data bölümündeki bir ofset olmalıdır ve veriler aşağıdaki "map_list " ile belirtilen biçimde olmalıdır.
|
string_ids_size | uint | dize tanımlayıcılar listesindeki dizelerin sayısı |
string_ids_off | uint | dosya başlangıcından dize tanımlayıcılar listesine kadar olan ofset veya string_ids_size == 0 ise 0 (bu durumun sıra dışı bir uç durum olduğunu kabul etmek gerekir). Sıfır olmayan ofset, string_ids bölümünün başına yönlendirilmelidir.
|
type_ids_size | uint | tür tanımlayıcıları listesindeki öğelerin sayısı (en fazla 65.535) |
type_ids_off | uint | dosya başlangıcından tür tanımlayıcıları listesine kadar olan ofset veya type_ids_size == 0 ise 0 (bu durumun sıra dışı bir uç durum olduğunu kabul etmek gerekir). Sıfır olmayan ofset, type_ids bölümünün başına yönlendirilmelidir.
|
proto_ids_size | uint | prototip tanımlayıcılar listesindeki öğelerin sayısı (en fazla 65.535) |
proto_ids_off | uint | dosya başlangıcından prototip tanımlayıcıları listesine kadar olan ofset veya proto_ids_size == 0 ise 0 (bu durumun sıra dışı bir uç durum olduğunu kabul etmek gerekir). Sıfır olmayan ofset, proto_ids bölümünün başına yönlendirilmelidir.
|
field_ids_size | uint | alan tanımlayıcıları listesindeki öğelerin sayısı |
field_ids_off | uint | dosya başlangıcından alan tanımlayıcılar listesine kadar olan ofset veya field_ids_size == 0 ise 0 . Sıfır olmayan ofset, field_ids bölümünün başına yönlendirilmelidir. |
method_ids_size | uint | yöntem tanımlayıcıları listesindeki öğelerin sayısı |
method_ids_off | uint | dosya başlangıcından yöntem tanımlayıcılar listesine kadar olan ofset veya method_ids_size == 0 ise 0 . Sıfır olmayan ofset, method_ids bölümünün başına yönlendirilmelidir. |
class_defs_size | uint | sınıf tanımları listesindeki öğelerin sayısı |
class_defs_off | uint | dosya başlangıcından sınıf tanımları listesine kadar olan ofset veya class_defs_size == 0 ise 0 (bu durumun sıra dışı bir uç durum olduğunu kabul etmek gerekir). Sıfır olmayan ofset, class_defs bölümünün başına yönlendirilmelidir.
|
data_size | uint |
Kullanılmayan (v41 veya sonraki sürümler) |
data_off | uint |
dosyanın başlangıcından Kullanılmayan (v41 veya sonraki sürümler) |
container_size | uint |
bu alan mevcut değil. dosyanın tamamının boyutu (diğer dex başlıkları ve verileri dahil). (v41 veya sonraki sürümler) |
header_offset | uint |
bu alan mevcut değil. dosyanın başlangıcından bu başlığın başına kadar olan ofset. (v41 veya sonraki sürümler) |
map_list
Veriler bölümünde görünür.
header_item öğesinden referans verilen
Hizalama: 4 bayt
Bu, bir dosyanın tüm içeriğinin sıralı bir listesidir. header_item
ile ilgili bazı yedek bilgiler içerir ancak dosyanın tamamında iterasyon yapmak için kullanımı kolay bir form olarak tasarlanmıştır. Belirli bir tür, bir haritada en fazla bir kez görünmelidir ancak biçimin geri kalanının ima ettiği kısıtlamalar dışında (ör. önce bir header
bölümü, ardından bir string_ids
bölümü vb.) türlerin hangi sırada görünebileceğiyle ilgili bir kısıtlama yoktur. Ayrıca, harita girişleri ilk ofsete göre sıralanmış olmalı ve çakışmamalıdır.
Ad | Biçimi | Açıklama |
---|---|---|
beden | uint | listenin giriş cinsinden boyutu |
liste | map_item[size] | listenin öğeleri |
map_item biçimi
Ad | Biçimi | Açıklama |
---|---|---|
tür | ushort | öğelerin türü (aşağıdaki tabloya bakın) |
unused | ushort | (unused) |
beden | uint | Belirtilen ofsette bulunacak öğelerin sayısı |
ofset | uint | Dosyanın başlangıcından söz konusu öğelere kadar olan ofset |
Kodlar
Öğe Türü | Sabit | Değer | Öğe Boyutu (Bayt) |
---|---|---|---|
header_item | TYPE_HEADER_ITEM | 0x0000 | 0x70 |
string_id_item | TYPE_STRING_ID_ITEM | 0x0001 | 0x04 |
type_id_item | TYPE_TYPE_ID_ITEM | 0x0002 | 0x04 |
proto_id_item | TYPE_PROTO_ID_ITEM | 0x0003 | 0x0c |
field_id_item | TYPE_FIELD_ID_ITEM | 0x0004 | 0x08 |
method_id_item | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
class_def_item | TYPE_CLASS_DEF_ITEM | 0x0006 | 0x20 |
call_site_id_item | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x04 |
method_handle_item | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
map_list | TYPE_MAP_LIST | 0x1000 | 4 + (item.size * 12) |
type_list | TYPE_TYPE_LIST | 0x1001 | 4 + (item.size * 2) |
annotation_set_ref_list | TYPE_ANNOTATION_SET_REF_LIST | 0x1002 | 4 + (item.size * 4) |
annotation_set_item | TYPE_ANNOTATION_SET_ITEM | 0x1003 | 4 + (item.size * 4) |
class_data_item | TYPE_CLASS_DATA_ITEM | 0x2000 | örtük; ayrıştırılmalıdır |
code_item | TYPE_CODE_ITEM | 0x2001 | örtük; ayrıştırılmalıdır |
string_data_item | TYPE_STRING_DATA_ITEM | 0x2002 | örtük; ayrıştırılmalıdır |
debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | örtülü; ayrıştırılmalıdır |
annotation_item | TYPE_ANNOTATION_ITEM | 0x2004 | örtülü; ayrıştırılmalıdır |
encoded_array_item | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | örtülü; ayrıştırılmalıdır |
annotations_directory_item | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | örtülü; ayrıştırılmalıdır |
hiddenapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | örtük; ayrıştırılmalıdır |
string_id_item
string_ids bölümünde görünür.
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
string_data_off | uint | dosya başlangıcından bu öğenin dize verilerine kadar olan ofset. Ofset, data bölümündeki bir konuma ait olmalı ve veriler aşağıdaki "string_data_item " ile belirtilen biçimde olmalıdır.
Ofset için hizalama koşulu yoktur.
|
string_data_item
Veriler bölümünde görünür.
Hizalama: yok (bayt hizalı)
Ad | Biçimi | Açıklama |
---|---|---|
utf16_size | uleb128 | UTF-16 kod birimleri cinsinden bu dizenin boyutu (birçok sistemde "dize uzunluğu"dur). Yani bu, dizenin kod çözülmüş uzunluğudur. (Kodlanan uzunluk, 0 baytının konumuyla belirtilir.) |
aktarma | ubyte[] | Bir dizi MUTF-8 kod birimi (diğer adıyla sekizli, diğer adıyla bayt) ve ardından 0 değerine sahip bir bayt. Veri biçimiyle ilgili ayrıntılar ve tartışma için yukarıdaki "MUTF-8 (Değiştirilmiş UTF-8) Kodlaması"na bakın.
Not: UTF-16 yedek kod birimleri (yani |
type_id_item
type_ids bölümünde görünür.
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
descriptor_idx | uint | Bu türdeki tanımlayıcı dizesi için string_ids listesinde dizin Dize, yukarıda tanımlanan TypeDescriptor sözdizimine uygun olmalıdır.
|
proto_id_item
proto_ids bölümünde görünür.
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
shorty_idx | uint | bu prototipin kısa açıklama dizesi için string_ids listesinde dizin oluşturma Dize, yukarıda tanımlanan ShortyDescriptor sözdizimine uygun olmalı ve bu öğenin döndürülen türüne ve parametrelerine karşılık gelmelidir.
|
return_type_idx | uint | bu prototipin döndürülen türü için type_ids listesinde dizin
|
parameters_off | uint | dosya başlangıcından bu prototipin parametre türleri listesine kadar olan mesafeyi veya bu prototipin parametresi yoksa 0 değerini döndürür. Sıfırdan farklıysa bu ofset data bölümünde olmalı ve buradaki veriler aşağıda "type_list" ile belirtilen biçimde olmalıdır. Ayrıca, listede void türüne referans
|
field_id_item
field_ids bölümünde görünür.
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
class_idx | ushort | Bu alanın tanımlayıcısı için type_ids listesinde dizin. Bu, dizi veya ilkel tür değil, sınıf türü olmalıdır.
|
type_idx | ushort | Bu alanın türü için type_ids listesinde dizin
|
name_idx | uint | bu alanın adı için string_ids listesinde dizin oluşturma Dize, yukarıda tanımlanan ÜyeAdı söz dizimine uymalıdır.
|
method_id_item
method_ids bölümünde görünür.
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
class_idx | ushort | Bu yöntemin tanımlayıcısı için type_ids listesinde dizin. Bu, ilkel tür değil, sınıf veya dizi türü olmalıdır.
|
proto_idx | ushort | Bu yöntemin prototipi için proto_ids listesinde dizin
|
name_idx | uint | bu yöntemin adı için string_ids listesinde dizin oluşturma Dize, yukarıda tanımlanan ÜyeAdı söz dizimine uymalıdır.
|
class_def_item
class_defs bölümünde görünür
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
class_idx | uint | bu sınıfın type_ids listesinde dizin.
Bu, dizi veya ilkel tür değil, sınıf türü olmalıdır.
|
access_flags | uint | sınıf için erişim işaretleri (public , final vb.). Ayrıntılar için "access_flags Tanımlar" bölümüne bakın.
|
superclass_idx | uint | üst sınıf için type_ids listesindeki dizin veya bu sınıfın üst sınıfı yoksa (yani Object gibi bir kök sınıfsa) sabit değer NO_INDEX . Mevcutsa bu, dizi veya ilkel tür değil, sınıf türü olmalıdır.
|
interfaces_off | uint | dosya başlangıcından arayüz listesine kadar olan ofset veya böyle bir arayüz yoksa 0 . Bu ofset, data bölümünde olmalıdır ve buradaki veriler aşağıdaki "type_list " ile belirtilen biçimde olmalıdır. Listenin her bir öğesi sınıf türü olmalıdır (dizi veya ilkel tür olmamalıdır) ve yinelenen öğe bulunmamalıdır.
|
source_file_idx | uint | sınıfın (en azından büyük bir kısmının) orijinal kaynağını içeren dosyanın adı için string_ids listesinde dizin veya bu bilgilerin eksikliğini temsil eden özel değer NO_INDEX . Belirli bir yöntemin debug_info_item , bu kaynak dosyayı geçersiz kılabilir ancak çoğu sınıfın yalnızca bir kaynak dosyadan gelmesi beklenir.
|
annotations_off | uint | dosya başlangıcından bu sınıfın ek açıklama yapısına kadar olan ofset veya bu sınıfta ek açıklama yoksa 0 . Bu ofset, sıfırdan farklıysa data bölümünde olmalıdır ve buradaki veriler, aşağıda "annotations_directory_item " ile belirtilen biçimde olmalıdır. Tüm öğeler, tanımlayıcısı olarak bu sınıfa atıfta bulunur.
|
class_data_off | uint | dosya başlangıcından bu öğeyle ilişkili sınıf verilerine kadar olan ofset veya bu sınıf için sınıf verisi yoksa 0 . (Örneğin, bu sınıf bir işaretçi arayüzüyse bu durum söz konusu olabilir.) Sıfır olmayan ofset, data bölümünde olmalıdır ve buradaki veriler aşağıdaki "class_data_item " ile belirtilen biçimde olmalıdır. Tüm öğeler, tanımlayıcısı olarak bu sınıfa atıfta bulunmalıdır.
|
static_values_off | uint | dosyanın başlangıcından static alanlarının ilk değer listesine veya hiç yoksa 0 'a (ve tüm static alanları 0 veya null ile başlatılacaksa) olan ofset. Bu ofset data bölümünde olmalı ve buradaki veriler aşağıdaki "encoded_array_item " ile belirtilen biçimde olmalıdır. Dizi boyutu, bu sınıf tarafından tanımlanan static alanlarının sayısından büyük olmamalıdır ve öğeler, ilgili field_list içinde tanımlandığı sırayla static alanlarına karşılık gelir. Her dizi öğesinin türü, karşılık gelen alanının bildirilen türüyle eşleşmelidir.
Dizideki öğe sayısı static alanından azsa kalan alanlar, türe uygun bir 0 veya null ile başlatılır.
|
call_site_id_item
call_site_ids bölümünde görünür
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
call_site_off | uint | Site tanımını çağırmak için dosyanın başlangıcından itibaren ofset. Ofset, veri bölümünde olmalıdır ve buradaki veriler aşağıdaki "call_site_item" tarafından belirtilen biçimde olmalıdır. |
call_site_item
Veriler bölümünde görünür.
Hizalama: yok (bayt hizalı)
call_site_item, öğeleri bir bootstrap bağlayıcı yöntemine sağlanan bağımsız değişkenlere karşılık gelen bir encoded_array_item öğesidir. İlk üç bağımsız değişken şunlardır:
- Önyükleme bağlayıcı yöntemini temsil eden bir yöntem tutamaç (VALUE_METHOD_HANDLE).
- Önyükleme bağlayıcısının çözümlemesi gereken bir yöntem adı (VALUE_STRING).
- Çözülecek yöntem adının türüne karşılık gelen bir yöntem türü (VALUE_METHOD_TYPE).
Ek bağımsız değişkenler, önyükleme bağlayıcı yöntemine iletilen sabit değerlerdir. Bu bağımsız değişkenler sırayla ve herhangi bir tür dönüştürme işlemi yapılmadan iletilir.
Bootstrap bağlayıcı yöntemini temsil eden yöntem adı, java.lang.invoke.CallSite
döndürme türüne sahip olmalıdır. İlk üç parametre türü şunlardır:
java.lang.invoke.Lookup
java.lang.String
java.lang.invoke.MethodType
Ek bağımsız değişkenlerin parametre türleri, sabit değerlerine göre belirlenir.
method_handle_item
method_handles bölümünde görünür
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
method_handle_type | ushort | yöntem tutamacının türü (aşağıdaki tabloya bakın) |
unused | ushort | (unused) |
field_or_method_id | ushort | Yöntem adı türünün erişim yöntemi mi yoksa yöntem çağırıcı mı olduğuna bağlı olarak alan veya yöntem kimliği |
unused | ushort | (unused) |
Yöntem herkese açık kullanıcı adı türü kodları
Sabit | Değer | Açıklama |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0x00 | Yöntem adı, statik bir alan ayarlayıcısıdır (erişimci). |
METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | Yöntem adı, statik bir alan alıcısıdır (erişimci). |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | Yöntem adı, örnek alan ayarlayıcısıdır (erişimci). |
METHOD_HANDLE_TYPE_INSTANCE_GET | 0x03 | Yöntem adı, bir örnek alan alıcısıdır (erişimci). |
METHOD_HANDLE_TYPE_INVOKE_STATIC | 0x04 | Yöntem adı, statik bir yöntem çağırıcıdır |
METHOD_HANDLE_TYPE_INVOKE_INSTANCE | 0x05 | Yöntem adı, bir örnek yöntemi çağırıcısıdır |
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR | 0x06 | Yöntem adı, bir kurucu yöntemi çağırıcısıdır |
METHOD_HANDLE_TYPE_INVOKE_DIRECT | 0x07 | Yöntem adı, doğrudan yöntem çağırıcıdır |
METHOD_HANDLE_TYPE_INVOKE_INTERFACE | 0x08 | Yöntem herkese açık kullanıcı adı, bir arayüz yöntemi çağırıcısıdır |
class_data_item
class_def_item tarafından referans verilen
Veriler bölümünde görünür.
Hizalama: yok (bayt hizalı)
Ad | Biçimi | Açıklama |
---|---|---|
static_fields_size | uleb128 | Bu öğede tanımlanan statik alanların sayısı |
instance_fields_size | uleb128 | Bu öğede tanımlanan örnek alanı sayısı |
direct_methods_size | uleb128 | Bu öğede tanımlanan doğrudan yöntemlerin sayısı |
virtual_methods_size | uleb128 | Bu öğede tanımlanan sanal yöntemlerin sayısı |
static_fields | encoded_field[static_fields_size] | Kodlanmış öğeler dizisi olarak temsil edilen tanımlanmış statik alanlar. Alanlar field_idx sütununa göre artan düzende sıralanmış olmalıdır.
|
instance_fields | encoded_field[instance_fields_size] | Kodlanmış öğe dizisi olarak temsil edilen tanımlanmış örnek alanları. Alanlar field_idx sütununa göre artan düzende sıralanmış olmalıdır.
|
direct_methods | encoded_method[direct_methods_size] | Kodlanmış öğelerin dizisi olarak temsil edilen, tanımlanmış doğrudan (static , private veya yapıcıdan herhangi biri) yöntemler. Yöntemler method_idx sütununa göre artan düzende sıralanmalıdır.
|
virtual_methods | encoded_method[virtual_methods_size] | Kodlanmış öğelerin dizisi olarak temsil edilen, tanımlanmış sanal (static , private veya yapıcı yöntemlerinden hiçbiri) yöntemler. Bu liste, bu öğenin temsil ettiği sınıf tarafından geçersiz kılınmadığı sürece devralınan yöntemleri içermemelidir. Yöntemler, method_idx sütununa göre artan düzende sıralanmalıdır.
Sanal yöntemin method_idx değeri, doğrudan yöntemlerle aynı olmamalıdır.
|
Not: Tüm öğelerin field_id
ve method_id
örnekleri aynı tanımlama sınıfına referans vermelidir.
encoded_field biçimi
Ad | Biçimi | Açıklama |
---|---|---|
field_idx_diff | uleb128 | Bu alanın kimliği için field_ids listesinde dizin (adı ve tanımlayıcıyı içerir), listedeki önceki öğenin dizininden fark olarak temsil edilir. Bir listedeki ilk öğenin dizini doğrudan temsil edilir.
|
access_flags | uleb128 | alan için erişim işaretleri (public , final vb.). Ayrıntılar için "access_flags Tanımlar" bölümüne bakın.
|
encoded_method biçimi
Ad | Biçimi | Açıklama |
---|---|---|
method_idx_diff | uleb128 | Bu yöntemin kimliği için method_ids listesinde dizin (adı ve tanımlayıcıyı içerir), listedeki önceki öğenin dizininden fark olarak temsil edilir. Bir listedeki ilk öğenin dizini doğrudan temsil edilir.
|
access_flags | uleb128 | yöntemin erişim işaretleri (public , final vb.). Ayrıntılar için "access_flags Tanımlar" bölümüne bakın.
|
code_off | uleb128 | dosyanın başlangıcından bu yöntemin kod yapısına kadar olan ofset veya bu yöntem abstract veya native ise 0 . Başlangıç, data bölümündeki bir konuma ayarlanmalıdır. Verilerin biçimi aşağıdaki "code_item " ile belirtilir.
|
type_list
class_def_item ve proto_id_item öğelerinden referans alınmıştır
Veriler bölümünde görünür.
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
beden | uint | listenin giriş cinsinden boyutu |
liste | type_item[size] | listenin öğeleri |
type_item biçimi
Ad | Biçimi | Açıklama |
---|---|---|
type_idx | ushort | type_ids listesinde dizin |
code_item
encoded_method tarafından referans verilen
Veriler bölümünde görünür.
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
registers_size | ushort | Bu kod tarafından kullanılan kaydedici sayısı |
ins_size | ushort | Bu kodun ait olduğu yönteme gelen bağımsız değişkenlerin kelime sayısı |
outs_size | ushort | yöntem çağrısı için bu kod tarafından gereken çıkış bağımsız değişkeni alanının kelime sayısı |
tries_size | ushort | Bu örnek için try_item sayısı. Sıfırdan farklıysa bu değerler, bu örnekte insns değerinin hemen ardından tries dizisi olarak görünür.
|
debug_info_off | uint | dosya başlangıcından bu kod için hata ayıklama bilgisine (satır numaraları + yerel değişken bilgisi) kadar olan ofset veya bilgi yoksa 0 . Başlangıç değeri sıfırdan farklıysa data bölümündeki bir konuma yönlendirmelidir. Verilerin biçimi, aşağıdaki "debug_info_item " ile belirtilir.
|
insns_size | uint | talimat listesinin boyutu (16 bit kod birimi cinsinden) |
insns | ushort[insns_size] | gerçek bayt kodu dizisi. insns dizisindeki kod biçimi, Dalvik bytecode adlı tamamlayıcı doküman tarafından belirtilir. Bu, ushort dizisi olarak tanımlanmış olsa da dört baytlık hizalamayı tercih eden bazı dahili yapılar olduğunu unutmayın. Ayrıca, bu işlem bir endian değişimli dosyada gerçekleşirse değişim yalnızca daha büyük dahili yapılarda değil, ayrı ushort örneklerde yapılır.
|
padding | ushort (isteğe bağlı) = 0 | tries dört baytlık hizalı hale getirmek için iki baytlık dolgu.
Bu öğe yalnızca tries_size sıfırdan farklıysa ve insns_size tek sayıysa bulunur.
|
deneme | try_item[tries_size] (isteğe bağlı) | istisnaların kodun neresinde yakalandığını ve nasıl ele alınacağını belirten bir dizi. Dizideki öğeler, aralık içinde çakışmamalı ve düşükten yükseğe doğru adres sırasına göre olmalıdır. Bu öğe yalnızca tries_size sıfırdan farklıysa bulunur.
|
işleyiciler | encoded_catch_handler_list (isteğe bağlı) | Yakalama türlerinin ve ilişkili işleyici adreslerinin listelerinin listesini temsil eden baytlar. Her try_item , bu yapıda bayt bazında bir ofsete sahiptir. Bu öğe yalnızca tries_size sıfırdan farklıysa mevcuttur.
|
try_item biçimi
Ad | Biçimi | Açıklama |
---|---|---|
start_addr | uint | Bu girişin kapsadığı kod bloğunun başlangıç adresi. Adres, kapsanan ilk talimatın başına kadar olan 16 bitlik kod birimlerinin sayısıdır. |
insn_count | ushort | Bu girişin kapsadığı 16 bit kod birimi sayısı. Kapsanan son kod birimi (dahil) start_addr + insn_count - 1 .
|
handler_off | ushort | Bu girişin ilişkili encoded_catch_hander_list başlangıcından encoded_catch_handler sonuna kadar olan baytlık ofset. Bu, encoded_catch_handler başlangıcına göre bir ofset olmalıdır.
|
encoded_catch_handler_list biçimi
Ad | Biçimi | Açıklama |
---|---|---|
beden | uleb128 | Bu listenin giriş cinsinden boyutu |
liste | encoded_catch_handler[handlers_size] | Doğrudan (ofset olarak değil) temsil edilen ve sırayla birleştirilen gerçek işleyici listeleri |
encoded_catch_handler biçimi
Ad | Biçimi | Açıklama |
---|---|---|
beden | sleb128 | Bu listedeki yakalama türlerinin sayısı. Pozitif değilse bu, yakalama türlerinin sayısının negatif değeridir ve yakalamaların ardından her şeyi yakalayan bir işleyici gelir. Örneğin: 0 için size
ifadesi, her şeyi yakalayan bir yakalama olduğunu ancak açıkça yazılmış yakalama olmadığını gösterir.
2 of 2 , açıkça yazılmış iki yakalama olduğunu ve her şeyi yakalayan bir yakalama olmadığını gösterir.size size of -1 ise
her şeye uyan bir yakalama ifadesiyle birlikte bir tane yazılmış yakalama ifadesi olduğu anlamına gelir.
|
işleyiciler | encoded_type_addr_pair[abs(size)] | abs(size) kodlanmış öğe akışı (her yakalanan tür için bir tane, türlerin test edilme sırasına göre).
|
catch_all_addr | uleb128 (isteğe bağlı) | Tümünü yakalama işleyicisinin bayt kodu adresi. Bu öğe yalnızca size pozitif değilse bulunur.
|
encoded_type_addr_pair biçimi
Ad | Biçimi | Açıklama |
---|---|---|
type_idx | uleb128 | yakalanacak istisna türü için type_ids listesinde dizin
|
addr | uleb128 | İlişkili istisna işleyicinin bayt kodu adresi |
debug_info_item
code_item öğesinden referans verilen
Veriler bölümünde görünür.
Hizalama: yok (bayt hizalı)
Her debug_info_item
, yorumlandığında bir code_item
için konum tablosunu ve (potansiyel olarak) yerel değişken bilgilerini yayan, DWARF3'ten esinlenilmiş bir bayt kodlu durum makinesi tanımlar. Dize, değişken uzunlukta bir başlık (uzunluğu yöntem parametrelerinin sayısına bağlıdır) ile başlar, durum makinesi bayt kodlarıyla devam eder ve DBG_END_SEQUENCE
baytıyla biter.
Durum makinesi beş kayıttan oluşur. address
kaydedicisi, ilişkili insns_item
'daki talimat ofsetini 16 bitlik kod birimlerinde temsil eder. address
kaydedicisi, her debug_info
dizisinin başında 0
ile başlar ve yalnızca tekdüze artmalıdır.
line
yazma kaydedicisi, durum makinesi tarafından yayınlanan bir sonraki konumlar tablosu girişiyle ilişkilendirilmesi gereken kaynak satır numarasını temsil eder. Sıralı üstbilgide başlatılır ve pozitif veya negatif yönde değişebilir ancak hiçbir zaman 1
'ten az olmamalıdır. source_file
yazma kaydedicisi, satır numarası girişlerinin atıfta bulunduğu kaynak dosyayı temsil eder. class_def_item
bağımsız değişkeni, class_def_item
içindeki source_file_idx
değerine ayarlanır.
Diğer iki değişken olan prologue_end
ve epilogue_begin
, oluşturulan bir sonraki konumun yöntem prologu mu yoksa epilogu mu olarak kabul edileceğini belirten boole işaretleridir (false
olarak başlatılır). Durum makinesi, DBG_RESTART_LOCAL
kodu için her kayıtta bulunan son yerel değişkenin adını ve türünü de izlemelidir.
Üstbilgi şu şekildedir:
Ad | Biçimi | Açıklama |
---|---|---|
line_start | uleb128 | durum makinesinin line yazmacısının başlangıç değeri.
Gerçek bir pozisyon girişini temsil etmez.
|
parameters_size | uleb128 | Kodlanan parametre adlarının sayısı. Varsa örnek yönteminin this parametresi hariç, her yöntem parametresi için bir tane olmalıdır.
|
parameter_names | uleb128p1[parameters_size] | yöntem parametresi adının dize dizini. NO_INDEX kodlu bir değer, ilişkili parametre için ad kullanılamadığını gösterir. Tür tanımlayıcısı ve imzası, yöntem tanımlayıcısı ve imzasından anlaşılır.
|
Bayt kodu değerleri şunlardır:
Ad | Değer | Biçim | Argümanlar | Açıklama |
---|---|---|---|---|
DBG_END_SEQUENCE | 0x00 | (yok) | code_item için hata ayıklama bilgileri sırasını sonlandırır |
|
DBG_ADVANCE_PC | 0x01 | uleb128 addr_diff | addr_diff : Adres siciline eklenecek tutar |
Bir konum girişi yayınlamadan adres kaydını ilerletir. |
DBG_ADVANCE_LINE | 0x02 | sleb128 line_diff | line_diff : satır kaydını değiştirecek tutar |
Bir konum girişi yayınlamadan satır kaydediciyi ilerletir. |
DBG_START_LOCAL | 0x03 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx |
register_num : yerel dizini içeren kayıtname_idx : adın dize dizinitype_idx : türün tür dizini
|
mevcut adreste yerel bir değişken oluşturur. Değerin bilinmediğini belirtmek için name_idx veya type_idx yerine NO_INDEX kullanılabilir.
|
DBG_START_LOCAL_EXTENDED | 0x04 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx uleb128p1 sig_idx |
register_num : yerel dizini içeren kayıtname_idx : adın dize dizinitype_idx : türün dize dizinisig_idx : tür imzasının dize dizini
|
Mevcut adreste bir tür imzası olan yerel bir öğe tanıtır.
name_idx , type_idx veya sig_idx değerlerinden biri, değerin bilinmediğini belirtmek için NO_INDEX olabilir. (Ancak sig_idx -1 ise aynı veriler DBG_START_LOCAL kod komutu kullanılarak daha verimli bir şekilde temsil edilebilir.)
Not: İmzaları işlemeyle ilgili uyarılar için aşağıdaki " |
DBG_END_LOCAL | 0x05 | uleb128 register_num | register_num : yerel içeren kayıt |
Şu anda etkin olan yerel bir değişkeni, geçerli adreste kapsam dışında olarak işaretler |
DBG_RESTART_LOCAL | 0x06 | uleb128 register_num | register_num : Yeniden başlatmak için kaydolun |
Mevcut adreste yerel bir değişkeni yeniden tanıtır. Ad ve tür, belirtilen kayıt defterinde etkin olan son yerel kayıtla aynıdır. |
DBG_SET_PROLOGUE_END | 0x07 | (yok) | prologue_end durum makinesi kaydını ayarlayarak, eklenen sonraki konum girişinin bir yöntem prologunun (yöntem kesme noktası için uygun bir yer) sonu olarak kabul edilmesi gerektiğini belirtir. prologue_end kaydedicisi, herhangi bir özel (>= 0x0a ) işlem kodu tarafından silinir.
|
|
DBG_SET_EPILOGUE_BEGIN | 0x08 | (yok) | epilogue_begin durum makinesi kaydını ayarlayarak, eklenen sonraki konum girişinin bir yöntem epilogunun başlangıcı (yöntemden çıkmadan önce yürütmeyi askıya almak için uygun bir yer) olarak kabul edilmesi gerektiğini belirtir.
epilogue_begin kaydedicisi, herhangi bir özel (>= 0x0a ) işlem koduyla silinir.
|
|
DBG_SET_FILE | 0x09 | uleb128p1 name_idx | name_idx : kaynak dosya adının dize dizini; bilinmiyorsa NO_INDEX
|
code_item içinde belirtilen varsayılan ad yerine, sonraki tüm satır numarası girişlerinin bu kaynak dosya adını referans aldığını belirtir.
|
Özel İşlem Kodları | 0x0a…0xff | (yok) | line ve address kaydedicilerini ileri götürür, bir konum girişi verir ve prologue_end ile epilogue_begin 'ı temizler. Açıklama için aşağıya bakın.
|
Özel işlem kodları
0x0a
ile 0xff
arasında (dahil) değerlere sahip kod komutları hem line
hem de address
kaydedicilerini küçük bir miktarda hareket ettirir ve ardından yeni bir konum tablosu girişi yayınlar.
Artışların formülü aşağıdaki gibidir:
DBG_FIRST_SPECIAL = 0x0a // the smallest special opcode DBG_LINE_BASE = -4 // the smallest line number increment DBG_LINE_RANGE = 15 // the number of line increments represented adjusted_opcode = opcode - DBG_FIRST_SPECIAL line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE) address += (adjusted_opcode / DBG_LINE_RANGE)
annotations_directory_item
class_def_item tarafından referans verilen
Veriler bölümünde görünür.
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
class_annotations_off | uint | sınıfın doğrudan ek açıklamaları varsa dosyanın başlangıcından sınıfa yapılan ek açıklamalara kadar olan ofset veya sınıfta doğrudan ek açıklama yoksa 0 .
Başlangıç değeri sıfırdan farklıysa data bölümündeki bir konuma yönlendirmelidir. Verilerin biçimi aşağıdaki "annotation_set_item " ile belirtilir.
|
fields_size | uint | Bu öğe tarafından ek açıklama eklenmiş alanların sayısı |
annotated_methods_size | uint | Bu öğe tarafından ek açıklama eklenmiş yöntemlerin sayısı |
annotated_parameters_size | uint | Bu öğe tarafından ek açıklama eklenmiş yöntem parametresi listelerinin sayısı |
field_annotations | field_annotation[fields_size] (isteğe bağlı) | ilişkili alan ek açıklamalarının listesi. Listenin öğeleri field_idx değerine göre artan düzende sıralanmış olmalıdır.
|
method_annotations | method_annotation[methods_size] (isteğe bağlı) | ilişkili yöntem ek açıklamalarının listesi. Listenin öğeleri method_idx değerine göre artan düzende sıralanmış olmalıdır.
|
parameter_annotations | parameter_annotation[parameters_size] (isteğe bağlı) | ilişkili yöntem parametresi ek açıklamalarının listesi. Listenin öğeleri method_idx değerine göre artan düzende sıralanmış olmalıdır.
|
Not: Tüm öğelerin field_id
ve method_id
örnekleri aynı tanımlama sınıfına referans vermelidir.
field_annotation biçimi
Ad | Biçimi | Açıklama |
---|---|---|
field_idx | uint | Açıklama yapılan alanın kimliği için field_ids listesinde dizin
|
annotations_off | uint | dosya başlangıcından alanın ek açıklamaları listesine kadar olan mesafedir. Başlangıç, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki "annotation_set_item " ile belirtilir.
|
method_annotation biçimi
Ad | Biçimi | Açıklama |
---|---|---|
method_idx | uint | Açıklama yapılan yöntemin kimliği için method_ids listesinde dizin
|
annotations_off | uint | dosya başlangıcından yöntemin ek açıklamaları listesine kadar olan mesafedir. Başlangıç, data bölümündeki bir konuma ayarlanmalıdır. Verilerin biçimi aşağıdaki "annotation_set_item " ile belirtilir.
|
parameter_annotation biçimi
Ad | Biçimi | Açıklama |
---|---|---|
method_idx | uint | Parametreleri ek açıklamaya tabi tutulan yöntemin kimliği için method_ids listesinde dizin
|
annotations_off | uint | dosya başlangıcından yöntem parametrelerinin ek açıklamaları listesine kadar olan mesafe. Başlangıç, data bölümündeki bir konuma ayarlanmalıdır. Verilerin biçimi aşağıdaki "annotation_set_ref_list " ile belirtilir.
|
annotation_set_ref_list
parameter_annotations_item kaynağından referans alınmıştır
Veriler bölümünde görünür.
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
beden | uint | listenin giriş cinsinden boyutu |
liste | annotation_set_ref_item[size] | listenin öğeleri |
annotation_set_ref_item biçimi
Ad | Biçimi | Açıklama |
---|---|---|
annotations_off | uint | dosya başlangıcından referans verilen ek açıklama setine kadar olan ofset veya bu öğe için ek açıklama yoksa 0 .
Başlangıç değeri sıfırdan farklıysa data bölümündeki bir konuma yönlendirmelidir. Verilerin biçimi aşağıdaki "annotation_set_item " ile belirtilir.
|
annotation_set_item
annotations_directory_item, field_annotations_item, method_annotations_item ve annotation_set_ref_item öğelerinden referans alır.
Veriler bölümünde görünür.
Hizalama: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
beden | uint | kümenin giriş cinsinden boyutu |
girişler | annotation_off_item[size] | öğelerini içerir. Öğeler type_idx sütununa göre artan düzende sıralanmış olmalıdır.
|
annotation_off_item biçimi
Ad | Biçimi | Açıklama |
---|---|---|
annotation_off | uint | dosyanın başlangıcından bir ek açıklamaya kadar olan mesafe.
Ofset, data bölümündeki bir konuma ait olmalıdır ve bu konumdaki verilerin biçimi aşağıdaki "annotation_item " ile belirtilir.
|
annotation_item
annotation_set_item öğesinden referans alınmıştır
Veriler bölümünde görünür.
Hizalama: yok (bayt hizalı)
Ad | Biçimi | Açıklama |
---|---|---|
görünürlük | ubyte | bu ek açıklamanın amaçlanan görünürlüğü (aşağıya bakın) |
ek açıklama | encoded_annotation | Yukarıdaki "encoded_value kodlama" bölümündeki "encoded_annotation biçimi" bölümünde açıklanan biçimte kodlanmış ek açıklama içerikleri.
|
Görünürlük değerleri
annotation_item
içindeki visibility
alanı için seçenekler şunlardır:
Ad | Değer | Açıklama |
---|---|---|
VISIBILITY_BUILD | 0x00 | Yalnızca derleme zamanında (ör. diğer kodun derlenmesi sırasında) görünmesi amaçlanan |
VISIBILITY_RUNTIME | 0x01 | çalışma zamanında görünmesi amaçlanan |
VISIBILITY_SYSTEM | 0x02 | Çalışma zamanında görünmesi amaçlanmasına rağmen yalnızca temel sistem tarafından görülebilen (normal kullanıcı kodu tarafından görülemeyen) |
encoded_array_item
class_def_item tarafından referans verilen
Veriler bölümünde görünür.
Hizalama: yok (bayt hizalı)
Ad | Biçimi | Açıklama |
---|---|---|
değer | encoded_array | Yukarıdaki "encoded_value Kodlama" bölümündeki "encoded_array
|
hiddenapi_class_data_item
Bu bölümde, her sınıfın kullandığı kısıtlanmış arayüzlere ilişkin veriler yer alır.
Not: Gizli API özelliği Android 10.0'da kullanıma sunulmuştur ve yalnızca önyükleme sınıfı yolundaki sınıfların DEX dosyaları için geçerlidir. Aşağıda açıklanan işaretlerin listesi, Android'in gelecekteki sürümlerinde genişletilebilir. Daha fazla bilgi için SDK olmayan arayüzlerdeki kısıtlamalar bölümüne bakın.
Ad | Biçimi | Açıklama |
---|---|---|
beden | uint | bölümün toplam boyutu |
ofsetler | uint[] | class_idx tarafından dizine eklenen bir uzaklık dizisi.
class_idx dizininde sıfır dizi girişi, bu class_idx için veri olmadığı veya tüm gizli API işaretlerinin sıfır olduğu anlamına gelir.
Aksi takdirde dizi girişi sıfırdan farklıdır ve bölümün başından bu class_idx için gizli API işaretleri dizisine kadar olan bir ofset içerir.
|
flags | uleb128[] | her sınıf için gizli API işaretlerinin birleştirilmiş dizileri. Olası işaret değerleri aşağıdaki tabloda açıklanmıştır. İşaretler, sınıf verilerindeki alanlar ve yöntemlerle aynı sırada kodlanır. |
Kısıtlama işareti türleri:
Ad | Değer | Açıklama |
---|---|---|
beyaz liste | 0 | Resmi olarak belgelenmiş Android çerçevesinin Paket Dizini kapsamında özgürce kullanılabilen ve desteklenen arayüzler. |
gri liste | 1 | Uygulamanın hedef API düzeyinden bağımsız olarak kullanılabilen SDK dışı arayüzler. |
kara listeye al | 2 | Uygulamanın hedef API düzeyinden bağımsız olarak kullanılamayan SDK dışı arayüzler. Bu arayüzlerden birine erişmek çalışma zamanı hatasına neden olur. |
greylist‑max‑o | 3 | Kısıtlanmadığı sürece Android 8.x ve önceki sürümlerde kullanılabilen SDK dışı arayüzler. |
greylist‑max‑p | 4 | Kısıtlanmadığı sürece Android 9.x için kullanılabilen SDK dışı arayüzler. |
greylist‑max‑q | 5 | Kısıtlanmadığı sürece Android 10.x için kullanılabilen SDK dışı arayüzler. |
greylist‑max‑r | 6 | Kısıtlanmadığı sürece Android 11.x için kullanılabilen SDK dışı arayüzler. |
Sistem ek açıklamaları
Sistem ek açıklamaları, sınıflar (ve yöntemler ve alanlar) hakkında çeşitli yansıtıcı bilgi parçalarını temsil etmek için kullanılır. Bu bilgilere genellikle yalnızca istemci (sistem dışı) kodu tarafından dolaylı olarak erişilir.
Sistem ek açıklamaları, .dex
dosyalarında görünürlüğü VISIBILITY_SYSTEM
olarak ayarlanmış ek açıklamalar olarak gösterilir.
dalvik.annotation.AnnotationDefault
Ek açıklama arayüzlerindeki yöntemlerde görünür.
Varsayılan bağlamaları belirtmek isteyen her ek açıklama arayüzüne bir AnnotationDefault
ek açıklaması eklenir.
Ad | Biçimi | Açıklama |
---|---|---|
değer | Ek Açıklama | Bu ek açıklamanın varsayılan bağlamaları (bu türde bir ek açıklama olarak temsil edilir). Ek açıklamanın, ek açıklama tarafından tanımlanan tüm adları içermesi gerekmez. Eksik adlar için varsayılan değer atanmaz. |
dalvik.annotation.EnclosingClass
Sınıflarda gösterilir
Her sınıfa, başka bir sınıfın üyesi olarak tanımlanan veya anonim olan ancak bir yöntem gövdesinde tanımlanmayan (ör. sentetik bir iç sınıf) bir EnclosingClass
ek açıklama eklenir. Bu ek açıklamaya sahip her sınıfta InnerClass
ek açıklaması da olmalıdır. Ayrıca, bir sınıfta hem EnclosingClass
hem de EnclosingMethod
ek açıklaması bulunmamalıdır.
Ad | Biçimi | Açıklama |
---|---|---|
değer | Sınıf | Bu sınıfa en yakın söz dizimi kapsamına sahip sınıf |
dalvik.annotation.EnclosingMethod
Sınıflarda gösterilir
Bir yöntem gövdesinde tanımlanan her sınıfa bir EnclosingMethod
ek açıklama eklenir. Bu ek açıklamaya sahip her sınıfta InnerClass
ek açıklaması da olmalıdır.
Ayrıca, bir sınıfta hem EnclosingClass
hem de EnclosingMethod
ek açıklaması bulunmamalıdır.
Ad | Biçimi | Açıklama |
---|---|---|
değer | Yöntem | Bu sınıfın söz dizimi kapsamını en iyi şekilde belirleyen yöntem |
dalvik.annotation.InnerClass
Sınıflarda gösterilir
Her sınıfa, başka bir sınıfın tanımının sözlük kapsamında tanımlanan bir InnerClass
ek açıklama eklenir.
Bu ek açıklamaya sahip tüm sınıflarda EnclosingClass
veya EnclosingMethod
ek açıklaması da olmalıdır.
Ad | Biçimi | Açıklama |
---|---|---|
ad | Dize | Bu sınıfın başlangıçta bildirilen basit adı (paket ön ekiyle birlikte değil). Bu sınıf anonimse ad null olur.
|
accessFlags | int | sınıfın başlangıçta bildirilen erişim işaretleri (kaynak dilin ve hedef sanal makinenin yürütme modelleri arasındaki uyuşmazlık nedeniyle etkili işaretlerden farklı olabilir) |
dalvik.annotation.MemberClasses
Sınıflarda gösterilir
Her sınıfa, üye sınıfları açıklayan bir MemberClasses
ek açıklama eklenir. (Üye sınıfı, adı olan doğrudan bir iç sınıftır.)
Ad | Biçimi | Açıklama |
---|---|---|
değer | Sınıf[] | üye sınıflarının dizisi |
dalvik.annotation.MethodParameters
Yöntemlerde gösterilir
Not: Bu ek açıklama, Android 7.1'den sonra eklenmiştir. Bu sürüm, önceki Android sürümlerinde mevcut olsa bile yoksayılır.
MethodParameters
ek açıklama isteğe bağlıdır ve parametre adları ve değiştiriciler gibi parametre meta verileri sağlamak için kullanılabilir.
Parametre meta verileri çalışma zamanında gerekli olmadığında ek açıklama, bir yöntemden veya oluşturucudan güvenli bir şekilde çıkarılabilir.
java.lang.reflect.Parameter.isNamePresent()
, bir parametrede meta verilerin bulunup bulunmadığını kontrol etmek için kullanılabilir ve bilgiler mevcut değilse java.lang.reflect.Parameter.getName()
gibi ilişkili yansıtma yöntemleri çalışma zamanında varsayılan davranışa geri döner.
Parametre meta verileri, bir parametrenin sentetik olup olmadığını veya zorunlu olup olmadığını içerdiğinden derleyiciler, parametre meta verilerini dahil ederken enum gibi oluşturulan sınıflarla ilgili bilgileri de dahil etmelidir.
MethodParameters
ek açıklamaları yalnızca yöntem parametrelerini açıklar. Bu nedenle derleyiciler, kod boyutu ve çalışma zamanı verimliliği için parametresi olmayan kurucular ve yöntemler için ek açıklamayı tamamen atlayabilir.
Aşağıda açıklanan diziler, yöntemle ilişkili method_id_item
dex yapısıyla aynı boyutta olmalıdır. Aksi takdirde, çalışma zamanında bir java.lang.reflect.MalformedParametersException
atılır.
Yani: method_id_item.proto_idx
->
proto_id_item.parameters_off
->
type_list.size
, names().length
ve
accessFlags().length
ile aynı olmalıdır.
MethodParameters
, kaynak kodda açıkça veya dolaylı olarak tanımlanmayanlar da dahil olmak üzere tüm resmi yöntem parametrelerini tanımladığından, dizilerin boyutu, yalnızca kaynak kodda tanımlanan açık parametrelere dayalı İmza veya diğer meta veri bilgilerinden farklı olabilir. MethodParameters
, gerçek yöntem imzasında bulunmayan tür ek açıklama alıcı parametreleri hakkında herhangi bir bilgi de içermez.
Ad | Biçimi | Açıklama |
---|---|---|
isimler | Dize[] | İlişkili yöntemin resmi parametrelerinin adları. Dizi boş olmamalıdır ancak resmi parametre yoksa boş olmalıdır. Söz konusu dizinle ilişkili resmi parametrenin adı yoksa dizideki bir değer null olmalıdır. Parametre adı dizeleri boşsa veya ".", ";', "[" veya "/" içeriyorsa çalışma zamanında bir java.lang.reflect.MalformedParametersException atılır.
|
accessFlags | int[] | İlişkili yöntemin resmi parametrelerinin erişim işaretleri. Dizi boş olmamalıdır ancak resmi parametre yoksa boş olmalıdır. Değer, aşağıdaki değerleri içeren bir bit maskesidir:
java.lang.reflect.MalformedParametersException atılır.
|
dalvik.annotation.Signature
Sınıflarda, alanlarda ve yöntemlerde gösterilir
type_id_item
ile temsil edilebilenden daha karmaşık bir tür açısından tanımlanan her sınıfa, alana veya yönteme bir Signature
ek açıklama eklenir. .dex
biçimi, imzalar için biçimi tanımlamaz; yalnızca bir kaynak dilin semantiklerinin başarılı bir şekilde uygulanması için ihtiyaç duyduğu tüm imzaları temsil edebilmek amacıyla tasarlanmıştır. Bu nedenle, imzalar genellikle sanal makine uygulamaları tarafından ayrıştırılmaz (veya doğrulanmaz). İmzalar, daha üst düzey API'lere ve araçlara (ör. hata ayıklayıcılar) aktarılır. Bu nedenle, imzaların kullanımı, yalnızca geçerli imzalar alınacağı varsayımı yapılmadan yazılmalıdır. Böylece, söz dizimi açısından geçersiz bir imzayla karşılaşma olasılığına karşı kendinizi açıkça koruyabilirsiniz.
İmza dizelerinde çok fazla yinelenen içerik bulunduğundan Signature
ek açıklama, yinelenen öğelerin doğal olarak aynı temel verilere atıfta bulunduğu ve imzanın dizindeki tüm dizelerin bir araya getirilmesi olarak kabul edildiği bir dize dizisi olarak tanımlanır. İmzaların ayrı dizelere nasıl ayrılacağıyla ilgili herhangi bir kural yoktur. Bu tamamen .dex
dosyaları oluşturan araçlara bağlıdır.
Ad | Biçimi | Açıklama |
---|---|---|
değer | Dize[] | Birleştirilecek bir dize dizisi olarak bu sınıfın veya üyenin imzası |
dalvik.annotation.Throws
Yöntemlerde gösterilir
Bir veya daha fazla istisna türü atacağı beyan edilen her yönteme bir Throws
ek açıklama eklenir.
Ad | Biçimi | Açıklama |
---|---|---|
değer | Sınıf[] | oluşturulan istisna türü dizisi |