Format wykonywalny Dalvik

Ten dokument opisuje układ i zawartość .dex które służą do przechowywania zbioru definicji klas i powiązanych z nimi danych dodatkowych.

Przewodnik po typach

Nazwa Opis
bajt Zalogowanie się 8-bitowe
ubajt 8-bitowa niepodpisana liczba całkowita
krótki 16-bitowa wartość całkowita zalogowana, little-endian
Ushort 16-bitowa liczba całkowita bez znaku, little-endian
int 32-bitowa wartość całkowita zalogowana, little-endian
Uint 32-bitowa liczba całkowita bez znaku, little-endian
długi 64-bitowa wartość całkowita zalogowana, little-endian
Ulong 64-bitowa liczba całkowita bez znaku, little-endian
sleb128 podpisany LEB128, zmienna długości (patrz poniżej)
Uleb128 bez znaku LEB128, zmienna długości (patrz poniżej)
ULEB128P1 bez znaku LEB128 plus 1, zmienna długości (patrz poniżej)

128 LEB

LEB128 („Apaza128”) to kodowanie o zmiennej długości dla dowolnych liczb całkowitych ze znakiem lub bez znaku. Format zapożyczone z dokumentu DWARF3 specyfikacji. W pliku .dex nazwa LEB128 jest używana tylko do kodować 32-bitowe ilości.

Każda wartość zakodowana w formacie LEB128 składa się z 1–5 wartości bajtów, które razem reprezentują jedną wartość 32-bitową. Każdy jest ustawiony najbardziej istotny bit bajtowy, z wyjątkiem ostatniego bajtu w funkcji w sekwencji, której najbardziej znaczący bit jest jasny. Pozostałe 7 bitów każdego bajtu to ładunek, przy czym najmniej istotne części w pierwszym bajcie, a następnych 7 w drugim i tak dalej. W przypadku podpisanego dokumentu LEB128 (sleb128): najbardziej istotny bit ładunku ostatniego bajtu w sekwencji to i potęgowania znaku, aby otrzymać wartość końcową. W przypadku bez podpisu (uleb128), wszystkie bity, które nie są wyraźnie reprezentowane, są interpretowany jako 0.

Schemat bitowy dwubajtowej wartości funkcji LEB128
Pierwszy bajt Drugi bajt
1 bit6 bit5 bit4 bit3 bit2 bit1 bit0 0 bit13 bit12 bit11 bit10 bit9 bit8 bit7

Wariant uleb128p1 służy do reprezentowania ciągu znaków ze znakiem gdzie reprezentacja jest wartością plus jeden zakodowaną jako uleb128. Powoduje to, że kodowanie -1 (traktowana jako wartość bez znaku 0xffffffff) – ale nie ma żadnej innej liczby ujemnej – jest to 1 bajt i jest przydatne dokładnie w tych przypadkach, gdy reprezentowana liczba musi być albo nie może być liczbą ujemną ani -1 (lub 0xffffffff), gdzie nie są dozwolone żadne inne wartości ujemne (lub gdy duże liczby nieoznaczone) prawdopodobnie nie są potrzebne).

Oto kilka przykładów formatów:

Zakodowana sekwencja Jako sleb128 Jako uleb128 Jako uleb128p1
0000-1
01110
7f-1127126
80 7F-1281625616255

Układ pliku

Nazwa Format Opis
nagłówek element_nagłówka nagłówek
string_id, string_id_item[] listę identyfikatorów ciągów tekstowych. Są to identyfikatory wszystkich ciągów używane w tym pliku, na potrzeby nazw wewnętrznych (np. deskryptorów typów) lub jako obiekty stałe odwołujące się w kodzie. Ta lista musi być sortowana według zawartości ciągu znaków, z użyciem wartości punktów kodowych UTF-16 (nie w tagu (z uwzględnieniem regionu) i nie może zawierać żadnych zduplikowanych wpisów.
identyfikatory_typów type_id_item[] typów identyfikatorów. Są to identyfikatory wszystkich typów (klas, tablice lub typy podstawowe), do których odwołuje się ten plik, niezależnie od tego, czy są zdefiniowane w pliku, czy nie. Ta lista musi być sortowana według wartości string_id indeksu i nie może zawierać żadnych zduplikowanych wpisów.
identyfikatory_proto identyfikator_proto_id[] listę identyfikatorów prototypów metody. Są to identyfikatory wszystkich funkcji prototypy, do których odwołuje się ten plik. Ta lista musi być sortowana w zwracany typ (wg indeksu type_id), kolejność głównych, a następnie według listy argumentów (porządkowanie leksykograficzne, poszczególne argumenty) w kolejności według indeksu type_id). Lista nie może nie powinny zawierać zduplikowanych wpisów.
pola_id pole_identyfikatora_elementu[] identyfikatory pól. To są identyfikatory wszystkich pól przywoływanych w tym pliku, niezależnie od tego, czy zostały w nim zdefiniowane. Ten lista musi być sortowana, przy czym typ definiujący (wg type_id indeks) to kolejność główna, nazwa pola (według indeksu string_id) to kolejność pośrednia i typ (według indeksu type_id) mianowicie porządek drobny. Lista nie może zawierać żadnych zduplikowanych pozycji.
identyfikator_metody metody_id_item[] identyfikatorów metod. To są identyfikatory wszystkich metod przywoływanych w tym pliku, niezależnie od tego, czy zostały w nim zdefiniowane. Ten lista musi być sortowana, przy czym typ definiujący (wg type_id indeks) to porządek główny, nazwa metody (wg string_id indeks) to rząd pośredni i prototyp metody (przez proto_id) to porządek podrzędny. Lista nie może nie powinny zawierać zduplikowanych wpisów.
class_defs class_def_item[] definicji klas. Klasy muszą być uporządkowane w taki sposób, aby określony klasa nadrzędna i zaimplementowane interfejsy są widoczne w jest wcześniejsza niż klasa odsyłająca. Ponadto jest nieprawidłowa dla pola definicja klasy o tej samej nazwie, która pojawi się więcej niż raz w listę.
identyfikatory_witryn_do_połączeń identyfikator_witryny_[call_site_id_item] listę identyfikatorów witryn. To są identyfikatory wszystkich witryn do wykonywania połączeń przywoływanych w tym pliku, niezależnie od tego, czy zostały w nim zdefiniowane. Ta lista muszą zostać posortowane w kolejności rosnącej według wartości call_site_off.
uchwyty_metody metoda_handle_item[] listę uchwytów metod. listę wszystkich uchwytów metod, do których odwołuje się ten plik; niezależnie od tego, czy określono w pliku. Ta lista nie jest posortowana i może zawierać które będą logicznie odpowiadać instancji z obsługą różnych metod.
dane ubaj[] który zawiera wszystkie dane pomocnicze do tabel wymienionych powyżej. Różne elementy mają różne wymagania dotyczące wyrównania. bajty dopełnienia są wstawiane przed każdym elementem, jeśli jest to konieczne do osiągnięcia jej wyrównanie.
dane_linku ubaj[] danych używanych w plikach połączonych statycznie. Format danych w ta sekcja pozostaje nieokreślona w tym dokumencie. Ta sekcja jest pusta w przypadku niepołączonych plików i implementacji środowiska wykonawczego mogą z nich korzystać według własnego uznania.

Pole bitowe, ciąg znaków i definicje stałe

MAGIA_PLIKU_DEX

Umieszczony w elemencie header_item

Stała tablica/ciąg DEX_FILE_MAGIC to lista B, które muszą występować na początku pliku .dex aby został on w ten sposób rozpoznawany. Wartość celowo zawiera nowy wiersz ("\n" lub 0x0a) i pusty bajt ("\0" lub 0x00), aby pomóc wykrywania określonych form korupcji. Wartość koduje numer wersji formatu jako trzy cyfry dziesiętne, która jest powinien rosnąć monotonicznie w miarę ewoluowania formatu.

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

Uwaga: obsługa wersji 039 w Androidzie 9.0 i wprowadziliśmy dwa nowe formaty. nowe kody bajtowe, const-method-handle i const-method-type. (Są one opisane w Podsumowanie zestawu kodów bajtowych ). W Androidzie 10 w wersji 039 format pliku DEX jest poszerzany o ukrycie. Informacje interfejsu API, które mają zastosowanie tylko do plików DEX w ścieżce klasy rozruchowej.

Uwaga: obsługa wersji Format 038 został dodany na Androidzie 8.0 wersji. Wersja 038 dodała nowe kody bajtowe (invoke-polymorphic i invoke-custom) oraz dla uchwytów metod.

Uwaga: obsługa wersji 037 w Androidzie 7.0. Przed 037 największą wersją wersji Androida używa wersji 035 formatu. Jedyna różnica między wersjami 035 i 037 to dodanie metod domyślnych i dostosowanie metody invoke.

Uwaga: co najmniej kilka wcześniejszych wersji formatu są używane w powszechnie dostępnych publicznych wersjach oprogramowania. Przykład: wersja 009 została użyta w wersjach M3 Platforma Android (listopad–grudzień 2007 r.), a 013 była używana w wersjach M5 Androida. (luty–marzec 2008 r.). Pod kilkoma względami wersji formatu znacznie się różni od wersji opisanej w dokument.

ENDIAN_CONSTANT i REVERSE_ENDIAN_CONSTANT

