Bu belgede, bir dizi sınıf tanımını ve bunlarla ilişkili yardımcı verileri tutmak için kullanılan .dex
dosyalarının düzeni ve içeriği açıklanmaktadır.
Türlere ilişkin kılavuz
İsim | Tanım |
---|---|
bayt | 8 bit imzalı dahili |
ubayt | 8 bit imzasız int |
kısa | 16-bit imzalı int, küçük-endian |
kısa | 16-bit işaretsiz int, küçük-endian |
int | 32-bit imzalı int, küçük-endian |
uint | 32-bit imzasız int, küçük-endian |
uzun | 64-bit imzalı int, küçük-endian |
uzun | 64-bit işaretsiz int, küçük-endian |
sleb128 | LEB128 imzalı, değişken uzunluklu (aşağıya bakın) |
uleb128 | işaretsiz LEB128, değişken uzunluklu (aşağıya bakınız) |
uleb128p1 | işaretsiz LEB128 plus 1 , değişken uzunluklu (aşağıya bakın) |
LEB128
LEB128 (" L ittle- Endian B ase 128 "), keyfi işaretli veya işaretsiz tamsayı miktarları için değişken uzunluklu bir kodlamadır. Format DWARF3 spesifikasyonundan ödünç alınmıştır. Bir .dex
dosyasında LEB128 yalnızca 32 bitlik miktarları kodlamak için kullanılır.
Her LEB128 kodlu değer, birlikte tek bir 32 bitlik değeri temsil eden bir ila beş bayttan oluşur. Her baytın, dizideki en önemli biti açık olan son bayt dışında, en önemli bit seti vardır. Her baytın geri kalan yedi biti, miktarın en az önemli yedi biti ilk baytta, sonraki yedi biti ikinci baytta olacak şekilde yüktür. İmzalı bir LEB128 ( sleb128
) durumunda, dizideki son baytın en önemli veri yükü biti, nihai değeri üretmek için işaretle genişletilir. İmzasız durumda ( uleb128
), açıkça temsil edilmeyen tüm bitler 0
olarak yorumlanır.
İki baytlık LEB128 değerinin bit düzeyinde diyagramı | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
İlk bayt | İkinci bayt | ||||||||||||||
1 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 | 0 | bit 13 | bit 12 | bit 11 | bit 10 | bit 9 | bit 8 | bit 7 |
uleb128p1
varyantı, işaretli bir değeri temsil etmek için kullanılır; burada temsil, uleb128
olarak kodlanan değer artı bir değerden oluşur. Bu, -1
kodlamasını (alternatif olarak işaretsiz değer 0xffffffff
olarak da düşünülür) - ancak başka negatif sayı yok - tek bir bayt haline getirir ve temsil edilen sayının negatif olmaması veya -1
(veya 0xffffffff
) ve başka hiçbir negatif değere izin verilmeyen yerlerde (veya büyük işaretsiz değerlere ihtiyaç duyulmayacağı durumlarda).
İşte formatların bazı örnekleri:
Kodlanmış Sıra | sleb128 olarak | uleb128 olarak | uleb128p1 olarak |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
Dosya düzeni
İsim | Biçim | Tanım |
---|---|---|
başlık | başlık_item | başlık |
string_ids | string_id_item[] | dize tanımlayıcıları listesi. Bunlar, bu dosya tarafından dahili adlandırma (örn. tür tanımlayıcılar) veya kod tarafından atıfta bulunulan sabit nesneler olarak kullanılan tüm dizelerin tanımlayıcılarıdır. Bu liste, UTF-16 kod noktası değerleri kullanılarak (yerel ayarlara duyarlı olmayan bir şekilde) dize içeriğine göre sıralanmalı ve yinelenen girişler içermemelidir. |
type_ids | type_id_item[] | tür tanımlayıcıları listesi. Bunlar, dosyada tanımlı olsun veya olmasın, bu dosya tarafından atıfta bulunulan tüm türlerin (sınıflar, diziler veya temel türler) tanımlayıcılarıdır. Bu liste string_id indeksine göre sıralanmalı ve yinelenen girişler içermemelidir. |
proto_ids | proto_id_item[] | yöntem prototip tanımlayıcıları listesi. Bunlar, bu dosyanın atıfta bulunduğu tüm prototiplerin tanımlayıcılarıdır. Bu listenin dönüş tipi ( type_id indeksine göre) ana sırasına göre ve ardından argüman listesine (sözlükbilimsel sıralama, type_id indeksine göre sıralanan bireysel argümanlar) göre sıralanması gerekir. Listede yinelenen girişler bulunmamalıdır. |
alan_kimlikleri | field_id_item[] | alan tanımlayıcıları listesi. Bunlar, dosyada tanımlanmış olsun ya da olmasın, bu dosya tarafından başvurulan tüm alanların tanımlayıcılarıdır. Bu listenin, tanımlayıcı türün ( type_id indeksine göre) ana sıra, alan adının ( string_id indeksine göre) ara sıra ve türün ( type_id indeksine göre) alt sıra olduğu şekilde sıralanması gerekir. Listede yinelenen girişler bulunmamalıdır. |
yöntem_idleri | method_id_item[] | yöntem tanımlayıcıları listesi. Bunlar, dosyada tanımlanmış olsun ya da olmasın, bu dosya tarafından atıfta bulunulan tüm yöntemlerin tanımlayıcılarıdır. Bu listenin, tanımlayıcı türün ( type_id indeksine göre) ana sıra, yöntem adının ( string_id indeksine göre) ara sıra ve yöntem prototipinin ( proto_id indeksine göre) küçük sıra olduğu şekilde sıralanması gerekir. Listede yinelenen girişler bulunmamalıdır. |
class_defs | class_def_item[] | sınıf tanımları listesi. Sınıflar, belirli bir sınıfın üst sınıfı ve uygulanan arayüzleri listede başvuran sınıftan önce görünecek şekilde sıralanmalıdır. Ayrıca aynı isimli sınıfa ait tanımın listede birden fazla yer alması geçersizdir. |
call_site_ids | call_site_id_item[] | site tanımlayıcıları listesini çağırın. Bunlar, dosyada tanımlanmış olsun ya da olmasın, bu dosya tarafından atıfta bulunulan tüm çağrı sitelerinin tanımlayıcılarıdır. Bu listenin call_site_off göre artan düzende sıralanması gerekir. |
metod_handles | method_handle_item[] | yöntem listeyi yönetir. Dosyada tanımlanmış olsun ya da olmasın, bu dosya tarafından başvurulan tüm yöntem tanıtıcılarının listesi. Bu liste sıralanmamıştır ve mantıksal olarak farklı yöntem tanıtıcı örneklerine karşılık gelecek kopyalar içerebilir. |
veri | ubayt[] | Yukarıda listelenen tablolar için tüm destek verilerini içeren veri alanı. Farklı öğelerin farklı hizalama gereksinimleri vardır ve uygun hizalamayı sağlamak için gerekirse her öğenin önüne dolgu baytları eklenir. |
bağlantı_verileri | ubayt[] | Statik olarak bağlantılı dosyalarda kullanılan veriler. Bu bölümdeki verilerin formatı bu belgede belirtilmemiştir. Bu bölüm bağlantısız dosyalarda boştur ve çalışma zamanı uygulamaları bunu uygun gördükleri şekilde kullanabilir. |
Bitfield, string ve sabit tanımları
DEX_FILE_MAGIC
başlık_item'e gömülü
DEX_FILE_MAGIC
sabit dizisi/dizesi, bir .dex
dosyasının bu şekilde tanınması için başında görünmesi gereken baytların listesidir. Değer, belirli yolsuzluk biçimlerinin tespit edilmesine yardımcı olmak amacıyla kasıtlı olarak bir yeni satır ( "\n"
veya 0x0a
) ve bir boş bayt ( "\0"
veya 0x00
) içerir. Değer aynı zamanda format geliştikçe zaman içinde monoton bir şekilde artması beklenen üç ondalık basamaklı bir format sürüm numarasını da kodlar.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
Not: Formatın 039
sürümüne yönelik destek, const-method-handle
ve const-method-type
üzere iki yeni bayt kodu sunan Android 9.0 sürümüne eklendi. (Bunların her biri Bayt kodu kümesi özeti tablosunda açıklanmıştır.) Android 10'da sürüm 039
, DEX dosya formatını yalnızca önyükleme sınıfı yolundaki DEX dosyaları için geçerli olan gizli API bilgilerini içerecek şekilde genişletir.
Not: Formatın 038
sürümüne yönelik destek, Android 8.0 sürümüne eklenmiştir. Sürüm 038
yeni bayt kodları ( invoke-polymorphic
ve invoke-custom
) ve yöntem tanıtıcıları için veriler ekledi.
Not: Formatın 037
sürümü desteği Android 7.0 sürümüne eklenmiştir. Sürüm 037
önce Android'in çoğu sürümü, formatın 035
sürümünü kullanıyordu. 035
ve 037
sürümleri arasındaki tek fark, varsayılan yöntemlerin eklenmesi ve invoke
ayarının yapılmasıdır.
Not: Formatın en azından birkaç önceki sürümü, yaygın olarak bulunan kamuya açık yazılım sürümlerinde kullanılmıştır. Örneğin, Android platformunun M3 sürümleri (Kasım – Aralık 2007) için 009
sürümü, Android platformunun M5 sürümleri (Şubat – Mart 2008) için ise sürüm 013
kullanıldı. Formatın bu önceki sürümleri, birçok açıdan bu belgede açıklanan sürümden önemli ölçüde farklıdır.
ENDIAN_CONSTANT ve REVERSE_ENDIAN_CONSTANT
başlık_item'e gömülü
ENDIAN_CONSTANT
sabiti, bulunduğu dosyanın endianlığını belirtmek için kullanılır. Standart .dex
formatı little-endian olmasına rağmen uygulamalar bayt değişimi gerçekleştirmeyi seçebilir. Bir uygulama, endian_tag
ENDIAN_CONSTANT
yerine REVERSE_ENDIAN_CONSTANT
olan bir başlıkla karşılaşırsa, dosyanın beklenen formdan bayt değiştirildiğini bilir.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
NO_INDEX
class_def_item ve debug_info_item'e gömülü
NO_INDEX
sabiti bir indeks değerinin bulunmadığını belirtmek için kullanılır.
Not: Bu değer 0
olarak tanımlanmamıştır çünkü bu aslında genellikle geçerli bir dizindir.
NO_INDEX
için seçilen değer uleb128p1
kodlamasında tek bir bayt olarak temsil edilebilir.
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
erişim_flags tanımları
class_def_item, encoded_field, encoded_method ve InnerClass'a gömülü
Bu bayrakların bit alanları, sınıfların ve sınıf üyelerinin erişilebilirliğini ve genel özelliklerini belirtmek için kullanılır.
İsim | Değer | Sınıflar için (ve InnerClass ek açıklamaları) | Alanlar İçin | Yöntemler için |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | herkese public : her yerde görünür | herkese public : her yerde görünür | herkese public : her yerde görünür |
ACC_PRIVATE | 0x2 | private : yalnızca sınıfı tanımlayanlar tarafından görülebilir | private : yalnızca sınıfı tanımlayanlar tarafından görülebilir | private : yalnızca sınıfı tanımlayanlar tarafından görülebilir |
ACC_PROTECTED | 0x4 | protected : paket ve alt sınıflar tarafından görülebilir | protected : paket ve alt sınıflar tarafından görülebilir | protected : paket ve alt sınıflar tarafından görülebilir |
ACC_STATIC | 0x8 | static : dış this referansıyla oluşturulmamıştır | static : sınıfı tanımlayana kadar global | static : this argümanını almaz |
ACC_FINAL | 0x10 | final : alt sınıflara ayrılamaz | final : inşaattan sonra değişmez | final : geçersiz kılınamaz |
ACC_SYNCHRONIZED | 0x20 | synchronized : bu yönteme yapılan çağrı etrafında otomatik olarak elde edilen ilgili kilit. Not: Bu yalnızca | ||
ACC_VOLATILE | 0x40 | volatile : iş parçacığı güvenliğine yardımcı olacak özel erişim kuralları | ||
ACC_BRIDGE | 0x40 | derleyici tarafından tür açısından güvenli bir köprü olarak otomatik olarak eklenen köprü yöntemi | ||
ACC_TRANSIENT | 0x80 | transient : varsayılan serileştirmeyle kaydedilmeyecek | ||
ACC_VAARGS | 0x80 | son argüman derleyici tarafından "geri kalan" argüman olarak değerlendirilmelidir | ||
ACC_NATIVE | 0x100 | native : yerel kodda uygulandı | ||
ACC_INTERFACE | 0x200 | interface : çoklu-uygulanabilir soyut sınıf | ||
ACC_ABSTRACT | 0x400 | abstract : doğrudan örneklenemez | abstract : bu sınıf tarafından uygulanmadı | |
ACC_STRICT | 0x800 | strictfp : kayan nokta aritmetiği için katı kurallar | ||
ACC_SENTETİK | 0x1000 | kaynak kodunda doğrudan tanımlanmadı | kaynak kodunda doğrudan tanımlanmadı | kaynak kodunda doğrudan tanımlanmadı |
ACC_ANNOTATION | 0x2000 | ek açıklama sınıfı olarak bildirildi | ||
ACC_ENUM | 0x4000 | numaralandırılmış bir tür olarak bildirildi | numaralandırılmış bir değer olarak bildirildi | |
(kullanılmıyor) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | yapıcı yöntemi (sınıf veya örnek başlatıcı) | ||
ACC_DECLARED_ SENKRONİZE | 0x20000 | synchronized bildirdi.Not: Bunun yürütme üzerinde hiçbir etkisi yoktur (kendi başına bu bayrağın yansıması dışında). |
InnerClass
ek açıklamaları için açık olmasına izin verilir ve hiçbir zaman class_def_item
içinde açık olmamalıdır.
MUTF-8 (Değiştirilmiş UTF-8) Kodlaması
Daha kolay eski desteğe verilen bir taviz olarak, .dex
formatı, dize verilerini fiilen standart olarak değiştirilmiş bir UTF-8 formunda (bundan sonra MUTF-8 olarak anılacaktır) kodlar. Bu form, aşağıdakiler dışında standart UTF-8 ile aynıdır:
- Yalnızca bir, iki ve üç baytlık kodlamalar kullanılır.
-
U+10000
…U+10ffff
aralığındaki kod noktaları, her biri üç baytlık kodlanmış bir değer olarak temsil edilen bir yedek çift olarak kodlanır. -
U+0000
kod noktası iki bayt biçiminde kodlanmıştır. - Düz bir boş bayt (değer
0
), standart C dili yorumunda olduğu gibi bir dizenin sonunu belirtir.
Yukarıdaki ilk iki madde şu şekilde özetlenebilir: MUTF-8, Unicode karakterler için daha doğrudan bir kodlama formatı olmak yerine, UTF-16 için bir kodlama formatıdır.
Yukarıdaki son iki öğe, U+0000
kod noktasının bir dizeye dahil edilmesini ve yine de onu C tarzı boş sonlandırılmış bir dize olarak işlemeyi aynı anda mümkün kılar.
Bununla birlikte, özel U+0000
kodlaması, normal UTF-8'den farklı olarak, bir MUTF-8 dize çifti üzerinde standart C işlevinin strcmp()
çağrılması sonucunun, eşit olmayan dizelerin karşılaştırılmasında her zaman düzgün şekilde imzalanmış sonucu göstermediği anlamına gelir. . Sıralama (yalnızca eşitlik değil) söz konusu olduğunda, MUTF-8 dizelerini karşılaştırmanın en basit yolu, bunların kodunu karakter karakter çözmek ve kodu çözülmüş değerleri karşılaştırmaktır. (Ancak daha akıllı uygulamalar da mümkündür.)
Karakter kodlaması hakkında daha fazla bilgi için lütfen Unicode Standardına bakın. MUTF-8 aslında (nispeten daha az bilinen) kodlama CESU-8'e UTF-8'den daha yakındır.
kodlanmış_değer kodlaması
annotation_element ve encoded_array_item'e gömülü
encoded_value
, (neredeyse) rastgele hiyerarşik olarak yapılandırılmış verilerin kodlanmış bir parçasıdır. Kodlamanın hem kompakt hem de ayrıştırılması kolay olması amaçlanmıştır.
İsim | Biçim | Tanım |
---|---|---|
(value_arg << 5) | değer türü | ubayt | yüksek dereceli üç bitte isteğe bağlı açıklayıcı bir argümanla birlikte hemen sonraki value türünü belirten bayt. Çeşitli value tanımları için aşağıya bakın. Çoğu durumda, value_arg hemen sonraki value uzunluğunu bayt cinsinden kodlar; (size - 1) gibi; örneğin, 0 , değerin bir bayt gerektirdiği anlamına gelir ve 7 , sekiz bayt gerektirdiği anlamına gelir; ancak aşağıda belirtildiği gibi istisnalar da vardır. |
değer | ubayt[] | değeri temsil eden baytlar, uzunlukları değişkendir ve farklı value_type baytları için farklı şekilde yorumlanırlar, ancak her zaman küçük endiandır. Ayrıntılar için aşağıdaki çeşitli değer tanımlarına bakın. |
Değer formatları
Adı yazın | value_type | value_arg Biçimi | value Formatı | Tanım |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (yok; 0 olmalıdır) | ubayt[1] | imzalı bir baytlık tamsayı değeri |
VALUE_SHORT | 0x02 | boyut - 1 (0…1) | ubayt[boyut] | imzalı iki baytlık tamsayı değeri, işaret genişletilmiş |
VALUE_CHAR | 0x03 | boyut - 1 (0…1) | ubayt[boyut] | işaretsiz iki baytlık tam sayı değeri, sıfır genişletilmiş |
VALUE_INT | 0x04 | boyut - 1 (0…3) | ubayt[boyut] | imzalı dört baytlık tamsayı değeri, işaret genişletilmiş |
VALUE_LONG | 0x06 | boyut - 1 (0…7) | ubayt[boyut] | imzalı sekiz baytlık tamsayı değeri, işaret genişletilmiş |
VALUE_FLOAT | 0x10 | boyut - 1 (0…3) | ubayt[boyut] | dört baytlık bit modeli, sağa doğru sıfır genişletilmiş ve IEEE754 32 bit kayan nokta değeri olarak yorumlanır |
VALUE_DOUBLE | 0x11 | boyut - 1 (0…7) | ubayt[boyut] | sekiz baytlık bit modeli, sağa doğru sıfır genişletilmiş ve IEEE754 64 bit kayan nokta değeri olarak yorumlanır |
VALUE_METHOD_TYPE | 0x15 | boyut - 1 (0…3) | ubayt[boyut] | imzasız (sıfır genişletilmiş) dört baytlık tam sayı değeri, proto_ids bölümünde bir dizin olarak yorumlanır ve bir yöntem türü değerini temsil eder |
VALUE_METHOD_HANDLE | 0x16 | boyut - 1 (0…3) | ubayt[boyut] | işaretsiz (sıfır genişletilmiş) dört baytlık tam sayı değeri, method_handles bölümünde bir dizin olarak yorumlanır ve bir yöntem tanıtıcı değerini temsil eder |
VALUE_STRING | 0x17 | boyut - 1 (0…3) | ubayt[boyut] | string_ids bölümünde bir dizin olarak yorumlanan ve bir dize değerini temsil eden işaretsiz (sıfır genişletilmiş) dört baytlık tamsayı değeri |
DEĞER TÜRÜ | 0x18 | boyut - 1 (0…3) | ubayt[boyut] | type_ids bölümünde bir dizin olarak yorumlanan ve yansıtıcı bir tür/sınıf değerini temsil eden işaretsiz (sıfır genişletilmiş) dört baytlık tamsayı değeri |
VALUE_FIELD | 0x19 | boyut - 1 (0…3) | ubayt[boyut] | işaretsiz (sıfır genişletilmiş) dört baytlık tam sayı değeri, field_ids bölümünde bir dizin olarak yorumlanır ve yansıtıcı bir alan değerini temsil eder |
VALUE_METHOD | 0x1a | boyut - 1 (0…3) | ubayt[boyut] | işaretsiz (sıfır genişletilmiş) dört baytlık tam sayı değeri, method_ids bölümünde bir dizin olarak yorumlanır ve yansıtıcı bir yöntem değerini temsil eder |
VALUE_ENUM | 0x1b | boyut - 1 (0…3) | ubayt[boyut] | işaretsiz (sıfır genişletilmiş) dört baytlık tam sayı değeri, field_ids bölümünde bir dizin olarak yorumlanır ve numaralandırılmış bir tür sabitinin değerini temsil eder |
VALUE_ARRAY | 0x1c | (yok; 0 olmalıdır) | kodlanmış_dizi | aşağıda " encoded_array biçimi" ile belirtilen biçimde bir değerler dizisi. value boyutu kodlamada örtülüdür. |
VALUE_ANNOTATION | 0x1d | (yok; 0 olmalıdır) | kodlanmış_annotation | aşağıda " encoded_annotation formatı" ile belirtilen formatta bir alt açıklama. value boyutu kodlamada örtülüdür. |
VALUE_NULL | 0x1e | (yok; 0 olmalıdır) | (hiçbiri) | null referans değeri |
VALUE_BOOLEAN | 0x1f | boole (0…1) | (hiçbiri) | bir bitlik değer; false için 0 , true için 1 . Bit, value_arg dosyasında temsil edilir. |
kodlanmış_dizi biçimi
İsim | Biçim | Tanım |
---|---|---|
boyut | uleb128 | dizideki eleman sayısı |
değerler | kodlanmış_değer[boyut] | bu bölümde belirtilen formatta, sırayla birleştirilmiş bir dizi size encoded_value bayt dizisi. |
kodlanmış_açıklama biçimi
İsim | Biçim | Tanım |
---|---|---|
type_idx | uleb128 | ek açıklamanın türü. Bu bir sınıf (dizi veya ilkel değil) türü olmalıdır. |
boyut | uleb128 | bu ek açıklamadaki ad-değer eşlemelerinin sayısı |
elementler | annotation_element[boyut] | doğrudan satır içi olarak temsil edilen (ötelikler olarak değil) ek açıklamanın öğeleri. Öğeler string_id indeksine göre artan sırada sıralanmalıdır. |
ek açıklama_öğesi biçimi
İsim | Biçim | Tanım |
---|---|---|
name_idx | uleb128 | string_ids bölümünde bir dizin olarak temsil edilen öğe adı. Dizenin yukarıda tanımlanan MemberName sözdizimine uyması gerekir. |
değer | kodlanmış_değer | eleman değeri |
Dize sözdizimi
Bir .dex
dosyasında sonuçta bir dizeye atıfta bulunan çeşitli öğe türleri vardır. Aşağıdaki BNF tarzı tanımlar, bu dizeler için kabul edilebilir sözdizimini gösterir.
Basit Ad
SimpleName, diğer şeylerin adlarının sözdiziminin temelidir. .dex
formatı burada oldukça geniş bir serbestliğe izin veriyor (çoğu yaygın kaynak dilden çok daha fazla). Kısaca, basit bir ad herhangi bir düşük ASCII alfabetik karakter veya rakamdan, birkaç belirli düşük ASCII sembolden ve kontrol, boşluk veya özel karakter olmayan çoğu ASCII olmayan kod noktasından oluşur. Sürüm 040
başlayarak format ayrıca boşluk karakterlerine de izin verir (Unicode Zs
kategorisi). Yedek kod noktalarının ( U+d800
… U+dfff
aralığında) kendi başına geçerli ad karakterleri olarak kabul edilmediğini, ancak Unicode tamamlayıcı karakterlerin geçerli olduğunu (bunlar SimpleNameChar kuralının son alternatifiyle temsil edilir) unutmayın. MUTF-8 kodlamasında bir dosyada yedek kod noktası çiftleri olarak temsil edilmelidir.
Basit Ad → | ||
SimpleNameChar ( SimpleNameChar )* | ||
SimpleNameChar → | ||
'A' ... 'Z' | ||
| | 'a' ... 'z' | |
| | '0' … '9' | |
| | ' ' | DEX sürüm 040'tan beri |
| | '$' | |
| | '-' | |
| | '_' | |
| | U+00a0 | DEX sürüm 040'tan beri |
| | U+00a1 … U+1fff | |
| | U+2000 … U+200a | DEX sürüm 040'tan beri |
| | U+2010 … U+2027 | |
| | U+202f | DEX sürüm 040'tan beri |
| | 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
ÜyeAdı, bir sınıfın üyesinin adıdır; üyeler alanlar, yöntemler ve iç sınıflardır.
ÜyeAdı → | |
Basit Ad | |
| | '<' BasitAd '>' |
TamSınıfAdı
FullClassName , isteğe bağlı bir paket belirtici ve ardından gerekli bir adı içeren tam nitelikli bir sınıf adıdır.
TamSınıfAdı → | |
İsteğe Bağlı PaketÖneki Basit Ad | |
İsteğe Bağlı Paket Öneki → | |
( BasitAd '/' )* |
Tür Tanımlayıcı
type_id_item tarafından kullanılıyor
TypeDescriptor, temel öğeler, sınıflar, diziler ve void
dahil olmak üzere herhangi bir türün temsilidir. Çeşitli versiyonların anlamları için aşağıya bakın.
Tür Tanımlayıcı → | |
'V' | |
| | Alan Türü Tanımlayıcısı |
FieldTypeDescriptor → | |
NonArrayFieldTypeDescriptor | |
| | ( '[' * 1…255) NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor → | |
'Z' | |
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' TamSınıfAdı ';' |
Kısa Tanımlayıcı
proto_id_item tarafından kullanılıyor
ShortyDescriptor, çeşitli referans (sınıf veya dizi) türleri arasında bir ayrım olmaması dışında, dönüş ve parametre türleri de dahil olmak üzere bir yöntem prototipinin kısa biçimli temsilidir. Bunun yerine, tüm referans türleri tek bir 'L'
karakteriyle temsil edilir.
ShortyDescriptor → | |
ShortyReturnType ( ShortyFieldType )* | |
ShortyReturnType → | |
'V' | |
| | ShortyFieldType |
ShortyFieldType → | |
'Z' | |
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
Tür Tanımlayıcı Semantiği
Bu, TypeDescriptor değişkenlerinin her birinin anlamıdır.
Sözdizimi | Anlam |
---|---|
V | void ; yalnızca dönüş türleri için geçerlidir |
Z | boolean |
B | byte |
S | short |
C | char |
BEN | int |
J | long |
F | float |
D | double |
L tam/nitelikli/İsim ; | sınıf fully.qualified.Name |
[ tanımlayıcı | descriptor dizisi, dizi dizileri için yinelemeli olarak kullanılabilir, ancak 255'ten fazla boyuta sahip olmak geçersizdir. |
Öğeler ve ilgili yapılar
Bu bölüm, bir .dex
dosyasında görünebilecek üst düzey öğelerin her birine ilişkin tanımları içerir.
başlık_item
başlık bölümünde görünür
hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
büyü | ubayt[8] = DEX_FILE_MAGIC | sihirli değer. Daha fazla ayrıntı için yukarıdaki " DEX_FILE_MAGIC " başlığı altındaki tartışmaya bakın. |
sağlama toplamı | uint | dosyanın geri kalanının adler32 sağlama toplamı ( magic ve bu alan dışında her şey); dosya bozulmasını tespit etmek için kullanılır |
imza | ubayt[20] | Dosyanın geri kalanının SHA-1 imzası (karma) ( magic , checksum ve bu alan dışındaki her şey); dosyaları benzersiz şekilde tanımlamak için kullanılır |
Dosya boyutu | uint | bayt cinsinden tüm dosyanın boyutu (başlık dahil) |
başlık_boyutu | uint = 0x70 | Bayt cinsinden başlığın boyutu (bu bölümün tamamı). Bu, formatı geçersiz kılmadan en azından sınırlı miktarda geriye/ileriye uyumluluğa izin verir. |
endian_tag | uint = ENDIAN_CONSTANT | endianness etiketi. Daha fazla ayrıntı için yukarıdaki " ENDIAN_CONSTANT ve REVERSE_ENDIAN_CONSTANT " başlığı altındaki tartışmaya bakın. |
bağlantı_boyutu | uint | bağlantı bölümünün boyutu veya bu dosya statik olarak bağlı değilse 0 |
bağlantı_kapalı | uint | dosyanın başlangıcından bağlantı bölümüne kadar uzaklık veya link_size == 0 ise 0 . Ofset, eğer sıfır değilse, link_data bölümündeki bir ofset olmalıdır. İşaret edilen verilerin formatı bu belgede belirtilmeden bırakılmıştır; bu başlık alanı (ve önceki), çalışma zamanı uygulamaları tarafından kullanılmak üzere kanca olarak bırakılmıştır. |
harita_off | uint | dosyanın başlangıcından harita öğesine kadar uzaklık. Sıfırdan farklı olması gereken uzaklık, data bölümündeki uzaklığa göre olmalı ve veriler, aşağıda " map_list " ile belirtilen formatta olmalıdır. |
string_ids_size | uint | dize tanımlayıcıları listesindeki dizelerin sayısı |
string_ids_off | uint | dosyanın başlangıcından dize tanımlayıcılar listesine kadar ofset veya string_ids_size == 0 ise 0 (kuşkusuz garip bir uç durum). Uzaklık sıfır değilse string_ids bölümünün başlangıcında olmalıdır. |
type_ids_size | uint | tür tanımlayıcıları listesindeki öğelerin sayısı, en fazla 65535 |
type_ids_off | uint | dosyanın başlangıcından tür tanımlayıcılar listesine kadar ofset veya type_ids_size == 0 ise 0 (kuşkusuz garip bir uç durum). Uzaklık sıfır değilse type_ids bölümünün başlangıcında olmalıdır. |
proto_ids_size | uint | prototip tanımlayıcılar listesindeki öğelerin sayısı, en fazla 65535 |
proto_ids_off | uint | dosyanın başlangıcından prototip tanımlayıcılar listesine kadar ofset veya proto_ids_size == 0 ise 0 (kuşkusuz garip bir uç durum). Uzaklık sıfır değilse proto_ids bölümünün başlangıcında olmalıdır. |
field_ids_size | uint | alan tanımlayıcıları listesindeki öğelerin sayısı |
field_ids_off | uint | dosyanın başlangıcından alan tanımlayıcıları listesine kadar uzaklık veya field_ids_size == 0 0 . Uzaklık sıfır değilse, field_ids bölümünün başlangıcında olmalıdır. |
method_ids_size | uint | yöntem tanımlayıcıları listesindeki öğelerin sayısı |
method_ids_off | uint | dosyanın başlangıcından yöntem tanımlayıcılar listesine kadar uzaklık veya method_ids_size == 0 0 . Uzaklık sıfır değilse, method_ids bölümünün başlangıcında olmalıdır. |
class_defs_size | uint | sınıf tanımları listesindeki öğelerin sayısı |
class_defs_off | uint | dosyanın başlangıcından sınıf tanımları listesine kadar ofset veya class_defs_size == 0 ise 0 (kuşkusuz garip bir uç durum). Uzaklık, sıfır değilse, class_defs bölümünün başlangıcında olmalıdır. |
veri_boyutu | uint | Bayt cinsinden data bölümünün boyutu. sizeof(uint) değerinin çift katı olmalıdır. |
veri_kapalı | uint | dosyanın başlangıcından data bölümünün başlangıcına kadar olan uzaklık. |
harita_listesi
veri bölümünde görünür
başlık_item'den referans alındı
hizalama: 4 bayt
Bu, bir dosyanın tüm içeriğinin sırayla bir listesidir. header_item
ile ilgili bir miktar fazlalık içerir ancak tüm dosya üzerinde yineleme yapmak için kullanımı kolay bir form olması amaçlanmıştır. Belirli bir tür bir haritada en fazla bir kez görünmelidir, ancak biçimin geri kalanının ima ettiği kısıtlamalar dışında hangi türlerin görünebileceğine dair herhangi bir kısıtlama yoktur (örneğin, önce bir header
bölümü görünmeli, ardından bir string_ids
gelmelidir) bölüm vb.). Ayrıca harita girişleri başlangıçtaki uzaklığa göre sıralanmalı ve çakışmamalıdır.
İsim | Biçim | Tanım |
---|---|---|
boyut | uint | listenin boyutu, girişlerde |
liste | harita_öğesi[boyut] | listenin unsurları |
harita_öğesi biçimi
İsim | Biçim | Tanım |
---|---|---|
tip | kısa | öğelerin türü; aşağıdaki tabloya bakınız |
kullanılmayan | kısa | (kullanılmıyor) |
boyut | uint | belirtilen ofsette bulunacak öğe sayısının sayısı |
telafi etmek | uint | dosyanın başlangıcından söz konusu öğelere kadar olan uzaklık |
Tip Kodları
Öğe türü | Devamlı | Değer | Bayt Cinsinden Öğe Boyutu |
---|---|---|---|
başlık_item | TYPE_HEADER_ITEM | 0x0000 | 0x70 |
string_id_item | TYPE_STRING_ID_ITEM | 0x0001 | 0x04 |
type_id_item | TYPE_TYPE_ID_ITEM | 0x0002 | 0x04 |
proto_id_item | TYPE_PROTO_ID_ITEM | 0x0003 | 0x0c |
field_id_item | TYPE_FIELD_ID_ITEM | 0x0004 | 0x08 |
method_id_item | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
class_def_item | TYPE_CLASS_DEF_ITEM | 0x0006 | 0x20 |
call_site_id_item | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x04 |
method_handle_item | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
harita_listesi | TYPE_MAP_LIST | 0x1000 | 4 + (ürün boyutu * 12) |
tür_listesi | TYPE_TYPE_LIST | 0x1001 | 4 + (ürün boyutu * 2) |
annotation_set_ref_list | TYPE_ANNOTATION_SET_REF_LIST | 0x1002 | 4 + (ürün boyutu * 4) |
annotation_set_item | TYPE_ANNOTATION_SET_ITEM | 0x1003 | 4 + (ürün boyutu * 4) |
class_data_item | TYPE_CLASS_DATA_ITEM | 0x2000 | örtülü; ayrıştırmalı |
code_item | TYPE_CODE_ITEM | 0x2001 | örtülü; ayrıştırmalı |
string_data_item | TYPE_STRING_DATA_ITEM | 0x2002 | örtülü; ayrıştırmalı |
debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | örtülü; ayrıştırmalı |
ek açıklama_item | TYPE_ANNOTATION_ITEM | 0x2004 | örtülü; ayrıştırmalı |
kodlanmış_array_item | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | örtülü; ayrıştırmalı |
annotations_directory_item | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | örtülü; ayrıştırmalı |
Hiddenapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | örtülü; ayrıştırmalı |
string_id_item
string_ids bölümünde görünür
hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
string_data_off | uint | dosyanın başlangıcından bu öğenin dize verilerine kadar olan uzaklık. Uzaklık, data bölümündeki bir konumda olmalı ve veriler, aşağıda " string_data_item " tarafından belirtilen formatta olmalıdır. Ofset için herhangi bir hizalama gereksinimi yoktur. |
string_data_item
veri bölümünde görünür
hizalama: yok (bayt hizalı)
İsim | Biçim | Tanım |
---|---|---|
utf16_size | uleb128 | bu dizenin UTF-16 kod birimleri cinsinden boyutu (birçok sistemde "dize uzunluğu" anlamına gelir). Yani bu, dizenin kodu çözülmüş uzunluğudur. (Kodlanmış uzunluk 0 baytın konumuyla belirtilir.) |
veri | ubayt[] | bir dizi MUTF-8 kod birimi (diğer adıyla sekizli, diğer adıyla bayt) ve ardından 0 değerinde bir bayt gelir. Veri formatıyla ilgili ayrıntılar ve tartışmalar için yukarıdaki "MUTF-8 (Değiştirilmiş UTF-8) Kodlaması" konusuna bakın. Not: UTF-16 yedek kod birimlerini (yani, |
type_id_item
type_ids bölümünde görünür
hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
tanımlayıcı_idx | uint | bu türün tanımlayıcı dizesi için string_ids listesine dizin ekleyin. Dizenin yukarıda tanımlanan TypeDescriptor sözdizimine uyması gerekir. |
proto_id_item
proto_ids bölümünde görünür
hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
shorty_idx | uint | Bu prototipin kısa biçimli tanımlayıcı dizesi için string_ids listesine indeksleyin. Dizenin yukarıda tanımlanan ShortyDescriptor sözdizimine uyması ve bu öğenin dönüş türüne ve parametrelerine karşılık gelmesi gerekir. |
return_type_idx | uint | bu prototipin dönüş tipi için type_ids listesine indeksleyin |
parametreler_off | uint | dosyanın başlangıcından bu prototip için parametre türleri listesine kadar ofset veya bu prototipin parametresi yoksa 0 . Bu uzaklık, eğer sıfır değilse, data bölümünde olmalı ve buradaki veriler, aşağıda "type_list" ile belirtilen formatta olmalıdır. Ayrıca listede void türüne referans olmamalıdır. |
field_id_item
field_ids bölümünde görünür
hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
class_idx | kısa | bu alanın tanımlayıcısı için type_ids listesine indeksleyin. Bu bir dizi veya temel tür değil, bir sınıf türü olmalıdır. |
type_idx | kısa | bu alanın türü için type_ids listesine dizin |
name_idx | uint | bu alanın adı için string_ids listesine dizin ekleyin. Dizenin yukarıda tanımlanan MemberName sözdizimine uyması gerekir. |
method_id_item
method_ids bölümünde görünür
hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
class_idx | kısa | Bu yöntemin tanımlayıcısı için type_ids listesine indeksleyin. Bu, ilkel bir tür değil, bir sınıf veya dizi türü olmalıdır. |
proto_idx | kısa | bu yöntemin prototipi için proto_ids listesine indeksleyin |
name_idx | uint | Bu yöntemin adı için string_ids listesine indeksleyin. Dizenin yukarıda tanımlanan MemberName sözdizimine uyması gerekir. |
class_def_item
class_defs bölümünde görünür
hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
class_idx | uint | bu sınıfın type_ids listesine indeksleyin. Bu bir dizi veya temel tür değil, bir sınıf türü olmalıdır. |
erişim_flagları | uint | sınıf için erişim bayrakları ( public , final vb.). Ayrıntılar için " access_flags Tanımları"na bakın. |
süpersınıf_idx | uint | üst sınıf için type_ids listesine dizin ekleyin veya bu sınıfın üst sınıfı yoksa (yani, Object gibi bir kök sınıfsa) NO_INDEX sabit değerini kullanın. Varsa, bu bir dizi veya temel tür değil, bir sınıf türü olmalıdır. |
arayüzler_off | uint | dosyanın başlangıcından arayüz listesine kadar ofset veya yoksa 0 . Bu ofset data bölümünde olmalı ve oradaki veriler aşağıda " type_list " ile belirtilen formatta olmalıdır. Listenin öğelerinin her biri bir sınıf türü olmalı (dizi veya temel tür değil) ve herhangi bir kopya olmamalıdır. |
kaynak_dosya_idx | uint | Bu sınıfın orijinal kaynağını (en azından çoğunu) içeren dosyanın adı için string_ids listesine indeks ekleyin veya bu bilginin eksikliğini temsil etmek için NO_INDEX özel değerini kullanın. Herhangi bir yöntemin debug_info_item bu kaynak dosyayı geçersiz kılabilir, ancak beklenti çoğu sınıfın yalnızca bir kaynak dosyadan gelmesidir. |
ek açıklamalar_off | uint | dosyanın başlangıcından bu sınıfın ek açıklama yapısına kadar ofset veya bu sınıfta ek açıklama yoksa 0 . Bu uzaklık, sıfır değilse, data bölümünde olmalı ve buradaki veriler, tüm öğelerin tanımlayıcı olarak bu sınıfa gönderme yapmasıyla birlikte, aşağıda " annotations_directory_item " tarafından belirtilen formatta olmalıdır. |
class_data_off | uint | dosyanın başlangıcından bu öğe için ilişkili sınıf verilerine kadar ofset veya bu sınıf için sınıf verisi yoksa 0 . (Örneğin, bu sınıf bir işaretleyici arayüzü ise bu durum geçerli olabilir.) Ofset, sıfır değilse, data bölümünde olmalı ve oradaki veriler, aşağıda " class_data_item " ile belirtilen formatta olmalıdır, tüm öğeler tanımlayıcı olarak bu sınıfa atıfta bulunur. |
static_values_off | uint | dosyanın başlangıcından static alanlar için başlangıç değerleri listesine kadar ofset veya hiçbiri yoksa 0 (ve tüm static alanlar 0 veya null ile başlatılmalıdır). Bu ofset data bölümünde olmalı ve oradaki veriler aşağıda " encoded_array_item " ile belirtilen formatta olmalıdır. Dizinin boyutu, bu sınıf tarafından bildirilen static alanların sayısından daha büyük olmamalıdır ve öğeler, karşılık gelen field_list dosyasında bildirilen sırayla static alanlara karşılık gelir. Her dizi öğesinin türü, ilgili alanın bildirilen türüyle eşleşmelidir. Dizide static alanlardan daha az öğe varsa, kalan alanlar türe uygun 0 veya null ile başlatılır. |
call_site_id_item
call_site_ids bölümünde görünür
hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
call_site_off | uint | Site tanımını çağırmak için dosyanın başlangıcından itibaren ofset. Ofset, veri bölümünde olmalı ve buradaki veriler, aşağıda "call_site_item" tarafından belirtilen formatta olmalıdır. |
call_site_item
veri bölümünde görünür
hizalama: yok (bayt hizalanmış)
Call_site_item, öğeleri bir önyükleme bağlayıcı yöntemine sağlanan argümanlara karşılık gelen bir kodlanmış_dizi_itemdir. İlk üç argüman:
- Önyükleme bağlayıcı yöntemini (VALUE_METHOD_HANDLE) temsil eden bir yöntem tanıtıcısı.
- Önyükleme bağlayıcısının çözümlemesi gereken bir yöntem adı (VALUE_STRING).
- Çözümlenecek yöntem adının türüne karşılık gelen bir yöntem türü (VALUE_METHOD_TYPE).
Ek bağımsız değişkenler, önyükleme bağlayıcı yöntemine iletilen sabit değerlerdir. Bu bağımsız değişkenler sırayla ve herhangi bir tür dönüşümü olmadan iletilir.
Önyükleme bağlayıcı yöntemini temsil eden yöntem tanıtıcısı, java.lang.invoke.CallSite
dönüş türüne sahip olmalıdır. İlk üç parametre türü şunlardır:
-
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
hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
method_handle_type | kısa | yöntem tanıtıcısının türü; aşağıdaki tabloya bakınız |
kullanılmayan | kısa | (kullanılmıyor) |
field_or_method_id | kısa | Yöntem tanıtıcısı türünün erişimci mi yoksa yöntem çağırıcı mı olduğuna bağlı olarak alan veya yöntem kimliği |
kullanılmayan | kısa | (kullanılmıyor) |
Yöntem Tanıtıcı Türü Kodları
Devamlı | Değer | Tanım |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0x00 | Yöntem tanıtıcısı statik bir alan ayarlayıcıdır (erişimci) |
Method_handle_type_static_get | 0x01 | Yöntem Kulpu Statik Alan Getter (Accessor) |
Method_handle_type_instance_put | 0x02 | Yöntem Kulpu bir örnek alan ayarlayıcısıdır (Accessor) |
Method_handle_type_instance_get | 0x03 | Yöntem Kulpu bir örnek alan alıcısıdır (Accessor) |
Method_handle_type_invoke_static | 0x04 | Yöntem Kulpu statik bir yöntem invoker |
Method_handle_type_invoke_instance | 0x05 | Yöntem Kulpu, bir örnek yöntem invoker |
Method_handle_type_invoke_constructor | 0x06 | Yöntem Kulpu bir yapıcı yöntem invoker |
Method_handle_type_invoke_direct | 0x07 | Yöntem Kulpu doğrudan bir yöntem invoker |
Method_handle_type_invoke_interface | 0x08 | Yöntem Kulpu bir arabirim yöntemi Invoker |
class_data_item
class_def_item'den atıfta bulunuldu
Veri bölümünde görünür
Hizalama: Yok (bayt hizalanmış)
İsim | Biçim | Tanım |
---|---|---|
static_fields_size | Uleb128 | Bu öğede tanımlanan statik alanların sayısı |
instance_fields_size | Uleb128 | Bu öğede tanımlanan örnek alanlarının sayısı |
Direct_methods_size | Uleb128 | Bu öğede tanımlanan doğrudan yöntem sayısı |
sanal_methods_size | Uleb128 | Bu öğede tanımlanan sanal yöntemlerin sayısı |
static_fields | encoded_field [static_fields_size] | Kodlanmış elemanların bir dizisi olarak temsil edilen tanımlanmış statik alanlar. Alanlar artan sırada field_idx tarafından sıralanmalıdır. |
örnek_fields | encoded_field [örnek_fields_size] | Kodlanmış öğelerin bir dizisi olarak temsil edilen tanımlı örnek alanları. Alanlar artan sırada field_idx tarafından sıralanmalıdır. |
Direct_methods | encoded_method [direct_methods_size] | Kodlanmış eleman dizisi olarak temsil edilen tanımlanmış doğrudan ( static , private veya yapıcı) yöntemler. Yöntemler, artan sırada method_idx tarafından sıralanmalıdır. |
sanal_methods | encoded_method [virtual_methods_size] | Kodlanmış elementlerin bir dizisi olarak temsil edilen tanımlanmış sanal ( static , private veya yapıcı hiçbiri) yöntem. Bu liste, bu öğenin temsil ettiği sınıf tarafından geçersiz kılınmadıkça kalıtsal yöntemler içermemelidir . Yöntemler, artan sırada method_idx tarafından sıralanmalıdır. Sanal bir yöntemin method_idx herhangi bir doğrudan yöntemle aynı olmamalıdır . |
Not: Tüm öğeler ' field_id
s ve method_id
s, aynı tanımlayıcı sınıfa atıfta bulunmalıdır.
encoded_field formatı
İsim | Biçim | Tanım |
---|---|---|
field_idx_diff | Uleb128 | Listedeki önceki öğenin dizininden bir fark olarak temsil edilen bu alanın kimliği (ad ve tanımlayıcı içerir) için field_ids listesine dizin. Bir listedeki ilk öğenin dizini doğrudan temsil edilir. |
Access_flags | Uleb128 | Alan için Access bayrakları ( public , final vb.). Ayrıntılar için bkz. " access_flags Tanımları". |
encoded_method biçimi
İsim | Biçim | Tanım |
---|---|---|
Method_idx_diff | Uleb128 | Listedeki önceki öğenin dizininden bir fark olarak temsil edilen bu yöntemin kimliği (ad ve tanımlayıcı içerir) için method_ids listesine dizin. Bir listedeki ilk öğenin dizini doğrudan temsil edilir. |
Access_flags | Uleb128 | Yöntem için Access bayrakları ( public , final vb.). Ayrıntılar için bkz. " access_flags Tanımları". |
kod_off | Uleb128 | Dosyanın başlangıcından bu yöntem için kod yapısına veya bu yöntem abstract veya native 0 . Ofset, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " code_item " ile belirtilmiştir. |
type_list
class_def_item ve proto_id_item'den atıfta bulunuldu
Veri bölümünde görünür
Hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
boyut | uint | listenin boyutu, girişlerde |
liste | type_item [boyut] | Listenin unsurları |
type_item biçimi
İsim | Biçim | Tanım |
---|---|---|
type_idx | ushort | type_ids listesine dizin |
code_item
encoded_method'dan atıfta bulunuldu
Veri bölümünde görünür
Hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
RECISTERS_SIZE | ushort | Bu kod tarafından kullanılan kayıt sayısı |
ins_size | ushort | Bu kodun için olduğu yönteme gelen argümanların kelimelerinin sayısı |
outs_size | ushort | Yöntem çağırma için bu kodun gerektirdiği giden argüman alanının kelime sayısı |
tries_size | ushort | Bu örnek için try_item s sayısı. Sıfır değilse, bunlar bu örnekteki insns hemen sonra tries dizisi olarak görünür. |
debug_info_off | uint | Dosyanın başından bu kod için hata ayıklama bilgisi (satır numaraları + yerel değişken bilgi) dizisine veya herhangi bir bilgi yoksa 0 ofset. Ofset, sıfır değilse, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " debug_info_item " ile belirtilmiştir. |
insns_size | uint | 16 bit kod birimlerinde talimatlar listesinin boyutu |
insns | USHORT [INSNS_SIZE] | gerçek bayt kodu. Bir insns dizisindeki kod biçimi , Dalvik Bytecode refakatçi belgesi tarafından belirtilir. Bunun bir ushort dizisi olarak tanımlanmasına rağmen, dört baytlık hizalamayı tercih eden bazı iç yapılar olduğunu unutmayın. Ayrıca, bu endian-sween bir dosyada olursa, değiştirme daha büyük iç yapılarda değil, yalnızca bireysel ushort s üzerinde yapılır. |
dolgu malzemesi | Ushort (isteğe bağlı) = 0 | Dört baytlık tries yapmak için iki bayt dolgu. Bu öğe yalnızca tries_size sıfır değilse ve insns_size garipse mevcuttur. |
çalışır | try_item [tries_size] (isteğe bağlı) | Kod istisnalarının nerede yakalandığını ve bunların nasıl ele alınacağını gösteren dizi. Dizinin elemanları menzilde ve düşükten yüksek adrese göre örtüşmemelidir. Bu öğe yalnızca tries_size sıfır değilse mevcuttur. |
işleyiciler | Encoded_catch_handler_list (isteğe bağlı) | Yakalama türleri ve ilişkili işleyici adresleri listelerinin bir listesini temsil eden baytlar. Her try_item bu yapıya bayt bilgisiz bir ofsete sahiptir. Bu öğe yalnızca tries_size sıfır değilse mevcuttur. |
try_item biçimi
İsim | Biçim | Tanım |
---|---|---|
start_addr | uint | Bu girişin kapsadığı kod bloğunun adresini başlatın. Adres, ilk kapsamlı talimatın başlangıcına kadar 16 bit kod birimleridir. |
insn_count | ushort | Bu girişin kapsadığı 16 bit kod birimlerinin sayısı. Kapsanan son kod birimi (dahil) start_addr + insn_count - 1 . |
handler_off | ushort | Bu giriş için encoded_catch_hander_list encoded_catch_handler başlamasından itibaren bayt cinsinden ofset. Bu, encoded_catch_handler başlangıcında bir ofset olmalıdır. |
Encoded_catch_handler_list formatı
İsim | Biçim | Tanım |
---|---|---|
boyut | Uleb128 | Bu listenin boyutu, girişlerde |
liste | encoded_catch_handler [handlers_size] | Doğrudan temsil edilen (ofset olarak değil) ve sırayla birleştirilmiş işleyici listelerinin gerçek listesi |
encoded_catch_handler biçimi
İsim | Biçim | Tanım |
---|---|---|
boyut | SLOB128 | Bu listedeki yakalama türlerinin sayısı. Pozitif değilse, bu yakalama türlerinin sayısının negatifidir ve yakalamaları bir yakalama işleyicisi takip eder. Örneğin: 0 size , bir yakalama var, ancak açıkça yazılmış bir yakalama olduğu anlamına gelir. 2 size açıkça yazılmış iki yakalama ve yakalama olmadığı anlamına gelir. Ve -1 size bir yakalama ile birlikte yazılmış bir yakalama olduğu anlamına gelir. |
işleyiciler | encoded_type_addr_pair [abs (boyut)] | abs(size) kodlanmış öğelerin akışı, her bir tür yakalanan tür için, türlerin test edilmesi gerektiği sırayla. |
catch_all_addr | Uleb128 (isteğe bağlı) | Catch-All Handler'ın bayt kodu adresi. Bu öğe yalnızca size pozitif değilse mevcuttur. |
encoded_type_addr_pair formatı
İsim | Biçim | Tanım |
---|---|---|
type_idx | Uleb128 | Catch için istisna türü için type_ids listesine dizini |
adres | Uleb128 | İlişkili istisna işleyicisinin bayt kodu adresi |
debug_info_item
code_item'den atıfta bulunuldu
Veri bölümünde görünür
Hizalama: Yok (bayt hizalanmış)
Her debug_info_item
, yorumlandığında konum tablosunu ve (potansiyel olarak) bir code_item
için yerel değişken bilgilerini yayan cüce3 esintili bayt kodlu bir durum makinesi tanımlar. Dizi, değişken uzunlukta bir başlık ile başlar (uzunluğu yöntem parametrelerinin sayısına bağlı), bunu durum makinesi bayt modları takip eder ve bir DBG_END_SEQUENCE
baytıyla biter.
Devlet makinesi beş kayıttan oluşur. address
kaydı, 16 bit kod birimlerinde ilişkili insns_item
talimat ofsetini temsil eder. address
kaydı, her bir debug_info
dizisinin başında 0
başlar ve yalnızca monoton olarak artmalıdır. line
kaydı, hangi kaynak satır numarasının durum makinesi tarafından yayılan bir sonraki konum tablo girişiyle ilişkilendirilmesi gerektiğini temsil eder. Sıra başlığında başlatılır ve pozitif veya negatif yönlerde değişebilir, ancak asla 1
az olmamalıdır. source_file
kayıt, satır numarası girişlerinin başvurduğu kaynak dosyayı temsil eder. class_def_item
source_file_idx
değerine başlatılır. Diğer iki değişken olan prologue_end
ve epilogue_begin
, yayılan bir sonraki pozisyonun bir yöntem prologu veya epilog olarak kabul edilip edilmeyeceğini gösteren boole bayraklarıdır ( false
olarak başlatılır). Durum makinesi ayrıca DBG_RESTART_LOCAL
KODU için her kayıtta canlı son yerel değişkenin adını ve türünü izlemelidir.
Başlık aşağıdaki gibidir:
İsim | Biçim | Tanım |
---|---|---|
line_start | Uleb128 | Durum makinesinin line kaydı için başlangıç değeri. Gerçek bir konum girişini temsil etmez. |
parametreler_size | Uleb128 | kodlanan parametre adlarının sayısı. Metod başına bir parametre başına bir örnek, this bir örnek yöntem hariç olmalıdır. |
parametre_names | Uleb128p1 [parametreler_size] | Yöntem parametresi adının dize dizin. NO_INDEX kodlanmış bir değeri, ilişkili parametre için hiçbir adın bulunmadığını gösterir. Tip tanımlayıcı ve imza yöntem tanımlayıcı ve imzasından ima edilir. |
Bayt kodu değerleri aşağıdaki gibidir:
İsim | Değer | Biçim | Argümanlar | Tanım |
---|---|---|---|---|
DBG_END_SEXENCE | 0x00 | (hiçbiri) | bir code_item için bir hata ayıklama bilgi dizisini sonlandırır | |
Dbg_advance_pc | 0x01 | Uleb128 addr_diff | addr_diff : Adres kaydına eklenecek tutar | Konum girişi yaymadan adres kaydını geliştirir |
Dbg_advance_line | 0x02 | slear128 line_diff | line_diff : Satır kaydını değiştirme tutarı | Bir konum girişi yaymadan çizgi kaydını geliştirir |
Dbg_start_local | 0x03 | Uleb128 register_num Uleb128p1 Name_idx Uleb128p1 type_idx | register_num : Yerel içerecek kayıtname_idx : adın dize dizintype_idx : Türün Tür Dizini | Geçerli adreste yerel bir değişken sunar. name_idx veya type_idx bu değerin bilinmediğini belirtmek için NO_INDEX olabilir. |
Dbg_start_local_extended | 0x04 | Uleb128 register_num Uleb128p1 Name_idx Uleb128p1 type_idx Uleb128p1 SIG_IDX | register_num : Yerel içerecek kayıtname_idx : adın dize dizintype_idx : Türün Tür Dizinisig_idx : Tip İmzasının Dize Dizin | Geçerli adreste tip imzalı bir yerel tanıtılır. name_idx , type_idx veya sig_idx herhangi biri, bu değerin bilinmediğini belirtmek için NO_INDEX olabilir. ( sig_idx -1 ise, aynı veriler opcode DBG_START_LOCAL kullanılarak daha verimli bir şekilde temsil edilebilir.) Not: İmzaları ele alma konusunda uyarılar için aşağıdaki " |
Dbg_end_local | 0x05 | Uleb128 register_num | register_num : Yerel içeren kayıt | Şu anda canlı bir yerel değişkeni, geçerli adreste kapsam dışı olarak işaretler |
DBG_RESTART_LOCAL | 0x06 | Uleb128 register_num | register_num : Yeniden başlatmak için kaydolun | Geçerli adreste yerel bir değişkeni yeniden tanıtır. Adı ve türü, belirtilen kayıtta canlı olan son yerel ile aynıdır. |
Dbg_set_pologue_end | 0x07 | (hiçbiri) | Bir sonraki konum girişinin bir yöntem prologunun (bir yöntem kesme noktası için uygun bir yer) olarak düşünülmesi gerektiğini belirten prologue_end durum makinesi kaydını ayarlar. prologue_end kaydı herhangi bir özel ( >= 0x0a ) opcode ile temizlenir. | |
Dbg_set_epilogue_begin | 0x08 | (hiçbiri) | epilogue_begin Durum Makine kaydını ayarlar, bu da eklenen bir sonraki konum girişinin bir yöntem epilogunun başlangıcı olarak düşünülmesi gerektiğini gösterir (yöntem çıkışından önce yürütmeyi askıya almak için uygun bir yer). epilogue_begin kaydı herhangi bir özel ( >= 0x0a ) opcode ile temizlenir. | |
Dbg_set_file | 0x09 | Uleb128p1 Name_idx | name_idx : Kaynak dosya adının dize dizin; Bilinmiyorsa NO_INDEX | code_item belirtilen varsayılan ad yerine, sonraki tüm satır numarası girişlerinin bu kaynak dosya adına referans verdiğini gösterir |
Özel Opcodes | 0x0a… 0xff | (hiçbiri) | line ve address kayıtlarını geliştirir, bir konum girişi yayar ve prologue_end ve epilogue_begin temizler. Açıklama için aşağıya bakın. |
Özel Opcodes
0x0a
ve 0xff
(dahil) arasındaki değerlere sahip opcodlar hem line
hem de address
kayıtlarını küçük bir miktar taşır ve ardından yeni bir konum tablosu girişi yayar. Artışların formülü aşağıdaki gibidir:
DBG_FIRST_SPECIAL = 0x0a // the smallest special opcode DBG_LINE_BASE = -4 // the smallest line number increment DBG_LINE_RANGE = 15 // the number of line increments represented adjusted_opcode = opcode - DBG_FIRST_SPECIAL line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE) address += (adjusted_opcode / DBG_LINE_RANGE)
Annotations_directory_item
class_def_item'den atıfta bulunuldu
Veri bölümünde görünür
Hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
class_annotations_off | uint | Dosyanın başlangıcından doğrudan sınıfta yapılan ek açıklamalara veya sınıfın doğrudan ek açıklamaları yoksa 0 denk gelin. Ofset, sıfır değilse, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " annotation_set_item " ile belirtilmiştir. |
Fields_size | uint | Bu öğe tarafından açıklanan alanların sayısı |
Annotated_methods_size | uint | Bu öğe tarafından açıklanan yöntemlerin sayısı |
Annotated_parameters_size | uint | Bu öğe tarafından açıklanan yöntem parametre listelerinin sayısı |
Field_annotations | Field_annotation [Fields_size] (isteğe bağlı) | İlişkili alan ek açıklamalarının listesi. Listenin öğeleri field_idx tarafından artan sırada sıralanmalıdır. |
Method_annotations | Method_Annotation [Methy_size] (isteğe bağlı) | İlişkili yöntem ek açıklamalarının listesi. Listenin öğeleri, method_idx tarafından artan sırada sıralanmalıdır. |
parametre_annotasyonları | parametre_annotasyon [parametreler_size] (isteğe bağlı) | İlişkili yöntem parametre ek açıklamalarının listesi. Listenin öğeleri, method_idx tarafından artan sırada sıralanmalıdır. |
Not: Tüm öğeler ' field_id
s ve method_id
s, aynı tanımlayıcı sınıfa atıfta bulunmalıdır.
field_annotasyon biçimi
İsim | Biçim | Tanım |
---|---|---|
Field_idx | uint | Açıklaman alanın kimliği için field_ids listesine indeks |
ek açıklamalar_off | uint | Dosyanın başlangıcından alan için ek açıklamalar listesine ofset. Ofset, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " annotation_set_item " ile belirtilmiştir. |
Method_annotasyon biçimi
İsim | Biçim | Tanım |
---|---|---|
Method_idx | uint | Açıklaman yöntemin kimliği için method_ids listesine index |
ek açıklamalar_off | uint | Dosyanın başlangıcından yöntemin ek açıklamaları listesine dengelenin. Ofset, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " annotation_set_item " ile belirtilmiştir. |
parametre_annotasyon biçimi
İsim | Biçim | Tanım |
---|---|---|
Method_idx | uint | Parametreleri açıklanan yöntemin kimliği için method_ids listesine index |
ek açıklamalar_off | uint | Dosyanın başlangıcından yöntem parametreleri için ek açıklamalar listesine ofset. Ofset, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " annotation_set_ref_list " ile belirtilmiştir. |
Annotation_set_ref_list
parametreden_annotasyonlar_item'den atıfta bulunuldu
Veri bölümünde görünür
Hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
boyut | uint | listenin boyutu, girişlerde |
liste | Annotation_set_ref_item [boyut] | Listenin unsurları |
Annotation_set_ref_item biçimi
İsim | Biçim | Tanım |
---|---|---|
ek açıklamalar_off | uint | Bu öğe için ek açıklama yoksa dosyanın başlamasından referans verilen ek açıklama setine veya 0 dengelenir. Ofset, sıfır değilse, data bölümündeki bir konuma olmalıdır. Verilerin biçimi aşağıdaki " annotation_set_item " ile belirtilmiştir. |
Annotation_set_item
Annotations_directory_item, Field_annotations_item, Method_annotations_item ve Annotation_set_ref_item'den atıfta bulunuldu
Veri bölümünde görünür
Hizalama: 4 bayt
İsim | Biçim | Tanım |
---|---|---|
boyut | uint | Girişlerde setin boyutu |
girdileri | Annotation_off_item [boyut] | setin unsurları. Elemanlar, type_idx ile artan sırada sıralanmalıdır. |
ek açıklama_off_item biçimi
İsim | Biçim | Tanım |
---|---|---|
ek açıklama_off | uint | Dosyanın başlangıcından ek açıklama. Ofset, data bölümündeki bir konuma olmalı ve bu konumdaki verilerin biçimi aşağıdaki " annotation_item " ile belirtilmelidir. |
ek açıklama_item
Annotation_set_item'den atıfta bulunuldu
Veri bölümünde görünür
Hizalama: Yok (bayt hizalanmış)
İsim | Biçim | Tanım |
---|---|---|
görünürlük | Ubyte | Bu ek açıklamanın amaçlanan görünürlüğü (aşağıya bakın) |
dipnot | encoded_annotation | Kodlanmış ek açıklama içeriği, yukarıdaki " encoded_annotation Format" altında " encoded_value Format" ile açıklanan formatta. |
Görünürlük Değerleri
Bunlar, bir annotation_item
visibility
alanı için seçeneklerdir:
İsim | Değer | Tanım |
---|---|---|
Visibility_build | 0x00 | sadece yapı zamanında görünür olması amaçlanmıştır (örneğin, diğer kodun derlenmesi sırasında) |
Visibility_runtime | 0x01 | Çalışma zamanında görünür olması amaçlanmıştır |
Visibility_system | 0x02 | Çalışma zamanında görünür, ancak yalnızca temel sistemde (ve normal kullanıcı koduna değil) |
encoded_array_item
class_def_item'den atıfta bulunuldu
Veri bölümünde görünür
Hizalama: Yok (bayt hizalanmış)
İsim | Biçim | Tanım |
---|---|---|
değer | Encoded_array | Kodlanmış dizi değerini temsil eden baytlar, yukarıdaki " encoded_value Kodlama" altında " encoded_array Format" tarafından belirtilen formatta. |
hiddenapi_class_data_item
Bu bölüm, her sınıf tarafından kullanılan kısıtlı arayüzler hakkında veriler içerir.
Not: Gizli API özelliği Android 10.0'da tanıtıldı ve yalnızca önyükleme sınıfı yolundaki sınıfların DEX dosyaları için geçerlidir. Aşağıda açıklanan bayrakların listesi Android'in gelecekteki sürümlerinde genişletilebilir. Daha fazla bilgi için bkz. SDK olmayan arabirimlerdeki kısıtlamalar .
İsim | Biçim | Tanım |
---|---|---|
boyut | uint | Bölümün toplam boyutu |
ofsets | Uint [] | Ofset dizisi class_idx tarafından endekslendi. class_idx dizininde sıfır dizi girişi, bu class_idx için veri olmadığı veya tüm gizli API bayraklarının sıfır olduğu anlamına gelir. Aksi takdirde dizi girişi sıfır değildir ve bölümün başlangıcından bu class_idx için bir dizi gizli API bayrağına bir ofset içerir. |
bayraklar | Uleb128 [] | Her sınıf için gizli API bayraklarının birleştirilmiş dizileri. Olası bayrak değerleri aşağıdaki tabloda açıklanmaktadır. Bayraklar alanlarla aynı sırayla kodlanır ve yöntemler sınıf verilerinde kodlanır. |
Kısıtlama bayrağı türleri:
İsim | Değer | Tanım |
---|---|---|
beyaz liste | 0 | Özgür olarak kullanılabilen ve resmi olarak belgelenmiş Android Framework Paketi dizininin bir parçası olarak desteklenen arayüzler. |
gri listesi | 1 | Uygulamanın hedef API seviyesinden bağımsız olarak kullanılabilen SDK olmayan arabirimler. |
kara liste | 2 | Uygulamanın hedef API seviyesinden bağımsız olarak kullanılamayan SDK olmayan arabirimler. Bu arabirimlerden birine erişmek çalışma zamanı hatasına neden olur. |
Greylist - MAX - O | 3 | Kısıtlanmadıkça Android 8.x ve daha düşük bir süre için kullanılabilen SDK olmayan arayüzler. |
Greylist - Max - P | 4 | Kısıtlanmadıkça Android 9.x için kullanılabilen SDK olmayan arayüzler. |
Greylist - MAX - Q | 5 | Kısıtlanmadıkça Android 10.x için kullanılabilen SDK olmayan arayüzler. |
Greylist - MAX - R | 6 | Kısıtlanmadıkça Android 11.x için kullanılabilen SDK olmayan arayüzler. |
Sistem ek açıklamaları
Sistem ek açıklamaları, sınıflar (ve yöntemler ve alanlar) hakkında çeşitli yansıtıcı bilgileri temsil etmek için kullanılır. Bu bilgilere genellikle yalnızca Müşteri (Sistem Olmayan) Kodu ile dolaylı olarak erişilir.
Sistem ek açıklamaları, .dex
dosyalarında görünürlük ile VISIBILITY_SYSTEM
olarak ayarlanmış ek açıklamalar olarak temsil edilir.
Dalvik.Annotation.AnnotationDefault
Ek açıklama arayüzlerindeki yöntemlerde görünür
Her ek açıklama arayüzüne, varsayılan bağlamaları belirtmek isteyen bir AnnotationDefault
ek açıklaması eklenir.
İsim | Biçim | Tanım |
---|---|---|
değer | Dipnot | Bu ek açıklama için varsayılan bağlamalar, bu tür bir ek açıklama olarak temsil edilir. Ek açıklamanın ek açıklama ile tanımlanan tüm isimleri içermesi gerekmez; Eksik isimlerin varsayılanları yoktur. |
Dalvik.Annotation.EnclosingClass
Sınıflarda görünür
Her sınıfa başka bir sınıfın üyesi olarak tanımlanan veya anonim olan ancak bir yöntem gövdesinde (örneğin sentetik bir iç sınıf) tanımlanmayan bir ekleme EnclosingClass
eklenir. Bu ek açıklamaya sahip olan her sınıfta da bir InnerClass
eklemesi olmalıdır. Ek olarak, bir sınıfın hem bir EnclosingClass
hem de bir EnclosingMethod
açıklaması olmamalıdır.
İsim | Biçim | Tanım |
---|---|---|
değer | Sınıf | Bu sınıfı en yakından kapsamlı bir şekilde kapsamlı olan sınıf |
Dalvik.Annotation.EnsLosingMethod
Sınıflarda görünür
Bir yöntem gövdesi içinde tanımlanan her sınıfa bir EnclosingMethod
belirtisi eklenmiştir. Bu ek açıklamaya sahip olan her sınıfta da bir InnerClass
eklemesi olmalıdır. Ek olarak, bir sınıfın hem bir EnclosingClass
hem de bir EnclosingMethod
açıklaması olmamalıdır.
İsim | Biçim | Tanım |
---|---|---|
değer | Yöntem | Bu sınıfı en yakından kapsamlı bir şekilde kapsamlı bir yöntem |
Dalvik.Annotation.innerClass
Sınıflarda görünür
Başka bir sınıfın tanımının sözcüksel kapsamında tanımlanan her sınıfa bir InnerClass
ek açıklaması eklenir. Bu ek açıklamaya sahip herhangi bir sınıfın, bir EnclosingClass
eklemi veya EnclosingMethod
ek açıklaması olması gerekir.
İsim | Biçim | Tanım |
---|---|---|
isim | Sicim | Başlangıçta bu sınıfın basit adı bildirildi (herhangi bir paket öneki dahil değil). Bu sınıf anonim ise, adı null . |
AccessFlags | int | Başlangıçta beyan edilen sınıfın erişim bayrakları (kaynak dilinin yürütme modelleri ile hedef sanal makinenin yürütme modelleri arasındaki uyumsuzluk nedeniyle etkili bayraklardan farklı olabilir) |
Dalvik.Annotation.Memberclasses
Sınıflarda görünür
Üye sınıflarını beyan eden her sınıfa bir MemberClasses
ek açıklaması eklenmiştir. (Üye sınıfı, adı olan doğrudan bir iç sınıftır.)
İsim | Biçim | Tanım |
---|---|---|
değer | Sınıf[] | Üye sınıflarının dizisi |
Dalvik.Annotation.MethodParameter
Yöntemlerde görünür
Not: Bu ek açıklama Android 7.1'den sonra eklendi. Daha önceki Android sürümlerindeki varlığı göz ardı edilecektir.
Bir MethodParameters
ek açıklaması isteğe bağlıdır ve parametre adları ve değiştiriciler gibi parametre meta verilerini sağlamak için kullanılabilir.
Ek açıklama, çalışma zamanında parametre meta verileri gerekmediğinde bir yöntemden veya yapıcıdan güvenli bir şekilde atlanabilir. java.lang.reflect.Parameter.isNamePresent()
bir parametre için meta verilerin olup olmadığını kontrol etmek için kullanılabilir ve java.lang.reflect.Parameter.getName()
gibi ilişkili yansıma yöntemleri çalışma zamanında varsayılan davranışa geri döner. Bilgi mevcut değilse.
Parametre meta verileri dahil ederken, derleyiciler, bir parametrenin sentetik veya zorunlu olup olmadığını içerdiğinden, derleyiciler mezarlar gibi oluşturulan sınıflar için bilgiler içermelidir.
Bir MethodParameters
ek açıklaması yalnızca bireysel yöntem parametrelerini açıklar. Bu nedenle, derleyiciler, kod büyüklüğü ve çalışma zamanı verimliliği uğruna parametresi olmayan yapıcılar ve yöntemler için ek açıklamayı atlayabilir.
Aşağıda belgelenen diziler, yöntemle ilişkili method_id_item
DEX yapısıyla aynı boyutta olmalıdır, aksi takdirde bir java.lang.reflect.MalformedParametersException
çalışma zamanında atılacaktır.
Yani: method_id_item.proto_idx
-> proto_id_item.parameters_off
-> type_list.size
names().length
ve accessFlags().length
.
MethodParameters
tüm resmi yöntem parametrelerini açıkladığından, kaynak kodunda açıkça veya dolaylı olarak bildirilmeyenler bile, dizilerin boyutu yalnızca kaynak kodunda bildirilen açık parametrelere dayanan imza veya diğer meta veri bilgilerinden farklı olabilir. MethodParameters
ayrıca, gerçek yöntem imzasında bulunmayan tip açıklama alıcı parametreleri hakkında herhangi bir bilgi içermez.
İsim | Biçim | Tanım |
---|---|---|
isimler | Sicim[] | İlişkili yöntem için resmi parametrelerin adları. Dizi boş olmamalı, ancak resmi parametre yoksa boş olmalıdır. Bu dizine sahip resmi parametrenin adı yoksa, dizideki bir değer boş olmalıdır. Parametre adı dizeleri boşsa veya '', ';' '[' veya '/' içeriyorsa, java.lang.reflect.MalformedParametersException çalışma zamanında atılır. |
AccessFlags | int [] | İlişkili yöntem için resmi parametrelerin erişim bayrakları. Dizi boş olmamalı, ancak resmi parametre yoksa boş olmalıdır. Değer, aşağıdaki değerlerle biraz maskedir:
java.lang.reflect.MalformedParametersException çalışma zamanında atılır. |
Dalvik.Annotation.Signature
Sınıflarda, alanlarda ve yöntemlerde görünür
Bir type_id_item
tarafından temsil edilebileceğinden daha karmaşık bir tür olarak tanımlanan her sınıfa, alana veya yönteme bir Signature
açıklaması eklenir. .dex
biçimi imzalar için biçimi tanımlamaz; Sadece bir kaynak dilinin bu dilin semantiğinin başarılı bir şekilde uygulanması için ihtiyaç duyduğu imzaları temsil edebilmesi anlamına gelir. Bu nedenle, imzalar sanal makine uygulamaları tarafından genellikle ayrıştırılmaz (veya doğrulanmaz). İmzalar, daha üst düzey API'lere ve araçlara (hata ayıklayıcılar gibi) teslim edilir. Bu nedenle, bir imzanın herhangi bir kullanımı, yalnızca geçerli imzalar alma hakkında herhangi bir varsayım yapmamak ve açıkça kendisini sözdizimsel olarak geçersiz bir imzaya ulaşma olasılığına karşı korumak için yazılmalıdır.
İmza dizeleri çok fazla yinelenen içeriğe sahip olma eğiliminde olduğundan, bir Signature
ek açıklaması, kopyalanan öğelerin doğal olarak aynı temel verilere atıfta bulunduğu ve imzanın dizideki tüm dizelerin birleştirilmesi olarak alındığı bir dizi dizisi olarak tanımlanır. . Bir imzanın ayrı iplere nasıl ayıracağına dair hiçbir kural yoktur; Bu tamamen .dex
dosyalarını oluşturan araçlara bağlıdır.
İsim | Biçim | Tanım |
---|---|---|
değer | Sicim[] | Bu sınıfın veya üyenin imzası, birlikte birleştirilecek bir dizi dizgi olarak |
Dalvik.Annotation.Throws
Yöntemlerde görünür
Bir veya daha fazla istisna türü attığı bildirilen her yönteme Throws
açıklaması eklenir.
İsim | Biçim | Tanım |
---|---|---|
değer | Sınıf[] | atılan istisna türleri dizisi |