이 문서에서는 클래스 정의 및 관련 부속 데이터를 보유하는 데 사용되는 .dex
파일의 레이아웃과 콘텐츠를 설명합니다.
형식에 관한 가이드
이름 | 설명 |
---|---|
byte | 8비트 부호 있는 정수 |
ubyte | 8비트 부호 없는 정수 |
short | 16비트 부호 있는 정수, little-endian |
ushort | 16비트 부호 없는 정수, little-endian |
int | 32비트 부호 있는 정수, little-endian |
uint | 32비트 부호 없는 정수, little-endian |
long | 64비트 부호 있는 정수, little-endian |
ulong | 64비트 부호 없는 정수, little-endian |
sleb128 | 부호 있는 LEB128, 가변 길이(아래 참고) |
uleb128 | 부호 없는 LEB128, 가변 길이(아래 참고) |
uleb128p1 | 부호 없는 LEB128 + 1 , 가변 길이(아래 참고) |
LEB128
LEB128('Little-Endian Base 128')은 부호가 있거나 부호가 없는 임의의 정수 수량에 관한 가변 길이 인코딩입니다. 이 형식은 DWARF3 사양에서 가져왔습니다. .dex
파일에서 LEB128은 32비트 수량을 인코딩하는 데만 사용됩니다.
LEB128로 인코딩된 각 값은 1~5바이트로 구성되며 모두 합치면 단일 32비트 값을 나타냅니다. 시퀀스에서 최상위 비트가 설정되지 않은 마지막 바이트를 제외한 각 바이트에는 최상위 비트가 설정되어 있습니다. 각 바이트의 나머지 7비트는 페이로드이며 첫 번째 바이트에 수량의 최하위 비트 7개가 위치하고 두 번째 바이트에는 다음 비트 7개가 위치하는 방식입니다. 부호가 있는 LEB128(sleb128
)의 경우, 시퀀스에서 마지막 바이트의 최상위 페이로드 비트는 최종 값을 생성하도록 부호가 확장됩니다. 부호가 없는 경우(uleb128
), 명시적으로 표현되지 않은 비트는 0
으로 해석됩니다.
2바이트 LEB128 값의 비트별 다이어그램 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
첫 번째 바이트 | 두 번째 바이트 | ||||||||||||||
1 |
비트6 | 비트5 | 비트4 | 비트3 | 비트2 | 비트1 | 비트0 | 0 |
비트13 | 비트12 | 비트11 | 비트10 | 비트9 | 비트8 | 비트7 |
변형 uleb128p1
은 부호가 있는 값을 나타낼 때 사용되며 여기서는 uleb128
로 인코딩된 값 +1을 나타냅니다. 이 경우 다른 음수를 제외한 -1
(부호 없는 값 0xffffffff
로 간주되기도 함)의 인코딩은 단일 바이트가 되며 표현된 숫자가 음수가 아니어야 하거나 -1
(또는 0xffffffff
)이어야 하고 다른 음수 값이 허용되지 않을 때(또는 부호 없는 큰 값이 필요할 가능성이 낮을 때)에 유용합니다.
다음은 형식의 몇 가지 예입니다.
인코딩된 시퀀스 | sleb128 형태 |
uleb128 형태 |
uleb128p1 형태 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
파일 레이아웃
이름 | 형식 | 설명 |
---|---|---|
header | header_item | 헤더 |
string_ids | string_id_item[] | 문자열 식별자 목록입니다. 이는 내부 이름 지정(예: 형식 설명어) 용도로 또는 코드에서 참조한 상수 객체로서 이 파일에서 사용되는 모든 문자열에 관한 식별자입니다. 이 목록은 언어와 상관없이 UTF-16 코드 포인트 값을 사용하여 문자열 내용 기준으로 정렬해야 하며 중복 항목을 포함할 수 없습니다. |
type_ids | type_id_item[] | 형식 식별자 목록입니다. 이는 파일 내 정의 여부와 관계없이 이 파일에서 참조한 모든 형식(클래스형, 배열형 또는 기본형)에 관한 식별자입니다. 이 목록은 string_id 색인 기준으로 정렬해야 하며 중복 항목을 포함할 수 없습니다.
|
proto_ids | proto_id_item[] | 메서드 프로토타입 식별자 목록입니다. 이는 이 파일에서 참조하는 모든 프로토타입의 식별자입니다. 이 목록은 반환 유형(type_id 색인 기준) 위주의 순서로 정렬한 뒤 인수 목록(사전식 정렬, type_id 색인 기준 개별 인수 정렬) 기준으로 정렬해야 합니다. 목록에는 중복 항목이 없어야 합니다.
|
field_ids | field_id_item[] | 필드 식별자 목록입니다. 이는 파일 내 정의 여부에 관계없이 이 파일에서 참조하는 모든 필드의 식별자입니다. 이 목록은 정렬되어야 하며 type_id 색인 기준으로 정의하는 형식이 1순위 순서, string_id 색인별 필드 이름이 2순위 순서, type_id 색인별 형식이 3순위 순서입니다. 목록에는 중복 항목이 없어야 합니다.
|
method_ids | method_id_item[] | 메서드 식별자 목록입니다. 이는 파일 내 정의 여부에 관계없이 이 파일에서 참조하는 모든 메소드의 식별자입니다. 이 목록은 정렬되어야 하며 type_id 색인 기준으로 정의하는 형식이 1순위 순서, string_id 색인별 메서드 이름이 2순위 순서, proto_id 색인별 메서드 프로토타입이 3순위 순서입니다. 목록에는 중복 항목이 없어야 합니다.
|
class_defs | class_def_item[] | 클래스 정의 목록입니다. 지정된 클래스의 상위 클래스 및 구현된 인터페이스가 목록에서 참조하는 클래스보다 먼저 표시되도록 클래스를 정렬해야 합니다. 또한 이름이 같은 클래스의 정의가 목록에서 두 번 이상 표시되어서는 안 됩니다. |
call_site_ids | call_site_id_item[] | 호출 사이트 식별자 목록입니다. 이는 파일 내 정의 여부에 관계없이 이 파일에서 참조하는 모든 호출 사이트의 식별자입니다. 이 목록은 call_site_off 의 오름차순으로 정렬해야 합니다.
|
method_handles | method_handle_item[] | 메서드 핸들 목록입니다. 파일 내 정의 여부에 관계없이 이 파일에서 참조하는 모든 메서드 핸들의 목록입니다. 이 목록은 정렬되지 않으며 다른 메서드 핸들 인스턴스에 논리적으로 상응하는 중복 항목을 포함할 수 있습니다. |
데이터 | ubyte[] | 데이터 영역으로, 위에 나열된 표에 관한 모든 지원 데이터를 포함합니다. 항목마다 정렬 요구사항이 다르며 필요한 경우 각 항목 앞에 패딩 바이트가 삽입되어 올바르게 정렬됩니다. |
link_data | ubyte[] | 정적으로 연결된 파일에서 사용되는 데이터입니다. 본 문서에서 이 섹션의 데이터 형식은 지정하지 않은 채로 둡니다. 이 섹션은 연결이 해제된 파일에서 비어 있으며 런타임 구현 시 필요에 맞게 사용할 수 있습니다. |
비트필드, 문자열, 상수 정의
DEX_FILE_MAGIC
header_item에 삽입됨
상수 배열/문자열 DEX_FILE_MAGIC
은 바이트 목록으로 .dex
파일의 시작 부분에 표시되어야 제대로 인식될 수 있습니다. 값에는 의도적으로 줄바꿈("\n"
또는 0x0a
)과 null 바이트("\0"
또는 0x00
)가 포함되어 있어 특정 형식의 손상을 감지하는 데 도움이 됩니다. 이 값은 또한 형식 버전 수를 3자리 십진수로 인코딩하며 시간이 흐르면서 형식이 변함에 따라 단조 증가할 것으로 예상됩니다.
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
참고: 이 형식의 버전 039
에 관한 지원은 2가지 새로운 바이트 코드인 const-method-handle
및 const-method-type
을 도입한 Android 9.0 출시에서 추가되었습니다. (이에 관한 설명은 바이트 코드 세트 요약 표에서 확인할 수 있습니다.) Android 10의 경우 버전 039
는 DEX 파일 형식을 확장하여 부팅 클래스 경로의 DEX 파일에만 적용되는 숨겨진 API 정보를 포함합니다.
참고: 이 형식의 버전 038
에 관한 지원은 Android 8.0 출시에서 추가되었습니다. 버전 038
에는 새 바이트 코드(invoke-polymorphic
및 invoke-custom
)와 메서드 핸들에 관한 데이터가 추가되었습니다.
참고: 이 형식의 버전 037
에 관한 지원은 Android 7.0 출시에서 추가되었습니다. 버전 037
이전에는 대부분의 Android 버전이 이 형식의 버전 035
를 사용해 왔습니다. 버전 035
및 037
간의 유일한 차이점은 기본 메서드의 추가와 invoke
의 조정입니다.
참고: 이 형식의 이전 버전 중 적어도 몇 개는 널리 사용되는 공개 소프트웨어 버전에서 사용된 바 있습니다. 예를 들어 버전 009
는 Android 플랫폼의 M3 출시(2007년 11월~12월)에 사용되었으며 013
은 Android 플랫폼의 M5 출시(2008년 2월~3월)에 사용되었습니다. 이 형식의 이러한 이전 버전은 본 문서에 설명된 버전과는 여러 면에서 매우 다릅니다.
ENDIAN_CONSTANT 및 REVERSE_ENDIAN_CONSTANT
header_item에 삽입됨
상수 ENDIAN_CONSTANT
는 이 상수가 발견된 파일의 엔디언을 나타내는 데 사용됩니다. 표준 .dex
형식은 little-endian이지만 구현 시 바이트 스와핑을 실행하도록 선택할 수 있습니다. 구현 시 endian_tag
가 ENDIAN_CONSTANT
대신 REVERSE_ENDIAN_CONSTANT
인 헤더가 있는 경우 파일이 예상된 양식으로부터 바이트 스와핑되었음을 알게 됩니다.
uint ENDIAN_CONSTANT = 0x12345678; uint REVERSE_ENDIAN_CONSTANT = 0x78563412;
NO_INDEX
class_def_item 및 debug_info_item에 삽입됨
상수 NO_INDEX
는 인덱스 값이 없음을 나타내기 위해 사용됩니다.
참고: 이 값은 일반적으로 유효한 색인인 0
으로 정의되지 않습니다.
NO_INDEX
로 선택한 값은 uleb128p1
인코딩에서 단일 바이트로 표시할 수 있습니다.
uint NO_INDEX = 0xffffffff; // == -1 if treated as a signed int
access_flags 정의
class_def_item, encoded_field, encoded_method, InnerClass에 삽입됨
이러한 플래그의 비트필드는 클래스 및 클래스 멤버의 접근성과 전반적인 속성을 나타내는 데 사용됩니다.
이름 | 값 | 클래스(및 InnerClass 주석)의 경우 |
필드의 경우 | 메서드의 경우 |
---|---|---|---|---|
ACC_PUBLIC | 0x1 | public : 모든 곳에 표시 |
public : 모든 곳에 표시 |
public : 모든 곳에 표시 |
ACC_PRIVATE | 0x2 | private : 정의를 내리는 클래스에만 표시 |
private : 정의를 내리는 클래스에만 표시 |
private : 정의를 내리는 클래스에만 표시 |
ACC_PROTECTED | 0x4 | protected : 패키지 및 서브클래스에 표시 |
protected : 패키지 및 서브클래스에 표시 |
protected : 패키지 및 서브클래스에 표시 |
ACC_STATIC | 0x8 | static : 외부 this 참조를 통해 구성되지 않음 |
static : 정의를 내리는 클래스에 관해 전역적 |
static : this 인수를 사용하지 않음 |
ACC_FINAL | 0x10 | final : 서브클래스로 생성 불가 |
final : 구성 후 변경 불가능 |
final : 재정의할 수 없음 |
ACC_SYNCHRONIZED | 0x20 | synchronized : 이 메서드 호출에 관해 자동 획득된 관련 잠금입니다.참고: |
||
ACC_VOLATILE | 0x40 | volatile : 스레드 안전을 지원하는 특수 액세스 규칙 |
||
ACC_BRIDGE | 0x40 | 브리지 메서드로, 컴파일러를 통해 형식 안전 브리지로 자동 추가됨 | ||
ACC_TRANSIENT | 0x80 | transient : 기본 직렬화에 의해 저장되지 않아야 함 |
||
ACC_VARARGS | 0x80 | 마지막 인수는 컴파일러에 의해 'rest' 인수로 처리되어야 함 | ||
ACC_NATIVE | 0x100 | native : 네이티브 코드로 구현됨 |
||
ACC_INTERFACE | 0x200 | interface : 멀티플라이를 구현할 수 있는 추상 클래스 |
||
ACC_ABSTRACT | 0x400 | abstract : 직접 인스턴스화할 수 없음 |
abstract : 이 클래스에서 구현되지 않음 |
|
ACC_STRICT | 0x800 | strictfp : 부동 소수점 산술에 관한 엄격한 규칙 |
||
ACC_SYNTHETIC | 0x1000 | 소스 코드에 직접 정의되지 않음 | 소스 코드에 직접 정의되지 않음 | 소스 코드에 직접 정의되지 않음 |
ACC_ANNOTATION | 0x2000 | 주석 클래스로 선언됨 | ||
ACC_ENUM | 0x4000 | 열거 형식으로 선언됨 | 열거형 값으로 선언됨 | |
(사용되지 않음) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | 생성자 메서드(클래스 또는 인스턴스 이니셜라이저) | ||
ACC_DECLARED_ SYNCHRONIZED |
0x20000 | synchronized 로 선언되었습니다.참고: 이는 실행에 영향을 미치지 않습니다(이 플래그 자체를 반영하는 경우는 제외). |
InnerClass
주석에 관해서만 허용되며 class_def_item
에서는 사용할 수 없습니다.
수정된 UTF-8 인코딩
기존 지원이 더 용이하기 때문에 .dex
형식은 사실상의 표준 양식인 수정된 UTF-8 양식(이하 MUTF-8)으로 문자열 데이터를 인코딩합니다. 이 형식은 다음 특징을 제외하면 표준 UTF-8과 동일합니다.
- 1바이트, 2바이트, 3바이트 인코딩만 사용됩니다.
U+10000
...U+10ffff
범위의 코드 포인트는 서로게이트 페어로 인코딩되며 각각 3바이트로 인코딩된 값으로 표현됩니다.- 코드 포인트
U+0000
은 2바이트 형식으로 인코딩됩니다. - 일반 null 바이트(값
0
)는 표준 C 언어 해석과 마찬가지로 문자열의 끝을 나타냅니다.
위에서 첫 두 항목은 다음과 같이 요약될 수 있습니다. 즉, MUTF-8은 UTF-16에 사용되는 인코딩 형식이며 유니코드 문자에 사용되는 보다 직접적인 인코딩 형식이 아닙니다.
마지막 두 가지 특징 때문에 MUTF-8은 코드 포인트 U+0000
을 문자열에 포함하는 동시에 null로 끝나는 C 형식 문자열로 조작할 수 있습니다.
하지만 MUTF-8 문자열 쌍에서 표준 C 함수 strcmp()
를 호출하는 경우 U+0000
의 특수 인코딩의 결과는 일반 UTF-8과 달리 동일하지 않은 문자열과의 비교 결과에 적절한 부호가 늘 적용되지는 않습니다.
균등뿐 아니라 순서가 중요시되는 경우 MUTF-8 문자열을 비교해 보는 가장 간단한 방법은 문자별로 디코딩하고 디코딩된 값을 비교하는 것입니다. 하지만 더 현명한 방법이 있을 수도 있습니다.
문자 인코딩에 관한 자세한 내용은 유니코드 표준을 참고하세요. MUTF-8은 UTF-8보다 상대적으로 덜 알려진 인코딩 CESU-8에 더 가깝습니다.
encoded_value 인코딩
annotation_element 및 encoded_array_item에 삽입됨
encoded_value
는 사실상 임의의 계층으로 구조화된 데이터의 인코딩된 부분입니다. 인코딩을 통해 간결하고 간단하게 파싱할 수 있습니다.
이름 | 형식 | 설명 |
---|---|---|
(value_arg << 5) | value_type | ubyte | 상위 비트 3개에서 확정하는 역할을 하는 선택적 인수와 더불어 즉시 이어지는 value 의 형식을 나타내는 바이트입니다.
다양한 value 정의는 아래를 참고하세요.
대부분의 경우 value_arg 는 즉시 이어지는 value 의 길이를 (size - 1) 과 같이 바이트 단위로 인코딩합니다. 0 은 값에 1바이트가 필요하고 7 은 8바이트가 필요함을 의미합니다. 하지만 다음과 같은 예외가 있습니다.
|
값 | ubyte[] | 값과 변수를 길이로 표현하는 바이트로, 항상 little-endian이기는 하지만 value_type 바이트마다 다르게 해석됩니다. 자세한 내용은 아래에서 다양한 값 정의를 참조하세요.
|
값 형식
형식 이름 | value_type |
value_arg 형식 |
value 형식 |
설명 |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (없음, 0 이어야 함) |
ubyte[1] | 부호 있는 1바이트 정수 값 |
VALUE_SHORT | 0x02 | 크기 - 1(0…1) | ubyte[size] | 부호 있는 2바이트 정수 값, 부호 확장 |
VALUE_CHAR | 0x03 | 크기 - 1(0…1) | ubyte[size] | 부호 없는 2바이트 정수 값, 0 확장 |
VALUE_INT | 0x04 | 크기 - 1(0…3) | ubyte[size] | 부호 있는 4바이트 정수 값, 부호 확장 |
VALUE_LONG | 0x06 | 크기 - 1(0…7) | ubyte[size] | 부호 있는 8바이트 정수 값, 부호 확장 |
VALUE_FLOAT | 0x10 | 크기 - 1(0…3) | ubyte[size] | 4바이트 비트 패턴, 오른쪽으로 0 확장, IEEE754 32비트 부동 소수점 값으로 해석됨 |
VALUE_DOUBLE | 0x11 | 크기 - 1(0…7) | ubyte[size] | 8바이트 비트 패턴, 오른쪽으로 0 확장, IEEE754 64비트 부동 소수점 값으로 해석됨 |
VALUE_METHOD_TYPE | 0x15 | 크기 - 1(0…3) | ubyte[size] | 부호 없는(0 확장) 4바이트 정수 값으로, proto_ids 섹션에 관한 색인으로 해석되며 메서드 형식 값을 표현함 |
VALUE_METHOD_HANDLE | 0x16 | 크기 - 1(0…3) | ubyte[size] | 부호 없는(0 확장) 4바이트 정수 값으로, method_handles 섹션에 관한 색인으로 해석되며 메서드 핸들 값을 표현함 |
VALUE_STRING | 0x17 | 크기 - 1(0…3) | ubyte[size] | 부호 없는(0 확장) 4바이트 정수 값으로, string_ids 섹션에 관한 색인으로 해석되며 문자열 값을 표현함 |
VALUE_TYPE | 0x18 | 크기 - 1(0…3) | ubyte[size] | 부호 없는(0 확장) 4바이트 정수 값으로, type_ids 섹션에 관한 색인으로 해석되며 반영적인 형식/클래스 값을 표현함 |
VALUE_FIELD | 0x19 | 크기 - 1(0…3) | ubyte[size] | 부호 없는(0 확장) 4바이트 정수 값으로, field_ids 섹션에 관한 색인으로 해석되며 반영적인 필드 값을 표현함 |
VALUE_METHOD | 0x1a | 크기 - 1(0…3) | ubyte[size] | 부호 없는(0 확장) 4바이트 정수 값으로, method_ids 섹션에 관한 색인으로 해석되며 반영적인 메서드 값을 표현함 |
VALUE_ENUM | 0x1b | 크기 - 1(0…3) | ubyte[size] | 부호 없는(0 확장) 4바이트 정수 값으로, field_ids 섹션에 관한 색인으로 해석되며 열거형 상수 값을 표현함 |
VALUE_ARRAY | 0x1c | (없음, 0 이어야 함) |
encoded_array | 아래 'encoded_array 형식'에서 지정한 형식의 값 배열입니다. value 의 크기는 인코딩에서 암시적입니다.
|
VALUE_ANNOTATION | 0x1d | (없음, 0 이어야 함) |
encoded_annotation | 하위 주석으로, 아래 'encoded_annotation 형식'에서 지정한 형식을 사용합니다. value 의 크기는 인코딩에서 암시적입니다.
|
VALUE_NULL | 0x1e | (없음, 0 이어야 함) |
(없음) | null 참조 값 |
VALUE_BOOLEAN | 0x1f | 부울(0…1) | (없음) | 1비트 값, false 인 경우 0 이며 true 인 경우 1 입니다. 비트는 value_arg 로 표현됩니다.
|
encoded_array 형식
이름 | 형식 | 설명 |
---|---|---|
size | uleb128 | 배열 요소 개수 |
values | encoded_value[size] | 이 섹션에서 지정한 형식인 일련의 size encoded_value 바이트 시퀀스이며 순차적으로 연결됩니다. |
encoded_annotation 형식
이름 | 형식 | 설명 |
---|---|---|
type_idx | uleb128 | 주석의 형식입니다. 이는 (배열형 또는 기본형이 아니라) 클래스 형식이어야 합니다. |
size | uleb128 | 이 주석의 이름-값 매핑 수 |
elements | annotation_element[size] | 주석의 요소로, 인라인으로 직접 표현됩니다(오프셋으로 표현되지 않음). 요소는 string_id 색인 기준으로 오름차순으로 정렬해야 합니다.
|
annotation_element 형식
이름 | 형식 | 설명 |
---|---|---|
name_idx | uleb128 | 요소 이름으로, string_ids 섹션에 관한 색인으로 표현됩니다. 문자열은 위에 정의된 MemberName의 구문을 준수해야 합니다.
|
값 | encoded_value | element value |
문자열 구문
.dex
파일에는 최종적으로 문자열을 참조하는 여러 종류의 항목이 있습니다. 다음 BNF 스타일 정의는 이러한 문자열에 허용되는 구문을 나타냅니다.
SimpleName
SimpleName은 다른 이름의 구문에 관한 기초입니다. .dex
형식은 상당한 자유 범위를 허용하며 이는 대부분의 일반적인 소스 언어보다 훨씬 광범위합니다. 요약하자면, 간단한 이름은 하위 ASCII 알파벳 문자 또는 숫자, 일부 하위 ASCII 기호, 컨트롤이나 공백 또는 특수 문자가 아닌 대부분의 비ASCII 코드 포인트로 구성됩니다. 이 형식은 버전 040
부터 공백 문자(유니코드 Zs
카테고리)를 추가적으로 허용합니다. 서로게이트 코드 포인트(U+d800
... U+dfff
범위)는 그 자체로는 유효한 이름 문자로 간주되지 않습니다. 하지만 유니코드 보조 문자는 유효하며(SimpleNameChar에 관한 규칙의 최종 대안으로 표현) MUTF-8 인코딩의 서로게이트 코드 포인트 쌍으로 파일 내에 표현되어야 합니다.
SimpleName → | ||
SimpleNameChar (SimpleNameChar)* | ||
SimpleNameChar → | ||
'A' … 'Z' |
||
| | 'a' … 'z' |
|
| | '0' … '9' |
|
| | ' ' |
DEX 버전 040 이후 |
| | '$' |
|
| | '-' |
|
| | '_' |
|
| | U+00a0 |
DEX 버전 040 이후 |
| | U+00a1 … U+1fff |
|
| | U+2000 … U+200a |
DEX 버전 040 이후 |
| | U+2010 … U+2027 |
|
| | U+202f |
DEX 버전 040 이후 |
| | U+2030 … U+d7ff |
|
| | U+e000 … U+ffef |
|
| | U+10000 … U+10ffff |
MemberName
field_id_item 및 method_id_item에서 사용
MemberName은 클래스 멤버 즉, 필드, 메서드 및 내부 클래스인 멤버의 이름입니다.
MemberName → | |
SimpleName | |
| | '<' SimpleName '>' |
FullClassName
FullClassName은 정규화된 클래스 이름으로, 뒤에 필수 이름이 붙는 선택적 패키지 지정자를 포함합니다.
FullClassName → | |
OptionalPackagePrefix SimpleName | |
OptionalPackagePrefix → | |
(SimpleName '/' )* |
TypeDescriptor
type_id_item에서 사용
TypeDescriptor는 기본형, 클래스, 배열, void
를 포함한 모든 형식에 관한 표현입니다. 다양한 버전의 의미는 아래를 참조하세요.
TypeDescriptor → | |
'V' |
|
| | FieldTypeDescriptor |
FieldTypeDescriptor → | |
NonArrayFieldTypeDescriptor | |
| | ('[' * 1…255) NonArrayFieldTypeDescriptor |
NonArrayFieldTypeDescriptor→ | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' FullClassName ';' |
ShortyDescriptor
proto_id_item에서 사용
ShortyDescriptor는 반환 및 매개변수 형식을 포함하는 메서드 프로토타입의 짧은 양식 표현이며 이 점을 제외하면 다양한 참조(클래스 또는 배열) 형식과 뚜렷한 차이가 없습니다. 대신, 모든 참조 형식은 단일 'L'
문자로 표현됩니다.
ShortyDescriptor → | |
ShortyReturnType (ShortyFieldType)* | |
ShortyReturnType → | |
'V' |
|
| | ShortyFieldType |
ShortyFieldType → | |
'Z' |
|
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
TypeDescriptor 의미 체계
TypeDescriptor의 각 변형에 관한 의미입니다.
구문 | 의미 |
---|---|
V | void , 반환 유형에만 유효함 |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long |
F | float |
D | double |
L완전히/정규화된/이름; | 클래스 fully.qualified.Name |
[설명어 | descriptor 배열로서, 배열의 배열에 반복적으로 사용할 수 있지만 차원의 수가 255를 넘을 수는 없습니다. |
항목 및 관련 구조
이 섹션에는 .dex
파일에 표시될 수 있는 최상위 수준 항목 각각에 관한 정의가 포함되어 있습니다.
header_item
헤더 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
magic | ubyte[8] = DEX_FILE_MAGIC | 매직 값입니다. 자세한 내용은 위에서 'DEX_FILE_MAGIC ' 부분의 토론을 참조하세요.
|
checksum | uint | 파일의 나머지 부분(magic 및 이 필드만 제외)에 관한 adler32 체크섬이며 파일 손상을 감지하는 데 사용됨 |
signature | ubyte[20] | 파일의 나머지 부분(magic , checksum , 이 필드만 제외)의 SHA-1 서명(해시)이며 파일을 고유하게 식별하는 데 사용됨 |
file_size | uint | 헤더를 포함한 전체 파일의 크기(바이트 단위) |
header_size | uint = 0x70 | 헤더(전체 섹션)의 크기입니다(바이트 단위). 형식을 무효화하지 않으면서 최소한 제한된 수준의 상위/하위 호환성을 제공합니다. |
endian_tag | uint = ENDIAN_CONSTANT | endianness 태그입니다. 자세한 내용은 위에서 'ENDIAN_CONSTANT 및 REVERSE_ENDIAN_CONSTANT ' 부분의 토론을 참조하세요.
|
link_size | uint | 연결 섹션의 크기 또는 0 (파일이 정적으로 연결되지 않은 경우) |
link_off | uint | 파일의 시작 부분에서 연결 섹션까지의 오프셋이며, link_size == 0 인 경우 0 입니다. 오프셋이 0이 아니라면 link_data 섹션으로의 오프셋이어야 합니다. 본 문서에서 특정된 데이터의 형식은 지정하지 않은 채로 둡니다. 이 헤더 필드는 기존 헤더 필드와 마찬가지로 런타임 구현 시 사용할 후크로 둡니다.
|
map_off | uint | 파일의 시작 부분에서 맵 항목까지의 오프셋입니다. 오프셋은 0이 아니어야 하며, data 섹션으로의 오프셋이어야 합니다. 데이터는 아래의 'map_list '에서 지정한 형식이어야 합니다.
|
string_ids_size | uint | 문자열 식별자 목록의 문자열 수 |
string_ids_off | uint | 파일의 시작 부분에서 문자열 식별자 목록까지의 오프셋이며, string_ids_size == 0 인 경우 0 입니다(일반적이지 않은 극단적인 케이스). 오프셋은 0이 아닌 경우 string_ids 섹션의 시작 부분까지여야 합니다.
|
type_ids_size | uint | 형식 식별자 목록의 요소 개수, 최대 65535 |
type_ids_off | uint | 파일의 시작 부분에서 형식 식별자 목록까지의 오프셋이며, type_ids_size == 0 인 경우 0 입니다(일반적이지 않은 극단적인 케이스). 오프셋은 0이 아닌 경우 type_ids 섹션의 시작 부분까지여야 합니다.
|
proto_ids_size | uint | 프로토타입 식별자 목록의 요소 개수, 최대 65535 |
proto_ids_off | uint | 파일의 시작 부분에서 프로토타입 식별자 목록까지의 오프셋이며, proto_ids_size == 0 인 경우 0 입니다(일반적이지 않은 극단적인 케이스). 오프셋은 0이 아닌 경우 proto_ids 섹션의 시작 부분까지여야 합니다.
|
field_ids_size | uint | 필드 식별자 목록의 요소 개수 |
field_ids_off | uint | 파일의 시작 부분에서 필드 식별자 목록까지의 오프셋이며, field_ids_size == 0 인 경우 0 입니다. 오프셋은 0이 아닌 경우 field_ids 섹션의 시작 부분까지여야 합니다. |
method_ids_size | uint | 메서드 식별자 목록의 요소 개수 |
method_ids_off | uint | 파일의 시작 부분에서 메서드 식별자 목록까지의 오프셋이며, method_ids_size == 0 인 경우 0 입니다. 오프셋은 0이 아닌 경우 method_ids 섹션의 시작 부분까지여야 합니다. |
class_defs_size | uint | 클래스 정의 목록의 요소 개수 |
class_defs_off | uint | 파일의 시작 부분에서 클래스 정의 목록까지의 오프셋이며 class_defs_size == 0 인 경우 0 입니다(일반적이지 않은 극단적인 케이스). 오프셋은 0이 아닌 경우 class_defs 섹션의 시작 부분까지여야 합니다.
|
data_size | uint | 바이트 단위로 나타낸 data 섹션의 크기입니다. sizeof(unit)의 짝수 배수여야 합니다. |
data_off | uint | 파일의 시작 부분에서 data 섹션 시작 부분까지의 오프셋입니다. |
map_list
데이터 섹션에 표시됨
header_item에서 참조됨
정렬: 4바이트
파일의 전체 내용을 순서대로 나열한 목록입니다. 여기에는 header_item
과 관련하여 약간의 중복이 포함되지만, 이는 전체 파일에서 반복하는 데 사용하기 쉬운 형식을 제공하기 위함입니다. 특정 형식은 지도에서 최대 한 번만 표시할 수 있으나 형식을 표시할 수 있는 순서에는 제한이 없으며, 예외적으로 형식의 나머지 부분에서 암시하는 제한사항(예: header
섹션이 가장 먼저 표시되고 string_ids
가 그 뒤에 표시되어야 함)만 적용됩니다. 또한 맵 항목은 초기 오프셋 기준으로 정렬해야 하며 겹치지 않아야 합니다.
이름 | 형식 | 설명 |
---|---|---|
size | uint | 목록의 크기(항목 단위) |
list | map_item[size] | 목록의 요소 |
map_item 형식
이름 | 형식 | 설명 |
---|---|---|
type | ushort | 항목 형식(아래 표 참고) |
unused | ushort | (사용되지 않음) |
size | uint | 표시된 오프셋에서 찾을 수 있는 항목의 수 |
offset | uint | 파일의 시작 부분에서 문제 항목까지의 오프셋 |
유형 코드
항목 형식 | 상수 | 값 | 항목 크기(바이트 단위) |
---|---|---|---|
header_item | TYPE_HEADER_ITEM | 0x0000 | 0x70 |
string_id_item | TYPE_STRING_ID_ITEM | 0x0001 | 0x04 |
type_id_item | TYPE_TYPE_ID_ITEM | 0x0002 | 0x04 |
proto_id_item | TYPE_PROTO_ID_ITEM | 0x0003 | 0x0c |
field_id_item | TYPE_FIELD_ID_ITEM | 0x0004 | 0x08 |
method_id_item | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
class_def_item | TYPE_CLASS_DEF_ITEM | 0x0006 | 0x20 |
call_site_id_item | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x04 |
method_handle_item | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
map_list | TYPE_MAP_LIST | 0x1000 | 4 + (item.size * 12) |
type_list | TYPE_TYPE_LIST | 0x1001 | 4 + (item.size * 2) |
annotation_set_ref_list | TYPE_ANNOTATION_SET_REF_LIST | 0x1002 | 4 + (item.size * 4) |
annotation_set_item | TYPE_ANNOTATION_SET_ITEM | 0x1003 | 4 + (item.size * 4) |
class_data_item | TYPE_CLASS_DATA_ITEM | 0x2000 | 암시적, 파싱해야 함 |
code_item | TYPE_CODE_ITEM | 0x2001 | 암시적, 파싱해야 함 |
string_data_item | TYPE_STRING_DATA_ITEM | 0x2002 | 암시적, 파싱해야 함 |
debug_info_item | TYPE_DEBUG_INFO_ITEM | 0x2003 | 암시적, 파싱해야 함 |
annotation_item | TYPE_ANNOTATION_ITEM | 0x2004 | 암시적, 파싱해야 함 |
encoded_array_item | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | 암시적, 파싱해야 함 |
annotations_directory_item | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | 암시적, 파싱해야 함 |
hiddenapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | 암시적, 파싱해야 함 |
string_id_item
string_ids 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
string_data_off | uint | 파일의 시작 부분에서 이 항목의 문자열 데이터까지의 오프셋입니다. 오프셋은 data 섹션 내의 위치까지여야 하며 데이터는 아래 'string_data_item '에서 지정한 형식이어야 합니다.
오프셋에 관한 정렬 요구사항은 없습니다.
|
string_data_item
데이터 섹션에 표시됨
정렬: 없음(바이트 정렬)
이름 | 형식 | 설명 |
---|---|---|
utf16_size | uleb128 | 이 문자열의 크기로, 많은 시스템에서 '문자열 길이'인 UTF-16 코드 단위로 나타냅니다. 즉, 문자열의 디코딩된 길이입니다. 인코딩된 길이는 0 바이트의 위치를 통해 암시됩니다. |
데이터 | ubyte[] | 일련의 MUTF-8 코드 단위(옥텟, 바이트라고 함)로, 뒤에 값 0 의 바이트가 붙습니다. 세부정보와 데이터 형식에 관한 토론은 위의 'MUTF-8(Modified UTF-8) 인코딩'을 참고하세요.
참고: 인코딩된 양식의 UTF-16 서로게이트 코드 단위( |
type_id_item
type_ids 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
descriptor_idx | uint | 이 형식의 설명자 문자열에 관한 string_ids 목록 색인입니다. 문자열은 위에 정의된 TypeDescriptor의 구문을 준수해야 합니다.
|
proto_id_item
proto_ids 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
shorty_idx | uint | 이 프로토타입의 짧은 양식으로 된 설명어 문자열에 관한 string_ids 목록 색인입니다. 문자열은 위에 정의된 ShortyDescriptor의 구문을 준수해야 하며 이 항목의 반환 유형 및 매개변수와 일치해야 합니다.
|
return_type_idx | uint | 이 프로토타입의 반환 유형에 관한 type_ids 목록 색인 |
parameters_off | uint | 파일 시작 부분에서 이 프로토타입의 매개변수 형식 목록까지의 오프셋이며 이 프로토타입에 매개변수가 없는 경우 0 입니다. 오프셋이 0이 아닌 경우 data 섹션에 있어야 하며 여기에 있는 데이터는 아래 "type_list" 에서 지정한 형식이어야 합니다. 또한 목록의 형식 void 에 관한 참조가 없어야 합니다.
|
field_id_item
field_ids 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
class_idx | ushort | 이 필드의 정의자에 관한 type_ids 목록 색인입니다. 배열형이나 기본형이 아닌 클래스 형식이어야 합니다.
|
type_idx | ushort | 이 필드의 형식에 관한 type_ids 목록 색인 |
name_idx | uint | 이 필드의 이름에 관한 string_ids 목록 색인 문자열은 위에 정의된 MemberName의 구문을 준수해야 합니다.
|
method_id_item
method_ids 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
class_idx | ushort | 이 메서드의 정의자에 관한 type_ids 목록 색인입니다. 클래스형 또는 배열형이어야 하며 기본형일 수 없습니다.
|
proto_idx | ushort | 이 메서드의 프로토타입에 관한 proto_ids 목록 색인 |
name_idx | uint | 이 메서드의 이름에 관한 string_ids 목록 색인 문자열은 위에 정의된 MemberName의 구문을 준수해야 합니다.
|
class_def_item
class_defs 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
class_idx | uint | 이 클래스의 type_ids 목록 색인입니다.
배열형이나 기본형이 아닌 클래스 형식이어야 합니다.
|
access_flags | uint | 클래스에 관한 액세스 플래그입니다(public , final 등). 세부정보는 'access_flags 정의'를 참고하세요.
|
superclass_idx | uint | 슈퍼클래스의 type_ids 목록 색인이거나 이 클래스에 슈퍼클래스가 없는 경우 상수 값 NO_INDEX 입니다(즉, Object 등의 루트 클래스). 슈퍼클래스가 있다면 배열형 또는 기본형이 아닌 클래스 형식이어야 합니다. |
interfaces_off | uint | 파일 시작 부분에서 인터페이스의 목록까지의 오프셋이며 아무것도 없는 경우 0 입니다. 이 오프셋은 data 섹션에 있어야 하며, 여기에 있는 데이터는 아래 'type_list '에서 지정한 형식이어야 합니다. 목록의 각 요소는 배열형 또는 기본형이 아닌 클래스 형식이어야 하며 중복이 없어야 합니다.
|
source_file_idx | uint | 최소한 이 클래스 대부분의 원본 소스를 포함하는 파일 이름의 string_ids 목록에 관한 색인 또는 이 정보의 부재를 나타내는 특수 값 NO_INDEX 입니다. 특정 메서드의 debug_info_item 은 이 소스 파일을 재정의할 수 있지만 대부분의 클래스는 하나의 소스 파일에서만 가져올 수 있습니다.
|
annotations_off | uint | 파일 시작 부분에서 이 클래스의 주석 구조까지의 오프셋이며 이 클래스의 주석이 없는 경우 0 입니다. 오프셋은 0이 아닌 경우 data 섹션에 있어야 하며, 여기에 있는 데이터는 아래 'annotations_directory_item '에서 지정한 형식이면서 모든 항목은 이 클래스를 정의자로 참조해야 합니다.
|
class_data_off | uint | 파일의 시작 부분에서 이 항목의 관련된 클래스 데이터까지의 오프셋이며 이 클래스의 클래스 데이터가 없는 경우 0 입니다. 예를 들어 이 클래스가 마커 인터페이스인 경우가 이에 해당할 수 있습니다. 오프셋은 0이 아닌 경우 data 섹션에 있어야 하며, 여기에 있는 데이터는 아래 'class_data_item '에서 지정한 형식이면서 모든 항목은 이 클래스를 정의자로 참조해야 합니다.
|
static_values_off | uint | 파일 시작 부분에서 static 필드의 초기 값 목록까지의 오프셋이며, 아무것도 없으면서 모든 static 필드가 0 또는 null 로 초기화되는 경우 0 입니다. 이 오프셋은 data 섹션에 있어야 하며, 여기에 있는 데이터는 아래 'encoded_array_item '에서 지정한 형식이어야 합니다. 배열의 크기는 이 클래스에서 선언한 static 필드의 수보다 크지 않아야 하며, 요소는 상응하는 field_list 에서 선언한 순서대로 static 필드와 일치해야 합니다. 각 배열 요소의 형식은 상응하는 필드의 선언된 형식과 일치해야 합니다.
배열의 요소가 static 필드의 요소보다 적은 경우 나머지 필드는 형식에 적합한 0 또는 null 로 초기화됩니다.
|
call_site_id_item
call_site_ids 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
call_site_off | uint | 파일 시작 부분에서 호출 사이트 정의까지의 오프셋입니다. 오프셋은 데이터 섹션에 있어야 하며, 여기에 있는 데이터는 아래 'call_site_item'에서 지정한 형식이어야 합니다. |
call_site_item
데이터 섹션에 표시됨
정렬: 없음(바이트 정렬)
call_site_item은 요소가 부트스트랩 링커 메서드에 제공된 인수에 해당하는 encoded_array_item입니다. 처음 세 인수는 다음과 같습니다.
- 부트스트랩 링커 메서드(VALUE_METHOD_HANDLE)를 나타내는 메서드 핸들입니다.
- 부트스트랩 링커가 해결해야 하는 메서드 이름입니다(VALUE_STRING).
- 해결할 메서드 이름의 형식에 상응하는 메서드 형식입니다(VALUE_METHOD_TYPE).
추가 인수는 부트스트랩 링커 메서드로 전달되는 상수 값입니다. 이러한 인수는 형식 변환 없이 순서대로 전달됩니다.
부트스트랩 링커 메서드를 나타내는 메서드 핸들은 반환 유형 java.lang.invoke.CallSite
가 있어야 합니다. 처음 세 매개변수 형식은 다음과 같습니다.
java.lang.invoke.Lookup
java.lang.String
java.lang.invoke.MethodType
추가 인수의 매개변수 형식은 상수 값에서 결정됩니다.
method_handle_item
method_handles 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
method_handle_type | ushort | 메서드 핸들 형식, 아래 표 참조 |
unused | ushort | (사용되지 않음) |
field_or_method_id | ushort | 메서드 핸들 형식이 접근자인지 메서드 호출자인지에 따라 결정되는 필드 또는 메서드 ID |
unused | ushort | (사용되지 않음) |
메서드 핸들 유형 코드
상수 | 값 | 설명 |
---|---|---|
METHOD_HANDLE_TYPE_STATIC_PUT | 0x00 | 메서드 핸들은 정적 필드 setter임(접근자) |
METHOD_HANDLE_TYPE_STATIC_GET | 0x01 | 메서드 핸들은 정적 필드 getter임(접근자) |
METHOD_HANDLE_TYPE_INSTANCE_PUT | 0x02 | 메서드 핸들은 인스턴스 필드 setter임(접근자) |
METHOD_HANDLE_TYPE_INSTANCE_GET | 0x03 | 메서드 핸들은 인스턴스 필드 getter임(접근자) |
METHOD_HANDLE_TYPE_INVOKE_STATIC | 0x04 | 메서드 핸들은 정적 메서드 호출자임 |
METHOD_HANDLE_TYPE_INVOKE_INSTANCE | 0x05 | 메서드 핸들은 인스턴스 메서드 호출자임 |
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR | 0x06 | 메서드 핸들은 생성자 메서드 호출자임 |
METHOD_HANDLE_TYPE_INVOKE_DIRECT | 0x07 | 메서드 핸들은 직접 메서드 호출자임 |
METHOD_HANDLE_TYPE_INVOKE_INTERFACE | 0x08 | 메서드 핸들은 인터페이스 메서드 호출자임 |
class_data_item
class_def_item에서 참조됨
데이터 섹션에 표시됨
정렬: 없음(바이트 정렬)
이름 | 형식 | 설명 |
---|---|---|
static_fields_size | uleb128 | 이 항목에 정의된 정적 필드의 수 |
instance_fields_size | uleb128 | 이 항목에 정의된 인스턴스 필드의 수 |
direct_methods_size | uleb128 | 이 항목에 정의된 직접 메서드의 수 |
virtual_methods_size | uleb128 | 이 항목에 정의된 가상 메서드의 수 |
static_fields | encoded_field[static_fields_size] | 정의된 정적 필드로서, 인코딩된 요소의 시퀀스로 표현됩니다. 필드는 field_idx 에 따라 오름차순으로 정렬해야 합니다.
|
instance_fields | encoded_field[instance_fields_size] | 정의된 인스턴스 필드로, 인코딩된 요소의 시퀀스로 표현됩니다. 필드는 field_idx 에 따라 오름차순으로 정렬해야 합니다.
|
direct_methods | encoded_method[direct_methods_size] | 정의된 직접(static , private 또는 생성자) 메서드로, 인코딩된 요소의 시퀀스로 표현됩니다. 메서드는 method_idx 에 따라 오름차순으로 정렬해야 합니다.
|
virtual_methods | encoded_method[virtual_methods_size] | 정의된 가상(static , private , 또는 생성자) 메서드로, 인코딩된 요소의 시퀀스로 표현됩니다. 이 목록은 이 항목이 표현하는 클래스에 의해 재정의된 경우를 제외하고 상속된 메서드를 포함할 수 없습니다. 메서드는 method_idx 에 따라 오름차순으로 정렬해야 합니다.
가상 메서드의 method_idx 는 직접 메서드와 동일할 수 없습니다.
|
참고: 모든 요소의 field_id
및 method_id
인스턴스는 동일한 정의 클래스를 참조해야 합니다.
encoded_field 형식
이름 | 형식 | 설명 |
---|---|---|
field_idx_diff | uleb128 | 이 필드의 아이덴티티에 관한 field_ids 목록 색인(이름과 설명어 포함)으로, 목록 내 이전 요소 색인과의 차이로 표현됩니다. 목록 내 첫 번째 요소의 색인은 직접 표현됩니다.
|
access_flags | uleb128 | 필드에 관한 액세스 플래그(public , final 등)입니다. 세부정보는 'access_flags 정의'를 참고하세요.
|
encoded_method 형식
이름 | 형식 | 설명 |
---|---|---|
method_idx_diff | uleb128 | 이 메서드의 아이덴티티에 관한 method_ids 목록 색인(이름과 설명어 포함)으로, 목록 내 이전 요소 색인과의 차이로 표현됩니다. 목록 내 첫 번째 요소의 색인은 직접 표현됩니다.
|
access_flags | uleb128 | 메서드에 관한 액세스 플래그(public , final 등)입니다. 세부정보는 'access_flags 정의'를 참고하세요.
|
code_off | uleb128 | 파일 시작 부분에서 이 메서드의 코드 구조까지의 오프셋이며, 이 메서드가 abstract 또는 native 인 경우 0 입니다. 오프셋은 data 섹션 내 위치까지여야 합니다. 데이터 형식은 아래 'code_item '에 의해 지정됩니다.
|
type_list
class_def_item 및 proto_id_item에서 참조됨
데이터 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
size | uint | 목록의 크기(항목 단위) |
list | type_item[size] | 목록의 요소 |
type_item 형식
이름 | 형식 | 설명 |
---|---|---|
type_idx | ushort | type_ids 목록 색인 |
code_item
encoded_method에서 참조됨
데이터 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
registers_size | ushort | 이 코드에서 사용하는 레지스터의 수 |
ins_size | ushort | 이 코드에 관한 메서드로 들어오는 인수의 단어 수 |
outs_size | ushort | 메서드 호출을 위해 이 코드에서 필요로 하는 나가는 인수 공간의 단어 수 |
tries_size | ushort | 이 인스턴스에 관한 try_item 의 수 0이 아닌 경우 이 인스턴스에 있는 insns 의 바로 다음에 tries 배열로 표시됩니다.
|
debug_info_off | uint | 파일 시작 부분에서 이 코드의 디버그 정보(줄 수, 로컬 변수 정보) 시퀀스까지의 오프셋이며 정보가 없는 경우 0 입니다. 오프셋은 0이 아닌 경우 data 섹션 내 위치까지여야 합니다. 데이터 형식은 아래 'debug_info_item '에 의해 지정됩니다.
|
insns_size | uint | 명령 목록 크기(16비트 코드 단위) |
insns | ushort[insns_size] | 바이트 코드의 실제 배열입니다. insns 배열의 코드 형식은 부속 문서 Dalvik 바이트 코드에서 지정합니다. 이 배열은 ushort 의 배열로 정의되지만 4바이트 정렬을 선호하는 내부 구조도 있습니다. 또한 endian 스와핑 파일 내에 있는 경우, 스와핑은 규모가 더 큰 내부 구조가 아닌 오직 개별 ushort 인스턴스에서만 실행됩니다.
|
패딩 | ushort(선택 사항) = 0 | tries 4바이트를 정렬 상태로 만들기 위한 2바이트의 패딩입니다.
이 요소는 tries_size 가 0이 아니고 insns_size 가 홀수인 경우에만 존재합니다.
|
tries | try_item[tries_size](선택 사항) | 코드 예외가 발견되는 위치와 처리 방법을 나타내는 배열입니다. 배열의 요소는 범위가 겹치지 않아야 하고 낮은 주소에서 높은 주소 순이어야 합니다. 이 요소는 tries_size 가 0이 아닌 경우에만 존재합니다.
|
handlers | encoded_catch_handler_list(선택 사항) | catch 형식 목록 및 관련 핸들러 주소의 목록을 표현하는 바이트입니다. 각 try_item 에는 이 구조에 관한 바이트 방식의 오프셋이 있습니다. 이 요소는 tries_size 가 0이 아닌 경우에만 존재합니다.
|
try_item 형식
이름 | 형식 | 설명 |
---|---|---|
start_addr | uint | 이 항목에서 처리하는 코드 블록의 시작 주소입니다. 이 주소는 첫 번째로 처리되는 명령의 시작 부분에 관한 16비트 코드 단위의 수입니다. |
insn_count | ushort | 이 항목에서 처리하는 16비트 코드 단위의 수입니다. 처리되는 마지막 코드 단위(포함)는 start_addr + insn_count - 1 입니다.
|
handler_off | ushort | 관련 encoded_catch_hander_list 의 시작 부분에서 이 항목의 encoded_catch_handler 에 이르는 바이트 단위의 오프셋입니다. 이 오프셋은 encoded_catch_handler 시작 부분까지의 오프셋이어야 합니다.
|
encoded_catch_handler_list 형식
이름 | 형식 | 설명 |
---|---|---|
size | uleb128 | 이 목록의 크기(항목 단위) |
list | encoded_catch_handler[handlers_size] | 핸들러 목록의 실제 목록으로, 오프셋으로 표현되지 않고 직접 표현되며 순차적으로 연결됩니다. |
encoded_catch_handler 형식
이름 | 형식 | 설명 |
---|---|---|
size | sleb128 | 이 목록의 catch 형식 수입니다. 양수가 아닌 경우 catch 형식 수의 음수이며 catch 뒤에 catch-all 핸들러가 옵니다. 예를 들어 size 가 0 인 경우 catch-all은 있지만 형식이 명시된 catch는 없음을 의미합니다.
size 가 2 인 경우 형식이 명시된 catch가 2개 있지만 catch-all은 없음을 의미합니다. size 가 -1 인 경우 형식이 있는 catch 1개와 catch-all 1개가 있음을 의미합니다.
|
handlers | encoded_type_addr_pair[abs(size)] | catch된 형식별로 1개씩 있는 abs(size) 인코딩된 항목의 스트림이며, 형식을 테스트해야 하는 순서를 따릅니다. |
catch_all_addr | uleb128(선택 사항) | catch-all 핸들러의 바이트 코드 주소입니다. 이 요소는 size 가 양수가 아닌 경우에만 존재합니다.
|
encoded_type_addr_pair 형식
이름 | 형식 | 설명 |
---|---|---|
type_idx | uleb128 | catch할 예외 형식의 type_ids 목록 색인 |
addr | uleb128 | 관련 예외 핸들러의 바이트 코드 주소 |
debug_info_item
code_item에서 참조됨
데이터 섹션에 표시됨
정렬: 없음(바이트 정렬)
각 debug_info_item
은 DWARF3에서 영감을 받은 바이트 코딩된 상태 시스템을 정의합니다. 상태 시스템은 해석될 때 위치 표를 내보내며 code_item
의 로컬 변수 정보를 내보낼 가능성이 있습니다. 시퀀스는 메서드 매개변수의 수에 따라 길이가 달라지는 가변 길이 헤더로 시작하고 뒤에 상태 시스템 바이트 코드가 오며 DBG_END_SEQUENCE
바이트로 끝납니다.
상태 시스템은 레지스터 5개로 구성됩니다. address
레지스터는 관련 insns_item
의 명령 오프셋을 16 비트 코드 단위로 표현합니다. address
레지스터는 각 debug_info
시퀀스의 시작에서 0
으로 시작하며 단조 증가만 할 수 있습니다.
line
레지스터는 상태 시스템에서 내보낸 다음 위치 표 항목과 어떤 소스 행 번호가 연결되어야 하는지 나타냅니다. 이 레지스터는 시퀀스 헤더에서 초기화되고 양 또는 음의 방향으로 변경될 수 있지만 1
보다 작아서는 안 됩니다. source_file
레지스터는 행 번호 항목이 참조하는 소스 파일을 나타냅니다. 이는 class_def_item
에서 source_file_idx
의 값으로 초기화됩니다.
다른 두 변수 prologue_end
, epilogue_begin
은 내보낸 다음 위치가 메서드 프롤로그인지 아니면 에필로그인지를 나타내는 부울 플래그이며 false
로 초기화됩니다. 상태 시스템은 또한 DBG_RESTART_LOCAL
코드의 각 레지스터에 있는 마지막 로컬 변수의 이름과 형식을 추적해야 합니다.
헤더는 다음과 같습니다.
이름 | 형식 | 설명 |
---|---|---|
line_start | uleb128 | 상태 시스템 line 레지스터의 초기 값입니다.
실제 위치 항목을 나타내지 않습니다.
|
parameters_size | uleb128 | 인코딩된 매개변수 이름의 수입니다. 메서드 매개변수당 하나씩 있어야 하며 인스턴스 메서드의 this (있는 경우)는 제외합니다.
|
parameter_names | uleb128p1[parameters_size] | 메서드 매개변수 이름의 문자열 색인입니다. NO_INDEX 의 인코딩된 값은 관련 매개변수에 사용할 수 있는 이름이 없음을 나타냅니다. 형식 설명어와 서명은 메서드 설명어와 서명에서 암시됩니다.
|
바이트 코드 값은 다음과 같습니다.
이름 | 값 | 형식 | 인수 | 설명 |
---|---|---|---|---|
DBG_END_SEQUENCE | 0x00 | (없음) | code_item 에 관한 디버그 정보 시퀀스 종료 |
|
DBG_ADVANCE_PC | 0x01 | uleb128 addr_diff | addr_diff : 주소 레지스터에 추가할 양 |
위치 항목을 내보내지 않고 주소 레지스터 진행 |
DBG_ADVANCE_LINE | 0x02 | sleb128 line_diff | line_diff : 행 레지스터를 변경할 양 |
위치 항목을 내보내지 않고 행 레지스터를 진행 |
DBG_START_LOCAL | 0x03 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx |
register_num : 로컬을 포함하는 레지스터name_idx : 이름의 문자열 색인type_idx : 형식의 형식 색인 |
현재 주소에 지역 변수를 도입합니다. name_idx , type_idx 중 하나는 값을 알 수 없음을 나타내는 NO_INDEX 일 수 있습니다.
|
DBG_START_LOCAL_EXTENDED | 0x04 | uleb128 register_num uleb128p1 name_idx uleb128p1 type_idx uleb128p1 sig_idx |
register_num : 로컬을 포함하는 레지스터name_idx : 이름의 문자열 색인type_idx : 형식의 형식 색인sig_idx : 형식 서명의 문자열 색인 |
현재 주소에 형식 서명이 있는 로컬을 도입합니다.
name_idx , type_idx 또는 sig_idx 는 값을 알 수 없음을 나타내는 NO_INDEX 일 수 있습니다. 하지만 sig_idx 가 -1 인 경우, 명령 코드 DBG_START_LOCAL 을 사용하여 동일한 데이터를 더 효율적으로 표현할 수 있습니다.
참고: 서명 처리에 관한 주의 사항은 아래 ' |
DBG_END_LOCAL | 0x05 | uleb128 register_num | register_num : 로컬을 포함하는 레지스터 |
현재 활성 상태인 로컬 변수를 현재 주소에서 범위를 벗어난 것으로 표시 |
DBG_RESTART_LOCAL | 0x06 | uleb128 register_num | register_num : 다시 시작하기 위한 레지스터 |
현재 주소에 로컬 변수를 다시 도입합니다. 이름과 형식은 지정된 레지스터에서 활성 상태였던 마지막 로컬과 동일합니다. |
DBG_SET_PROLOGUE_END | 0x07 | (없음) | prologue_end 상태 시스템 레지스터를 설정하며, 이는 추가되는 다음 위치 항목이 메서드 중단점으로 적합한 위치인 메서드 프롤로그의 끝 부분으로 간주되어야 함을 나타냅니다. prologue_end 레지스터는 모든 특수한 >= 0x0a opcode에 의해 정리됩니다.
|
|
DBG_SET_EPILOGUE_BEGIN | 0x08 | (없음) | epilogue_begin 상태 시스템 레지스터를 설정하며, 이는 추가되는 다음 위치 항목이 메서드 종료 전 실행을 정지하기에 적합한 위치인 메서드 에필로그의 시작 부분으로 간주되어야 함을 나타냅니다.
epilogue_begin 레지스터는 모든 특수한 >= 0x0a opcode에 의해 정리됩니다.
|
|
DBG_SET_FILE | 0x09 | uleb128p1 name_idx | name_idx : 소스 파일 이름의 문자열 색인이며 알 수 없는 경우 NO_INDEX 임 |
모든 후속 행 번호 항목이 code_item 에 지정된 기본 이름이 아닌 이 소스 파일 이름을 참조함을 나타냄 |
특수 명령 코드 | 0x0a…0xff | (없음) | line 및 address 레지스터를 진행하며 위치 항목을 내보내고 prologue_end 및 epilogue_begin 을 정리합니다. 설명은 아래를 참조하세요.
|
특수 명령 코드
0x0a
~0xff
사이의 값(두 값 포함)이 있는 명령 코드는 line
과 address
사이를 조금씩 이동하며 새로운 위치 표 항목을 내보냅니다.
증가에 관한 수식은 다음과 같습니다.
DBG_FIRST_SPECIAL = 0x0a // the smallest special opcode DBG_LINE_BASE = -4 // the smallest line number increment DBG_LINE_RANGE = 15 // the number of line increments represented adjusted_opcode = opcode - DBG_FIRST_SPECIAL line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE) address += (adjusted_opcode / DBG_LINE_RANGE)
annotations_directory_item
class_def_item에서 참조됨
데이터 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
class_annotations_off | uint | 파일의 시작 부분에서 클래스에서 직접 작성된 주석까지의 오프셋이며 클래스에 직접 주석이 없는 경우 0 입니다.
오프셋은 0이 아닌 경우 data 섹션 내 위치까지여야 합니다. 데이터 형식은 아래 'annotation_set_item '에 의해 지정됩니다.
|
fields_size | uint | 이 항목에서 주석 처리한 필드의 수 |
annotated_methods_size | uint | 이 항목에서 주석 처리한 메서드의 수 |
annotated_parameters_size | uint | 이 항목에서 주석 처리한 메서드 매개변수 목록의 수 |
field_annotations | field_annotation[fields_size](선택 사항) | 관련 필드 주석의 목록입니다. 목록의 요소는 field_idx 에 따라 오름차순으로 정렬해야 합니다.
|
method_annotations | method_annotation[methods_size](선택 사항) | 관련 메서드 주석의 목록입니다. 목록의 요소는 method_idx 에 따라 오름차순으로 정렬해야 합니다.
|
parameter_annotations | parameter_annotation[parameters_size](선택 사항) | 관련 메서드 매개변수 주석의 목록입니다. 목록의 요소는 method_idx 에 따라 오름차순으로 정렬해야 합니다.
|
참고: 모든 요소의 field_id
및 method_id
인스턴스는 동일한 정의 클래스를 참조해야 합니다.
field_annotation 형식
이름 | 형식 | 설명 |
---|---|---|
field_idx | uint | 주석 처리되고 있는 필드의 ID에 관한 field_ids 목록 색인 |
annotations_off | uint | 파일의 시작 부분에서 필드의 주석 목록까지의 오프셋입니다. 오프셋은 data 섹션 내 위치까지여야 합니다. 데이터 형식은 아래 'annotation_set_item '에 의해 지정됩니다.
|
method_annotation 형식
이름 | 형식 | 설명 |
---|---|---|
method_idx | uint | 주석 처리되고 있는 메서드의 아이덴티티에 관한 method_ids 목록 색인 |
annotations_off | uint | 파일의 시작 부분에서 메서드의 주석 목록까지의 오프셋입니다. 오프셋은 data 섹션 내 위치까지여야 합니다. 데이터 형식은 아래 'annotation_set_item '에 의해 지정됩니다.
|
parameter_annotation 형식
이름 | 형식 | 설명 |
---|---|---|
method_idx | uint | 매개변수가 주석 처리되고 있는 메서드의 아이덴티티에 관한 method_ids 목록 색인 |
annotations_off | uint | 파일의 시작 부분에서 메서드 매개변수의 주석 목록까지의 오프셋입니다. 오프셋은 data 섹션 내 위치까지여야 합니다. 데이터 형식은 아래 'annotation_set_ref_list '에 의해 지정됩니다.
|
annotation_set_ref_list
parameter_annotations_item에서 참조됨
데이터 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
size | uint | 목록의 크기(항목 단위) |
list | annotation_set_ref_item[size] | 목록의 요소 |
annotation_set_ref_item 형식
이름 | 형식 | 설명 |
---|---|---|
annotations_off | uint | 파일의 시작 부분에서 참조된 주석 세트까지의 오프셋이며, 이 요소에 관한 주석이 없는 경우 0 입니다.
오프셋은 0이 아닌 경우 data 섹션 내 위치까지여야 합니다. 데이터 형식은 아래 'annotation_set_item '에 의해 지정됩니다.
|
annotation_set_item
annotations_directory_item, field_annotations_item, method_annotations_item, annotation_set_ref_item에서 참조됨
데이터 섹션에 표시됨
정렬: 4바이트
이름 | 형식 | 설명 |
---|---|---|
size | uint | 세트의 크기(항목 단위) |
entries | annotation_off_item[size] | 세트의 요소입니다. 요소는 type_idx 에 따라 오름차순으로 정렬해야 합니다.
|
annotation_off_item 형식
이름 | 형식 | 설명 |
---|---|---|
annotation_off | uint | 파일의 시작 부분에서 주석까지의 오프셋입니다.
오프셋은 data 섹션 내 위치까지여야 하며 그 위치에서 데이터의 형식은 아래 'annotation_item '에 의해 지정됩니다.
|
annotation_item
annotation_set_item에서 참조됨
데이터 섹션에 표시됨
정렬: 없음(바이트 정렬)
이름 | 형식 | 설명 |
---|---|---|
공개 상태 | ubyte | 이 주석에 적용할 공개 상태(아래 참조) |
annotation | encoded_annotation | 인코딩된 주석 내용으로, 위 'encoded_value 인코딩' 부분의 'encoded_annotation 형식'에서 설명한 형식을 사용합니다. |
공개 상태 값
다음은 annotation_item
의 visibility
필드 옵션입니다.
이름 | 값 | 설명 |
---|---|---|
VISIBILITY_BUILD | 0x00 | 빌드 시간에만 표시됨(예: 다른 코드를 컴파일하는 시간) |
VISIBILITY_RUNTIME | 0x01 | 런타임에 표시됨 |
VISIBILITY_SYSTEM | 0x02 | 런타임에 표시되며 기본 시스템에만 적용(일반 사용자 코드에는 적용되지 않음) |
encoded_array_item
class_def_item에서 참조됨
데이터 섹션에 표시됨
정렬: 없음(바이트 정렬)
이름 | 형식 | 설명 |
---|---|---|
값 | encoded_array | 인코딩된 배열 값을 표현하는 바이트로, 위 'encoded_value 인코딩' 부분의 'encoded_array 형식'에서 지정한 형식을 사용합니다. |
hiddenapi_class_data_item
이 섹션에는 각 클래스에서 사용하는 제한적인 인터페이스에 관한 데이터가 포함되어 있습니다.
참고: 숨겨진 API 기능은 Android 10.0에 도입되었으며 부팅 클래스 경로에 있는 클래스의 DEX 파일에만 적용됩니다. 아래에 설명된 플래그 목록은 이후 Android 버전에서 확장될 수 있습니다. 자세한 내용은 비SDK 인터페이스 제한사항을 참조하세요.
이름 | 형식 | 설명 |
---|---|---|
size | uint | 섹션의 총 크기 |
offsets | uint[] | class_idx 로 색인을 생성한 오프셋의 배열입니다.
색인 class_idx 에 0인 배열 항목이 있는 경우 class_idx 의 데이터가 없거나 모든 숨겨진 API 플래그가 0임을 의미합니다.
이 경우를 제외하면 배열 항목은 0이 아니며 섹션의 시작 부분에서 class_idx 에 관한 숨겨진 API 플래그 배열까지의 오프셋을 포함합니다.
|
플래그 | uleb128[] | 각 클래스에 관한 숨겨진 API 플래그의 연결된 배열입니다. 가능한 플래그 값은 아래 표에 설명되어 있습니다. 플래그는 필드와 동일한 순서로 인코딩되며 메서드는 클래스 데이터로 인코딩됩니다. |
제한 플래그 형식은 다음과 같습니다.
이름 | 값 | 설명 |
---|---|---|
whitelist | 0 | 자유롭게 사용할 수 있으며 공식 문서화된 Android 프레임워크 패키지 색인의 일부로 지원되는 인터페이스입니다. |
greylist | 1 | 애플리케이션의 타겟 API 수준에 관계없이 사용할 수 있는 비SDK 인터페이스입니다. |
blacklist | 2 | 애플리케이션의 타겟 API 수준에 관계없이 사용할 수 없는 비SDK 인터페이스입니다. 이러한 인터페이스 중 하나에 액세스하면 런타임 오류가 발생합니다. |
greylist‑max‑o | 3 | 제한이 없다면 Android 8.x 이후 버전에서 사용할 수 있는 비SDK 인터페이스입니다. |
greylist‑max‑p | 4 | 제한이 없다면 Android 9.x에서 사용할 수 있는 비SDK 인터페이스입니다. |
greylist‑max‑q | 5 | 제한이 없다면 Android 10.x에서 사용할 수 있는 비SDK 인터페이스입니다. |
greylist‑max‑r | 6 | 제한이 없다면 Android 11.x에서 사용할 수 있는 비 SDK 인터페이스입니다. |
시스템 주석
시스템 주석은 클래스, 메서드, 필드에 관한 다양한 반영적 정보를 표현하는 데 사용됩니다. 이 정보는 보통 클라이언트(비시스템) 코드를 통해서 간접적으로만 액세스됩니다.
시스템 주석은 공개 상태를 VISIBILITY_SYSTEM
으로 설정한 주석으로 .dex
파일에 표시됩니다.
dalvik.annotation.AnnotationDefault
주석 인터페이스의 메서드에 표시됨
AnnotationDefault
주석은 기본 바인딩을 나타내고자 하는 각 주석 인터페이스에 연결됩니다.
이름 | 형식 | 설명 |
---|---|---|
값 | 주석 | 이 주석의 기본 바인딩으로, 이 형식의 주석으로 표시됩니다. 주석에서 정의한 모든 이름이 주석에 포함될 필요는 없으며 누락된 이름에는 기본값이 없습니다. |
dalvik.annotation.EnclosingClass
클래스에 표시됨
EnclosingClass
주석은 그 자체로 다른 클래스의 멤버로 정의되거나, 익명이지만 메서드 본문 내에 정의되지는 않은 각 클래스(예: 합성 내부 클래스)에 연결됩니다. 이 주석이 있는 모든 클래스는 InnerClass
주석도 있어야 합니다. 또한 클래스에는 EnclosingClass
및 EnclosingMethod
주석이 동시에 있을 수 없습니다.
이름 | 형식 | 설명 |
---|---|---|
값 | 클래스 | 이 클래스를 어휘적으로 가장 근접하게 범위를 지정하는 클래스 |
dalvik.annotation.EnclosingMethod
클래스에 표시됨
EnclosingMethod
주석은 메서드 본문 내에 정의된 각 클래스에 연결됩니다. 이 주석이 있는 모든 클래스는 InnerClass
주석도 있어야 합니다.
또한 클래스에는 EnclosingClass
및 EnclosingMethod
주석이 동시에 있을 수 없습니다.
이름 | 형식 | 설명 |
---|---|---|
값 | 메서드 | 이 클래스를 어휘적으로 가장 근접하게 범위를 지정하는 메서드 |
dalvik.annotation.InnerClass
클래스에 표시됨
InnerClass
주석은 다른 클래스 정의의 어휘 범위에 정의된 각 클래스에 연결됩니다.
이 주석이 있는 모든 클래스에는 EnclosingClass
주석 또는 EnclosingMethod
주석 중 하나가 있어야 합니다.
이름 | 형식 | 설명 |
---|---|---|
이름 | 문자열 | 이 클래스의 최초로 선언된 간단한 이름입니다(모든 패키지 프리픽스 제외). 이 클래스가 익명인 경우 이름은 null 입니다.
|
accessFlags | int | 이 클래스의 최초로 선언된 액세스 플래그(소스 언어와 타겟 가상 머신 간 실행 모델의 불일치로 인해 유효 플래그와 다를 수 있음) |
dalvik.annotation.MemberClasses
클래스에 표시됨
MemberClasses
주석은 멤버 클래스를 선언하는 각 클래스에 연결됩니다. 멤버 클래스는 이름이 있는 직접적인 내부 클래스입니다.
이름 | 형식 | 설명 |
---|---|---|
값 | 클래스[] | 멤버 클래스의 배열 |
dalvik.annotation.MethodParameters
메서드에 표시됨
참고: 이 주석은 Android 7.1 이후 버전에 추가되었습니다. 이전 Android 출시에 있는 이 주석은 무시됩니다.
MethodParameters
주석은 선택사항이며 매개변수 이름 및 수정자와 같은 매개변수 메타데이터를 제공하는 데 사용할 수 있습니다.
매개변수 메타데이터가 런타임에 필요하지 않은 경우 메서드 또는 생성자에서 주석을 안전하게 생략할 수 있습니다.
java.lang.reflect.Parameter.isNamePresent()
는 메타데이터가 매개변수에 있는지 확인하는 데 사용할 수 있으며 java.lang.reflect.Parameter.getName()
과 같은 관련 리플렉션 메서드는 정보가 없는 경우 런타임에서 기본 동작으로 돌아갑니다.
매개변수 메타데이터가 포함되는 경우 컴파일러에 enum과 같이 생성된 클래스에 관한 정보가 있어야 합니다. 매개변수 메타데이터에는 매개변수가 합성인지 아니면 필수인지가 포함되기 때문입니다.
MethodParameters
주석은 개별 메서드 매개변수만 설명합니다. 따라서 컴파일러는 코드 크기 및 런타임 효율성을 위해 매개변수가 없는 생성자 및 메서드의 주석을 완전히 생략할 수 있습니다.
아래에 설명된 배열은 메서드와 관련이 있는 method_id_item
dex 구조의 크기와 동일해야 하며 그렇지 않으면 런타임에서 java.lang.reflect.MalformedParametersException
이 발생합니다.
즉, method_id_item.proto_idx
-> proto_id_item.parameters_off
-> type_list.size
가 names().length
및 accessFlags().length
와 같아야 합니다.
MethodParameters
는 소스 코드에서 명시적 또는 암시적으로 선언되지 않은 매개변수를 포함한 모든 정규 메서드 매개변수를 설명하기 때문에, 배열의 크기가 소스 코드에 선언된 명시적인 매개변수만을 기반으로 하는 서명 또는 다른 메타데이터 소스 정보와 다를 수 있기 때문입니다. MethodParameters
에는 또한 실제 메서드 서명에 없는 형식 주석 수신자 매개변수에 관한 정보가 포함되지 않습니다.
이름 | 형식 | 설명 |
---|---|---|
names | String[] | 관련 메서드의 정규 매개변수 이름입니다. 배열은 null일 수 없으며 정규 매개변수가 없는 경우 비어 있어야 합니다. 색인이 있는 정규 매개변수에 이름이 없는 경우 배열의 값은 null이어야 합니다. 매개변수 이름 문자열이 비어 있거나 '.', ';', '[' 또는 '/'를 포함하면 런타임에서 java.lang.reflect.MalformedParametersException 이 발생합니다.
|
accessFlags | int[] | 관련 메서드의 정규 매개변수의 액세스 플래그입니다. 배열은 null일 수 없으며 정규 매개변수가 없는 경우 비어 있어야 합니다. 이 값은 다음 값을 가진 비트 마스크입니다.
java.lang.reflect.MalformedParametersException 이 발생합니다. |
dalvik.annotation.Signature
클래스, 필드, 메서드에 표시됨
Signature
주석은 type_id_item
에서 표현 가능한 것보다 더 복잡한 형식으로 정의된 각 클래스, 필드 또는 메서드에 연결됩니다. .dex
형식은 서명의 형식을 정의하지 않으며, 소스 언어의 의미 체계를 성공적으로 구현하기 위해 소스 언어에서 필요로 하는 모든 서명을 표현할 뿐입니다. 따라서 서명은 일반적으로 가상 머신 구현에서 파싱하거나 확인하지 않습니다. 서명은 상위 수준의 API 및 디버거와 같은 도구로 전달됩니다. 따라서 서명 사용 시 유효한 서명만 수신하는 것, 구문상 유효하지 않은 서명을 발견할 가능성을 명시적으로 방지하는 것에 관한 가정을 하지 않도록 작성해야 합니다.
서명 문자열은 일반적으로 중복되는 내용이 많기 때문에 Signature
주석은 중복된 요소가 기본적으로 동일한 기본 데이터를 참조하는 문자열의 배열로 정의되며 서명은 배열의 모든 문자열을 연결한 것으로 간주됩니다. 서명을 별도의 문자열로 분리하는 방법에 관한 규칙은 없으며, 이는 .dex
파일을 생성하는 도구에 의해 전적으로 결정됩니다.
이름 | 형식 | 설명 |
---|---|---|
값 | String[] | 함께 연결할 문자열의 배열로서 이 클래스 또는 멤버의 서명 |
dalvik.annotation.Throws
메서드에 표시됨
Throws
주석은 하나 이상의 예외 형식을 발생시키도록 선언되는 각 메서드에 연결됩니다.
이름 | 형식 | 설명 |
---|---|---|
값 | 클래스[] | 발생한 예외 형식의 배열 |