Umieszczony w elemencie header_item

Stała ENDIAN_CONSTANT służy do wskazywania na końcu pliku, w którym się znajduje. Chociaż standard Format .dex to little-endian, implementacje mogą wybierać w celu wymiany bajtów. Jeśli podczas implementacji zobaczysz nagłówek, którego endian_tag ma wartość REVERSE_ENDIAN_CONSTANT zamiast ENDIAN_CONSTANT, system wiedział, że plik została zastąpiona bajtami w stosunku do oczekiwanej postaci.

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

NO_INDEX

Umieszczony w elementach class_def_item i debug_info_item

Stała NO_INDEX wskazuje, że brak wartości indeksu.

Uwaga: ta wartość nie jest zdefiniowana jako 0, bo tak naprawdę jest to zwykle prawidłowy indeks.

Wybrana wartość dla opcji NO_INDEX to co jest przedstawiane jako pojedynczy bajt w kodowaniu uleb128p1.

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

Definicje flag_dostępu

Umieszczone w atrybutach class_def_item, encoded_field, encoded_method i Klasa wewnętrzny

Pola bitowe tych flag są używane do wskazywania ułatwień dostępu ogólne właściwości klas i ich członków.

Nazwa Wartość Dla klas (i InnerClass adnotacji) Do pól Metody
ACC_PUBLIC (PUBLICZNY) 0x1 public: widoczny wszędzie public: widoczny wszędzie public: widoczny wszędzie
ACC_PRIVATE 0x2 * private: widoczne tylko dla klasy definiującej private: widoczny tylko dla klasy definiującej private: widoczny tylko dla klasy definiującej
ACC_PROTECTED (Ochrona aCC) 0 × 4 * protected: widoczny dla pakietu i podklas protected: widoczny dla pakietu i podklas protected: widoczny dla pakietu i podklas
ACC_STATIC 0 × 8 * static: nie jest skonstruowana z zewnętrzną this – odniesienie static: globalna klasa definiująca static: nie przyjmuje argumentu this
ACC_FINAL 0x10 final: nie można podklasyfikować final: ustawienie stałe po budowie final: nie można zastąpić
ACC_SYNCHRONIZED 0x20     synchronized: automatycznie uzyskano powiązaną blokadę wokół wywołania tej metody.

Uwaga: tę opcję można ustawić tylko wtedy, gdy Ustawiono także wartość ACC_NATIVE.

ACC_VOLATILE 0x40   volatile: specjalne reguły dostępu ułatwiające wątek zagranie bezpieczne  
ACC_BRIDGE 0x40     mostka, dodawana automatycznie przez kompilator jako bezpieczną mostu
ACC_TRANSIENT (ACC_TRANSIENT) 0 × 80   transient: nie zostanie zapisany w domyślnej serializacji  
ACC_VARARGS 0 × 80     ostatni argument powinien być traktowany jako „odpoczynek” argument przez kompilator
ACC_NATIVE (ACC_NATIVE) 0x100     native: zaimplementowany w kodzie natywnym
INTERFEJS ACC 0x200 interface: klasa abstrakcyjna, którą można wielokrotnie implementować    
ACC_ABSTRACT (ACC) 0x400 abstract: nie można utworzyć bezpośrednio   abstract: nie zaimplementowano przez tę klasę
ACC_STRICT 0 × 800     strictfp: ścisłe zasady arytmetyki zmiennoprzecinkowej
ACC_SYNTHETIC (ACC) 0x1000 nie zdefiniowane bezpośrednio w kodzie źródłowym nie zdefiniowane bezpośrednio w kodzie źródłowym nie zdefiniowane bezpośrednio w kodzie źródłowym
ACC_Adnotacja 0x2000 zadeklarowano jako klasa adnotacji    
ACC_ENUM 0x4000 zadeklarowany jako typ wyliczany zadeklarowane jako wartość wyliczana  
(nieużywana) 0x8000      
ACC_KONSTRUCTOR 0x10000     metoda konstruktora (inicjator klasy lub instancji)
ACC_DECLARED_
ZSYNCHRONIZOWANO
0x20000     zadeklarowano synchronized.

Uwaga: nie ma to wpływu na wykonania (inne niż w związku z tą flagą, jako takie).

* Dozwolone tylko w przypadku adnotacji InnerClass, i nie może być włączona w class_def_item.

Zmodyfikowane kodowanie UTF-8

W ramach ulgi na ułatwienie dostępu do starszych wersji formatu .dex koduje swoje dane ciągu znaków w zmodyfikowanej zgodnie ze standardem UTF-8 postaci, która później czyli tzw. MUTF-8. Ten formularz jest identyczny ze standardowym kodowaniem UTF-8 z jednym wyjątkiem:

  • Stosowane jest tylko kodowanie 1-, 2- i 3-bajtowe.
  • Punkty kodu w zakresie U+10000... U+10ffff są kodowane jako para zastępcza, z których każda co jest przedstawiane jako zakodowana trzybajtowa wartość.
  • Punkt kodowy U+0000 jest zakodowany w postaci dwubajtowej.
  • Zwykły bajt o wartości null (wartość 0) wskazuje koniec argumentu ciąg znaków, tak jak w przypadku standardowej interpretacji w języku C.

Pierwsze 2 elementy można podsumować w taki sposób: MUTF-8 to format kodowania UTF-16, formatu kodowania znaków Unicode.

Ostatnie dwa powyższe elementy umożliwiają jednoczesne uwzględnianie punkt kodowy U+0000 w ciągu znaków i nadal modyfikuj go jako ciąg z zakończeniem null w stylu C.

Jednak specjalne kodowanie U+0000 oznacza, że w przeciwieństwie do normalne UTF-8, wynik wywołania standardowej funkcji C strcmp() w parze ciągów MUTF-8 nie zawsze wskazują prawidłowo podpisany wynik porównania ciągów nierównych. Kiedy liczą się nie tylko równość, aby porównać ciągi znaków MUTF-8, to zdekodowanie ich znak po znaku, i porównaj zdekodowane wartości. (Bardziej sprytne implementacje są jednak jest też możliwe).

Zapoznaj się z sekcją Unicode Standard, aby dowiedzieć się więcej o kodowaniu znaków. MUTF-8 jest w rzeczywistości bliższy (stosunkowo mniej dobrze znanemu) kodowaniu. CESU-8 niż do UTF-8 per se.

kodowanie formatted_value

Umieszczony w elementach adnotacji i zakodowanych_tablicach

Element encoded_value to zakodowany fragment (niemal) dowolnych uporządkowanych hierarchicznych danych. Kodowanie ma na celu były kompaktowe i łatwe do analizy.

Nazwa Format Opis
(value_arg << 5) | value_type ubajt bajt wskazujący typ następnego value przy z opcjonalnym argumentem wyjaśniającym w trzech bitach wysokiej rzędu. Poniżej znajdziesz definicje różnych value. W większości przypadków value_arg koduje długość następny value w bajtach, jak (size - 1), np. 0 oznacza, że wartość wymaga jednego bajta, a 7 oznacza, że wymaga 8 bajtów, jednak są wyjątki, które opisaliśmy poniżej.
wartość ubaj[] bajtów reprezentujących wartość, zmienną długości i zinterpretowane inaczej dla różnych value_type bajtów, Little-endian. Poniżej znajdziesz różne definicje wartości: .

Formaty wartości

