Dalvik 실행 형식

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

이 문서는 .dex 파일의 레이아웃과 내용을 설명합니다. 이 파일은 일련의 클래스 정의 및 관련 부속 데이터를 보유하는 데 사용됩니다.

유형 안내

이름 설명
바이트 8비트 부호 있는 정수
유바이트 8비트 부호 없는 정수
짧은 16비트 부호 있는 정수, 리틀 엔디안
짧은 16비트 unsigned int, little-endian
정수 32비트 부호 있는 정수, 리틀 엔디안
단위 32비트 unsigned int, little-endian
64비트 부호 있는 정수, 리틀 엔디안
울롱 64비트 unsigned int, little-endian
슬렙128 부호 있는 LEB128, 가변 길이(아래 참조)
uleb128 부호 없는 LEB128, 가변 길이(아래 참조)
uleb128p1 부호 없는 LEB128 더하기 1 , 가변 길이(아래 참조)

LEB128

LEB128 (" L ittle - Endian Base 128 ")은 임의의 부호 있는 정수 또는 부호 없는 정수 수량에 대한 가변 길이 인코딩입니다. 형식은 DWARF3 사양에서 차용했습니다. .dex 파일에서 LEB128은 32비트 수량을 인코딩하는 데만 사용됩니다.

각 LEB128 인코딩 값은 하나의 32비트 값을 나타내는 1~5바이트로 구성됩니다. 각 바이트에는 최상위 비트가 지워진 시퀀스의 마지막 바이트를 제외하고 최상위 비트 세트가 있습니다. 각 바이트의 나머지 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_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 인덱스 기준)은 주요 순서이고 필드 이름( string_id 인덱스 기준)은 중간 순서이며 유형( type_id 인덱스 기준)은 부 순서입니다. 목록에는 중복 항목이 없어야 합니다.
method_ids method_id_item[] 메소드 식별자 목록. 파일에 정의되어 있는지 여부에 관계없이 이 파일이 참조하는 모든 메서드에 대한 식별자입니다. 이 목록은 정렬되어야 합니다. 정의 유형( type_id 인덱스 기준)은 주요 순서이고 메서드 이름( string_id 인덱스 기준)은 중간 순서이며 메서드 프로토타입( proto_id 인덱스 기준)은 부 순서입니다. 목록에는 중복 항목이 없어야 합니다.
class_defs class_def_item[] 클래스 정의 목록. 주어진 클래스의 슈퍼클래스와 구현된 인터페이스가 참조하는 클래스보다 먼저 목록에 나타나도록 클래스를 정렬해야 합니다. 또한 동일한 이름의 클래스에 대한 정의가 목록에 두 번 이상 나타나는 것은 유효하지 않습니다.
call_site_ids call_site_id_item[] 사이트 식별자 목록을 호출합니다. 파일에 정의되어 있는지 여부에 관계없이 이 파일이 참조하는 모든 호출 사이트에 대한 식별자입니다. 이 목록은 call_site_off 의 오름차순으로 정렬되어야 합니다.
방법_핸들 method_handle_item[] 메소드는 목록을 처리합니다. 파일에 정의되어 있는지 여부에 관계없이 이 파일이 참조하는 모든 메서드 핸들의 목록입니다. 이 목록은 정렬되지 않았으며 논리적으로 다른 메서드 핸들 인스턴스에 해당하는 중복 항목을 포함할 수 있습니다.
데이터 유바이트[] 위에 나열된 테이블에 대한 모든 지원 데이터를 포함하는 데이터 영역. 항목마다 정렬 요구 사항이 다르며 적절한 정렬을 달성하기 위해 필요한 경우 각 항목 앞에 패딩 바이트가 삽입됩니다.
link_data 유바이트[] 정적으로 링크된 파일에서 사용되는 데이터. 이 섹션의 데이터 형식은 이 문서에서 지정하지 않은 상태로 유지됩니다. 이 섹션은 연결되지 않은 파일에서 비어 있으며 런타임 구현에서 적절하다고 생각하는 대로 사용할 수 있습니다.

비트 필드, 문자열 및 상수 정의

DEX_FILE_MAGIC

header_item에 포함됨

상수 배열/문자열 DEX_FILE_MAGIC 는 .dex 파일이 인식되기 위해 .dex 파일의 시작 부분에 나타나야 하는 바이트 목록입니다. 값에는 특정 형태의 손상을 감지하는 데 도움이 되도록 의도적으로 줄 바꿈( "\n" 또는 0x0a )과 널 바이트( "\0" 또는 0x00 )가 포함됩니다. 값은 또한 형식 버전 번호를 10진수 3자리로 인코딩합니다. 이 숫자는 형식이 발전함에 따라 시간이 지남에 따라 단조롭게 증가할 것으로 예상됩니다.

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

참고: 형식의 버전 039 에 대한 지원이 Android 9.0 릴리스에 추가되어 두 개의 새로운 바이트코드 const-method-handleconst-method-type 이 도입되었습니다. (각각 바이트코드 집합 요약 테이블에 설명되어 있습니다.) Android 10에서 버전 039 는 ​​부팅 클래스 경로의 DEX 파일에만 적용할 수 있는 숨겨진 API 정보를 포함하도록 DEX 파일 형식을 확장합니다.

참고: 형식의 버전 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 형식은 리틀 엔디안이지만 구현에서는 바이트 스와핑을 수행하도록 선택할 수 있습니다. 구현에서 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 으로 정의되지 않습니다.

uleb128p1 NO_INDEX 에서 단일 바이트로 표시할 수 있습니다.

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

access_flags 정의

class_def_item,coded_field,coded_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_
동기화됨
0x20000 선언 synchronized .

참고: 이것은 실행에 영향을 미치지 않습니다(이 플래그 자체를 반영하는 경우를 제외하고).

* InnerClass 주석에 대해서만 허용되며 class_def_item 에서는 절대 켜지 않아야 합니다.

MUTF-8(수정된 UTF-8) 인코딩

더 쉬운 레거시 지원에 대한 양보로 .dex 형식은 문자열 데이터를 사실상 표준 수정된 UTF-8 형식(이하 MUTF-8이라고 함)으로 인코딩합니다. 이 형식은 다음을 제외하고 표준 UTF-8과 동일합니다.

  • 1, 2, 3바이트 인코딩만 사용됩니다.
  • U+10000U+10ffff 범위의 코드 포인트는 서로게이트 쌍으로 인코딩되며, 각각은 3바이트 인코딩 값으로 표시됩니다.
  • 코드 포인트 U+0000 은 2바이트 형식으로 인코딩됩니다.
  • 일반 널 바이트(값 0 )는 표준 C 언어 해석과 마찬가지로 문자열의 끝을 나타냅니다.

