Dalvik Executable 형식

이 문서에서는 클래스 정의 및 관련 부속 데이터를 보유하는 데 사용되는 .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 형태
0000-1
01110
7f-1127126
80 7f-1281625616255

파일 레이아웃

이름 형식 설명
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-handleconst-method-type을 도입한 Android 9.0 출시에서 추가되었습니다. (이에 관한 설명은 바이트 코드 세트 요약 표에서 확인할 수 있습니다.) Android 10의 경우 버전 039는 DEX 파일 형식을 확장하여 부팅 클래스 경로의 DEX 파일에만 적용되는 숨겨진 API 정보를 포함합니다.

참고: 이 형식의 버전 038에 관한 지원은 Android 8.0 출시에서 추가되었습니다. 버전 038에는 새 바이트 코드(invoke-polymorphicinvoke-custom)와 메서드 핸들에 관한 데이터가 추가되었습니다.

참고: 이 형식의 버전 037에 관한 지원은 Android 7.0 출시에서 추가되었습니다. 버전 037 이전에는 대부분의 Android 버전이 이 형식의 버전 035를 사용해 왔습니다. 버전 035037 간의 유일한 차이점은 기본 메서드의 추가와 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_tagENDIAN_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_NATIVE가 설정되었을 때만 설정할 수 있습니다.

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에서는 사용할 수 없습니다.