Wpisz nazwę value_type Format: value_arg Format: value Opis
WARTOŚĆ_BYTE 0x00 (brak; musi być 0) ubajt[1] jednobajtowa wartość całkowita ze znakiem
SKRÓT 0x02 rozmiar – 1 (0...1) ubajt[rozmiar] dwubajtowa wartość całkowita ze znakiem, poszerzona
ZNAK_WARTOŚĆ 0x03 rozmiar – 1 (0...1) ubajt[rozmiar] dwubajtowa wartość całkowita bez znaku, rozszerzona o zero
VALUE_INT 0x04 rozmiar – 1 (0...3) ubajt[rozmiar] czterobajtowa wartość całkowita ze znakiem, poszerzona
WARTOŚĆ_DŁUGI 0x06 rozmiar – 1 (0...7) ubajt[rozmiar] 8-bajtowa wartość całkowita ze znakiem, poszerzona
LICZBA_WARTOŚCI 0x10 rozmiar – 1 (0...3) ubajt[rozmiar] wzorzec 4-bajtowy z rozszerzonym o 0 w prawo, interpretowane jako 32-bitowa wartość zmiennoprzecinkowa IEEE754.
WARTOŚĆ_DOUBLE 0x11 rozmiar – 1 (0...7) ubajt[rozmiar] ośmiobajtowy wzór z rozszerzonym do zera w prawo, interpretowane jako 64-bitowa wartość zmiennoprzecinkowa IEEE754.
WARTOŚĆ_TYPNA 0x15 rozmiar – 1 (0...3) ubajt[rozmiar] czterobajtowa wartość całkowita bez znaku (rozszerzona do 0), interpretowany jako indeks w sekcji proto_ids i reprezentującej wartość typu metody
RĘKA DOTYCZĄCA_metody_VALUE 0x16 rozmiar – 1 (0...3) ubajt[rozmiar] czterobajtowa wartość całkowita bez znaku (rozszerzona do 0), interpretowany jako indeks w sekcji method_handles i reprezentujące wartość uchwytu metody
WARTOŚĆ_CIĄGU 0x17 rozmiar – 1 (0...3) ubajt[rozmiar] czterobajtowa wartość całkowita bez znaku (rozszerzona do 0), interpretowany jako indeks w sekcji string_ids i reprezentującej wartość ciągu znaków
WARTOŚĆ_TYPE 0x18 rozmiar – 1 (0...3) ubajt[rozmiar] czterobajtowa wartość całkowita bez znaku (rozszerzona do 0), interpretowany jako indeks w sekcji type_ids i która reprezentuje refleksję, typ/klasa
WARTOŚĆ_POLA 0x19 rozmiar – 1 (0...3) ubajt[rozmiar] czterobajtowa wartość całkowita bez znaku (rozszerzona do 0), interpretowany jako indeks w sekcji field_ids i która reprezentuje refleksję, wartość pola
METODA_WARTOŚĆ 0x1a rozmiar – 1 (0...3) ubajt[rozmiar] czterobajtowa wartość całkowita bez znaku (rozszerzona do 0), interpretowany jako indeks w sekcji method_ids i która reprezentuje refleksję, wartość metody
WARTOŚĆ_ENUM 0x1b rozmiar – 1 (0...3) ubajt[rozmiar] czterobajtowa wartość całkowita bez znaku (rozszerzona do 0), interpretowany jako indeks w sekcji field_ids i która reprezentuje wartość stała typu wyliczanego
ARRAY 0x1c (brak; musi być 0) tablica_zakodowana tablicę wartości w formacie określonym przez „Format encoded_array” poniżej. Rozmiar elementu value jest domyślnie określone w kodowaniu.
WARTOŚĆ_Adnotacja 0x1d (brak; musi być 0) zakodowana_adnotacja adnotacji podrzędnej w formacie określonym przez „Format encoded_annotation” poniżej. Rozmiar elementu value jest domyślnie określone w kodowaniu.
Wartość_NULL 0x1e (brak; musi być 0) (brak) Wartość referencyjna null
WARTOŚĆ_LOGICZNA 0x1f wartość logiczna (0...1) (brak) wartość jednobitowa; 0 za false i 1 za true. Bit jest reprezentowany w value_arg

format_tablicy_zakodowanej

Nazwa Format Opis
rozmiar Uleb128 liczba elementów w tablicy
wartości zakodowana_wartość[rozmiar] seria size encoded_value bajta sekwencje w formacie określonym przez tę sekcję, połączone sekwencyjnie.

format_zakodowanej_adnotacji

Nazwa Format Opis
typ_idx Uleb128 typu adnotacji. Musi to być klasa (nie tablica ani podstawowa) typu.
rozmiar Uleb128 liczba mapowań nazwa-wartość w tej adnotacji
elementy element_adnotacji[rozmiar] elementów adnotacji, bezpośrednio w tekście (nie jako przesunięcia). Elementy muszą być sortowane w kolejności rosnącej według Indeks string_id.

format elementu_adnotacji

Nazwa Format Opis
identyfikator_nazwiska Uleb128 nazwy elementu, reprezentowaną jako indeks w funkcji string_ids. Ciąg musi spełniać warunki składni elementu MemberName, która została zdefiniowana powyżej.
wartość zakodowana_wartość wartość elementu

Składnia ciągu znaków

W pliku .dex jest kilka rodzajów elementów, odwołują się do ciągu. Następujące definicje w stylu BNF wskazują akceptowalną składnię tych ciągów.

Prosta nazwa

Element SimpleName jest podstawą składni nazw innych rzeczy. Format .dex pozwala na dużą szerokość geograficzną (znacznie więcej niż w większości popularnych języków źródłowych). Krótko mówiąc, nazwa składa się z dowolnej litery lub cyfry o niskim kodzie ASCII, określone symbole niskie ASCII oraz większość punktów kodu spoza zestawu ASCII, które nie są elementów sterujących, spacji i znaków specjalnych. Od wersji 040 format dodatkowo pozwala na użycie spacji (Unicode Zs ). Pamiętaj, że zastępcze punkty kodowe (w zakresie U+d800 ... U+dfff) nie są są uznawane za prawidłowe znaki nazwy, jako takie, ale uzupełniające Unicode znaki prawidłowe (reprezentowane przez reguły dla SimpleNameChar) i powinny to być reprezentowane w pliku jako pary zastępczego punktu kodu w MUTF-8 kodowanie.

SimpleName
SimpleNameChar (SimpleNameChar)*
SimpleNameChar
'A'... 'Z'
| 'a'... 'z'
| '0'... '9'
| ' ' od wersji DEX 040
| '$'
| '-'
| '_'
| U+00a0 od wersji DEX 040
| U+00a1... U+1fff
| U+2000... U+200a od wersji DEX 040
| U+2010... U+2027
| U+202f od wersji DEX 040
| U+2030... U+d7ff
| U+e000... U+ffef
| U+10000... U+10ffff

NazwaCzłonka

używane przez pola_id_item i method_id_item

Element MemberName to imię i nazwisko członka zajęć, przy czym członkowie pól, metod i klas wewnętrznych.

MemberName
ProstaNazwa
| '<' SimpleName '>'

Pełna_nazwa_klasy

FullClassName to w pełni kwalifikowana nazwa zajęć zawierająca opcjonalny specyfikator pakietu, po którym następuje wymagana nazwa.

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(SimpleName '/')*

Deskryptor typu

Używane według parametru type_id_item

Element TypeDescriptor reprezentuje dowolny typ, w tym podstawowe, klasy, tablice oraz void. Zobacz poniżej znaczenie różnych wersji.

TypeDescriptor
'V'
| FieldTypeDescriptor (Deskryptor typu pola)
FieldTypeDescriptor
NonTrackFieldTypeDescriptor
| ('[' * 1...255) NonTrackFieldTypeDescriptor
NonTrackFieldTypeDescriptor
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L' FullClassName ';'

ShortyDescriptor

Używany przez proto_id_item

ShortyDescriptor to krótka reprezentacja metody w tym typu zwrotu i parametrów, chyba że istnieje brak rozróżnienia między różnymi typami odwołań (klasa lub tablica). Zamiast tego: wszystkie typy odwołań są reprezentowane przez pojedynczy znak 'L'.

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

Semantyka TypeDescriptor

To jest znaczenie każdego z wariantów obiektu TypeDescriptor.