위의 처음 두 항목은 다음과 같이 요약할 수 있습니다. MUTF-8은 유니코드 문자에 대한 보다 직접적인 인코딩 형식이 아니라 UTF-16에 대한 인코딩 형식입니다.

위의 마지막 두 항목을 사용하면 코드 포인트 U+0000 을 문자열에 포함하는 동시에 C 스타일의 null 종료 문자열 조작할 수 있습니다.

그러나 U+0000 의 특수 인코딩은 일반 UTF-8과 달리 한 쌍의 MUTF-8 문자열에 대해 표준 C 함수 strcmp() 를 호출한 결과가 항상 같지 않은 문자열 비교의 올바른 서명 결과를 나타내는 것은 아님을 의미합니다. . 순서(동등성뿐만 아니라)가 문제일 때 MUTF-8 문자열을 비교하는 가장 간단한 방법은 문자별로 디코딩하고 디코딩된 값을 비교하는 것입니다. (그러나 더 영리한 구현도 가능합니다.)

문자 인코딩에 대한 자세한 내용은 유니코드 표준 을 참조하십시오. MUTF-8은 실제로 UTF-8 자체보다 CESU-8 인코딩(비교적 덜 알려진)에 더 가깝습니다.

encode_value 인코딩

annotation_element 및 encode_array_item에 포함됨

encoded_value 는 (거의) 임의의 계층 구조 데이터의 인코딩된 조각입니다. 인코딩은 간결하고 구문 분석이 간단해야 합니다.

이름 체재 설명
(값_인수 << 5) | 값_유형 유바이트 상위 3비트의 선택적 명확화 인수와 함께 바로 다음 value 의 유형을 나타내는 바이트. 다양한 value 정의는 아래를 참조하십시오. 대부분의 경우 value_arg(size - 1) 과 같이 바로 뒤따르는 value 의 길이를 바이트로 인코딩합니다. 예를 들어 0 은 값에 1바이트가 필요하고 7 은 8바이트가 필요함을 의미합니다. 그러나 아래에 명시된 예외가 있습니다.
유바이트[] 값을 나타내는 바이트, 길이가 가변적이며 다른 value_type 바이트에 대해 다르게 해석되지만 항상 리틀 엔디안입니다. 자세한 내용은 아래의 다양한 값 정의를 참조하십시오.

값 형식

유형 이름 value_type value_arg 형식 value 형식 설명
VALUE_BYTE 0x00 (없음, 0 이어야 함) 유바이트[1] 부호 있는 1바이트 정수 값
VALUE_SHORT 0x02 크기 - 1(0…1) 유바이트[크기] 부호 있는 2바이트 정수 값, 부호 확장
VALUE_CHAR 0x03 크기 - 1(0…1) 유바이트[크기] 부호 없는 2바이트 정수 값, 0 확장
VALUE_INT 0x04 크기 - 1(0…3) 유바이트[크기] 부호 있는 4바이트 정수 값, 부호 확장
VALUE_LONG 0x06 크기 - 1(0…7) 유바이트[크기] 부호 있는 8바이트 정수 값, 부호 확장
VALUE_FLOAT 0x10 크기 - 1(0…3) 유바이트[크기] 4바이트 비트 패턴, 오른쪽으로 0 확장, IEEE754 32비트 부동 소수점 값으로 해석
VALUE_DOUBLE 0x11 크기 - 1(0…7) 유바이트[크기] 8바이트 비트 패턴, 오른쪽으로 0 확장, IEEE754 64비트 부동 소수점 값으로 해석
VALUE_METHOD_TYPE 0x15 크기 - 1(0…3) 유바이트[크기] proto_ids 섹션에 대한 인덱스로 해석되고 메서드 유형 값을 나타내는 부호 없는(0 확장) 4바이트 정수 값
VALUE_METHOD_HANDLE 0x16 크기 - 1(0…3) 유바이트[크기] method_handles 섹션에 대한 인덱스로 해석되고 메서드 핸들 값을 나타내는 부호 없는(0 확장) 4바이트 정수 값
VALUE_STRING 0x17 크기 - 1(0…3) 유바이트[크기] string_ids 섹션에 대한 인덱스로 해석되고 문자열 값을 나타내는 부호 없는(0 확장) 4바이트 정수 값
VALUE_TYPE 0x18 크기 - 1(0…3) 유바이트[크기] 부호 없는(0 확장) 4바이트 정수 값, type_ids 섹션에 대한 인덱스로 해석되고 반사 유형/클래스 값을 나타냄
VALUE_FIELD 0x19 크기 - 1(0…3) 유바이트[크기] field_ids 섹션에 대한 인덱스로 해석되고 반사 필드 값을 나타내는 부호 없는(0 확장) 4바이트 정수 값
VALUE_METHOD 0x1a 크기 - 1(0…3) 유바이트[크기] 부호 없는(0 확장) 4바이트 정수 값, method_ids 섹션에 대한 인덱스로 해석되고 반사 메서드 값을 나타냅니다.
VALUE_ENUM 0x1b 크기 - 1(0…3) 유바이트[크기] field_ids 섹션에 대한 인덱스로 해석되고 열거형 상수 값을 나타내는 부호 없는(0 확장) 4바이트 정수 값
VALUE_ARRAY 0x1c (없음, 0 이어야 함) 인코딩된 배열 아래의 " encoded_array 형식"에 지정된 형식의 값 배열입니다. value 의 크기는 인코딩에 암시적입니다.
VALUE_ANNOTATION 0x1d (없음, 0 이어야 함) encode_annotation 아래 " encoded_annotation 형식"에 지정된 형식의 하위 주석. value 의 크기는 인코딩에 암시적입니다.
VALUE_NULL 0x1e (없음, 0 이어야 함) (없음) null 참조 값
VALUE_BOOLEAN 0x1f 부울(0…1) (없음) 1비트 값; 0false 이고 1true 입니다. 비트는 value_arg 에 표시됩니다.

encode_array 형식

이름 체재 설명
크기 uleb128 배열의 요소 수
가치 인코딩된 값[크기] 이 섹션에서 지정한 형식의 일련의 size encoded_value 바이트 시퀀스로, 순차적으로 연결됩니다.

encode_annotation 형식

