Bu belgede, bir dizi sınıf tanımını ve bunlarla ilişkili ek verileri tutmak için kullanılan .dex
dosyalarının düzeni ve içeriği açıklanmaktadır.
Türler kılavuzu
Ad | Açıklama |
---|---|
bayt | 8 bit imzalı tam sayı |
ubyte | 8 bit işaretsiz tam sayı |
kısa | 16 bit imzalı tam sayı, little-endian |
ushort | 16 bit işaretsiz tam sayı, little-endian |
int | 32 bit işaretli tam sayı, little-endian |
uint | 32 bitlik işaretsiz tam sayı, little-endian |
uzun | 64 bit imzalı tam sayı, little-endian |
ulong | 64 bit işaretsiz tam sayı, little-endian |
sleb128 | signed LEB128, değişken uzunluk (aşağıya bakın) |
uleb128 | işaretsiz LEB128, değişken uzunluk (aşağıya bakın) |
uleb128p1 | işaretsiz LEB128 artı 1 , değişken uzunlukta (aşağıya bakın) |
LEB128
LEB128 ("Little-Endian Base 128"), rastgele işaretli veya işaretsiz tam sayı miktarları için değişken uzunluklu bir kodlamadır. Biçim, DWARF3 spesifikasyonundan alınmıştır. LEB128, .dex
dosyasında yalnızca 32 bitlik miktarları kodlamak için kullanılır.
Her LEB128 kodlu değer, birlikte tek bir 32 bitlik değeri temsil eden bir ila beş bayttan oluşur. Dizideki son bayt hariç her baytın en anlamlı biti ayarlanmıştır. Son baytın en anlamlı biti ise temizdir. Her baytın kalan yedi biti yük olur. İlk baytta miktarın en az anlamlı yedi biti, ikinci baytta sonraki yedi biti vb. yer alır. İşaretli bir LEB128 (sleb128
) durumunda, dizideki son baytın en anlamlı yük bitine, son değeri oluşturmak için işaret uzatması uygulanır. İşaretsiz durumda (uleb128
), açıkça gösterilmeyen tüm bitler 0
olarak yorumlanır.
İki baytlık LEB128 değerinin bit tabanlı diyagramı | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
İlk bayt | İkinci bayt | ||||||||||||||
1 |
bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | 0 |
bit13 | bit12 | bit11 | bit10 | bit9 | bit8 | bit7 |
Varyant uleb128p1
, işaretli bir değeri temsil etmek için kullanılır. Burada gösterim, uleb128
olarak kodlanmış bir artı değeridir. Bu, -1
(alternatif olarak işaretsiz değer 0xffffffff
olarak da düşünülebilir)
kodlamasını tek bir bayt haline getirir ancak başka hiçbir negatif sayı için geçerli değildir. Bu, tam olarak temsil edilen sayının negatif olmayan veya -1
(ya da 0xffffffff
) olması gerektiği ve başka hiçbir negatif değere izin verilmediği (veya büyük işaretsiz değerlerin gerekli olma ihtimalinin düşük olduğu) durumlarda kullanışlıdır.
Biçimlere ilişkin bazı örnekler:
Kodlanmış Sıra | sleb128 olarak |
uleb128 olarak |
uleb128p1 olarak |
---|---|---|---|
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ıları listesi. Bunlar, bu dosya tarafından kullanılan tüm dizelerin tanımlayıcılarıdır.Bu dizeler, dahili adlandırma (ör. tür tanımlayıcıları) veya kod tarafından başvurulan sabit nesneler olarak kullanılır. Bu liste, UTF-16 kod noktası değerleri kullanılarak (yerel ayara duyarlı bir şekilde değil) dize içeriklerine göre sıralanmalı ve yinelenen girişler içermemelidir. |
type_ids | type_id_item[] | tanımlayıcı listesi türü. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosyanın referans verdiği tüm türler (sınıflar, diziler veya temel türler) için tanımlayıcılardır. Bu liste string_id
indeksine göre sıralanmalı ve yinelenen girişler içermemelidir.
|
proto_ids | proto_id_item[] | yöntem prototipi tanımlayıcıları listesi. Bunlar, bu dosyanın referans verdiği tüm prototiplerin tanımlayıcılarıdır. Bu liste, önce type_id dizinine göre dönüş türüne göre, ardından da bağımsız değişken listesine göre (sözlük sırasına göre, type_id dizinine göre sıralanmış bağımsız değişkenler) sıralanmalıdır. Listede yinelenen girişler bulunmamalıdır.
|
field_ids | field_id_item[] | alan tanımlayıcıları listesi. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosyanın referans verdiği tüm alanların tanımlayıcılarıdır. Bu liste sıralanmalıdır. Burada, tanımlayan tür (type_id dizinine göre) ana sıra, alan adı (string_id dizinine göre) ara sıra ve tür (type_id dizinine göre) küçük sıradır. Listede yinelenen girişler olmamalıdır.
|
method_ids | method_id_item[] | yöntem tanımlayıcıları listesi. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosyanın referans verdiği tüm yöntemlerin tanımlayıcılarıdır. Bu
liste sıralanmalıdır. Burada, tanımlayan tür (type_id
diziniyle) ana sıra, yöntem adı (string_id
diziniyle) ara sıra ve yöntem prototipi (proto_id diziniyle) küçük sıradır. Listede yinelenen girişler bulunmamalıdır.
|
class_defs | class_def_item[] | sınıf tanımları listesi. Sınıflar, belirli bir sınıfın üst sınıfı ve uygulanan arayüzleri, referans sınıfından önce listede görünecek şekilde sıralanmalıdır. Ayrıca, aynı adlı sınıfın tanımının listede birden fazla kez görünmesi de geçersizdir. |
call_site_ids | call_site_id_item[] | Site tanımlayıcıları listesini arayın. Bunlar, dosyada tanımlanmış olsun veya olmasın, bu dosyanın referans verdiği tüm arama sitelerinin tanımlayıcılarıdır. Bu liste, call_site_off artan düzende sıralanmalıdır.
|
method_handles | method_handle_item[] | yöntem işleyicileri listesi. Dosyada tanımlanmış olsun veya olmasın, bu dosyanın referans verdiği tüm yöntem işleyicilerinin listesi. Bu liste sıralanmamıştır ve farklı yöntem işleme örneklerine mantıksal olarak karşılık gelecek yinelenen girişler içerebilir. |
aktarma | ubyte[] | Yukarıda listelenen tablolarla ilgili tüm destek verilerini içeren veri alanı. Farklı öğelerin farklı hizalama koşulları vardır ve uygun hizalamayı sağlamak için gerekirse her öğeden önce dolgu baytları eklenir. |
link_data | ubyte[] | statik olarak bağlı dosyalarda kullanılan veriler. Bu bölümdeki verilerin biçimi bu belgede belirtilmemiştir. Bu bölüm, bağlantısı kaldırılmış dosyalarda boştur ve çalışma zamanı uygulamaları bu bölümü uygun gördükleri şekilde kullanabilir. |
Kapsayıcı biçimi
41. sürümde, yer tasarrufu sağlamak amacıyla DEX verileri için yeni bir kapsayıcı biçimi kullanıma sunuluyor. Bu kapsayıcı biçimi, birkaç mantıksal DEX dosyasının tek bir fiziksel dosyada birleştirilmesine olanak tanır. Yeni biçim, önceki biçimdeki dosyaların çoğunlukla basit bir şekilde birleştirilmesinden oluşur. Ancak bazı farklılıklar vardır:
file_size
, fiziksel dosyanın değil, mantıksal dosyanın boyutudur. Kapsayıcıdaki tüm mantıksal dosyaları yinelemek için kullanılabilir.- Mantıksal dex dosyaları, kapsayıcıdaki daha sonraki verileri (ancak daha önceki verileri değil) referans alabilir. Bu sayede dex dosyaları, aralarında dizeler gibi verileri paylaşabilir.
- Tüm uzaklıklar fiziksel dosyaya göre belirlenir. Başlığa göre göreli bir uzaklık yok. Bu, ofsetli bölümlerin mantıksal dosyalar arasında paylaşılabilmesini sağlar.
- Başlık, kapsayıcının sınırlarını açıklamak için iki yeni alan ekler. Bu, ek bir tutarlılık kontrolüdür ve kodun yeni biçime taşınmasını kolaylaştırır.
data_size
vedata_off
artık kullanılmıyor. Veriler birden fazla mantıksal dosyaya yayılabilir ve bitişik olması gerekmez.
Bit alanı, dize ve sabit tanımları
DEX_FILE_MAGIC
header_item öğesine yerleştirilmiş
Sabit dizi/dize DEX_FILE_MAGIC
, .dex
dosyasının başında görünmesi gereken baytların listesidir. Bu baytlar, dosyanın bu şekilde tanınması için gereklidir. Değer, belirli bozulma biçimlerinin tespit edilmesine yardımcı olmak için kasıtlı olarak yeni satır ("\n"
veya 0x0a
) ve boş bayt ("\0"
veya 0x00
) içeriyor. Değer ayrıca, biçim geliştikçe zaman içinde tekdüze şekilde artması beklenen üç ondalık basamaklı bir biçim sürüm numarasını da kodlar.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
Not: Biçimin 041
sürümü için destek, Android 16 sürümüne eklenerek kapsayıcı biçimi desteklenmiştir.
Not: Biçimin 040
sürümü için destek, Android 10.0 sürümünde eklenmiş olup SimpleNames'te izin verilen karakterler kümesini genişletmiştir.
Not: Biçimin 039
sürümü için destek, iki yeni bayt kodu olan const-method-handle
ve const-method-type
'ı kullanıma sunan Android 9.0 sürümünde eklenmiştir. (Bunların her biri Bayt kodu kümesi özeti tablosunda açıklanmıştır.) Android 10'daki 039
sürümü, DEX dosya biçimini genişleterek yalnızca önyükleme sınıfı yolundaki DEX dosyaları için geçerli olan gizli API bilgilerini de içerir.
Not: Biçimin 038
sürümü için destek, Android 8.0 sürümünde eklenmiştir. Sürüm 038
, yeni bayt kodları (invoke-polymorphic
ve invoke-custom
) ve yöntem işleyicileri için veriler ekledi.
Not: Biçimin 037
sürümü için destek, Android 7.0 sürümünde eklenmiştir. Android'in 037
sürümünden önceki çoğu sürümde biçimin 035
sürümü kullanılıyordu. 035
ve 037
sürümleri arasındaki tek fark, varsayılan yöntemlerin eklenmesi ve invoke
ayarının yapılmasıdır.
Not: Biçimin en az birkaç önceki sürümü, herkese açık olarak sunulan yazılımlarda yaygın şekilde kullanılmıştır. Örneğin, Android platformunun M3 sürümlerinde (Kasım-Aralık 2007) 009
sürümü, Android platformunun M5 sürümlerinde (Şubat-Mart 2008) ise 013
sürümü kullanılmıştır. Biçimin bu önceki sürümleri, bu belgede açıklanan sürümden birçok açıdan önemli ölçüde farklıdır.
ENDIAN_CONSTANT ve REVERSE_ENDIAN_CONSTANT
header_item öğesine yerleştirilmiş
ENDIAN_CONSTANT
sabiti, bulunduğu dosyanın endianness'ini belirtmek için kullanılır. Standart .dex
biçimi little-endian olsa da uygulamalar bayt değişimi yapmayı tercih edebilir. Bir uygulama, ENDIAN_CONSTANT
yerine endian_tag
değeri REVERSE_ENDIAN_CONSTANT
olan bir başlıkla karşılaşırsa dosyanın beklenen biçimden bayt değiştirilmiş olduğunu anlar.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
NO_INDEX
class_def_item ve debug_info_item öğelerine yerleştirilmiş
NO_INDEX
sabiti, bir dizin değerinin olmadığını belirtmek için kullanılır.
Not: Bu değer, aslında genellikle geçerli bir dizin olduğundan 0
olarak tanımlanmamıştır.
NO_INDEX
için seçilen değer, uleb128p1
kodlamasında tek bir bayt olarak gösterilebilir.
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
access_flags tanımları
class_def_item, encoded_field, encoded_method ve InnerClass'a yerleştirilmiş
Bu işaretlerin bit alanları, sınıfların ve sınıf üyelerinin erişilebilirlik ve genel özelliklerini belirtmek için kullanılır.
Ad | Değer | Sınıflar (ve InnerClass ek açıklamaları) için |
Alanlar İçin | Yöntemler İçin |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : Her yerde görünür |
public : Her yerde görünür |
public : Her yerde görünür |
ACC_PRIVATE | 0x2 | private : yalnızca tanımlayan sınıfa görünür
|
private : yalnızca tanımlayan sınıf tarafından görülebilir |
private : yalnızca tanımlayan sınıf tarafından görülebilir |
ACC_PROTECTED | 0x4 | protected : paket ve alt sınıflar tarafından görülebilir
|
protected : paket ve alt sınıflar tarafından görülebilir |
protected : paket ve alt sınıflar tarafından görülebilir |
ACC_STATIC | 0x8 | static : dış this referansıyla oluşturulmamış |
static : global to defining class |
static : this bağımsız değişkenini almıyor |
ACC_FINAL | 0x10 | final : alt sınıf oluşturulamaz |
final : oluşturulduktan sonra değiştirilemez |
final : geçersiz kılınamaz |
ACC_SYNCHRONIZED | 0x20 | synchronized : Bu yönteme yapılan çağrı sırasında ilişkili kilit otomatik olarak edinilir. Not: Bu yalnızca |
||
ACC_VOLATILE | 0x40 | volatile : ileti dizisi güvenliğine yardımcı olacak özel erişim kuralları |
||
ACC_BRIDGE | 0x40 | Derleyici tarafından tür güvenli bir köprü olarak otomatik olarak eklenen köprü yöntemi | ||
ACC_TRANSIENT | 0x80 | transient : varsayılan serileştirme ile kaydedilmez |
||
ACC_VARARGS | 0x80 | Son bağımsız değişken, derleyici tarafından "rest" bağımsız değişkeni olarak değerlendirilmelidir. | ||
ACC_NATIVE | 0x100 | native : yerel kodda uygulanır |
||
ACC_INTERFACE | 0x200 | interface : birden çok kez uygulanabilen soyut sınıf |
||
ACC_ABSTRACT | 0x400 | abstract : doğrudan oluşturulamaz |
abstract : Bu sınıf tarafından uygulanmadı |
|
ACC_STRICT | 0x800 | strictfp : kayan nokta aritmetiği için katı kurallar |
||
ACC_SYNTHETIC | 0x1000 | kaynak kodunda doğrudan tanımlanmamış | kaynak kodunda doğrudan tanımlanmamış | kaynak kodunda doğrudan tanımlanmamış |
ACC_ANNOTATION | 0x2000 | açıklama sınıfı olarak tanımlanmış | ||
ACC_ENUM | 0x4000 | numaralandırılmış tür olarak tanımlanmış | numaralandırılmış değer olarak beyan edilmişse | |
(kullanılmıyor) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | oluşturucu yöntemi (sınıf veya örnek başlatıcı) | ||
ACC_DECLARED_ SYNCHRONIZED |
0x20000 | synchronized öğesini tanımladıysanız Not: Bunun, yürütme üzerinde (bu işaretin yansıması dışında) hiçbir etkisi yoktur. |
InnerClass
ek açıklamalarında izin verilir.
class_def_item
içinde hiçbir zaman bulunmamalıdır.
Değiştirilmiş UTF-8 kodlaması
Eski sistemlerde daha kolay destek sağlamak için .dex
biçimi, dize verilerini fiili bir standart olan değiştirilmiş UTF-8 biçiminde kodlar. Bu biçime bundan sonra MUTF-8 olarak atıfta bulunulacaktır. Bu form, aşağıdakiler hariç standart UTF-8 ile aynıdır:
- Yalnızca bir, iki ve üç baytlık kodlamalar kullanılır.
U+10000
…U+10ffff
aralığındaki kod noktaları, her biri üç baytlık kodlanmış bir değer olarak gösterilen bir yedek çift olarak kodlanır.U+0000
kod noktası iki baytlık biçimde kodlanır.- Düz bir boş bayt (değer
0
), standart C dili yorumlamasında olduğu gibi bir dizenin sonunu gösterir.
Yukarıdaki ilk iki öğe şu şekilde özetlenebilir: MUTF-8, Unicode karakterleri için daha doğrudan bir kodlama biçimi olmak yerine UTF-16 için bir kodlama biçimidir.
Yukarıdaki son iki öğe, kod noktasının U+0000
bir dizeye dahil edilmesini ve C tarzı null ile sonlandırılmış bir dize olarak işlenmesini aynı anda mümkün kılar.
Ancak U+0000
özel kodlaması nedeniyle, normal UTF-8'den farklı olarak, bir çift MUTF-8 dizesinde standart C işlevinin strcmp()
çağrılmasının sonucu her zaman eşit olmayan dizelerin karşılaştırılmasının uygun şekilde imzalanmış sonucunu göstermez.
Sıralama (yalnızca eşitlik değil) önemli olduğunda MUTF-8 dizelerini karşılaştırmanın en basit yolu, bunları karakter karakter kodunu çözmek ve çözülen değerleri karşılaştırmaktır. (Ancak daha akıllı uygulamalar da mümkündür.)
Karakter kodlama hakkında daha fazla bilgi için lütfen The Unicode Standard'ı inceleyin. MUTF-8, UTF-8'den ziyade (nispeten daha az bilinen) CESU-8 kodlamasına daha yakındır.
encoded_value kodlaması
annotation_element ve encoded_array_item öğelerine yerleştirilmiş
encoded_value
, (neredeyse) rastgele hiyerarşik olarak yapılandırılmış verilerin kodlanmış bir parçasıdır. Kodlama hem kompakt hem de ayrıştırılması kolay olacak şekilde tasarlanmıştır.
Ad | Biçimi | Açıklama |
---|---|---|
(value_arg << 5) | value_type | ubyte | byte, hemen sonraki value türünü gösterir. Yüksek sıralı üç bit içinde isteğe bağlı bir açıklama argümanı bulunur.
Çeşitli value tanımları için aşağıya bakın.
Çoğu durumda value_arg , hemen sonraki value öğesinin bayt cinsinden uzunluğunu (size - 1) olarak kodlar. Örneğin: 0 , değerin bir bayt gerektirdiği, 7 ise sekiz bayt gerektirdiği anlamına gelir. Ancak aşağıda belirtildiği gibi istisnalar vardır.
|
değer | ubyte[] | Değeri temsil eden baytlar. Uzunluk değişkendir ve farklı value_type baytlar için farklı şekilde yorumlanır ancak her zaman küçük endian'dır. Ayrıntılar için aşağıdaki çeşitli değer tanımlarına bakın.
|
Değer biçimleri
Tür Adı | value_type |
value_arg Biçim |
value Biçim |
Açıklama |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (yok; 0 olmalıdır) |
ubyte[1] | işaretli tek baytlık tam sayı değeri |
VALUE_SHORT | 0x02 | boyut - 1 (0…1) | ubyte[size] | işaretli iki baytlık tam sayı değeri, işaret genişletilmiş |
VALUE_CHAR | 0x03 | boyut - 1 (0…1) | ubyte[size] | işaretsiz iki baytlık tam sayı değeri, sıfırla genişletilmiş |
VALUE_INT | 0x04 | size - 1 (0…3) | ubyte[size] | işaretli dört baytlık tam sayı değeri, işaret genişletilmiş |
VALUE_LONG | 0x06 | boyut - 1 (0…7) | ubyte[size] | işaretli sekiz baytlık tam sayı değeri, işaret genişletilmiş |
VALUE_FLOAT | 0x10 | size - 1 (0…3) | ubyte[size] | dört baytlık bit kalıbı, sağa doğru sıfırla genişletilmiş ve IEEE754 32 bitlik kayan nokta değeri olarak yorumlanmış |
VALUE_DOUBLE | 0x11 | boyut - 1 (0…7) | ubyte[size] | sekiz baytlık bit deseni, sağa doğru sıfırla genişletilmiş ve IEEE754 64 bitlik kayan nokta değeri olarak yorumlanmış |
VALUE_METHOD_TYPE | 0x15 | size - 1 (0…3) | ubyte[size] | İşaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri,
proto_ids bölümünde bir dizin olarak yorumlanır ve bir yöntem türü değerini temsil eder.
|
VALUE_METHOD_HANDLE | 0x16 | size - 1 (0…3) | ubyte[size] | method_handles bölümünde bir dizin olarak yorumlanan ve yöntem işleyici değerini temsil eden, işaretsiz (sıfırla genişletilmiş) dört baytlık tam sayı değeri.
|
VALUE_STRING | 0x17 | size - 1 (0…3) | ubyte[size] | string_ids bölümünde dizin olarak yorumlanan ve dize değerini temsil eden, işaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri.
|
VALUE_TYPE | 0x18 | size - 1 (0…3) | ubyte[size] | type_ids bölümünde bir dizin olarak yorumlanan ve yansıtıcı bir tür/sınıf değerini temsil eden, işaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri
|
VALUE_FIELD | 0x19 | size - 1 (0…3) | ubyte[size] | field_ids bölümünde dizin olarak yorumlanan ve yansıtıcı bir alan değerini temsil eden, işaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri
|
VALUE_METHOD | 0x1a | size - 1 (0…3) | ubyte[size] | İşaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri,
method_ids bölümünde bir dizin olarak yorumlanır ve yansıtıcı bir yöntem değerini temsil eder.
|
VALUE_ENUM | 0x1b | size - 1 (0…3) | ubyte[size] | field_ids bölümünde dizin olarak yorumlanan ve numaralandırılmış türdeki bir sabitin değerini temsil eden, işaretsiz (sıfırla genişletilmiş) dört baytlık tamsayı değeri
|
VALUE_ARRAY | 0x1c | (yok; 0 olmalıdır) |
encoded_array | Aşağıdaki "encoded_array biçimi" ile belirtilen biçimde bir değer dizisi. value boyutunun şifrelemede örtülü olarak belirtilmesi gerekir.
|
VALUE_ANNOTATION | 0x1d | (yok; 0 olmalıdır) |
encoded_annotation | Aşağıdaki "encoded_annotation biçimi" ile belirtilen biçimde bir alt açıklama. value boyutunun şifrelemede örtülü olarak belirtilmesi gerekir.
|
VALUE_NULL | 0x1e | (yok; 0 olmalıdır) |
(yok) | null referans değeri |
VALUE_BOOLEAN | 0x1f | boole (0…1) | (yok) | bir bitlik değer; false için 0 ve true için 1 . Bit, value_arg içinde gösterilir.
|
encoded_array biçimi
Ad | Biçimi | Açıklama |
---|---|---|
size | uleb128 | dizideki öğe sayısı |
değerler | encoded_value[size] | Bu bölümde belirtilen biçimde, sırayla birleştirilmiş bir dizi size encoded_value baytlık sıra.
|
encoded_annotation biçimi
Ad | Biçimi | Açıklama |
---|---|---|
type_idx | uleb128 | ek açıklamanın türü. Bu bir sınıf (dizi veya ilkel değil) türü olmalıdır. |
size | uleb128 | Bu ek açıklamada bulunan ad-değer eşlemelerinin sayısı |
öğeler | annotation_element[size] | açıklama öğeleri doğrudan satır içinde (kaydırma olarak değil) gösterilir. Öğeler, string_id dizinine göre artan sırada sıralanmalıdır.
|
annotation_element biçimi
Ad | Biçimi | Açıklama |
---|---|---|
name_idx | uleb128 | string_ids bölümünde dizin olarak gösterilen öğe adı. Dize, yukarıda tanımlanan MemberName söz dizimine uygun olmalıdır.
|
değer | encoded_value | öğe değeri |
Dize söz dizimi
.dex
dosyasında, nihayetinde bir dizeye atıfta bulunan çeşitli öğe türleri vardır. Aşağıdaki BNF tarzı tanımlar, bu dizeler için kabul edilebilir söz dizimini gösterir.
SimpleName
SimpleName, diğer şeylerin adlarının söz diziminin temelini oluşturur. .dex
biçimi, bu konuda oldukça fazla esneklik sunar (en yaygın kaynak dillerden çok daha fazla). Kısaca, basit bir ad; herhangi bir düşük ASCII alfabesi karakteri veya rakamı, birkaç belirli düşük ASCII sembolü ve kontrol, boşluk ya da özel karakter olmayan çoğu ASCII dışı kod noktasından oluşur. 040
sürümünden itibaren biçim, boşluk karakterlerine (Unicode Zs
kategorisi) de izin vermektedir. Vekil kod noktalarının (U+d800
… U+dfff
aralığında) geçerli ad karakterleri olarak kabul edilmediğini, ancak Unicode ek karakterlerinin geçerli olduğunu (SimpleNameChar kuralının son alternatifiyle temsil edilir) ve MUTF-8 kodlamasında vekil kod noktaları çiftleri olarak bir dosyada temsil edilmesi gerektiğini unutmayın.
SimpleName → | ||
SimpleNameChar (SimpleNameChar)* | ||
SimpleNameChar → | ||
'A' … 'Z' |
||
| | 'a' … 'z' |
|
| | '0' … '9' |
|
| | ' ' |
DEX sürümü 040'tan itibaren |
| | '$' |
|
| | '-' |
|
| | '_' |
|
| | U+00a0 |
DEX sürümü 040'tan itibaren |
| | U+00a1 … U+1fff |
|
| | U+2000 … U+200a |
DEX sürümü 040'tan itibaren |
| | U+2010 … U+2027 |
|
| | U+202f |
DEX sürümü 040'tan itibaren |
| | U+2030 … U+d7ff |
|
| | U+e000 … U+ffef |
|
| | U+10000 … U+10ffff |
MemberName
field_id_item ve method_id_item tarafından kullanılır
MemberName, bir sınıfın üyesinin adıdır. Üyeler alanlar, yöntemler ve iç sınıflardır.
MemberName → | |
SimpleName | |
| | '<' SimpleName '>' |
FullClassName
FullClassName, gerekli bir adın ardından isteğe bağlı bir paket belirteci içeren tam nitelikli bir sınıf adıdır.
FullClassName → | |
OptionalPackagePrefix SimpleName | |
OptionalPackagePrefix → | |
(SimpleName '/' )* |
TypeDescriptor
type_id_item tarafından kullanılıyor
TypeDescriptor, ilkel türler, sınıflar, diziler ve void
dahil olmak üzere herhangi bir türün gösterimidir. Çeşitli sürümlerin anlamı için aşağıya bakın.
TypeDescriptor → | |
'V' |
|
| | FieldTypeDescriptor |
FieldTypeDescriptor → | |
NonArrayFieldTypeDescriptor | |
| | ('[' * 1…255)
NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor→ | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' FullClassName ';' |
ShortyDescriptor
proto_id_item tarafından kullanılıyor
ShortyDescriptor, çeşitli referans (sınıf veya dizi) türleri arasında ayrım yapılmaması dışında, dönüş ve parametre türleri de dahil olmak üzere bir yöntem prototipinin kısa biçimli gösterimidir. Bunun yerine, tüm referans türleri tek bir 'L'
karakteriyle gösterilir.
ShortyDescriptor → | |
ShortyReturnType (ShortyFieldType)* | |
ShortyReturnType → | |
'V' |
|
| | ShortyFieldType |
ShortyFieldType → | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
TypeDescriptor anlamı
TypeDescriptor'ın her bir varyantının anlamı aşağıda verilmiştir.
Sözdizimi | Anlamı |
---|---|
V | void ; yalnızca dönüş türleri için geçerlidir |
Z | boolean |
B | byte |
G | short |
C | char |
I | int |
J | long |
F | float |
D | double |
Lfully/qualified/Name; | sınıf fully.qualified.Name |
[descriptor | descriptor dizisi. 255'ten fazla boyutun olması geçersiz olsa da dizi dizileri için yinelemeli olarak kullanılabilir.
|
Öğeler ve ilgili yapılar
Bu bölümde, .dex
dosyasında görünebilecek her bir üst düzey öğenin tanımı yer alır.
header_item
Üstbilgi bölümünde görünür
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
sihir | ubyte[8] = DEX_FILE_MAGIC | sihirli değer. Daha fazla bilgi için yukarıdaki "DEX_FILE_MAGIC " bölümündeki tartışmaya bakın.
|
denetim toplamı | uint | Dosyanın geri kalanının (magic ve bu alan hariç) adler32 sağlama toplamı; dosya bozulmasını tespit etmek için kullanılır.
|
signature | ubyte[20] | Dosyanın geri kalanının (magic , checksum ve bu alan hariç) SHA-1 imzası (karması); dosyaları benzersiz şekilde tanımlamak için kullanılır.
|
file_size | uint |
Tüm dosyanın (başlık dahil) bayt cinsinden boyutu (v40 veya önceki sürümler) Bu başlığın başlangıcından bir sonraki başlığa veya tüm dosyanın (kapsayıcı) sonuna kadar olan bayt cinsinden mesafe. (v41 veya sonraki sürümler) |
header_size | uint |
Üstbilginin (bu bölümün tamamı) bayt cinsinden boyutu. Bu sayede, biçimi geçersiz kılmadan en azından sınırlı miktarda geriye/ileri dönük uyumluluk sağlanır. 0x70 (112) bayt olmalıdır. (v40 veya önceki sürümler) 0x78 (120) bayt olmalıdır. (v41 veya sonraki sürümler) |
endian_tag | uint = ENDIAN_CONSTANT | endianness etiketi. Daha fazla bilgi için yukarıdaki "ENDIAN_CONSTANT
ve REVERSE_ENDIAN_CONSTANT " başlıklı tartışmaya bakın.
|
link_size | uint | bağlantı bölümünün boyutu veya bu dosya statik olarak bağlanmamışsa 0 |
link_off | uint | dosyanın başlangıcından bağlantı bölümüne olan uzaklık veya
0 ise link_size == 0 . Sıfır olmayan başlangıç, link_data bölümündeki bir başlangıç olmalıdır. Bu belgede, işaret edilen verilerin biçimi belirtilmemiştir. Bu başlık alanı (ve önceki), çalışma zamanı uygulamaları tarafından kullanılmak üzere kancalar olarak bırakılmıştır.
|
map_off | uint | Dosyanın başlangıcından harita öğesine kadar olan uzaklık. Sıfır olmayan bir uzaklık, data bölümündeki bir uzaklığa olmalıdır ve veriler, aşağıda "map_list " tarafından belirtilen biçimde olmalıdır.
|
string_ids_size | uint | Dize tanımlayıcıları listesindeki dizelerin sayısı |
string_ids_off | uint | Dosyanın başlangıcından dize tanımlayıcıları listesine kadar olan uzaklık veya
0 string_ids_size == 0 ise (bu, kabul etmek gerekir ki
garip bir uç durumdur). Sıfır olmayan bir ofset varsa string_ids bölümünün başlangıcına doğru olmalıdır.
|
type_ids_size | uint | Tür tanımlayıcıları listesindeki öğelerin sayısı (en fazla 65535) |
type_ids_off | uint | Dosyanın başlangıcından tür tanımlayıcıları listesine kadar olan uzaklık veya
0 ise type_ids_size == 0 (açıkçası tuhaf bir uç durum). Sıfır olmayan bir ofset varsa type_ids bölümünün başlangıcına doğru olmalıdır.
|
proto_ids_size | uint | Prototip tanımlayıcılar listesindeki öğelerin sayısı (en fazla 65535) |
proto_ids_off | uint | Dosyanın başlangıcından prototip tanımlayıcıları listesine kadar olan uzaklık veya 0 (açıkçası garip bir uç durum) ise proto_ids_size == 0 . Sıfır olmayan bir ofset varsa proto_ids bölümünün başlangıcına doğru olmalıdır.
|
field_ids_size | uint | Alan tanımlayıcıları listesindeki öğelerin sayısı |
field_ids_off | uint | Dosyanın başlangıcından alan tanımlayıcıları listesine kadar olan uzaklık veya
0 ise field_ids_size == 0 . Sıfır olmayan bir ofset varsa field_ids bölümünün başlangıcına doğru olmalıdır. |
method_ids_size | uint | Yöntem tanımlayıcıları listesindeki öğelerin sayısı |
method_ids_off | uint | Dosyanın başlangıcından yöntem tanımlayıcıları listesine kadar olan uzaklık veya
0 ise method_ids_size == 0 . Sıfır olmayan bir ofset varsa method_ids bölümünün başlangıcına doğru olmalıdır. |
class_defs_size | uint | Sınıf tanımları listesindeki öğelerin sayısı |
class_defs_off | uint | dosyanın başlangıcından sınıf tanımları listesine kadar olan uzaklık veya
0 ise class_defs_size == 0 (açıkçası garip bir uç durum). Sıfır olmayan bir ofset varsa class_defs bölümünün başlangıcına doğru olmalıdır.
|
data_size | uint |
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. Diğer dex başlıkları ve verileri dahil olmak üzere dosyanın tamamının boyutu. (v41 veya sonraki sürümler) |
header_offset | uint |
bu alan mevcut değil. dosyanın başlangıcından bu başlığın başlangıcına kadar olan uzaklık. (v41 veya sonraki sürümler) |
map_list
Veri bölümünde görünür
header_item öğesinden referans alınmıştır.
Eşleşme: 4 bayt
Bu, bir dosyanın tüm içeriğinin sıralı listesidir. header_item
ile ilgili olarak bazı gereksiz bilgiler içerir ancak dosyanın tamamında yineleme yapmak için kolayca kullanılabilecek bir form olması amaçlanmıştır. Belirli bir tür, haritada en fazla bir kez görünebilir. Ancak, biçimin geri kalanında belirtilen kısıtlamalar dışında (ör. header
bölümü önce, ardından string_ids
bölümü görünmelidir) türlerin hangi sırada görünebileceği konusunda bir kısıtlama yoktur. Ayrıca, harita girişleri ilk ofsete göre sıralanmalı ve çakışmamalıdır.
Ad | Biçimi | Açıklama |
---|---|---|
size | uint | Listenin giriş sayısı cinsinden boyutu |
liste | map_item[size] | listenin öğeleri |
map_item biçimi
Ad | Biçimi | Açıklama |
---|---|---|
tür | ushort | Öğelerin türü (aşağıdaki tabloya bakın) |
unused | ushort | (kullanılmıyor) |
size | uint | Belirtilen ofsette bulunacak öğe sayısının sayısı |
telafi etmek | uint | dosyanın başlangıcından söz konusu öğelere kadar olan uzaklık |
Tür kodları
Öğe Türü | Sabit | Değer | Öğe Boyutu (Bayt) |
---|---|---|---|
header_item | TYPE_HEADER_ITEM | 0x0000 | 0x70 |
string_id_item | TYPE_STRING_ID_ITEM | 0x0001 | 0x04 |
type_id_item | TYPE_TYPE_ID_ITEM | 0x0002 | 0x04 |
proto_id_item | TYPE_PROTO_ID_ITEM | 0x0003 | 0x0c |
field_id_item | TYPE_FIELD_ID_ITEM | 0x0004 | 0x08 |
method_id_item | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
class_def_item | TYPE_CLASS_DEF_ITEM | 0x0006 | 0x20 |
call_site_id_item | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x04 |
method_handle_item | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
map_list | TYPE_MAP_LIST | 0x1000 | 4 + (item.size * 12) |
type_list | TYPE_TYPE_LIST | 0x1001 | 4 + (item.size * 2) |
annotation_set_ref_list | TYPE_ANNOTATION_SET_REF_LIST | 0x1002 | 4 + (item.size * 4) |
annotation_set_item | TYPE_ANNOTATION_SET_ITEM | 0x1003 | 4 + (item.size * 4) |
class_data_item | TYPE_CLASS_DATA_ITEM | 0x2000 | implicit; must parse |
code_item | TYPE_CODE_ITEM | 0x2001 | implicit; must parse |
string_data_item | TYPE_STRING_DATA_ITEM | 0x2002 | implicit; must parse |
debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | implicit; must parse |
annotation_item | TYPE_ANNOTATION_ITEM | 0x2004 | implicit; must parse |
encoded_array_item | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | implicit; must parse |
annotations_directory_item | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | implicit; must parse |
hiddenapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | implicit; must parse |
string_id_item
string_ids bölümünde görünür
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
string_data_off | uint | Bu öğenin dize verileri için dosyanın başlangıcından itibaren olan uzaklık. Ofset, data bölümündeki bir konuma olmalı ve veriler, aşağıda "string_data_item " ile belirtilen biçimde olmalıdır.
Ofset için hizalama şartı yoktur.
|
string_data_item
Veri bölümünde görünür
Hizalama: yok (bayt hizalı)
Ad | Biçimi | Açıklama |
---|---|---|
utf16_size | uleb128 | Bu dizenin UTF-16 kod birimlerindeki boyutu (birçok sistemde "dize uzunluğu" olarak bilinir). Yani bu, dizenin kodunun çözülmüş uzunluğudur. (Kodlanan uzunluk, 0 baytının konumuyla belirlenir.) |
aktarma | ubyte[] | 0 değerinde bir baytla birlikte bir dizi MUTF-8 kod birimi (diğer adıyla sekizli, diğer adıyla bayt). Veri biçimiyle ilgili ayrıntılar ve tartışma için yukarıdaki "MUTF-8 (Değiştirilmiş UTF-8) Kodlaması" bölümüne bakın.
Not: UTF-16 yedek kod birimlerinin (yani |
type_id_item
type_ids bölümünde görünür.
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
descriptor_idx | uint | Bu türün açıklayıcı dizesi için string_ids listesinde dizin oluşturun. Dize, yukarıda tanımlanan TypeDescriptor söz dizimine uygun olmalıdır.
|
proto_id_item
proto_ids bölümünde görünür.
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
shorty_idx | uint | Bu prototipin kısa içerik tanımlayıcı dizesi için string_ids listesinde dizin oluşturur. Dize, yukarıda tanımlanan ShortyDescriptor söz dizimine uygun olmalı ve bu öğenin dönüş türü ile parametrelerine karşılık gelmelidir.
|
return_type_idx | uint | Bu prototipin dönüş türü için type_ids listesinde dizin oluşturma
|
parameters_off | uint | Bu prototip için dosyanın başlangıcından parametre türleri listesine kadar olan uzaklık veya bu prototipte parametre yoksa 0 . Sıfır olmayan bu ofset, data bölümünde olmalı ve buradaki veriler, aşağıda "type_list" tarafından belirtilen biçimde olmalıdır. Ayrıca, listede void türüne de atıfta bulunulmamalıdır.
|
field_id_item
field_ids bölümünde görünür.
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
class_idx | ushort | Bu alanın tanımlayıcısı için type_ids listesindeki dizin. Bu bir sınıf türü olmalı, dizi veya temel tür olmamalıdır.
|
type_idx | ushort | Bu alanın türü için type_ids listesindeki dizin
|
name_idx | uint | Bu alanın adı için string_ids listesinde dizin oluşturun. Dize, yukarıda tanımlanan MemberName söz dizimine uygun olmalıdır.
|
method_id_item
method_ids bölümünde görünür.
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
class_idx | ushort | Bu yöntemin tanımlayıcısı için type_ids listesindeki dizin. Bu, sınıf veya dizi türü olmalı, ilkel tür olmamalıdır.
|
proto_idx | ushort | Bu yöntemin prototipi için proto_ids listesinde dizin oluşturma
|
name_idx | uint | Bu yöntemin adı için string_ids listesinde dizin oluşturun. Dize, yukarıda tanımlanan MemberName söz dizimine uygun olmalıdır.
|
class_def_item
class_defs bölümünde görünür.
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
class_idx | uint | Bu sınıfın type_ids listesinde dizine eklenir.
Bu bir sınıf türü olmalı, dizi veya temel tür olmamalıdır.
|
access_flags | uint | Sınıfın erişim işaretleri (public , final vb.). Ayrıntılar için "access_flags Tanımlar" bölümüne bakın.
|
superclass_idx | uint | Üst sınıf için type_ids listesinde dizin oluşturma veya
bu sınıfın üst sınıfı yoksa (ör. Object gibi bir kök sınıftır) NO_INDEX sabit değeri.
Varsa dizi veya temel tür değil, sınıf türü olmalıdır.
|
interfaces_off | uint | Dosyanın başlangıcından arayüzler listesine kadar olan uzaklık veya
0 arayüz yoksa. Bu ofset, data bölümünde olmalı ve buradaki veriler, aşağıda "type_list " ile belirtilen biçimde olmalıdır. Listenin her öğesi bir sınıf türü olmalıdır (dizi veya temel tür değil) ve yinelenen öğe olmamalıdır.
|
source_file_idx | uint | Bu sınıfın orijinal kaynağını (en azından çoğunu) içeren dosyanın adı için string_ids listesinde dizin oluşturun veya bu bilginin eksikliğini temsil etmek için NO_INDEX özel değerini kullanın. Belirli bir yöntemin debug_info_item bu kaynak dosyanın yerini alabilir ancak çoğu sınıfın yalnızca bir kaynak dosyasından gelmesi beklenir.
|
annotations_off | uint | Bu sınıf için dosyanın başlangıcından açıklama yapısına kadar olan uzaklık veya bu sınıfta açıklama yoksa 0 . Sıfır olmayan bu uzaklık, data bölümünde olmalı ve buradaki veriler, aşağıda "annotations_directory_item " ile belirtilen biçimde olmalıdır. Ayrıca, tüm öğeler bu sınıfı tanımlayıcı olarak referans vermelidir.
|
class_data_off | uint | Dosyanın başlangıcından bu öğeyle ilişkili sınıf verilerine kadar olan uzaklık veya bu sınıf için sınıf verisi yoksa 0 . (Örneğin, bu sınıf bir işaretleyici arayüzü ise bu durum geçerli olabilir.) Sıfır olmayan bir uzaklık varsa bu uzaklık data bölümünde olmalı ve buradaki veriler, aşağıda "class_data_item " ile belirtilen biçimde olmalıdır. Tüm öğeler, tanımlayıcı olarak bu sınıfa referans vermelidir.
|
static_values_off | uint | Dosyanın başlangıcından static alanlarının ilk değerleri listesine kadar olan uzaklık veya hiç yoksa 0 (ve tüm static alanları 0 veya null ile başlatılacaksa). Bu uzaklık data bölümünde olmalı ve buradaki veriler aşağıda "encoded_array_item " ile belirtilen biçimde olmalıdır. Dizinin boyutu, bu sınıf tarafından bildirilen static alanlarının sayısından büyük olmamalıdır ve öğeler, karşılık gelen field_list içinde bildirilenlerle aynı sırada static alanlarına karşılık gelmelidir. Her dizi öğesinin türü, karşılık gelen alanın belirtilen türüyle eşleşmelidir.
Dizide static alan sayısından daha az öğe varsa kalan alanlar, türe uygun bir 0 veya null ile başlatılır.
|
call_site_id_item
call_site_ids bölümünde görünür
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
call_site_off | uint | Dosyanın başlangıcından çağrı sitesi tanımına kadar olan uzaklık. Ofset, veri bölümünde olmalı ve buradaki veriler aşağıdaki "call_site_item" tarafından belirtilen biçimde olmalıdır. |
call_site_item
Veri bölümünde görünür
Hizalama: yok (bayt hizalı)
call_site_item, öğeleri bir bootstrap bağlayıcı yöntemine sağlanan bağımsız değişkenlere karşılık gelen bir encoded_array_item'dır. İlk üç bağımsız değişken şunlardır:
- Önyükleme bağlayıcı yöntemini (VALUE_METHOD_HANDLE) temsil eden bir yöntem işleyici.
- Bootstrap bağlayıcının çözmesi 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, bootstrap bağlayıcı yöntemine aktarılan sabit değerlerdir. Bu bağımsız değişkenler, herhangi bir tür dönüşümü olmadan sırayla iletilir.
Bootstrap bağlayıcı yöntemini temsil eden yöntem işleyicisi, java.lang.invoke.CallSite
dönüş türüne sahip olmalıdır. İlk üç parametre türü şunlardır:
java.lang.invoke.Lookup
java.lang.String
java.lang.invoke.MethodType
Ek bağımsız değişkenlerin parametre türleri, sabit değerlerinden belirlenir.
method_handle_item
method_handles bölümünde görünür.
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
method_handle_type | ushort | yöntem tutma yerinin türü; aşağıdaki tabloya bakın |
unused | ushort | (kullanılmıyor) |
field_or_method_id | ushort | Yöntem işleyici türünün erişim yöntemi mi yoksa yöntem çağırıcı mı olduğuna bağlı olarak alan veya yöntem kimliği |
unused | ushort | (kullanılmıyor) |
Yöntem işleme türü kodları
Sabit | Değer | Açıklama |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0x00 | Yöntem işleyici, statik alan ayarlayıcıdır (erişimci). |
METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | Yöntem tutma yeri, statik alan alıcısıdır (erişimci). |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | Yöntem işleyici, bir örnek alan ayarlayıcısıdır (erişimci) |
METHOD_HANDLE_TYPE_INSTANCE_GET | 0x03 | Yöntem işleyici, bir örnek alan alıcısıdır (erişimci). |
METHOD_HANDLE_TYPE_INVOKE_STATIC | 0x04 | Yöntem işleyici, statik yöntem çağırıcıdır |
METHOD_HANDLE_TYPE_INVOKE_INSTANCE | 0x05 | Yöntem işleyici, örnek yöntemi çağıran bir öğedir. |
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR | 0x06 | Yöntem işleyici, oluşturucu yöntemi çağırıcıdır |
METHOD_HANDLE_TYPE_INVOKE_DIRECT | 0x07 | Yöntem işleyici, doğrudan yöntem çağırıcıdır |
METHOD_HANDLE_TYPE_INVOKE_INTERFACE | 0x08 | Yöntem tutacağı, arayüz yöntemi çağırıcıdır |
class_data_item
class_def_item öğesinden referans alınmıştır.
Veri bölümünde görünür
Hizalama: yok (bayt hizalı)
Ad | Biçimi | Açıklama |
---|---|---|
static_fields_size | uleb128 | Bu öğede tanımlanan statik alanların sayısı |
instance_fields_size | uleb128 | bu öğede tanımlanan örnek alanlarının sayısı |
direct_methods_size | uleb128 | Bu öğede tanımlanan doğrudan yöntemlerin sayısı |
virtual_methods_size | uleb128 | Bu öğede tanımlanan sanal yöntemlerin sayısı |
static_fields | encoded_field[static_fields_size] | Tanımlı statik alanlar, kodlanmış öğeler dizisi olarak gösterilir. Alanlar, field_idx sütununa göre artan düzende sıralanmalıdır.
|
instance_fields | encoded_field[instance_fields_size] | Tanımlanan örnek alanları, kodlanmış öğeler dizisi olarak gösterilir. Alanlar, field_idx sütununa göre artan düzende sıralanmalıdır.
|
direct_methods | encoded_method[direct_methods_size] | kodlanmış öğeler dizisi olarak gösterilen, tanımlanmış doğrudan (static , private veya oluşturucu) yöntemler. Yöntemler, method_idx sütununa göre artan düzende sıralanmalıdır.
|
virtual_methods | encoded_method[virtual_methods_size] | tanımlanan sanal (static , private veya oluşturucu olmayan) yöntemler, kodlanmış öğeler dizisi olarak gösterilir. Bu liste, bu öğenin temsil ettiği sınıf tarafından geçersiz kılınmadığı sürece devralınan yöntemleri içermemelidir. Yöntemler, method_idx değerine göre artan düzende sıralanmalıdır.
Sanal bir yöntemin method_idx , doğrudan bir yöntemle aynı olmamalıdır.
|
Not: Tüm öğelerin field_id
ve method_id
örnekleri aynı tanımlayıcı sınıfa referansta bulunmalıdır.
encoded_field biçimi
Ad | Biçimi | Açıklama |
---|---|---|
field_idx_diff | uleb128 | Bu alanın kimliği için field_ids listesindeki dizin (ad ve tanımlayıcıyı içerir), listedeki önceki öğenin dizininden fark olarak gösterilir. Bir listedeki ilk öğenin dizini doğrudan gösterilir.
|
access_flags | uleb128 | alanın erişim işaretleri (public , final vb.). Ayrıntılar için "access_flags Tanımlar" bölümüne bakın.
|
encoded_method biçimi
Ad | Biçimi | Açıklama |
---|---|---|
method_idx_diff | uleb128 | Bu yöntemin kimliği için method_ids listesinde dizin oluşturur (ad ve tanımlayıcıyı içerir). Bu, listedeki önceki öğenin dizininden fark olarak gösterilir. Bir listedeki ilk öğenin dizini doğrudan gösterilir.
|
access_flags | uleb128 | Yöntemin erişim işaretleri (public , final vb.). Ayrıntılar için "access_flags Tanımlar" bölümüne bakın.
|
code_off | uleb128 | Bu yöntem için dosyanın başlangıcından kod yapısına olan uzaklık veya bu yöntem abstract ya da native ise 0 . Başlangıç, data bölümündeki bir konumda olmalıdır. Verilerin biçimi aşağıdaki
"code_item " ile belirtilir.
|
type_list
class_def_item ve proto_id_item öğelerinden referans alınır.
Veri bölümünde görünür
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
size | uint | Listenin giriş sayısı cinsinden boyutu |
liste | type_item[size] | listenin öğeleri |
type_item biçimi
Ad | Biçimi | Açıklama |
---|---|---|
type_idx | ushort | type_ids listesinde dizin oluşturma |
code_item
encoded_method öğesinden referans alınmıştır.
Veri bölümünde görünür
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
registers_size | ushort | Bu kod tarafından kullanılan kayıt sayısı |
ins_size | ushort | Bu kodun ait olduğu yönteme gelen bağımsız değişkenlerin kelime sayısı |
outs_size | ushort | Bu kodun yöntem çağrısı için gerektirdiği giden bağımsız değişken alanının kelime sayısı |
tries_size | ushort | Bu örnek için try_item sayısı. Sıfır değilse bu öğeler, bu örnekte tries dizisi olarak insns öğesinden hemen sonra görünür.
|
debug_info_off | uint | Bu kod için dosyanın başlangıcından hata ayıklama bilgileri (satır numaraları + yerel değişken bilgileri) dizisine olan uzaklık veya bilgi yoksa 0 . Sıfır olmayan bir ofset varsa data bölümündeki bir konuma gitmelidir. Verilerin biçimi, aşağıdaki "debug_info_item " ile belirtilir.
|
insns_size | uint | talimat listesinin boyutu (16 bitlik kod birimleriyle) |
insns | ushort[insns_size] | bayt kodunun gerçek dizisi. insns dizisindeki kodun biçimi, Dalvik bytecode adlı yardımcı dokümanda belirtilir. Note
that though this is defined as an array of ushort , there
are some internal structures that prefer four-byte alignment. Ayrıca, bu durum endian değiştirilmiş bir dosyada söz konusuysa değiştirme yalnızca tek tek ushort örneklerinde yapılır ve daha büyük dahili yapılarda yapılmaz.
|
padding | ushort (isteğe bağlı) = 0 | tries dört baytlık hizalama için iki baytlık dolgu.
Bu öğe yalnızca tries_size sıfır değilse ve insns_size tek sayıysa bulunur.
|
dener | try_item[tries_size] (isteğe bağlı) | Kodda istisnaların nerede yakalandığını ve nasıl ele alınacağını gösteren dizi. Dizinin öğeleri aralıkta çakışmamalı ve düşük adresten yüksek adrese doğru sıralanmalıdır. Bu öğe yalnızca tries_size sıfır değilse bulunur.
|
işleyiciler | encoded_catch_handler_list (isteğe bağlı) | Yakalama türlerinin ve ilişkili işleyici adreslerinin listelerinin listesini temsil eden baytlar. Her try_item , bu yapıda bayt bazında bir uzaklığa sahiptir.
into this structure. Bu öğe yalnızca tries_size sıfır değilse bulunur.
|
try_item biçimi
Ad | Biçimi | Açıklama |
---|---|---|
start_addr | uint | Bu girişin kapsadığı kod bloğunun başlangıç adresi. Adres, kapsanan ilk talimatın başlangıcına kadar olan 16 bitlik kod birimlerinin sayısıdır. |
insn_count | ushort | Bu girişin kapsadığı 16 bitlik kod birimi sayısı. Kapsanan son kod birimi start_addr + insn_count - 1 .
|
handler_off | ushort | İlişkili encoded_catch_hander_list başlangıcından bu girişin encoded_catch_handler konumuna kadar olan bayt cinsinden uzaklık. Bu, bir encoded_catch_handler başlangıcına göre ofset olmalıdır.
|
encoded_catch_handler_list biçimi
Ad | Biçimi | Açıklama |
---|---|---|
size | uleb128 | Bu listenin giriş cinsinden boyutu |
liste | encoded_catch_handler[handlers_size] | işleyici listelerinin gerçek listesi, doğrudan (ofset olarak değil) temsil edilir ve sırayla birleştirilir |
encoded_catch_handler biçimi
Ad | Biçimi | Açıklama |
---|---|---|
size | sleb128 | Bu listedeki yakalama türlerinin sayısı. Pozitif olmayan bir değerse bu, yakalama türlerinin sayısının negatifi olur ve yakalamaların ardından genel bir işleyici gelir. Örneğin: 0 size , genel bir yakalama olduğu ancak açıkça yazılmış yakalamaların olmadığı anlamına gelir.
size 2 , açıkça yazılmış iki yakalama olduğu ve genel yakalama olmadığı anlamına gelir. size -1 ise genel yakalama ile birlikte yazılmış bir yakalama olduğu anlamına gelir.
|
işleyiciler | encoded_type_addr_pair[abs(size)] | Her yakalanan tür için bir tane olmak üzere, türlerin test edilmesi gereken sırayla abs(size) kodlu öğe akışı.
|
catch_all_addr | uleb128 (isteğe bağlı) | Tümünü yakalama işleyicisinin bayt kodu adresi. Bu öğe yalnızca size pozitif olmayan bir değerse bulunur.
|
encoded_type_addr_pair biçimi
Ad | Biçimi | Açıklama |
---|---|---|
type_idx | uleb128 | yakalanacak istisna türü için type_ids listesinde dizin oluşturma
|
addr | uleb128 | ilişkilendirilmiş istisna işleyicinin bayt kodu adresi |
debug_info_item
code_item öğesinden referans alınmıştır.
Veri bölümünde görünür
Hizalama: yok (bayt hizalı)
Her debug_info_item
, yorumlandığında code_item
için konumlar tablosunu ve (muhtemelen) yerel değişken bilgilerini yayan, DWARF3'ten esinlenilmiş bir bayt kodlu durum makinesi tanımlar. Sıra, değişken uzunlukta bir başlıkla (uzunluğu yöntem parametrelerinin sayısına bağlıdır) başlar, durum makinesi bayt kodlarıyla devam eder ve DBG_END_SEQUENCE
baytıyla sona erer.
Durum makinesi beş kayıttan oluşur. address
kaydı, 16 bitlik kod birimlerinde ilişkili insns_item
içindeki talimat ofsetini temsil eder. address
kaydı, her debug_info
dizisinin başında 0
ile başlar ve yalnızca monoton bir şekilde artmalıdır.
line
kaydı, durum makinesi tarafından yayılan bir sonraki konum tablosu girişiyle hangi kaynak satır numarasının ilişkilendirilmesi gerektiğini gösterir. Sıra üstbilgisinde başlatılır ve pozitif veya negatif yönde değişebilir ancak asla 1
değerinden küçük olmamalıdır. source_file
kaydı, satır numarası girişlerinin ifade ettiği kaynak dosyayı gösterir. class_def_item
içindeki source_file_idx
değerine eşit olacak şekilde başlatılır.
Diğer iki değişken olan prologue_end
ve epilogue_begin
, bir sonraki konumun bir yöntem prologu veya epilogu olarak kabul edilip edilmeyeceğini belirten Boole işaretleridir (false
olarak başlatılır). Durum makinesi, DBG_RESTART_LOCAL
kodu için her kayıtta canlı olan son yerel değişkenin adını ve türünü de izlemelidir.
Üstbilgi aşağıdaki gibidir:
Ad | Biçimi | Açıklama |
---|---|---|
line_start | uleb128 | Durum makinesinin line kaydının başlangıç değeri.
Gerçek bir pozisyon girişi değildir.
|
parameters_size | uleb128 | Kodlanan parametre adlarının sayısı. Her yöntem parametresi için bir tane olmalıdır (varsa örnek yöntemin this hariç).
|
parameter_names | uleb128p1[parameters_size] | Yöntem parametresi adının dize dizini. NO_INDEX kodlanmış değeri, ilişkili parametre için ad olmadığını gösterir. Tür tanımlayıcısı ve imza, yöntem tanımlayıcısı ve imzadan anlaşılır.
|
Bayt kodu değerleri şunlardır:
Ad | Değer | Biçim | Argümanlar | Açıklama |
---|---|---|---|---|
DBG_END_SEQUENCE | 0x00 | (yok) | code_item için hata ayıklama bilgisi dizisini sonlandırır. |
|
DBG_ADVANCE_PC | 0x01 | uleb128 addr_diff | addr_diff : adres kaydına eklenecek tutar |
konum girişi vermeden adres kaydını ilerletir |
DBG_ADVANCE_LINE | 0x02 | sleb128 line_diff | line_diff : Satır kaydının değiştirileceği tutar |
Konum girişi vermeden satır kaydını ilerletir |
DBG_START_LOCAL | 0x03 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx |
register_num : yerel öğeleri içeren kayıtname_idx : adın dize dizinitype_idx : türün tür dizini
|
Mevcut adreste yerel bir değişken tanımlar. Değerin bilinmediğini belirtmek için name_idx veya type_idx NO_INDEX olabilir.
|
DBG_START_LOCAL_EXTENDED | 0x04 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx uleb128p1 sig_idx |
register_num : Yereldeğerini içerecek kayıt name_idx : Adın dize dizinitype_idx : Türün tür dizinisig_idx : Tür imzasının dize dizini
|
Geçerli adreste tür imzası olan bir yerel değişken oluşturur.
name_idx , type_idx veya sig_idx değerlerinden herhangi biri, değerin bilinmediğini belirtmek için NO_INDEX olabilir. (Ancak sig_idx -1 ise aynı veriler DBG_START_LOCAL işlem kodu kullanılarak daha verimli bir şekilde gösterilebilir.)
Not: İmzaların işlenmesiyle ilgili uyarılar için aşağıdaki " |
DBG_END_LOCAL | 0x05 | uleb128 register_num | register_num : yerel içeren kayıt |
Şu anda etkin olan bir yerel değişkeni, geçerli adreste kapsam dışında olarak işaretler. |
DBG_RESTART_LOCAL | 0x06 | uleb128 register_num | register_num : yeniden başlatmak için kaydolun |
geçerli adreste yerel bir değişkeni yeniden kullanıma sunar. Ad ve tür, belirtilen kayıt defterinde etkin olan son yerel ayarla aynıdır. |
DBG_SET_PROLOGUE_END | 0x07 | (yok) | prologue_end durum makinesi kaydını ayarlar.
Bu, eklenen bir sonraki konum girişinin bir yöntem prologunun sonu olarak (yöntem kesme noktası için uygun bir yer) kabul edilmesi gerektiğini gösterir. prologue_end kaydı, herhangi bir özel (>= 0x0a ) işlem koduyla temizlenir.
|
|
DBG_SET_EPILOGUE_BEGIN | 0x08 | (yok) | epilogue_begin durum makinesi kaydını ayarlar. Bu kayıt, eklenen bir sonraki konum girişinin, bir yöntem epilogunun başlangıcı (yöntemden çıkmadan önce yürütmeyi askıya almak için uygun bir yer) olarak kabul edilmesi gerektiğini belirtir.
epilogue_begin kaydı, herhangi bir özel (>= 0x0a ) işlem koduyla temizlenir.
|
|
DBG_SET_FILE | 0x09 | uleb128p1 name_idx | name_idx : Kaynak dosya adının dize dizini;
NO_INDEX bilinmiyorsa
|
, sonraki tüm satır numarası girişlerinin code_item içinde belirtilen varsayılan ad yerine bu kaynak dosya adına referans verdiğini gösterir.
|
Özel İşlem Kodları | 0x0a…0xff | (yok) | line ve address kayıtlarını ilerletir,
bir konum girişi verir ve prologue_end ile epilogue_begin 'ü temizler. Açıklama için aşağıya bakın.
|
Özel işlem kodları
0x0a
ile 0xff
(dahil) arasındaki değerlere sahip işlem kodları, hem line
hem de address
kayıtlarını küçük bir miktarda hareket ettirir ve ardından yeni bir konum tablosu girişi yayar.
Artışlarla ilgili formül aşağıdaki gibidir:
DBG_FIRST_SPECIAL = 0x0a // the smallest special opcode DBG_LINE_BASE = -4 // the smallest line number increment DBG_LINE_RANGE = 15 // the number of line increments represented adjusted_opcode = opcode - DBG_FIRST_SPECIAL line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE) address += (adjusted_opcode / DBG_LINE_RANGE)
annotations_directory_item
class_def_item öğesinden referans alınmıştır.
Veri bölümünde görünür
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
class_annotations_off | uint | dosyanın başlangıcından doğrudan sınıfa yapılan açıklamalara kadar olan uzaklık veya 0 sınıfın doğrudan açıklaması yoksa.
Sıfır olmayan bir ofset varsa bu, data bölümündeki bir konuma yönelik olmalıdır. Verilerin biçimi aşağıdaki "annotation_set_item " ile belirtilir.
|
fields_size | uint | Bu öğeyle açıklama eklenen alanların sayısı |
annotated_methods_size | uint | Bu öğeyle açıklama eklenen yöntemlerin sayısı |
annotated_parameters_size | uint | Bu öğe tarafından açıklama eklenen yöntem parametresi listelerinin sayısı |
field_annotations | field_annotation[fields_size] (isteğe bağlı) | ilişkili alan açıklamalarının listesi. Listenin öğeleri, field_idx 'ya göre artan düzende sıralanmalıdır.
|
method_annotations | method_annotation[methods_size] (isteğe bağlı) | ilişkili yöntem ek açıklamalarının listesi. Listenin öğeleri, method_idx 'ya göre artan düzende sıralanmalıdır.
|
parameter_annotations | parameter_annotation[parameters_size] (isteğe bağlı) | ilişkili yöntem parametresi ek açıklamalarının listesi. Listenin öğeleri, method_idx 'ya göre artan düzende sıralanmalıdır.
|
Not: Tüm öğelerin field_id
ve method_id
örnekleri aynı tanımlayıcı sınıfa referansta bulunmalıdır.
field_annotation biçimi
Ad | Biçimi | Açıklama |
---|---|---|
field_idx | uint | Açıklama eklenen alanın kimliği için field_ids listesindeki dizin
|
annotations_off | uint | alanın açıklama listesi için dosyanın başlangıcından itibaren olan uzaklık. Başlangıç, data bölümündeki bir konumda olmalıdır. Verilerin biçimi aşağıdaki
"annotation_set_item " ile belirtilir.
|
method_annotation biçimi
Ad | Biçimi | Açıklama |
---|---|---|
method_idx | uint | Notlandırılan yöntemin kimliği için method_ids listesinde dizin oluşturma
|
annotations_off | uint | Dosyanın başlangıcından yöntemin açıklama listesine kadar olan uzaklık. Başlangıç, data bölümündeki bir konumda olmalıdır. Verilerin biçimi aşağıdaki
"annotation_set_item " ile belirtilir.
|
parameter_annotation biçimi
Ad | Biçimi | Açıklama |
---|---|---|
method_idx | uint | Parametreleri açıklama eklenen yöntemin kimliği için method_ids listesindeki dizin
|
annotations_off | uint | dosyanın başlangıcından yöntem parametrelerinin ek açıklamaları listesine kadar olan uzaklık. Başlangıç, data bölümündeki bir konumda olmalıdır. Verilerin biçimi aşağıdaki
"annotation_set_ref_list " ile belirtilir.
|
annotation_set_ref_list
parameter_annotations_item öğesinden referans alınmıştır.
Veri bölümünde görünür
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
size | uint | Listenin giriş sayısı cinsinden boyutu |
liste | annotation_set_ref_item[size] | listenin öğeleri |
annotation_set_ref_item biçimi
Ad | Biçimi | Açıklama |
---|---|---|
annotations_off | uint | Dosyanın başlangıcından referans verilen açıklama grubuna kadar olan uzaklık
veya bu öğe için açıklama yoksa 0 .
Sıfır olmayan bir ofset varsa bu, data bölümündeki bir konuma yönelik olmalıdır. Verilerin biçimi aşağıdaki
"annotation_set_item " ile belirtilir.
|
annotation_set_item
annotations_directory_item, field_annotations_item, method_annotations_item ve annotation_set_ref_item öğelerinden referans alınmıştır.
Veri bölümünde görünür
Eşleşme: 4 bayt
Ad | Biçimi | Açıklama |
---|---|---|
size | uint | kümenin giriş cinsinden boyutu |
entries | annotation_off_item[size] | kümenin öğeleri. Öğeler, type_idx 'ya göre artan düzende sıralanmalıdır.
|
annotation_off_item biçimi
Ad | Biçimi | Açıklama |
---|---|---|
annotation_off | uint | Dosyanın başlangıcından ek açıklamaya kadar olan uzaklık.
Ofset, data bölümündeki bir konuma olmalı ve bu konumdaki verilerin biçimi aşağıdaki "annotation_item " ile belirtilmelidir.
|
annotation_item
annotation_set_item öğesinden referans alınmıştır.
Veri bölümünde görünür
Hizalama: yok (bayt hizalı)
Ad | Biçimi | Açıklama |
---|---|---|
görünürlük | ubyte | Bu ek açıklamanın amaçlanan görünürlüğü (aşağıya bakın) |
ek açıklama | encoded_annotation | Yukarıdaki "encoded_value kodlaması" bölümünde "encoded_annotation biçimi" ile açıklanan biçimde kodlanmış ek açıklama içerikleri.
|
Görünürlük değerleri
visibility
alanındaki seçenekler şunlardır:
annotation_item
:
Ad | Değer | Açıklama |
---|---|---|
VISIBILITY_BUILD | 0x00 | yalnızca derleme sırasında (ör. diğer kodların derlenmesi sırasında) görünür olması amaçlananlar |
VISIBILITY_RUNTIME | 0x01 | çalışma zamanında görünür olması amaçlanmıştır |
VISIBILITY_SYSTEM | 0x02 | Çalışma zamanında görünür olması amaçlanır ancak yalnızca temel sisteme (normal kullanıcı koduna değil) |
encoded_array_item
class_def_item öğesinden referans alınmıştır.
Veri bölümünde görünür
Hizalama: yok (bayt hizalı)
Ad | Biçimi | Açıklama |
---|---|---|
değer | encoded_array | Yukarıdaki "encoded_array Kodlama" bölümündeki "encoded_value Biçim" ile belirtilen biçimde, kodlanmış dizi değerini temsil eden baytlar.
|
hiddenapi_class_data_item
Bu bölümde, her sınıf tarafından kullanılan kısıtlanmış arayüzlerle ilgili veriler yer alır.
Not: Gizli API özelliği Android 10.0'da kullanıma sunulmuştur ve yalnızca önyükleme sınıfı yolundaki sınıfların DEX dosyaları için geçerlidir. Aşağıda açıklanan işaretlerin listesi, Android'in gelecekteki sürümlerinde genişletilebilir. Daha fazla bilgi için SDK olmayan arayüzlerdeki kısıtlamalar başlıklı makaleyi inceleyin.
Ad | Biçimi | Açıklama |
---|---|---|
size | uint | bölümün toplam boyutu |
telafi etme | uint[] | class_idx ile dizine eklenmiş uzaklık dizisi.
class_idx dizinindeki sıfır dizi girişi, bu class_idx için veri olmadığı veya tüm gizli API işaretlerinin sıfır olduğu anlamına gelir.
Aksi takdirde, dizi girişi sıfır değildir ve bölümün başlangıcından bu class_idx için gizli API işaretleri dizisine kadar olan bir ofseti içerir.
|
flags | uleb128[] | Her sınıf için gizli API işaretlerinin birleştirilmiş dizileri. Olası işaret değerleri aşağıdaki tabloda açıklanmıştır. İşaretler, alanlarla aynı sırada kodlanır ve yöntemler sınıf verilerinde kodlanır. |
Kısıtlama işareti türleri:
Ad | Değer | Açıklama |
---|---|---|
beyaz liste | 0 | Resmi olarak belgelenmiş Android çerçevesi Paket Dizini'nin bir parçası olarak desteklenen ve serbestçe kullanılabilen arayüzler. |
gri liste | 1 | Uygulamanın hedef API düzeyinden bağımsız olarak kullanılabilen SDK dışı arayüzler. |
kara listeye al | 2 | Uygulamanın hedef API düzeyinden bağımsız olarak kullanılamayan SDK dışı arayüzler. Bu arayüzlerden birine erişmek çalışma zamanı hatasına neden olur. |
greylist‑max‑o | 3 | Kısıtlanmadıkları sürece Android 8.x ve önceki sürümlerde kullanılabilen SDK dışı arayüzler. |
greylist‑max‑p | 4 | Kısıtlanmadıkları sürece Android 9.x'te kullanılabilecek SDK olmayan arayüzler. |
greylist‑max‑q | 5 | Kısıtlanmadığı sürece Android 10.x'te kullanılabilecek SDK dışı arayüzler. |
greylist‑max‑r | 6 | Kısıtlanmadıkları sürece Android 11.x'te kullanılabilecek SDK olmayan arayüzler. |
Sistem ek açıklamaları
Sistem açıklamaları, sınıflarla (ve yöntemler ve alanlarla) ilgili çeşitli yansıtıcı bilgileri göstermek için kullanılır. Bu bilgilere genellikle yalnızca istemci (sistem dışı) kodu tarafından dolaylı olarak erişilir.
Sistem açıklamaları, .dex
dosyalarında görünürlüğü VISIBILITY_SYSTEM
olarak ayarlanmış açıklamalar şeklinde gösterilir.
dalvik.annotation.AnnotationDefault
Ek açıklama arayüzlerindeki yöntemlerde görünür.
Varsayılan bağlamaları belirtmek isteyen her bir AnnotationDefault
ek açıklama arayüzüne eklenir.
Ad | Biçimi | Açıklama |
---|---|---|
değer | Ek Açıklama | Bu ek açıklamanın varsayılan bağlamaları, bu türde bir ek açıklama olarak gösterilir. Açıklama, açıklama tarafından tanımlanan tüm adları içermeyebilir. Eksik adlar varsayılan değerlere sahip değildir. |
dalvik.annotation.EnclosingClass
Sınıflarda görünme
Başka bir sınıfın üyesi olarak tanımlanan veya anonim olup bir yöntem gövdesinde tanımlanmayan (ör. sentetik bir iç sınıf) her sınıfa bir EnclosingClass
ek açıklaması eklenir. Bu ek açıklamaya sahip her sınıfta InnerClass
ek açıklaması da bulunmalıdır. Ayrıca, bir sınıfta hem EnclosingClass
hem de EnclosingMethod
notu bulunmamalıdır.
Ad | Biçimi | Açıklama |
---|---|---|
değer | Sınıf | Bu sınıfı en yakından kapsayan sınıf |
dalvik.annotation.EnclosingMethod
Sınıflarda görünme
Bir yöntem gövdesinde tanımlanan her sınıfa EnclosingMethod
ek açıklaması eklenir. Bu ek açıklamaya sahip her sınıfta InnerClass
ek açıklaması da bulunmalıdır.
Ayrıca, bir sınıfta hem EnclosingClass
hem de EnclosingMethod
açıklaması bulunmamalıdır.
Ad | Biçimi | Açıklama |
---|---|---|
değer | Yöntem | Bu sınıfı en yakından sözcüksel olarak kapsayan yöntem |
dalvik.annotation.InnerClass
Sınıflarda görünme
Başka bir sınıfın tanımının sözcüksel kapsamı içinde tanımlanan her sınıfa InnerClass
ek açıklaması eklenir.
Bu ek açıklamaya sahip tüm sınıflarda ya EnclosingClass
ek açıklaması ya da EnclosingMethod
ek açıklaması olmalıdır.
Ad | Biçimi | Açıklama |
---|---|---|
ad | Dize | Bu sınıfın başlangıçta belirtilen basit adı (paket öneki içermez). Bu sınıf anonimse ad null olur.
|
accessFlags | int | sınıfın başlangıçta beyan edilen erişim işaretleri (kaynak dilin ve hedef sanal makinenin yürütme modelleri arasındaki uyuşmazlık nedeniyle etkili işaretlerden farklı olabilir) |
dalvik.annotation.MemberClasses
Sınıflarda görünme
Üye sınıfları bildiren her sınıfa MemberClasses
ek açıklaması eklenir. (Üye sınıfı, adı olan doğrudan bir iç sınıftır.)
Ad | Biçimi | Açıklama |
---|---|---|
değer | Sınıf[] | üye sınıflarının dizisi |
dalvik.annotation.MethodParameters
Göründüğü yöntemler
Not: Bu ek açıklama, Android 7.1'den sonra eklenmiştir. Bu özellik, önceki Android sürümlerinde yok sayılır.
MethodParameters
ek açıklaması isteğe bağlıdır ve parametre adları ile değiştiriciler gibi parametre meta verilerini sağlamak için kullanılabilir.
Parametre meta verileri çalışma zamanında gerekli olmadığında açıklama, bir yöntemden veya oluşturucudan güvenli bir şekilde çıkarılabilir.
java.lang.reflect.Parameter.isNamePresent()
, bir parametre için meta verilerin mevcut olup olmadığını kontrol etmek üzere kullanılabilir. Bilgiler mevcut değilse java.lang.reflect.Parameter.getName()
gibi ilişkili yansıtma yöntemleri çalışma zamanında varsayılan davranışa geri döner.
Parametre meta verileri, bir parametrenin sentetik olup olmadığını veya zorunlu olup olmadığını içerdiğinden, derleyiciler parametre meta verilerini eklerken numaralandırmalar gibi oluşturulan sınıflarla ilgili bilgileri de eklemelidir.
MethodParameters
ek açıklaması yalnızca tek tek yöntem parametrelerini açıklar. Bu nedenle, derleyiciler kod boyutu ve çalışma zamanı verimliliği için parametresi olmayan oluşturucular ve yöntemlerde ek açıklamayı tamamen atlayabilir.
Aşağıda belgelenen diziler, yöntemle ilişkili method_id_item
dex yapısıyla aynı boyutta olmalıdır. Aksi takdirde, çalışma zamanında java.lang.reflect.MalformedParametersException
istisnası oluşturulur.
Yani method_id_item.proto_idx
->
proto_id_item.parameters_off
->
type_list.size
, names().length
ve
accessFlags().length
ile aynı olmalıdır.
MethodParameters
, kaynak kodda açıkça veya dolaylı olarak tanımlanmayanlar da dahil olmak üzere tüm resmi yöntem parametrelerini tanımladığından dizilerin boyutu, yalnızca kaynak kodda tanımlanan açık parametrelere dayalı olan İmza veya diğer meta veri bilgilerinden farklı olabilir. MethodParameters
, gerçek yöntem imzasında bulunmayan tür ek açıklaması alıcı parametreleri hakkında herhangi bir bilgi de içermez.
Ad | Biçimi | Açıklama |
---|---|---|
adlar | Dize[] | İlişkili yöntemin resmi parametrelerinin adları. Dizi boş olmamalıdır ancak resmi parametre yoksa boş olmalıdır. Dizideki bir değer, bu dizine sahip resmi parametrenin adı yoksa null olmalıdır. Parametre adı dizeleri boşsa veya ".", ";", "[" ya da "/" içeriyorsa çalışma zamanında java.lang.reflect.MalformedParametersException hatası verilir.
|
accessFlags | int[] | İlişkili yöntemin biçimsel parametrelerinin erişim işaretleri. Dizi boş olmamalıdır ancak resmi parametre yoksa boş olmalıdır. Değer, aşağıdaki değerlere sahip bir bit maskesidir:
java.lang.reflect.MalformedParametersException istisnası oluşturulur.
|
dalvik.annotation.Signature
Sınıflarda, alanlarda ve yöntemlerde görünür.
Signature
ile gösterilebilenden daha karmaşık bir tür açısından tanımlanan her sınıf, alan veya yönteme Signature
ek açıklaması eklenir.type_id_item
.dex
biçimi, imzaların biçimini tanımlamaz. Yalnızca bir kaynak dilin semantiğinin başarılı bir şekilde uygulanması için gereken imzaları temsil etmek amacıyla kullanılır. Bu nedenle, imzalar genellikle sanal makine uygulamaları tarafından ayrıştırılmaz (veya doğrulanmaz). İmzalar, daha üst düzey API'lere ve araçlara (ör. hata ayıklayıcılar) aktarılır. Bu nedenle, imza kullanımı yalnızca geçerli imzaların alınacağıyla ilgili herhangi bir varsayımda bulunmayacak şekilde yazılmalı ve söz dizimi açısından geçersiz bir imzayla karşılaşma olasılığına karşı açıkça korunmalıdır.
İmza dizeleri çok fazla yinelenen içeriğe sahip olma eğiliminde olduğundan, Signature
ek açıklaması bir dize dizisi olarak tanımlanır. Yinelenen öğeler doğal olarak aynı temel verileri ifade eder ve imza, dizideki tüm dizelerin birleştirilmesi olarak kabul edilir. İmzaların ayrı dizelere nasıl ayrılacağıyla ilgili kurallar yoktur. Bu tamamen .dex
dosyalarını oluşturan araçlara bağlıdır.
Ad | Biçimi | Açıklama |
---|---|---|
değer | Dize[] | Bu sınıfın veya üyenin imzası, birleştirilecek dizeler dizisi olarak |
dalvik.annotation.Throws
Göründüğü yöntemler
Bir veya daha fazla istisna türü oluşturduğu belirtilen her yönteme Throws
ek açıklaması eklenir.
Ad | Biçimi | Açıklama |
---|---|---|
değer | Sınıf[] | oluşan istisna türleri dizisi |