Składnia Znaczenie
V void; dotyczy tylko zwracanych typów
Z boolean
B byte
S short
C char
I int
J long
F float
D double
kwalifikował(a) się/kwalifikował(a) się/imię i nazwisko; zajęcia fully.qualified.Name
[deskryptor tablica descriptor, używana rekurencyjnie dla tablice, chociaż nie można mieć więcej niż 255 wymiarów.

Przedmioty i powiązane struktury

Ta sekcja zawiera definicje wszystkich elementów najwyższego poziomu, które może pojawić się w pliku .dex.

element_nagłówka

Widoczne w sekcji nagłówka

Wyrównanie: 4 bajty

Nazwa Format Opis
magia ubajt[8] = DEX_FILE_MAGIC magiczną wartość. Zobacz dyskusję powyżej w sekcji „DEX_FILE_MAGIC” .
suma kontrolna Uint suma kontrolna adler32 pozostałej części pliku (wszystko oprócz magic i to pole); używane do wykrywania uszkodzonych plików
podpis ubajt[20] Podpis SHA-1 (szyfrowanie) pozostałej części pliku (wszystko oprócz magic, checksum i to pole); w użyciu do jednoznacznego identyfikowania plików
rozmiar_pliku Uint rozmiar całego pliku (w tym nagłówka) w bajtach
rozmiar_nagłówka uint = 0x70 rozmiaru nagłówka (całej sekcji) w bajtach. Dzięki temu: co najmniej w ograniczonej zgodności do tyłu i do przodu, bez unieważniając format.
tag_końcowy uint = ENDIAN_CONSTANT Endianness. Zobacz dyskusję powyżej w sekcji „ENDIAN_CONSTANT” i REVERSE_ENDIAN_CONSTANT” .
rozmiar_linku Uint rozmiar sekcji linków lub 0, jeśli ten plik nie jest statycznie połączone
link_off Uint przesunięcie od początku pliku do sekcji linku lub 0, jeśli link_size == 0. Przesunięcie, jeśli jest inne niż 0, powinna być przesunięciem do sekcji link_data. format wskazywanych danych nie jest określony w tym dokumencie; to pole nagłówka (i poprzednie) pozostawiamy jako punkty zaczepienia, które będzie używane przez na środowiska wykonawczego.
Wyłącz mapę Uint od początku pliku do elementu mapy. Przesunięcie, które musi musi być różna od zera, powinna być przesunięciem do sekcji data, a dane powinny mieć format określony przez „map_list” poniżej.
rozmiar_identyfikatorów_ciągu Uint liczba ciągów na liście identyfikatorów ciągów
string_ids_off Uint przesunięcie od początku pliku do listy identyfikatorów ciągów lub 0, jeśli string_ids_size == 0 ( dziwny skrajny przypadek). Przesunięcie, jeśli jest inne niż 0, powinna znajdować się na początku sekcji string_ids.
rozmiar_identyfikatorów_typu Uint liczba elementów na liście identyfikatorów typów, maksymalnie 65 535
wyłączono typ_identyfikatorów Uint przesunięcie od początku pliku do listy identyfikatorów typów lub 0, jeśli type_ids_size == 0 ( dziwny skrajny przypadek). Przesunięcie, jeśli jest inne niż 0, powinien znajdować się na początku wartości type_ids .
rozmiar_identyfikatorów_proto Uint liczba elementów na liście identyfikatorów prototypów, maksymalnie 65 535
Wyłączenie identyfikatorów proto Uint przesunięcie od początku pliku do listy identyfikatorów prototypów lub 0, jeśli proto_ids_size == 0 ( dziwny skrajny przypadek). Przesunięcie, jeśli jest inne niż 0, powinien znajdować się na początku wartości proto_ids .
rozmiar_identyfikatorów_pola Uint liczba elementów na liście identyfikatorów pól
pola_ids_off (wył._pola) Uint przesunięcie od początku pliku do listy identyfikatorów pól lub 0, jeśli field_ids_size == 0. Przesunięcie, jeśli jest różna od zera, powinna przypadać na początku field_ids .
rozmiar_identyfikatorów_metody Uint liczba elementów na liście identyfikatorów metod
[method_ids_off] Uint przesunięcie od początku pliku do listy identyfikatorów metod lub 0, jeśli method_ids_size == 0. Przesunięcie, jeśli jest różna od zera, powinna przypadać na początku method_ids .
class_defs_size Uint liczba elementów na liście definicji klas
class_defs_off Uint przesunięcie od początku pliku do listy definicji klas lub 0, jeśli class_defs_size == 0 ( dziwny skrajny przypadek). Przesunięcie, jeśli jest inne niż 0, powinna znajdować się na początku sekcji class_defs.
rozmiar_danych Uint Rozmiar sekcji data w bajtach. Musi być równomierny wielokrotności rozmiaru sizeof(uint).
data_off Uint od początku pliku do początku data.

lista_map

Pojawia się w sekcji danych

Przywołanie z: header_item

Wyrównanie: 4 bajty

Jest to lista z całą zawartością pliku (porządkowo). it zawiera pewną nadmiarowość w odniesieniu do zbioru danych header_item ale ma być łatwa w użyciu do iteracji w całym . Dany typ musi pojawić się na mapie najwyżej raz, ale nie ma lub inne ograniczenia dotyczące typów zamówień, ograniczenia wynikające z pozostałej części formatu (np. Sekcja header musi pojawić się jako pierwsza, a po niej string_ids itp.). Wpisy na mapie muszą być dodatkowo są uporządkowane według przesunięcia początkowego i nie mogą nakładać się na siebie.

Nazwa Format Opis
rozmiar Uint rozmiar listy we wpisach
lista map_item[size] elementy listy

format elementu mapy

Nazwa Format Opis
typ Ushort typu elementów; patrz tabela poniżej
unused Ushort (nieużywana)
rozmiar Uint liczba elementów do znalezienia we wskazanym przesunięciu
odliczyć Uint przesunięcie od początku pliku do danych elementów

Wpisz kody

Typ produktu Stała Wartość Rozmiar elementu w bajtach
element_nagłówka TYP_NAGŁÓWKA_ITEM 0x0000 0x70
identyfikator_ciągu_ciągu TYPE_STRING_ID_ITEM 0x0001 0x04
type_id_item TYPE_TYPE_ID_ITEM (ELEMENT_ID_TYPU) 0x0002 0x04
identyfikator_proto TYPE_PROTO_ID_ITEM 0x0003 0x0c
pole_identyfikatora_elementu TYPE_FIELD_ID_ITEM (ELEMENT_ID_POLE) 0x0004 0x08
identyfikator_metody_item_item IDENTYFIKATOR_metody_TYPE_IDENTYFIKATOR_ELEMENTU 0x0005 0x08
class_def_item ELEMENT_DEF_KLASY_TYPU 0x0006 0x20
identyfikator_witryny_wywoław_item_item TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
metoda_handle_item TYPE_METODA_HANDLE_ITEM 0x0008 0x08
lista_map TYPE_MAP_LIST 0x1000 4 + (rozmiar.elementu * 12)
lista_typów TYPE_TYPE_LIST 0x1001 4 + (rozmiar.elementu * 2)
lista_zestawów_adnotacji TYPE_ADDRESS_SET_REF_LIST 0x1002 4 + (rozmiar.elementu * 4)
pozycja_zestawu adnotacji TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (rozmiar.elementu * 4)
class_data_item ELEMENT_DANE_KLASY 0x2000 implicit; musi analizować
kod_elementu ELEMENT_KODU_TYPU 0x2001 implicit; musi analizować
string_data_item, TYPE_STRING_DATA_ITEM (ELEMENT_DANE) 0x2002 implicit; musi analizować
informacje_debugowania_elementu TYPE_DEBUG_INFO_ITEM 0x2003 implicit; musi analizować
element_adnotacji TYPE_ADDRESS_ITEM 0x2004 implicit; musi analizować
zakodowany_element_tablicy TYPE_ENCODED_ARRAY_ITEM 0x2005 implicit; musi analizować
Adnotacje_directory_item TYPE_ADDRESSS_DIRECTORY_ITEM 0x2006 implicit; musi analizować
hideapi_class_data_item (Ukryta_klasa_data_item) TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 implicit; musi analizować

identyfikator_ciągu_ciągu

Występuje w sekcji string_ids

Wyrównanie: 4 bajty

Nazwa Format Opis
string_data_off, Uint od początku pliku do danych ciągu elementu. Odsunięcie powinno być zgodne z lokalizacją w sekcji data, a dane powinny znajdować się w format określony przez „string_data_item” poniżej. Przesunięcie nie jest wymagane.

string_data_item,

Pojawia się w sekcji danych

Wyrównanie: brak (wyrównanie bajtów)

Nazwa Format Opis
rozmiar_utf16 Uleb128 rozmiaru tego ciągu znaków w jednostkach kodu UTF-16 (czyli „ciąg znaków” długość" w wielu systemach). Jest to zdekodowana długość ciąg znaków. (Zakodowana długość jest sugerowana przez pozycję 0).
dane ubaj[] seria jednostek kodu MUTF-8 (oktetów, bajtów) po którym następuje bajt wartości 0. Zobacz „MUTF-8 (zmodyfikowane UTF-8)” kodowanie” powyżej, aby uzyskać szczegółowe informacje dyskusję na temat formatu danych.

Uwaga: możesz użyć ciągu znaków zawierającego (zakodowana postać) jednostek zastępczego kodu UTF-16 (czyli U+d800 ... U+dfff) albo odizolowane lub nieuporządkowane w stosunku do zwykłych obciążeń. kodowania Unicode na UTF-16. Ma to związek z zastosowaniem aby w razie potrzeby odrzucić takie nieprawidłowe kodowanie.

type_id_item

Widoczne w sekcji type_ids

Wyrównanie: 4 bajty

Nazwa Format Opis
identyfikator_deskryptora Uint do listy string_ids dla deskryptora tego typu. Ciąg musi być zgodny ze składnią argumentu TypeDescriptor (deskryptor typu) zdefiniowany powyżej.

identyfikator_proto

Widoczne w sekcji proto_ids

Wyrównanie: 4 bajty

Nazwa Format Opis
Shorty_idx Uint do listy string_ids dla krótkich formatów ciąg deskryptora tego prototypu. Ciąg musi spełniać warunki zdefiniowaną powyżej składnię ShortyDescriptor i musi odpowiadać zwracany typ i parametry tego elementu.
identyfikator_typu_zwrotux Uint na liście type_ids dla zwracanego typu tego prototypu
Parametry_wyłączone Uint przesunięcie od początku pliku do listy typów parametrów dla tego prototypu, lub 0, jeśli prototyp nie ma . Jeśli ma wartość różną od 0, to przesunięcie powinno znaleźć się w data, a dane powinny znajdować się w w formacie określonym przez "type_list" poniżej. Dodatkowo nie powinien zawierać odwołania do typu void na liście.

pole_identyfikatora_elementu

Widoczne w sekcji Field_ids

Wyrównanie: 4 bajty

Nazwa Format Opis
class_idx Ushort indeksu do listy type_ids dla twórcy tego argumentu . Musi to być typ klasy, a nie tablica lub typ podstawowy.
typ_idx Ushort na listę type_ids dla typu to pole
identyfikator_nazwiska Uint na liście string_ids dla tej nazwy . Ciąg musi być zgodny ze składnią MemberName, zdefiniowane powyżej.

identyfikator_metody_item_item

Pojawia się w sekcjiMethod_ids

Wyrównanie: 4 bajty

Nazwa Format Opis
class_idx Ushort indeksu do listy type_ids dla twórcy tego argumentu . Musi to być typ klasy lub tablicy, a nie typ podstawowy.
identyfikator_proto Ushort do listy proto_ids dla prototypu ta metoda
identyfikator_nazwiska Uint na liście string_ids dla tej nazwy . Ciąg musi być zgodny ze składnią MemberName, zdefiniowane powyżej.

class_def_item

Pojawia się w sekcji class_defs

Wyrównanie: 4 bajty

Nazwa Format Opis
class_idx Uint do listy type_ids tej klasy. Musi to być typ klasy, a nie tablica lub typ podstawowy.
flagi_dostępu Uint flagi dostępu klasy (public, final, itp.). Zobacz „access_flags definicji” .
superclass_idx Uint do listy type_ids dla klasy nadrzędnej lub wartość stałą NO_INDEX, jeśli ta klasa nie ma żadnej superclass (czyli jest to klasa główna, np. Object). Jeśli istnieje, musi to być typ klasy, a nie tablica czy typ podstawowy.
wyłączono interfejsy Uint przesunięcie od początku pliku do listy interfejsów lub 0, jeśli nie ma żadnego. To przesunięcie powinny znajdować się w sekcji data, a dane powinny być w formacie określonym przez „type_list” poniżej. Każdy element listy musi być typem klasy (nie jest to tablica ani typ podstawowy) oraz nie może być duplikatem.
identyfikator_pliku_źródłowego Uint na listę string_ids dla nazwy plik zawierający oryginalne źródło (przynajmniej większości) tej klasy, lub specjalną wartość NO_INDEX wskazującą brak te informacje. debug_info_item dowolnej metody może zastąpić ten plik źródłowy, ale większość klas pochodzi tylko z jednego pliku źródłowego.
adnotacje_off Uint przesunięcie od początku pliku do struktury adnotacji dla tych zajęć lub 0, jeśli nie ma adnotacji tych zajęć. Jeśli ma wartość różną od 0, to przesunięcie powinno znaleźć się w data oraz dane, które powinny się znajdować w format określony przez „annotations_directory_item” poniżej, przy czym wszystkie elementy odwołują się do tej klasy jako definicji.
class_data_off (Wyłączona klasa) Uint od początku pliku do powiązanej dane zajęć dla tego elementu lub 0, jeśli nie ma żadnych zajęć dla tych zajęć. (Może tak być na przykład, jeśli ten klasa interfejsu znaczników). Przesunięcie (jeśli jest inne niż zero) musi znajdować się w data, a dane powinny znajdować się w format określony przez „class_data_item” poniżej, ze wszystkimi które odnoszą się do tej klasy jako jej twórcy.
wartości_statyczne wyłączone Uint przesunięcie od początku pliku do listy początkowych wartości w polach static lub 0, jeśli podano to brak (a wszystkie pola static powinny zostać zainicjowane przez 0 lub null). To przesunięcie powinno być w data, a dane powinny znajdować się w format określony przez „encoded_array_item” poniżej. Rozmiar tablica nie może być większa niż liczba static zadeklarowane przez tę klasę, a elementy odpowiadają static pól w tej samej kolejności co zadeklarowana w odpowiadające wartości: field_list. Typ każdej tablicy element musi pasować do zadeklarowanego typu odpowiadającego mu pola. Jeśli w tablicy jest mniej elementów niż jest static, zainicjowane zostaną pozostałe pola za pomocą odpowiedniego typu elementu: 0 lub null.

identyfikator_witryny_wywoław_item_item

Widoczne w sekcji call_site_ids

Wyrównanie: 4 bajty

Nazwa Format Opis
Połączenie z witryny wyłączone Uint od początku pliku, aby wywołać definicję witryny. Przesunięcie powinno znajdują się w sekcji danych, a dane powinny być w formacie określonym przez „call_site_item” poniżej.

wywołaj_witryna_item

Pojawia się w sekcji danych

Wyrównanie: brak (wyrównanie bajtów)

Parametr call_site_item to zakodowany element w ramach tablicy, którego elementy odpowiadają argumentom dostępnej dla metody łączenia wczytywania. Pierwsze trzy argumenty to:

  1. Uchwyt metody reprezentujący metodę łączenia wczytywania (VALUE_METHOD_HANDLE).
  2. Nazwa metody, którą powinien rozwiązać tag łączący wczytywania (VALUE_STRING).
  3. Typ metody odpowiadający typowi nazwy metody do rozwiązania (VALUE_METHOD_TYPE).

Wszelkie dodatkowe argumenty to wartości stałe przekazywane do metody kreatora połączeń wczytywania. Te argumenty to są przekazywane w odpowiedniej kolejności i bez konwersji typu.

Uchwyt metody reprezentujący metodę łączenia wczytywania musi zwracać typ java.lang.invoke.CallSite. Pierwsze 3 typy parametrów to:

  1. java.lang.invoke.Lookup
  2. java.lang.String
  3. java.lang.invoke.MethodType

Typy parametrów wszystkich dodatkowych argumentów są określane na podstawie ich wartości stałych.

metoda_handle_item

Pojawia się w sekcjiMethod_handles

Wyrównanie: 4 bajty

Nazwa Format Opis
metoda_handle_type Ushort typ uchwytu metody; patrz tabela poniżej
unused Ushort (nieużywana)
pole_lub_identyfikator_metody Ushort Identyfikator pola lub metody w zależności od tego, czy typem uchwytu metody jest akcesor czy wywołujący metodę.
unused Ushort (nieużywana)

Kody typu uchwytu metody

Stała Wartość Opis
Metoda_HANDLE_TYPE_STATIC_PUT 0x00 Uchwyt metody to statyczny sposób ustawiania pól (akcesor)
Metoda_HANDLE_TYPE_STATIC_GET 0x01 Uchwyt metody jest statycznym modułem pobierania pól (akcesorem)
Metoda_HANDLE_TYPE_INSTANCE_PUT 0x02 Uchwyt metody jest ustawiającym pola instancji (akcesorem)
Metoda_HANDLE_TYPE_INSTANCE_GET 0x03 Uchwyt metody jest metodą pobierania pól instancji (akcesorem)
Metoda_HANDLE_TYPE_INVOKE_STATIC 0x04 Uchwyt metody jest wywołujący metodę statyczną
Metoda_HANDLE_TYPE_INVOKE_INSTANCE 0x05 Uchwyt metody jest wywołującym metodę instancji
FORMA_HANDLE_TYPE_INVOKE_KONSTRUCTOR 0x06 Uchwyt metody jest wywołującym metodę konstruktora
Metoda_HANDLE_TYPE_INVOKE_DIRECT 0x07 Uchwyt metody jest wywołującym metodę bezpośrednią
FORMA_HANDLE_TYPE_INVOKE_INTERFACE 0x08 Uchwyt metody jest wywołującym metodę interfejsu

class_data_item

Przywoływany z klasy class_def_item

Pojawia się w sekcji danych

Wyrównanie: brak (wyrównanie bajtów)

Nazwa Format Opis
rozmiar_pól_statycznych Uleb128 liczba pól statycznych zdefiniowanych w tym elemencie
rozmiar_pól_instancji Uleb128 liczba pól instancji zdefiniowanych w tym elemencie
rozmiar_metod_bezpośrednich Uleb128 liczba metod bezpośrednich zdefiniowanych w tym elemencie
rozmiar_metod_wirtualnych Uleb128 liczba metod wirtualnych zdefiniowanych w tym elemencie
pola_statyczne pole_zakodowane[rozmiar_pola_statycznego] zdefiniowanych pól statycznych, reprezentowanych jako sekwencja zakodowanych elementów. Pola muszą być sortowane według field_idx w kolejności rosnącej.
pola_instancji rozmiar_pola_zakodowanego[instance_fields_size] zdefiniowanych pól instancji, reprezentowanych jako sekwencja zakodowanych elementów. Pola muszą być sortowane według field_idx w kolejności rosnącej.
metody_bezpośrednie metoda_zakodowania[direct_methods_size] zdefiniowanej wartości bezpośredniej (dowolne z elementów static, private, lub konstruktora) reprezentowane przez zakodowanych elementów. Metody muszą być sortowane według method_idx w kolejności rosnącej.
metody_wirtualne zakodowany_metoda[virtual_methods_size] zdefiniowany wirtualny (żadne z static, private, lub konstruktora) reprezentowane przez zakodowanych elementów. Ta lista nie powinna zawierać elementów dziedziczonych chyba że zostanie zastąpiona klasą, którą reprezentuje dany element. metody muszą być sortowane według parametru method_idx w kolejności rosnącej. Wartość method_idx metody wirtualnej nie może być taka sama jak każda metoda bezpośrednia.

Uwaga: atrybut „Wszystkie elementy” field_id i Instancje method_id muszą odwoływać się do tej samej klasy definiującej.

format pola zakodowanego

Nazwa Format Opis
identyfikator_pola_rozbieżności Uleb128 na liście field_ids dla tożsamości tego (zawierające nazwę i deskryptor) reprezentowane przez różnicę od indeksu poprzedniego elementu na liście. Indeks pierwszy element listy jest reprezentowany bezpośrednio.
flagi_dostępu Uleb128 flagi dostępu do pola (public, final, itp.). Zobacz „access_flags definicji” .

format zakodowany_metoda

Nazwa Format Opis
identyfikator_metody_rozbieżności Uleb128 na liście method_ids dla tożsamości tego (zawiera nazwę i deskryptor) reprezentowaną przez różnicę od indeksu poprzedniego elementu na liście. Indeks pierwszy element listy jest reprezentowany bezpośrednio.
flagi_dostępu Uleb128 flagi dostępu metody (public, final, itp.). Zobacz „access_flags definicji” .
Code_off Uleb128 od początku pliku do struktury kodu dla tego lub 0, jeśli ta metoda to abstract lub native. Odsunięcie powinno znajdować się w lokalizacji w data. Format danych jest określony przez „code_item” poniżej.

lista_typów

Przywoływane z klas class_def_item i proto_id_item

Pojawia się w sekcji danych

Wyrównanie: 4 bajty

Nazwa Format Opis
rozmiar Uint rozmiar listy we wpisach
lista type_item[size] elementy listy

format elementu type_item

Nazwa Format Opis
typ_idx Ushort dodaj do listy type_ids

kod_elementu

Odwołano z formatted_method

Pojawia się w sekcji danych

Wyrównanie: 4 bajty

Nazwa Format Opis
rozmiar_rejestrów Ushort liczba rejestrów używanych przez ten kod
rozmiar ins Ushort liczbę słów przychodzących argumentów do metody, kod jest dla
rozmiar_outs Ushort wymagana przez to liczba słów przestrzeni argumentu wychodzącego kod wywołania metody
rozmiar_próby Ushort liczbę instancji try_item dla tej instancji. Jeśli ma wartość różną od zera, to pojawią się jako tablica tries zaraz za insns w tym przypadku.
informacje_o_debugowaniu wyłączone Uint przesunięcie od początku pliku do informacji debugowania (numery wierszy + z informacjami o zmiennej lokalnej) dla tego kodu lub 0, jeśli po prostu nie ma informacji. Jeśli wartość jest różna od zera, przesunięcie powinno wynosić do lokalizacji w sekcji data. Format dane są określone przez „debug_info_item” poniżej.
insns_size, Uint rozmiar listy instrukcji w 16-bitowych jednostkach kodu
insns rozmiar ushort[insns_size] rzeczywista tablica kodu bajtowego. Format kodu w elemencie insns tablica jest określona przez dokument towarzyszący Kod bajtowy Dalvik. Notatka że chociaż jest to zdefiniowane jako tablica ushort, istnieje niektóre struktury wewnętrzne, które preferują wyrównanie 4-bajtowe. Oprócz tego: Jeśli ten plik znajduje się w pliku zamiany przez zakończenie, tylko w pojedynczych instancjach ushort, a nie na większe struktury wewnętrzne.
padding ushort (opcjonalnie) = 0 dwa bajty dopełnienia, aby tries był wyrównany do 4 bajtów. Ten element występuje tylko wtedy, gdy tries_size ma wartość inną niż 0 i insns_size to nieparzyste.
próbuje try_item[tries_size] (opcjonalnie) tablica wskazująca, gdzie w kodzie zostaną przechwycone wyjątki, oraz jak z nimi radzić. Elementy tablicy nie mogą się pokrywać w kolejności od najniższego do najwyższego. Ten element jest występuje, jeśli tries_size ma wartość różną od 0.
moduły obsługi formatted_catch_handler_list (opcjonalny) bajtów reprezentujących listę typów przechwytywania i powiązanych adresy modułów obsługi. Każdy element try_item ma przesunięcie o bajt do tej struktury. Ten element występuje tylko wtedy, gdy tries_size ma wartość różną od 0.

format try_item

Nazwa Format Opis
początek_dodatku Uint adres początkowy bloku kodu uwzględnionego w tym wpisie. Adres to liczba 16-bitowych jednostek kodu do początku pierwszego omówionego wraz z instrukcjami.
insn_count, Ushort liczby 16-bitowych jednostek kodu, których dotyczy ta pozycja. Ostatni kod pokryta jednostka (włącznie) wynosi start_addr + insn_count - 1.
handle_off Ushort przesunięcie w bajtach od początku powiązanego encoded_catch_hander_list na encoded_catch_handler dla tego wpisu. Musi to być przesunięcie do początku encoded_catch_handler.

format zakodowanego_listy_obszaru_obsługi_zakodowania

Nazwa Format Opis
rozmiar Uleb128 rozmiaru tej listy w wpisach
lista zakodowany_moduł_catch_handler[handlers_size] rzeczywista lista list modułów obsługi, reprezentowana bezpośrednio (nie jako przesunięcia) i połączone sekwencyjnie

format zakodowanego_modułu_catch_handler

Nazwa Format Opis
rozmiar sleb128 liczba typów przechwytywania na tej liście. Jeśli nie ma wartości dodatniej, jest to liczbę ujemną liczby typów przechwytywania, a wyniki są śledzone za pomocą modułu obsługi typu „catch-all”. Przykład: size o wartości 0 oznacza, że istnieje element typucatch-all, ale nie ma wpisywanych bezpośrednio znaków cateringowych. Wartość size o wartości 2 oznacza, że istnieją 2 ani typu hacka, ale nie „catch-all”). Oraz size w wysokości -1 oznacza, że oprócz tego występuje też jeden haczyk wpisywany bezpośrednio.
moduły obsługi formatted_type_addr_pair[abs(size)] strumień abs(size) zakodowanych elementów, po jednym na każdy złapany określa się w kolejności, w jakiej mają być testowane.
adres_do_wszystkich uleb128 (opcjonalnie) z kodem bajtowym modułu obsługi „cat-all”. Ten element jest jeśli size ma wartość niedodatnią.

format_data_parowania_zakodowanych

Nazwa Format Opis
typ_idx Uleb128 na listę type_ids dla typu wyjątek umożliwiający przechwytywanie
Addr Uleb128 adres bajtowy powiązanego modułu obsługi wyjątków

informacje_debugowania_elementu

Odniesienie z elementu code_item

Pojawia się w sekcji danych

Wyrównanie: brak (wyrównanie bajtów)

Każdy element debug_info_item definiuje kod bajtowy inspirowany DWARF3 która, po zinterpretowaniu, emituje pozycje tabeli i (potencjalnie) informacji o zmiennej lokalnej dla argumentu code_item Sekwencja zaczyna się od parametru o zmiennej długości nagłówek (długość zależy od liczby metod ), po nim znajdują się kody bajtowe maszyny stanu, z DBG_END_SEQUENCE bajtem.

Maszyna stanowa składa się z 5 rejestrów. Rejestr address reprezentuje przesunięcie instrukcji w sekcji powiązane elementy insns_item w 16-bitowych jednostkach kodu. Rejestr address rozpoczyna się od 0 na początku każdego debug_info i może rosnąć tylko monotonicznie. Rejestr line reprezentuje numer wiersza źródłowego powinien być powiązany z wpisem w tabeli następnych pozycji wygenerowanym przez maszyny stanu. Jest zainicjowany w nagłówku sekwencji i może zmiana w kierunku dodatnim lub ujemnym, ale nie może być mniejsza niż 1 Rejestr source_file reprezentuje pliku źródłowego, do którego odwołują się wpisy z numerami wierszy. Jest inicjowana wartość source_file_idx w class_def_item. Pozostałe 2 zmienne: prologue_end oraz epilogue_begin, są flagami logicznymi (zainicjowanymi jako false), który wskazuje, czy została wyemitowana kolejna pozycja należy traktować jako prolog lub epilog metody. Maszyna stanowa musi również śledzić nazwę i typ ostatniej zmiennej lokalnej w każdy rejestr dla kodu DBG_RESTART_LOCAL.

Nagłówek wygląda tak:

Nazwa Format Opis
line_start, Uleb128 początkowa wartość rejestru line maszyny stanu. Nie oznacza rzeczywistego wpisu pozycji.
parametr_size [rozmiar_parametrów] Uleb128 liczbę zakodowanych nazw parametrów. Powinno być tam po jednym na parametr metody z wyłączeniem this metody instancji, jeśli tak jest.
nazwy_parametrów uleb128p1[rozmiar_parametrów] indeks ciągu znaków nazwy parametru metody. Zakodowana wartość NO_INDEX oznacza brak nazwy jest dostępna dla powiązanego parametru. Deskryptor typu i podpis są wywnioskowane z deskryptora metody i podpisu.

Wartości kodu bajtowego są następujące:

Nazwa Wartość Format Argumenty Opis
DBG_END_SEQUENCE 0x00 (brak) kończy sekwencję informacji debugowania dla code_item
DBG_ADVANCE_PC 0x01 Uleb128 addr_diff addr_diff: kwota do dodania do rejestru adresów przyspiesza rejestr adresowy bez wprowadzania wpisów
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: kwota, o którą chcesz zmienić rejestr wiersza przyspiesza rejestr liniowy bez wprowadzania pozycji
DBG_START_LOCAL 0x03 uleb128register_nums
uleb128p1 name_idx
uleb128p1 type_idx
register_num: rejestr, który zawiera plik lokalny
name_idx: indeks ciągu znaków nazwy
type_idx: indeks typu danego typu
wprowadza zmienną lokalną pod bieżącym adresem. Oba modele name_idx lub type_idx mogą być NO_INDEX, aby wskazać, że ta wartość jest nieznana.
DBG_START_LOCAL_EXTENDED 0x04 uleb128register_nums
uleb128p1 name_idx
uleb128p1 type_idx
Uleb128p1 sig_idx
register_num: rejestr, który zawiera plik lokalny
name_idx: indeks ciągu znaków nazwy
type_idx: indeks typu
sig_idx: indeks ciągu znaków odpowiadający typowi podpisu
wprowadza adres lokalny z podpisem typu pod bieżącym adresem. Dowolny z tych elementów: name_idx, type_idx lub sig_idx może mieć wartość NO_INDEX co wskazuje, że ta wartość jest nieznana. (Jeśli sig_idx to -1 jednak te same dane mogą być przedstawione w większym stopniu efektywnie za pomocą kodu operacji DBG_START_LOCAL).

Uwaga: zobacz dyskusję w sekcji „dalvik.annotation.Signature” poniżej ze względu na zastrzeżenia dotyczące obsługi podpisów.

DBG_END_LOCAL 0x05 uleb128register_nums register_num: rejestr zawierający dane lokalne. oznacza aktywną obecnie zmienną lokalną jako poza zakresem bieżącej adres
DBG_RESTART_LOCAL 0x06 uleb128register_nums register_num: zarejestruj się, aby uruchomić ponownie ponownie wprowadza zmienną lokalną pod bieżącym adresem. Nazwa i typ są takie same jak ostatnio opublikowane w danym regionie rejestracji.
DBG_SET_PROLOGUE_END 0x07 (brak) ustawia rejestr maszyny stanu prologue_end, wskazujący, że następny dodany wpis pozycji powinien zostać uważany za koniec prologu metody (odpowiednie miejsce dla punkt przerwania metody). Rejestr prologue_end to może zostać usunięty przez dowolny specjalny (>= 0x0a) kod operacji.
DBG_SET_EPILOGUE_BEGIN 0x08 (brak) ustawia rejestr maszyny stanu epilogue_begin, wskazujący, że następny dodany wpis pozycji powinien zostać za początek epilogu metody (odpowiedniego miejsca w celu zawieszenia wykonania przed zakończeniem metody). Rejestr epilogue_begin jest weryfikowany przez wszystkie (>= 0x0a).
PLIK_ZBIORU_DBG 0x09 uleb128p1 name_idx name_idx: indeks ciągu znaków nazwy pliku źródłowego; NO_INDEX, jeśli nie wiadomo wskazuje, że wszystkie kolejne wpisy z numerem odwołują się do tego nazwy pliku źródłowego, a nie domyślnej nazwy określonej w argumencie code_item
Specjalne operatory 0x0a...0xff (brak) przyspiesza rejestry line i address, emituje wejście pozycji oraz czyści prologue_end i epilogue_begin Ich opis znajdziesz poniżej.

Specjalne kody operacji

Kody operacji z wartościami od 0x0a do 0xff (włącznie) przesuń line i address rejestruje niewielką ilość, a następnie generuje nowy wpis w tabeli pozycji. Formuła na przyrost wartości jest następująca:

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)