이름 체재 설명
type_idx uleb128 주석의 유형입니다. 이것은 클래스(배열 또는 기본이 아님) 유형이어야 합니다.
크기 uleb128 이 주석의 이름-값 매핑 수
집단 주석_요소[크기] 인라인으로 직접 표현되는 주석의 요소(오프셋이 아님). 요소는 string_id 인덱스를 기준으로 오름차순으로 정렬해야 합니다.

주석_요소 형식

이름 체재 설명
이름_idx uleb128 string_ids 섹션에 대한 인덱스로 표시되는 요소 이름입니다. 문자열은 위에 정의된 MemberName 에 대한 구문을 준수해야 합니다.
인코딩된 값 요소 값

문자열 구문

.dex 파일에는 궁극적으로 문자열을 참조하는 여러 종류의 항목이 있습니다. 다음 BNF 스타일 정의는 이러한 문자열에 대해 허용되는 구문을 나타냅니다.

단순 이름

SimpleName 은 다른 것들의 이름 구문의 기초입니다. .dex 형식은 여기에서 상당한 양의 위도를 허용합니다(대부분의 일반적인 소스 언어보다 훨씬 더 많음). 간단히 말해서 간단한 이름은 낮은 ASCII 알파벳 문자 또는 숫자, 몇 가지 특정 낮은 ASCII 기호 및 제어, 공백 또는 특수 문자가 아닌 대부분의 비 ASCII 코드 포인트로 구성됩니다. 버전 040 부터 형식은 추가로 공백 문자를 허용합니다(유니코드 Zs 범주). 대리 코드 포인트( U+d800 +d800 … U+dfff 범위)는 그 자체로 유효한 이름 문자로 간주되지 않지만 유니코드 보조 문자 유효합니다( SimpleNameChar 에 대한 규칙의 최종 대안으로 표시됨). MUTF-8 인코딩에서 서로게이트 코드 포인트 쌍으로 파일에 표시되어야 합니다.

단순이름
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

회원이름

field_id_item 및 method_id_item에서 사용

MemberName 은 클래스 멤버의 이름이며, 멤버는 필드, 메소드 및 내부 클래스입니다.

회원명
단순 이름
| '<' 단순 이름 '>'

전체 클래스 이름

FullClassName 은 필수 이름이 뒤에 오는 선택적 패키지 지정자를 포함하는 완전한 클래스 이름입니다.

전체 클래스 이름
선택적 패키지 접두어 SimpleName
OptionalPackagePrefix
( 단순이름 '/' )*

유형 설명자

type_id_item에서 사용

TypeDescriptor 는 프리미티브, 클래스, 배열 및 void 를 포함한 모든 유형의 표현입니다. 다양한 버전의 의미는 아래를 참조하십시오.