MUTF-8(수정된 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+00a1U+1fff
| U+2000U+200a DEX 버전 040 이후
| U+2010U+2027
| U+202f DEX 버전 040 이후
| U+2030U+d7ff
| U+e000U+ffef
| U+10000U+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_CONSTANTREVERSE_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 서로게이트 코드 단위(U+d800 ... U+dfff)를 포함하는 문자열을 사용할 수 있습니다. 이때, 일반적으로 유니코드를 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입니다. 처음 세 인수는 다음과 같습니다.

  1. 부트스트랩 링커 메서드(VALUE_METHOD_HANDLE)를 나타내는 메서드 핸들입니다.
  2. 부트스트랩 링커가 해결해야 하는 메서드 이름입니다(VALUE_STRING).
  3. 해결할 메서드 이름의 형식에 상응하는 메서드 형식입니다(VALUE_METHOD_TYPE).

추가 인수는 부트스트랩 링커 메서드로 전달되는 상수 값입니다. 이러한 인수는 형식 변환 없이 순서대로 전달됩니다.

부트스트랩 링커 메서드를 나타내는 메서드 핸들은 반환 유형 java.lang.invoke.CallSite가 있어야 합니다. 처음 세 매개변수 형식은 다음과 같습니다.

  1. java.lang.invoke.Lookup
  2. java.lang.String
  3. 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_idmethod_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에서만 실행됩니다.
padding 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 핸들러가 옵니다. 예를 들어 size0인 경우 catch-all은 있지만 형식이 명시된 catch는 없음을 의미합니다. size2인 경우 형식이 명시된 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을 사용하여 동일한 데이터를 더 효율적으로 표현할 수 있습니다.

참고: 서명 처리에 관한 주의 사항은 아래 'dalvik.annotation.Signature' 부분의 토론을 참조하세요.

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 (없음) lineaddress 레지스터를 진행하며 위치 항목을 내보내고 prologue_endepilogue_begin을 정리합니다. 설명은 아래를 참조하세요.

특수 명령 코드

0x0a~0xff 사이의 값(두 값 포함)이 있는 명령 코드는 lineaddress 사이를 조금씩 이동하며 새로운 위치 표 항목을 내보냅니다. 증가에 관한 수식은 다음과 같습니다.

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_idmethod_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_itemvisibility 필드 옵션입니다.

이름 설명
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 주석도 있어야 합니다. 또한 클래스에는 EnclosingClassEnclosingMethod 주석이 동시에 있을 수 없습니다.

이름 형식 설명
클래스 이 클래스를 어휘적으로 가장 근접하게 범위를 지정하는 클래스

dalvik.annotation.EnclosingMethod

클래스에 표시됨

EnclosingMethod 주석은 메서드 본문 내에 정의된 각 클래스에 연결됩니다. 이 주석이 있는 모든 클래스는 InnerClass 주석도 있어야 합니다. 또한 클래스에는 EnclosingClassEnclosingMethod 주석이 동시에 있을 수 없습니다.

이름 형식 설명
메서드 이 클래스를 어휘적으로 가장 근접하게 범위를 지정하는 메서드

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.sizenames().lengthaccessFlags().length와 같아야 합니다.

MethodParameters는 소스 코드에서 명시적 또는 암시적으로 선언되지 않은 매개변수를 포함한 모든 정규 메서드 매개변수를 설명하기 때문에, 배열의 크기가 소스 코드에 선언된 명시적인 매개변수만을 기반으로 하는 서명 또는 다른 메타데이터 소스 정보와 다를 수 있기 때문입니다. MethodParameters에는 또한 실제 메서드 서명에 없는 형식 주석 수신자 매개변수에 관한 정보가 포함되지 않습니다.

이름 형식 설명
names String[] 관련 메서드의 정규 매개변수 이름입니다. 배열은 null일 수 없으며 정규 매개변수가 없는 경우 비어 있어야 합니다. 색인이 있는 정규 매개변수에 이름이 없는 경우 배열의 값은 null이어야 합니다.
매개변수 이름 문자열이 비어 있거나 '.', ';', '[' 또는 '/'를 포함하면 런타임에서 java.lang.reflect.MalformedParametersException이 발생합니다.
accessFlags int[] 관련 메서드의 정규 매개변수의 액세스 플래그입니다. 배열은 null일 수 없으며 정규 매개변수가 없는 경우 비어 있어야 합니다.
이 값은 다음 값을 가진 비트 마스크입니다.
  • 0x0010 : 최종, 매개변수가 최종으로 선언됨
  • 0x1000 : 합성, 컴파일러에서 매개변수를 도입함
  • 0x8000 : 필수, 매개변수가 합성이지만 언어 사양을 통해서도 암시됨
이 세트를 벗어나 비트를 설정할 경우 런타임에서 java.lang.reflect.MalformedParametersException이 발생합니다.

dalvik.annotation.Signature

클래스, 필드, 메서드에 표시됨

Signature 주석은 type_id_item에서 표현 가능한 것보다 더 복잡한 형식으로 정의된 각 클래스, 필드 또는 메서드에 연결됩니다. .dex 형식은 서명의 형식을 정의하지 않으며, 소스 언어의 의미 체계를 성공적으로 구현하기 위해 소스 언어에서 필요로 하는 모든 서명을 표현할 뿐입니다. 따라서 서명은 일반적으로 가상 머신 구현에서 파싱하거나 확인하지 않습니다. 서명은 상위 수준의 API 및 디버거와 같은 도구로 전달됩니다. 따라서 서명 사용 시 유효한 서명만 수신하는 것, 구문상 유효하지 않은 서명을 발견할 가능성을 명시적으로 방지하는 것에 관한 가정을 하지 않도록 작성해야 합니다.

서명 문자열은 일반적으로 중복되는 내용이 많기 때문에 Signature 주석은 중복된 요소가 기본적으로 동일한 기본 데이터를 참조하는 문자열의 배열로 정의되며 서명은 배열의 모든 문자열을 연결한 것으로 간주됩니다. 서명을 별도의 문자열로 분리하는 방법에 관한 규칙은 없으며, 이는 .dex 파일을 생성하는 도구에 의해 전적으로 결정됩니다.

이름 형식 설명
String[] 함께 연결할 문자열의 배열로서 이 클래스 또는 멤버의 서명

dalvik.annotation.Throws

메서드에 표시됨

Throws 주석은 하나 이상의 예외 형식을 발생시키도록 선언되는 각 메서드에 연결됩니다.

이름 형식 설명
클래스[] 발생한 예외 형식의 배열