Adnotacje_directory_item

Przywoływany z klasy class_def_item

Pojawia się w sekcji danych

Wyrównanie: 4 bajty

Nazwa Format Opis
class_annotations_off (wyłączone) Uint od początku pliku do adnotacji dodanych bezpośrednio w danej klasie lub 0, jeśli nie ma bezpośrednich adnotacji. Przesunięcie, jeśli ma wartość różną od zera, powinno znajdować się w lokalizacji w data. Format danych jest określony autor: „annotation_set_item” poniżej.
wielkość_pola Uint liczba pól z adnotacjami przez ten element
rozmiar_metod_adnotacji Uint liczba metod oznaczonych adnotacjami przez ten element
rozmiar_parametrów_z_adnotacjami Uint liczba list parametrów metody oznaczonych adnotacjami przez ten element
adnotacje_pola Field_annotation[fields_size] (opcjonalnie) listę powiązanych adnotacji pól. Elementy listy muszą są posortowane w kolejności rosnącej według field_idx.
adnotacje_metody metody_annotation[methods_size] (opcjonalnie) listę powiązanych adnotacji metod. Elementy listy muszą są posortowane w kolejności rosnącej według method_idx.
adnotacje_parametrów parametr_annotation[parameters_size] (opcjonalnie) listę adnotacji powiązanych parametrów metod. Elementy lista musi być sortowana w kolejności rosnącej, według method_idx.