유형 설명자
'V'
| 필드 유형 설명자
필드 유형 설명자
비배열 필드 유형 설명자
| ( '[' * 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'
| ShortyField 유형
ShortyField 유형
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L'

TypeDescriptor 의미론

이것은 TypeDescriptor 의 각 변형의 의미입니다.

통사론 의미
V void ; 반환 유형에만 유효
boolean
byte
에스 short
char
int
제이 long
에프 float
double
L 완전/자격/이름 ; 클래스 fully.qualified.Name
[ 설명자 descriptor 배열, 배열 배열에 대해 재귀적으로 사용할 수 있지만 255개 이상의 차원을 갖는 것은 유효하지 않습니다.

아이템 및 관련 구조

이 섹션에는 .dex 파일에 나타날 수 있는 각 최상위 항목에 대한 정의가 포함되어 있습니다.

header_item

헤더 섹션에 나타납니다.

정렬: 4바이트

이름 체재 설명
마법 ubyte[8] = DEX_FILE_MAGIC 마법의 가치. 자세한 내용은 위의 " DEX_FILE_MAGIC "에서 논의를 참조하십시오.
체크섬 단위 파일의 나머지 부분에 대한 adler32 체크섬( magic 과 이 필드를 제외한 모든 것); 파일 손상을 감지하는 데 사용
서명 유바이트[20] 나머지 파일의 SHA-1 서명(해시)( magic , checksum 및 이 필드를 제외한 모든 항목) 파일을 고유하게 식별하는 데 사용
파일 크기 단위 전체 파일(헤더 포함)의 크기(바이트)
header_size 단위 = 0x70 헤더(이 전체 섹션)의 크기(바이트). 이것은 형식을 무효화하지 않고 최소한 제한된 양의 역방향/순방향 호환성을 허용합니다.
endian_tag 단위 = ENDIAN_CONSTANT 엔디안 태그. 자세한 내용은 위의 " ENDIAN_CONSTANTREVERSE_ENDIAN_CONSTANT "에서 논의를 참조하십시오.
link_size 단위 링크 섹션의 크기, 또는 이 파일이 정적으로 링크되지 않은 경우 0
link_off 단위 파일의 시작 부분에서 링크 섹션까지의 오프셋 또는 link_size == 0 0 경우 0입니다. 오프셋은 0이 아닌 경우 link_data 섹션에 대한 오프셋이어야 합니다. 가리키는 데이터의 형식은 이 문서에서 지정되지 않은 채로 남아 있습니다. 이 헤더 필드(및 이전)는 런타임 구현에서 사용하기 위해 후크로 남겨집니다.
map_off 단위 파일 시작에서 맵 항목까지의 오프셋입니다. 0이 아니어야 하는 오프셋은 data 섹션에 대한 오프셋이어야 하며 데이터는 아래 " map_list "에 지정된 형식이어야 합니다.
string_ids_size 단위 문자열 식별자 목록의 문자열 개수
string_ids_off 단위 파일의 시작 부분에서 문자열 식별자 목록까지의 오프셋 또는 string_ids_size == 0 0 경우 0(확실히 이상한 경우). 오프셋은 0이 아닌 경우 string_ids 섹션의 시작 부분에 있어야 합니다.
type_ids_size 단위 유형 식별자 목록의 요소 수, 최대 65535
type_ids_off 단위 파일 시작에서 유형 식별자 목록까지의 오프셋 또는 type_ids_size == 0 0 경우 0(확실히 이상한 경우). 오프셋은 0이 아닌 경우 type_ids 섹션의 시작 부분에 있어야 합니다.
proto_ids_size 단위 프로토타입 식별자 목록의 요소 수, 최대 65535
proto_ids_off 단위 파일의 시작 부분에서 프로토타입 식별자 목록까지의 오프셋, 또는 proto_ids_size == 0 0 확실히 이상한 경우). 오프셋은 0이 아닌 경우 proto_ids 섹션의 시작 부분에 있어야 합니다.
field_ids_size 단위 필드 식별자 목록의 요소 수
field_ids_off 단위 파일의 시작 부분에서 필드 식별자 목록까지의 오프셋 또는 field_ids_size == 0 0 경우 0입니다. 오프셋은 0이 아닌 경우 field_ids 섹션의 시작 부분에 있어야 합니다.
method_ids_size 단위 메소드 식별자 목록의 요소 수
method_ids_off 단위 파일 시작 부분에서 메서드 식별자 목록까지의 오프셋 또는 method_ids_size == 0 0 경우 0입니다. 오프셋은 0이 아닌 경우 method_ids 섹션의 시작 부분에 있어야 합니다.
class_defs_size 단위 클래스 정의 목록의 요소 수
class_defs_off 단위 파일의 시작 부분에서 클래스 정의 목록까지의 오프셋 또는 class_defs_size == 0 0 경우 0(확실히 이상한 경우). 오프셋은 0이 아닌 경우 class_defs 섹션의 시작 부분에 있어야 합니다.
데이터 크기 단위 data 섹션의 크기(바이트)입니다. sizeof(uint)의 짝수 배수여야 합니다.
데이터 꺼짐 단위 파일 시작에서 data 섹션 시작까지의 오프셋입니다.

map_list

데이터 섹션에 나타납니다

header_item에서 참조됨

정렬: 4바이트

파일의 전체 내용을 순서대로 나열한 목록입니다. header_item 과 관련하여 약간의 중복성이 있지만 전체 파일을 반복하는 데 사용하기 쉬운 형식입니다. 주어진 유형은 지도에서 최대 한 번 나타나야 하지만 나머지 형식에서 암시하는 제한 외에는 어떤 순서 유형이 나타날 수 있는지에 대한 제한이 없습니다(예: header 섹션이 먼저 나타나고 그 뒤에 string_ids 가 와야 합니다. 섹션 등). 또한 지도 항목은 초기 오프셋으로 정렬되어야 하며 겹치지 않아야 합니다.

이름 체재 설명
크기 단위 항목의 목록 크기
목록 map_item[크기] 목록의 요소

map_item 형식

이름 체재 설명
유형 짧은 항목의 유형; 아래 표 참조
미사용 짧은 (미사용)
크기 단위 표시된 오프셋에서 찾을 수 있는 항목 수
오프셋 단위 파일의 시작 부분에서 해당 항목까지의 오프셋

유형 코드

항목 형식 끊임없는 항목 크기(바이트)
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 + (항목.크기 * 12)
type_list TYPE_TYPE_LIST 0x1001 4 + (항목.크기 * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (항목.크기 * 4)
annotation_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (항목.크기 * 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 절대적인; 구문 분석해야
주석_항목 TYPE_ANNOTATION_ITEM 0x2004 절대적인; 구문 분석해야
encode_array_item TYPE_ENCODED_ARRAY_ITEM 0x2005 절대적인; 구문 분석해야
주석_디렉토리_항목 TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 절대적인; 구문 분석해야
hiddenapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 절대적인; 구문 분석해야

string_id_item

string_ids 섹션에 나타납니다.

정렬: 4바이트

이름 체재 설명
string_data_off 단위 파일 시작에서 이 항목에 대한 문자열 데이터까지의 오프셋입니다. 오프셋은 data 섹션의 위치에 있어야 하며 데이터는 아래 " string_data_item "에 지정된 형식이어야 합니다. 오프셋에 대한 정렬 요구 사항은 없습니다.

string_data_item

데이터 섹션에 나타납니다

정렬: 없음(바이트 정렬)

이름 체재 설명
UTF16_크기 uleb128 이 문자열의 크기(UTF-16 코드 단위)(많은 시스템에서 "문자열 길이"). 즉, 이것은 문자열의 디코딩된 길이입니다. (인코딩된 길이는 0 바이트의 위치에 의해 암시됩니다.)
데이터 유바이트[] 일련의 MUTF-8 코드 단위(일명 옥텟, 일명 바이트) 다음에 값 0 의 바이트가 옵니다. 데이터 형식에 대한 자세한 내용과 논의는 위의 "MUTF-8(수정된 UTF-8) 인코딩"을 참조하십시오.

참고: UTF-16 대리 코드 단위(즉, U+d800 +d800 … U+dfff )를 포함하는 문자열(인코딩된 형식)을 일반적인 인코딩과 관련하여 분리되거나 비순차적으로 포함하는 것은 허용됩니다. 유니코드를 UTF-16으로 변환합니다. 적절한 경우 이러한 잘못된 인코딩을 거부하는 것은 상위 수준의 문자열 사용에 달려 있습니다.

type_id_item

type_ids 섹션에 나타납니다.

정렬: 4바이트

이름 체재 설명
descriptor_idx 단위 이 유형의 설명자 문자열에 대한 string_ids 목록의 인덱스입니다. 문자열은 위에 정의된 TypeDescriptor 구문을 따라야 합니다.

proto_id_item

proto_ids 섹션에 나타납니다.

정렬: 4바이트

이름 체재 설명
shorty_idx 단위 이 프로토타입의 짧은 형식 설명자 문자열에 대한 string_ids 목록의 인덱스입니다. 문자열은 위에 정의된 ShortyDescriptor 구문을 준수해야 하며 이 항목의 반환 유형 및 매개변수와 일치해야 합니다.
return_type_idx 단위 이 프로토타입의 반환 유형에 대한 type_ids 목록의 색인
매개변수_off 단위 파일 시작에서 이 프로토타입에 대한 매개변수 유형 목록까지의 오프셋 또는 이 프로토타입에 매개변수가 없는 경우 0 입니다. 이 오프셋은 0이 아닌 경우 data 섹션에 있어야 하며 데이터는 아래 "type_list" 에 지정된 형식이어야 합니다. 또한 목록에 void 유형에 대한 참조가 없어야 합니다.

field_id_item

field_ids 섹션에 나타납니다.

정렬: 4바이트

이름 체재 설명
class_idx 짧은 이 필드의 정의자에 대한 type_ids 목록의 인덱스입니다. 이것은 배열이나 기본 유형이 아니라 클래스 유형이어야 합니다.
type_idx 짧은 이 필드의 유형에 대한 type_ids 목록에 대한 색인
이름_idx 단위 이 필드의 이름에 대한 string_ids 목록의 인덱스입니다. 문자열은 위에 정의된 MemberName 에 대한 구문을 준수해야 합니다.

method_id_item

method_ids 섹션에 나타납니다.

정렬: 4바이트

이름 체재 설명
class_idx 짧은 이 메서드의 정의자에 대한 type_ids 목록의 인덱스입니다. 이것은 기본 유형이 아니라 클래스 또는 배열 유형이어야 합니다.
proto_idx 짧은 이 메서드의 프로토타입에 대한 proto_ids 목록의 인덱스
이름_idx 단위 이 메서드의 이름에 대한 string_ids 목록의 인덱스입니다. 문자열은 위에 정의된 MemberName 에 대한 구문을 준수해야 합니다.

class_def_item

class_defs 섹션에 나타납니다.

정렬: 4바이트

이름 체재 설명
class_idx 단위 이 클래스의 type_ids 목록에 대한 인덱스입니다. 이것은 배열이나 기본 유형이 아니라 클래스 유형이어야 합니다.
access_flags 단위 클래스에 대한 액세스 플래그( public , final 등). 자세한 내용은 " access_flags 정의"를 참조하십시오.
superclass_idx 단위 수퍼클래스에 대한 type_ids 목록에 대한 인덱스 또는 이 클래스에 수퍼클래스가 없는 경우(즉, Object 와 같은 루트 클래스인 경우) 상수 값 NO_INDEX 입니다. 존재하는 경우 이는 배열 또는 기본 유형이 아닌 클래스 유형이어야 합니다.
interface_off 단위 파일 시작에서 인터페이스 목록까지의 오프셋 또는 없는 경우 0 입니다. 이 오프셋은 data 섹션에 있어야 하고 거기에 있는 데이터는 아래 " type_list "에 지정된 형식이어야 합니다. 목록의 각 요소는 클래스 유형(배열 또는 기본 유형이 아님)이어야 하며 중복이 없어야 합니다.
소스_파일_idx 단위 이 클래스(적어도 대부분)의 원본 소스를 포함하는 파일 이름에 대한 string_ids 목록의 인덱스 또는 이 정보의 부족을 나타내는 특수 값 NO_INDEX . 주어진 메소드의 debug_info_item 은 이 소스 파일을 재정의할 수 있지만 대부분의 클래스는 하나의 소스 파일에서만 올 것입니다.
주석_꺼짐 단위 파일 시작에서 이 클래스의 주석 구조까지의 오프셋, 또는 이 클래스에 주석이 없는 경우 0 입니다. 이 오프셋은 0이 아닌 경우 data 섹션에 있어야 하며, 거기에 있는 데이터는 아래 " annotations_directory_item "에 지정된 형식이어야 하며 모든 항목은 이 클래스를 정의자로 참조합니다.
class_data_off 단위 파일 시작에서 이 항목에 대한 관련 클래스 데이터까지의 오프셋 또는 이 클래스에 대한 클래스 데이터가 없는 경우 0 입니다. (이는 예를 들어 이 클래스가 마커 인터페이스인 경우일 수 있습니다.) 오프셋이 0이 아닌 경우 data 섹션에 있어야 하고 거기에 있는 데이터는 아래 " class_data_item "에 지정된 형식이어야 합니다. 이 클래스를 정의자로 참조하는 모든 항목과 함께.
static_values_off 단위 파일의 시작 부분에서 static 필드의 초기 값 목록까지의 오프셋, 또는 아무것도 없으면 0 입니다(모든 static 필드는 0 또는 null 로 초기화되어야 함). 이 오프셋은 data 섹션에 있어야 하며, 거기에 있는 데이터는 아래 " encoded_array_item "에 지정된 형식이어야 합니다. 배열의 크기는 이 클래스에서 선언한 static 필드의 수보다 크지 않아야 하며 요소는 해당 field_list 에 선언된 것과 동일한 순서로 static 필드에 해당합니다. 각 배열 요소의 유형은 해당 필드의 선언된 유형과 일치해야 합니다. 배열에 static 필드보다 적은 요소가 있는 경우 남은 필드는 유형에 적합한 0 또는 null 로 초기화됩니다.

call_site_id_item

call_site_ids 섹션에 나타납니다.

정렬: 4바이트

이름 체재 설명
call_site_off 단위 사이트 정의를 호출하기 위한 파일의 시작 부분에서 오프셋. 오프셋은 데이터 섹션에 있어야 하며 거기에 있는 데이터는 아래 "call_site_item"에 지정된 형식이어야 합니다.

call_site_item

데이터 섹션에 나타납니다

정렬: 없음(바이트 정렬)

call_site_item은 해당 요소가 부트스트랩 링커 메서드에 제공된 인수에 해당하는 encode_array_item입니다. 처음 세 가지 인수는 다음과 같습니다.

  1. 부트스트랩 링커 메서드(VALUE_METHOD_HANDLE)를 나타내는 메서드 핸들입니다.
  2. 부트스트랩 링커가 확인해야 하는 메서드 이름(VALUE_STRING).
  3. A method type corresponding to the type of the method name to be resolved (VALUE_METHOD_TYPE).

Any additional arguments are constant values passed to the bootstrap linker method. These arguments are passed in order and without any type conversions.

The method handle representing the bootstrap linker method must have return type java.lang.invoke.CallSite . The first three parameter types are:

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

The parameter types of any additional arguments are determined from their constant values.

method_handle_item

appears in the method_handles section

alignment: 4 bytes

Name Format 설명
method_handle_type ushort type of the method handle; see table below
unused ushort (unused)
field_or_method_id ushort Field or method id depending on whether the method handle type is an accessor or a method invoker
unused ushort (unused)

Method Handle Type Codes

Constant Value 설명
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 Method handle is a static field setter (accessor)
METHOD_HANDLE_TYPE_STATIC_GET 0x01 Method handle is a static field getter (accessor)
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 Method handle is an instance field setter (accessor)
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 Method handle is an instance field getter (accessor)
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 Method handle is a static method invoker
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 Method handle is an instance method invoker
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 Method handle is a constructor method invoker
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 Method handle is a direct method invoker
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 Method handle is an interface method invoker

class_data_item

referenced from class_def_item

appears in the data section

alignment: none (byte-aligned)

Name Format 설명
static_fields_size uleb128 the number of static fields defined in this item
instance_fields_size uleb128 the number of instance fields defined in this item
direct_methods_size uleb128 the number of direct methods defined in this item
virtual_methods_size uleb128 the number of virtual methods defined in this item
static_fields encoded_field[static_fields_size] the defined static fields, represented as a sequence of encoded elements. The fields must be sorted by field_idx in increasing order.
instance_fields encoded_field[instance_fields_size] the defined instance fields, represented as a sequence of encoded elements. The fields must be sorted by field_idx in increasing order.
direct_methods encoded_method[direct_methods_size] the defined direct (any of static , private , or constructor) methods, represented as a sequence of encoded elements. The methods must be sorted by method_idx in increasing order.
virtual_methods encoded_method[virtual_methods_size] the defined virtual (none of static , private , or constructor) methods, represented as a sequence of encoded elements. This list should not include inherited methods unless overridden by the class that this item represents. The methods must be sorted by method_idx in increasing order. The method_idx of a virtual method must not be the same as any direct method.

Note: All elements' field_id s and method_id s must refer to the same defining class.

encoded_field format

Name Format 설명
field_idx_diff uleb128 index into the field_ids list for the identity of this field (includes the name and descriptor), represented as a difference from the index of previous element in the list. The index of the first element in a list is represented directly.
access_flags uleb128 access flags for the field ( public , final , etc.). See " access_flags Definitions" for details.

encoded_method format

Name Format 설명
method_idx_diff uleb128 index into the method_ids list for the identity of this method (includes the name and descriptor), represented as a difference from the index of previous element in the list. The index of the first element in a list is represented directly.
access_flags uleb128 access flags for the method ( public , final , etc.). See " access_flags Definitions" for details.
code_off uleb128 offset from the start of the file to the code structure for this method, or 0 if this method is either abstract or native . The offset should be to a location in the data section. The format of the data is specified by " code_item " below.

type_list

referenced from class_def_item and proto_id_item

appears in the data section

alignment: 4 bytes

Name Format 설명
size uint size of the list, in entries
list type_item[size] elements of the list

type_item format

Name Format 설명
type_idx ushort index into the type_ids list

code_item

referenced from encoded_method

appears in the data section

alignment: 4 bytes

Name Format 설명
registers_size ushort the number of registers used by this code
ins_size ushort the number of words of incoming arguments to the method that this code is for
outs_size ushort the number of words of outgoing argument space required by this code for method invocation
tries_size ushort the number of try_item s for this instance. If non-zero, then these appear as the tries array just after the insns in this instance.
debug_info_off uint offset from the start of the file to the debug info (line numbers + local variable info) sequence for this code, or 0 if there simply is no information. The offset, if non-zero, should be to a location in the data section. The format of the data is specified by " debug_info_item " below.
insns_size uint size of the instructions list, in 16-bit code units
insns ushort[insns_size] actual array of bytecode. The format of code in an insns array is specified by the companion document Dalvik bytecode . Note that though this is defined as an array of ushort , there are some internal structures that prefer four-byte alignment. Also, if this happens to be in an endian-swapped file, then the swapping is only done on individual ushort s and not on the larger internal structures.
padding ushort (optional) = 0 two bytes of padding to make tries four-byte aligned. This element is only present if tries_size is non-zero and insns_size is odd.
tries try_item[tries_size] (optional) array indicating where in the code exceptions are caught and how to handle them. Elements of the array must be non-overlapping in range and in order from low to high address. This element is only present if tries_size is non-zero.
handlers encoded_catch_handler_list (optional) bytes representing a list of lists of catch types and associated handler addresses. Each try_item has a byte-wise offset into this structure. This element is only present if tries_size is non-zero.

try_item format

Name Format 설명
start_addr uint start address of the block of code covered by this entry. The address is a count of 16-bit code units to the start of the first covered instruction.
insn_count ushort number of 16-bit code units covered by this entry. The last code unit covered (inclusive) is start_addr + insn_count - 1 .
handler_off ushort offset in bytes from the start of the associated encoded_catch_hander_list to the encoded_catch_handler for this entry. This must be an offset to the start of an encoded_catch_handler .

encoded_catch_handler_list format

Name Format 설명
size uleb128 size of this list, in entries
list encoded_catch_handler[handlers_size] actual list of handler lists, represented directly (not as offsets), and concatenated sequentially

encoded_catch_handler format

Name Format 설명
size sleb128 number of catch types in this list. If non-positive, then this is the negative of the number of catch types, and the catches are followed by a catch-all handler. For example: A size of 0 means that there is a catch-all but no explicitly typed catches. A size of 2 means that there are two explicitly typed catches and no catch-all. And a size of -1 means that there is one typed catch along with a catch-all.
handlers encoded_type_addr_pair[abs(size)] stream of abs(size) encoded items, one for each caught type, in the order that the types should be tested.
catch_all_addr uleb128 (optional) bytecode address of the catch-all handler. This element is only present if size is non-positive.

encoded_type_addr_pair format

Name Format 설명
type_idx uleb128 index into the type_ids list for the type of the exception to catch
addr uleb128 bytecode address of the associated exception handler

debug_info_item

referenced from code_item

appears in the data section

alignment: none (byte-aligned)

Each debug_info_item defines a DWARF3-inspired byte-coded state machine that, when interpreted, emits the positions table and (potentially) the local variable information for a code_item . The sequence begins with a variable-length header (the length of which depends on the number of method parameters), is followed by the state machine bytecodes, and ends with an DBG_END_SEQUENCE byte.

The state machine consists of five registers. The address register represents the instruction offset in the associated insns_item in 16-bit code units. The address register starts at 0 at the beginning of each debug_info sequence and must only monotonically increase. The line register represents what source line number should be associated with the next positions table entry emitted by the state machine. It is initialized in the sequence header, and may change in positive or negative directions but must never be less than 1 . The source_file register represents the source file that the line number entries refer to. It is initialized to the value of source_file_idx in class_def_item . The other two variables, prologue_end and epilogue_begin , are boolean flags (initialized to false ) that indicate whether the next position emitted should be considered a method prologue or epilogue. The state machine must also track the name and type of the last local variable live in each register for the DBG_RESTART_LOCAL code.

The header is as follows:

Name Format 설명
line_start uleb128 the initial value for the state machine's line register. Does not represent an actual positions entry.
parameters_size uleb128 the number of parameter names that are encoded. There should be one per method parameter, excluding an instance method's this , if any.
parameter_names uleb128p1[parameters_size] string index of the method parameter name. An encoded value of NO_INDEX indicates that no name is available for the associated parameter. The type descriptor and signature are implied from the method descriptor and signature.

The byte code values are as follows:

Name Value Format Arguments 설명
DBG_END_SEQUENCE 0x00 (none) terminates a debug info sequence for a code_item
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff : amount to add to address register advances the address register without emitting a positions entry
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff : amount to change line register by advances the line register without emitting a positions entry
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num : register that will contain local
name_idx : string index of the name
type_idx : type index of the type
introduces a local variable at the current address. Either name_idx or type_idx may be NO_INDEX to indicate that that value is unknown.
DBG_START_LOCAL_EXTENDED 0x04 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
uleb128p1 sig_idx
register_num : register that will contain local
name_idx : string index of the name
type_idx : type index of the type
sig_idx : string index of the type signature
introduces a local with a type signature at the current address. Any of name_idx , type_idx , or sig_idx may be NO_INDEX to indicate that that value is unknown. (If sig_idx is -1 , though, the same data could be represented more efficiently using the opcode DBG_START_LOCAL .)

Note: See the discussion under " dalvik.annotation.Signature " below for caveats about handling signatures.

DBG_END_LOCAL 0x05 uleb128 register_num register_num : register that contained local marks a currently-live local variable as out of scope at the current address
DBG_RESTART_LOCAL 0x06 uleb128 register_num register_num : register to restart re-introduces a local variable at the current address. The name and type are the same as the last local that was live in the specified register.
DBG_SET_PROLOGUE_END 0x07 (none) sets the prologue_end state machine register, indicating that the next position entry that is added should be considered the end of a method prologue (an appropriate place for a method breakpoint). The prologue_end register is cleared by any special ( >= 0x0a ) opcode.
DBG_SET_EPILOGUE_BEGIN 0x08 (none) sets the epilogue_begin state machine register, indicating that the next position entry that is added should be considered the beginning of a method epilogue (an appropriate place to suspend execution before method exit). The epilogue_begin register is cleared by any special ( >= 0x0a ) opcode.
DBG_SET_FILE 0x09 uleb128p1 name_idx name_idx : string index of source file name; NO_INDEX if unknown indicates that all subsequent line number entries make reference to this source file name, instead of the default name specified in code_item
Special Opcodes 0x0a…0xff (none) advances the line and address registers, emits a position entry, and clears prologue_end and epilogue_begin . See below for description.

Special opcodes

Opcodes with values between 0x0a and 0xff (inclusive) move both the line and address registers by a small amount and then emit a new position table entry. The formula for the increments are as follows:

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

referenced from class_def_item

appears in the data section

alignment: 4 bytes

Name Format 설명
class_annotations_off uint offset from the start of the file to the annotations made directly on the class, or 0 if the class has no direct annotations. The offset, if non-zero, should be to a location in the data section. The format of the data is specified by " annotation_set_item " below.
fields_size uint count of fields annotated by this item
annotated_methods_size uint count of methods annotated by this item
annotated_parameters_size uint count of method parameter lists annotated by this item
field_annotations field_annotation[fields_size] (optional) list of associated field annotations. The elements of the list must be sorted in increasing order, by field_idx .
method_annotations method_annotation[methods_size] (optional) list of associated method annotations. The elements of the list must be sorted in increasing order, by method_idx .
parameter_annotations parameter_annotation[parameters_size] (optional) list of associated method parameter annotations. The elements of the list must be sorted in increasing order, by method_idx .

Note: All elements' field_id s and method_id s must refer to the same defining class.

field_annotation format

Name Format 설명
field_idx uint index into the field_ids list for the identity of the field being annotated
annotations_off uint offset from the start of the file to the list of annotations for the field. The offset should be to a location in the data section. The format of the data is specified by " annotation_set_item " below.

method_annotation format

Name Format 설명
method_idx uint index into the method_ids list for the identity of the method being annotated
annotations_off uint offset from the start of the file to the list of annotations for the method. The offset should be to a location in the data section. The format of the data is specified by " annotation_set_item " below.

parameter_annotation format

Name Format 설명
method_idx uint index into the method_ids list for the identity of the method whose parameters are being annotated
annotations_off uint offset from the start of the file to the list of annotations for the method parameters. The offset should be to a location in the data section. The format of the data is specified by " annotation_set_ref_list " below.

annotation_set_ref_list

referenced from parameter_annotations_item

appears in the data section

alignment: 4 bytes

Name Format 설명
size uint size of the list, in entries
list annotation_set_ref_item[size] elements of the list

annotation_set_ref_item format

Name Format 설명
annotations_off uint offset from the start of the file to the referenced annotation set or 0 if there are no annotations for this element. The offset, if non-zero, should be to a location in the data section. The format of the data is specified by " annotation_set_item " below.

annotation_set_item

referenced from annotations_directory_item, field_annotations_item, method_annotations_item, and annotation_set_ref_item

appears in the data section

alignment: 4 bytes

Name Format 설명
size uint size of the set, in entries
entries annotation_off_item[size] elements of the set. The elements must be sorted in increasing order, by type_idx .

annotation_off_item format

Name Format 설명
annotation_off uint offset from the start of the file to an annotation. The offset should be to a location in the data section, and the format of the data at that location is specified by " annotation_item " below.

annotation_item

referenced from annotation_set_item

appears in the data section

alignment: none (byte-aligned)

Name Format 설명
visibility ubyte intended visibility of this annotation (see below)
annotation encoded_annotation encoded annotation contents, in the format described by " encoded_annotation format" under " encoded_value encoding" above.

Visibility values

These are the options for the visibility field in an annotation_item :

Name Value 설명
VISIBILITY_BUILD 0x00 intended only to be visible at build time (eg, during compilation of other code)
VISIBILITY_RUNTIME 0x01 intended to visible at runtime
VISIBILITY_SYSTEM 0x02 intended to visible at runtime, but only to the underlying system (and not to regular user code)

encoded_array_item

referenced from class_def_item

appears in the data section

alignment: none (byte-aligned)

Name Format 설명
value encoded_array bytes representing the encoded array value, in the format specified by " encoded_array Format" under " encoded_value Encoding" above.

hiddenapi_class_data_item

This section contains data on restricted interfaces used by each class.

Note: The hidden API feature was introduced in Android 10.0 and is only applicable to the DEX files of classes in the boot class path. The list of flags described below may be extended in the future releases of Android. For more information, see restrictions on non-SDK interfaces .

Name Format 설명
size uint total size of the section
offsets uint[] array of offsets indexed by class_idx . A zero array entry at index class_idx means that either there is no data for this class_idx , or all hidden API flags are zero. Otherwise the array entry is non-zero and contains an offset from the beginning of the section to an array of hidden API flags for this class_idx .
flags uleb128[] concatenated arrays of hidden API flags for each class. Possible flag values are described in the table below. Flags are encoded in the same order as fields and methods are encoded in class data.

Restriction flag types:

Name Value 설명
whitelist 0 Interfaces that can be freely used and are supported as part of the officially documented Android framework Package Index .
greylist 1 Non-SDK interfaces that can be used regardless of the application's target API level .
blacklist 2 Non-SDK interfaces that cannot be used regardless of the application's target API level . Accessing one of these interfaces causes a runtime error .
greylist‑max‑o Non-SDK interfaces that can be used for Android 8.x and below unless they are restricted.
greylist‑max‑p 4 Non-SDK interfaces that can be used for Android 9.x unless they are restricted.
greylist‑max‑q 5 Non-SDK interfaces that can be used for Android 10.x unless they are restricted.
greylist‑max‑r 6 Non-SDK interfaces that can be used for Android 11.x unless they are restricted.

System annotations

System annotations are used to represent various pieces of reflective information about classes (and methods and fields). This information is generally only accessed indirectly by client (non-system) code.

System annotations are represented in .dex files as annotations with visibility set to VISIBILITY_SYSTEM .

dalvik.annotation.AnnotationDefault

appears on methods in annotation interfaces

An AnnotationDefault annotation is attached to each annotation interface which wishes to indicate default bindings.

Name Format 설명
value Annotation the default bindings for this annotation, represented as an annotation of this type. The annotation need not include all names defined by the annotation; missing names simply do not have defaults.

dalvik.annotation.EnclosingClass

appears on classes

An EnclosingClass annotation is attached to each class which is either defined as a member of another class, per se, or is anonymous but not defined within a method body (eg, a synthetic inner class). Every class that has this annotation must also have an InnerClass annotation. Additionally, a class must not have both an EnclosingClass and an EnclosingMethod annotation.

Name Format 설명
value Class the class which most closely lexically scopes this class

dalvik.annotation.EnclosingMethod

appears on classes

An EnclosingMethod annotation is attached to each class which is defined inside a method body. Every class that has this annotation must also have an InnerClass annotation. Additionally, a class must not have both an EnclosingClass and an EnclosingMethod annotation.

Name Format 설명
value Method the method which most closely lexically scopes this class

dalvik.annotation.InnerClass

appears on classes

An InnerClass annotation is attached to each class which is defined in the lexical scope of another class's definition. Any class which has this annotation must also have either an EnclosingClass annotation or an EnclosingMethod annotation.

Name Format 설명
name String the originally declared simple name of this class (not including any package prefix). If this class is anonymous, then the name is null .
accessFlags int the originally declared access flags of the class (which may differ from the effective flags because of a mismatch between the execution models of the source language and target virtual machine)

dalvik.annotation.MemberClasses

appears on classes

A MemberClasses annotation is attached to each class which declares member classes. (A member class is a direct inner class that has a name.)

Name Format 설명
value Class[] array of the member classes

dalvik.annotation.MethodParameters

appears on methods

Note: This annotation was added after Android 7.1. Its presence on earlier Android releases will be ignored.

A MethodParameters annotation is optional and can be used to provide parameter metadata such as parameter names and modifiers.

The annotation can be omitted from a method or constructor safely when the parameter metadata is not required at runtime. java.lang.reflect.Parameter.isNamePresent() can be used to check whether metadata is present for a parameter, and the associated reflection methods such as java.lang.reflect.Parameter.getName() will fall back to default behavior at runtime if the information is not present.

When including parameter metadata, compilers must include information for generated classes such as enums, since the parameter metadata includes whether or not a parameter is synthetic or mandated.

A MethodParameters annotation describes only individual method parameters. Therefore, compilers may omit the annotation entirely for constructors and methods that have no parameters, for the sake of code-size and runtime efficiency.

The arrays documented below must be the same size as for the method_id_item dex structure associated with the method, otherwise a java.lang.reflect.MalformedParametersException will be thrown at runtime.

That is: method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size must be the same as names().length and accessFlags().length .

Because MethodParameters describes all formal method parameters, even those not explicitly or implicitly declared in source code, the size of the arrays may differ from the Signature or other metadata information that is based only on explicit parameters declared in source code. MethodParameters will also not include any information about type annotation receiver parameters that do not exist in the actual method signature.

Name Format 설명
names String[] The names of formal parameters for the associated method. The array must not be null but must be empty if there are no formal parameters. A value in the array must be null if the formal parameter with that index has no name.
If parameter name strings are empty or contain '.', ';', '[' or '/' then a java.lang.reflect.MalformedParametersException will be thrown at runtime.
accessFlags int[] The access flags of the formal parameters for the associated method. The array must not be null but must be empty if there are no formal parameters.
The value is a bit mask with the following values:
  • 0x0010 : final, the parameter was declared final
  • 0x1000 : synthetic, the parameter was introduced by the compiler
  • 0x8000 : mandated, the parameter is synthetic but also implied by the language specification
If any bits are set outside of this set then a java.lang.reflect.MalformedParametersException will be thrown at runtime.

dalvik.annotation.Signature

appears on classes, fields, and methods

A Signature annotation is attached to each class, field, or method which is defined in terms of a more complicated type than is representable by a type_id_item . The .dex format does not define the format for signatures; it is merely meant to be able to represent whatever signatures a source language requires for successful implementation of that language's semantics. As such, signatures are not generally parsed (or verified) by virtual machine implementations. The signatures simply get handed off to higher-level APIs and tools (such as debuggers). Any use of a signature, therefore, should be written so as not to make any assumptions about only receiving valid signatures, explicitly guarding itself against the possibility of coming across a syntactically invalid signature.

Because signature strings tend to have a lot of duplicated content, a Signature annotation is defined as an array of strings, where duplicated elements naturally refer to the same underlying data, and the signature is taken to be the concatenation of all the strings in the array. There are no rules about how to pull apart a signature into separate strings; that is entirely up to the tools that generate .dex files.

Name Format 설명
value String[] the signature of this class or member, as an array of strings that is to be concatenated together

dalvik.annotation.Throws

appears on methods

A Throws annotation is attached to each method which is declared to throw one or more exception types.

Name Format 설명
value Class[] the array of exception types thrown