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 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7F | -128 | 16256 | 16255 |
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_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). |
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 są 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
|
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:
- Uchwyt metody reprezentujący metodę łączenia wczytywania (VALUE_METHOD_HANDLE).
- Nazwa metody, którą powinien rozwiązać tag łączący wczytywania (VALUE_STRING).
- 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:
java.lang.invoke.Lookup
java.lang.String
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 lokalnyname_idx : indeks ciągu znaków nazwytype_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 lokalnyname_idx : indeks ciągu znaków nazwytype_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
„ |
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:
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 |