Uwaga: atrybut „Wszystkie elementy” field_id i Instancje method_id muszą odwoływać się do tej samej klasy definiującej.

format adnotacji_pola

Nazwa Format Opis
identyfikator_pola Uint na listę field_ids w celu identyfikacji pole z adnotacją
adnotacje_off Uint od początku pliku do listy adnotacji dla w odpowiednim polu. Przesunięcie powinno być zgodne z lokalizacją w zakresie: data. . Format danych jest określony przez „annotation_set_item” poniżej.

format adnotacji_metody

Nazwa Format Opis
identyfikator_metody Uint na listę method_ids w celu identyfikacji metoda z adnotacją
adnotacje_off Uint od początku pliku do listy adnotacji dla metody. Odsunięcie powinno znajdować się w lokalizacji w data. Format danych jest określony przez „annotation_set_item” poniżej.

format adnotacji_parametru

Nazwa Format Opis
identyfikator_metody Uint na listę method_ids w celu identyfikacji metoda, której parametry są oznaczane adnotacjami
adnotacje_off Uint od początku pliku do listy adnotacji dla parametry metody. Odsunięcie powinno znajdować się w lokalizacji w data. Format danych jest określony przez „annotation_set_ref_list” poniżej.

lista_zestawów_adnotacji

Odwołano z parametru parameter_annotations_item

Pojawia się w sekcji danych

Wyrównanie: 4 bajty

Nazwa Format Opis
rozmiar Uint rozmiar listy we wpisach
lista adnotacja_set_ref_item[rozmiar] elementy listy

Format adnotacji_set_ref_item

Nazwa Format Opis
adnotacje_off Uint przesunięcie od początku pliku do wskazanej zbioru adnotacji lub 0, jeśli nie ma adnotacji dla tego elementu. Przesunięcie (jeśli jest inne niż 0) powinno wskazywać lokalizację w argumencie data . Format danych jest określony przez „annotation_set_item” poniżej.

pozycja_zestawu adnotacji

Odniesienia z Adnotacje_directory_item, Field_annotations_item, metody_annotations_item i insertion_set_ref_item

Pojawia się w sekcji danych

Wyrównanie: 4 bajty

Nazwa Format Opis
rozmiar Uint rozmiar zbioru we wpisach
wpisy adnotacja_off_item[rozmiar] elementów zestawu. Elementy muszą być sortowane w kolejności rosnącej, do type_idx.

format adnotacji_off_item

Nazwa Format Opis
wyłączenie adnotacji Uint od początku pliku do adnotacji. Przesunięcie powinno wskazywać lokalizację w sekcji data, a format danych w tej lokalizacji jest określony przez „annotation_item” poniżej.

element_adnotacji

Nawiązano do adnotacji_set_item

Pojawia się w sekcji danych

Wyrównanie: brak (wyrównanie bajtów)

Nazwa Format Opis
widoczność ubajt zamierzona widoczność tej adnotacji (patrz poniżej).
adnotacja zakodowana_adnotacja zakodowanej treści adnotacji w formacie opisanym przez „Format encoded_annotation” poniżej „kodowanie encoded_value” powyżej.

Wartości widoczności

To są opcje pola visibility w tabeli annotation_item:

Nazwa Wartość Opis
WIDOCZNOŚĆ_BUILD 0x00 które mają być widoczne tylko w momencie kompilacji (np. podczas kompilacji) innego kodu)
VISIBILITY_RUNTIME 0x01 która ma być widoczna w czasie działania
VISIBILITY_SYSTEM 0x02 która ma być widoczna w czasie działania, ale tylko dla bazowego systemu (a nie zwykły kod użytkownika)

zakodowany_element_tablicy

Przywoływany z klasy class_def_item

Pojawia się w sekcji danych

Wyrównanie: brak (wyrównanie bajtów)

Nazwa Format Opis
wartość tablica_zakodowana bajtów reprezentujących zakodowaną wartość tablicy w określonym formacie według „Formatu encoded_array” w wierszu „encoded_value” Kodowanie” powyżej.

hideapi_class_data_item (Ukryta_klasa_data_item)

Ta sekcja zawiera dane o interfejsach z ograniczeniami używanych przez poszczególne klasy.

Uwaga: Ukryta funkcja API została wprowadzona w Androidzie 10.0 i ma zastosowanie tylko do plików DEX klas w ścieżce klasy rozruchowej. Lista opisanych poniżej flag może zostać rozszerzona w kolejnych wersjach Androida. Więcej informacji: ograniczeniach w interfejsach innych niż SDK.

Nazwa Format Opis
rozmiar Uint całkowity rozmiar sekcji
kompensacje uint[] tablica przesunięć zindeksowanych przez class_idx. Wpis w tablicy zero w pozycji class_idx oznacza, że albo nie ma danych dla tego interfejsu API (class_idx) lub dla wszystkich ukrytych interfejsów API flagi wynoszą 0. W przeciwnym razie wpis tablicy ma wartość różną od zera i zawiera przesunięcie od początek sekcji do tablicy ukrytych flag interfejsu API dla tego zasobu (class_idx).
flagi Uleb128[] połączone tablice ukrytych flag interfejsu API dla poszczególnych klas. Możliwe wartości flag zostały opisane w tabeli poniżej. Flagi są kodowane w tej samej kolejności co pola i metody zakodowane w danych klasy.

Typy flag ograniczeń:

Nazwa Wartość Opis
dodać do białej listy 0 Interfejsy, które można swobodnie używać i są obsługiwane oficjalnie udokumentowana platforma Androida Indeks pakietu.
szara lista 1 Interfejsy inne niż SDK, których można używać niezależnie od docelowy poziom interfejsu API.
zablokuj 2 Interfejsy inne niż SDK, których nie można używać bez względu na docelowy poziom interfejsu API. Dostęp do jednego z tych interfejsów powoduje błąd środowiska wykonawczego.
szara lista+max-o 3 Interfejsy inne niż SDK dostępne na Androidzie 8.x i starszych chyba że są objęte ograniczeniami.
szara lista-maks-p 4 Interfejsy inne niż SDK dostępne na Androidzie 9.x chyba że są objęte ograniczeniami.
szara lista-max-q 5 Interfejsy inne niż SDK dostępne na Androidzie 10.x chyba że są objęte ograniczeniami.
szara lista-max-r 6 Interfejsy inne niż SDK dostępne na Androidzie 11.x chyba że są objęte ograniczeniami.

Adnotacje systemowe

Adnotacje systemowe są używane do reprezentowania różnych elementów odbicia informacje o klasach (oraz metodach i polach). Ta informacja jest zwykle dostępne pośrednio tylko przez kod klienta (niesystemowy).

Adnotacje systemowe są reprezentowane w plikach .dex jako adnotacje z widocznością ustawioną na VISIBILITY_SYSTEM.

dalvik.annotation.AdnotationDefault

Pojawia się w metodach w interfejsach adnotacji

Do każdej z nich jest dołączona adnotacja AnnotationDefault interfejsu adnotacji, który chce wskazać domyślne powiązania.

Nazwa Format Opis
wartość Adnotacja domyślne wiązania tej adnotacji, przedstawione jako adnotacja tego typu. Adnotacja nie musi zawierać wszystkich nazw zdefiniowanych przez adnotacja; brakujące nazwy nie mają wartości domyślnych.

dalvik.annotation.EnclosingClass

Pojawia się na zajęciach

Do poszczególnych zajęć dołączona jest adnotacja EnclosingClass który jest zdefiniowany jako członek innej klasy lub jest anonimowe, ale nie zdefiniowane w treści metody (np. syntetyczny klasa wewnętrznej). Każda klasa, która zawiera tę adnotację, musi też mieć parametr InnerClass adnotacja. Dodatkowo klasa nie może zawierać zarówno EnclosingClass, jak i Adnotacja EnclosingMethod.

Nazwa Format Opis
wartość Kategoria klasa, która najściślej obejmuje zakres leksykalny tej klasy

dalvik.annotation.EnclosingMethod

Pojawia się na zajęciach

Do poszczególnych zajęć dołączona jest adnotacja EnclosingMethod zdefiniowanej w treści metody. Wszystkie zajęcia, które go mają adnotacja musi też mieć adnotację InnerClass. Poza tym klasa nie może mieć jednocześnie identyfikatora EnclosingClass. i adnotacja EnclosingMethod.

Nazwa Format Opis
wartość Metoda metoda, która najlepiej określa zakres leksykalny tej klasy

dalvik.annotation.InnerClass

Pojawia się na zajęciach

Do poszczególnych zajęć dołączona jest adnotacja InnerClass który jest zdefiniowany w zakresie leksykalnym definicji innej klasy. Każda klasa, która zawiera tę adnotację, musi też zawierać albo EnclosingClass adnotacja lub EnclosingMethod adnotacja.

Nazwa Format Opis
nazwa Ciąg znaków pierwotnie zadeklarowana prosta nazwa tej klasy (bez prefiks pakietu). Jeśli te zajęcia są anonimowe, nazwa: null
flagi dostępu int pierwotnie zadeklarowane flagi dostępu klasy (która może być inna ze skutecznych flag z powodu niezgodności między wykonaniem modelu języka źródłowego i docelowej maszyny wirtualnej)

dalvik.annotation.MemberClasses

Pojawia się na zajęciach

Do poszczególnych zajęć dołączona jest adnotacja MemberClasses , która deklaruje klasy członków. (Klasa członka to bezpośrednia klasa wewnętrzna który ma nazwę).

Nazwa Format Opis
wartość Klasa[] tablica klas elementów składowych

dalvik.annotation.MethodParameters

Pojawia się przy metodach

Uwaga: ta adnotacja została dodana po Androidzie 7.1. Jego obecność we wcześniejszych wersjach Androida będzie ignorowana.

Adnotacja MethodParameters jest opcjonalna i można jej użyć do: podaj metadane parametrów, takie jak nazwy parametrów i modyfikatory.

Adnotację można bezpiecznie pominąć w metodzie lub konstruktorze, gdy nie są wymagane metadane parametru podczas działania. Można użyć java.lang.reflect.Parameter.isNamePresent() do sprawdzania, czy metadane są dostępne dla parametru oraz powiązane z nim odbicie; metody takie jak java.lang.reflect.Parameter.getName() spadną jeśli te informacje nie są dostępne, przywraca się domyślne działanie w czasie działania aplikacji.

Włączając metadane parametrów, kompilatory muszą zawierać informacje dla wygenerowanych klas, takich jak wyliczenia, ponieważ metadane parametrów informuje, czy parametr jest syntetyczny lub wymagany.

Adnotacja MethodParameters opisuje tylko pojedynczą metodę . Z tego powodu kompilatory mogą całkowicie pominąć adnotację dla konstruktorów i metod niemających parametrów, tylko ze względu na rozmiar kodu i wydajność działania w czasie działania.

Tablice wymienione poniżej muszą mieć taki sam rozmiar jak tablice method_id_item struktura dex powiązana z metodą, w przeciwnym razie zostanie wyrzucony java.lang.reflect.MalformedParametersException w środowisku wykonawczym.

To oznacza: method_id_item.proto_idx -> proto_id_item.parameters_off -> Wartość type_list.size musi być taka sama jak names().length i accessFlags().length.

Ponieważ MethodParameters opisuje wszystkie metody formalne nawet te, które nie zostały jawnie lub niejawnie zadeklarowane w kodzie źródłowym, rozmiar tablic może się różnić od rozmiaru podpisu lub innych metadanych informacje oparte wyłącznie na jawnych parametrach zadeklarowanych w źródle w kodzie. MethodParameters nie będzie również zawierać żadnych informacji na temat: typ parametrów odbiornika adnotacji, które nie istnieją w metodzie rzeczywistej podpis.

Nazwa Format Opis
nazwy String[] Nazwy parametrów formalnych dla powiązanej metody. Tablica nie może być null, ale musi być pusty, jeśli nie ma żadnych parametrów formalnych. Wartość w argumencie tablica musi mieć wartość null, jeśli parametr formalny o tym indeksie nie ma nazwy.
Jeśli ciągi nazw parametrów są puste lub zawierają znaki „.”, „;”, „[” lub „/” następnie java.lang.reflect.MalformedParametersException zostanie rzucony na w środowisku wykonawczym.
flagi dostępu int[] Flagi dostępu parametrów formalnych dla powiązanej metody. tablica nie może mieć wartości null, ale musi być pusta, jeśli nie ma żadnych parametrów formalnych.
Wartość to maska bitowa z tymi wartościami:
  • 0x0010 : wartość końcowa, parametr został zadeklarowany jako ostateczne
  • 0x1000 : syntetyczny, parametr został wprowadzony przez kompilator
  • 0x8000 : wymagany, parametr jest syntetyczny, lecz także sugerujący język specyfikacja
. Jeśli jakieś bity są ustawione poza tym zestawem, Wartość java.lang.reflect.MalformedParametersException zostanie zgłoszona w czasie działania.

dalvik.annotation.Signature

Pojawia się w klasach, polach i metodach

Do wszystkich zajęć dołączona jest adnotacja Signature. pola lub metody zdefiniowanej w formie bardziej złożonego typu jest reprezentowana przez type_id_item. Format .dex nie określa formatu podpisów; jego ma po prostu reprezentować jakiekolwiek podpisy u źródła wymagane do skutecznej implementacji semantyka. Dlatego podpisy nie są zazwyczaj analizowane (ani weryfikowane). przez implementacje maszyn wirtualnych. Podpisy można po prostu przekazać do interfejsów API i narzędzi wyższego poziomu (takich jak debugery). Dowolne użycie podpis należy więc napisać w taki sposób, aby nie podejmować założenia dotyczące otrzymywania wyłącznie prawidłowych podpisów, wprost chroniący przed wystąpieniem składniowego tekstu nieprawidłowy podpis.

Ciągi podpisu zawierają zwykle dużo zduplikowanej treści, adnotacja Signature to tablica ciągi tekstowe, gdzie zduplikowane elementy naturalnie odnoszą się do tego samego bazowych danych, a podpis jest uważany za konkatenację wszystkich ciągów w tablicy. Nie ma żadnych reguł, które określałyby sposób pobierania podzielić podpis na osobne ciągi znaków; zależy wyłącznie od które generują pliki (.dex).

Nazwa Format Opis
wartość String[] podpis tej klasy lub elementu w formie tablicy ciągów, jest połączony

dalvik.annotation.rzuty

Pojawia się przy metodach

Do każdej metody, która jest używana, dołączona jest adnotacja Throws zadeklarowano zgłaszanie co najmniej 1 typu wyjątku.

Nazwa Format Opis
wartość Klasa[] tablica typów zgłoszonych wyjątków