Dalvik 可執行格式

本文件將說明 .dex 的版面配置和內容 檔案,可用於存放一組類別定義及其相關 假設資料。

類型指南

名稱 說明
byte 8 位元已登入
Ubyte 8 位元未簽署的 int
short 16 位元已登入的小端子
Ushort 16 位元無正負號 int、Little-Endian
int 32 位元已登入的小端子
Uint 32 位元無正負號 int、Little-Endian
long 64 位元有登入符號,小端序
烏龍 64 位元無正負號 int、Little-Endian
Sleb128 帶正負號的 LEB128,長度不定 (請見下方)
Ueb128 未簽署的 LEB128,長度不定 (請見下方)
uleb128p1 未簽署的 LEB128 加上 1,長度不定 (請見下方)

LEB128

LEB128 (「Little-Endian Base 128」) 是 變數長度編碼 任意帶正負號或無正負號的整數數量。格式為 借自 DWARF3 規格。在 .dex 檔案中,LEB128 只會用於 為 32 位元數量進行編碼

每個 LEB128 編碼值都包含 1 到 5 位元組,共代表一個 32 位元值。每項 除了 這個序列最顯而易見剩餘的 每個位元組的 7 位元是有效負載,最少為七分 也就是第一個位元組中數量的位元,在第二個位元組中 位元組等等如果是已簽署 LEB128 (sleb128), 序列中最後一個位元組中最重要的酬載位元是 號鍵產生最終值。未簽署的案件 (uleb128),任何未明確表示的位元都會 解讀為 0

雙位元組 LEB128 值的位元圖
第一個位元組 第二個位元組
1 位元6 位元5 位元4 位元3 位元2 位元1 位元0 0 位元13 位元12 位元11 位元10 位元9 位元8 位元7

變化版本 uleb128p1 用於代表已簽署 值,其中表示的值是「+1」經過編碼的值 做為 uleb128。如此一來,-1 的編碼就會是 (相反地會視為無正負號值 0xffffffff) ,但不包括其他負數 - 單一位元組, 出現數字就是 不得為負數或 -1 (或 0xffffffff), 以及不允許使用其他負值 (或大型無正負號) 都不會需要)。

以下列舉幾種廣告格式:

編碼序列 本裝置:sleb128 本裝置:uleb128 本裝置:uleb128p1
0000-1
01110
7f-1127126
80 7f-1281625616255

檔案版面配置

名稱 格式 說明
標頭 標題項目 頁首
字串 ID string_id_item[] 字串 ID 清單。這些是所有字串的 ID 由此檔案使用,可用於內部命名 (例如類型描述元) 或稱做程式碼參照的常數物件這份清單必須排序 字串內容,使用 UTF-16 編碼點值 (而非在 語言代碼),且不得包含任何重複項目。
類型 ID type_id_item[] 類型 ID 清單這些是所有類型的識別碼 (類別、 參照的陣列或原始型別) 檔案中的內容這份清單必須按照 string_id 排序 索引,不得包含任何重複的項目。
proto_ids proto_id_item[] 方法原型 ID 清單這些是 這個檔案所參照的原型這份清單必須排序為 傳回類型 (依 type_id 索引) 主要順序,然後 依引數清單 (字母順序排序、個別引數) 排序依據:type_id 索引)。清單不得 包含任何重複的項目。
欄位 ID field_id_item[] 欄位 ID 清單這些是所有欄位的 ID 參照該檔案,不論是否在檔案中定義。這個 清單必須排序,其中定義類型 (依 type_id 排序) 索引) 是主要順序,欄位名稱 (依 string_id 索引) 是中繼順序,類型 (依 type_id 索引) 代表不小的順序清單中不得包含重複的項目。
方法 ID method_id_item[] 方法 ID 清單這些是所有方法的 ID 參照該檔案,不論是否在檔案中定義。這個 清單必須排序,其中定義類型 (依 type_id 排序) 索引) 是主要順序,方法名稱 (依 string_id 排序) index) 是中繼順序,以及方法原型 (透過 proto_id 索引) 是次要順序,清單不得 包含任何重複的項目。
class_defs class_def_item[] 類別定義清單類別必須排序,讓指定的 父類別和已實作的介面會顯示在 列在參照類別之前此外, 可以多次顯示相同命名類別的定義 在這個範例中就是「花」 以及排在前端的其他字詞
來電網站 ID call_site_id_item[] 來電網站 ID 清單這些是所有來電網站的 ID 參照該檔案,不論是否在檔案中定義。這份清單 必須以 call_site_off 遞增排序。
方法控點 method_handle_item[] 方法控制代碼清單。這個檔案所參照的所有方法控制代碼清單, 不論是否在檔案內定義這份清單並未排序,可能含有 會在邏輯上對應至不同的方法處理常式。
data Ubyte[] 資料區域中,包含上列表格的所有支援資料。 不同的項目有不同的對齊規定, 會在每個項目之前插入邊框間距位元組,以達成 正確對齊
連結資料 Ubyte[] 靜態連結檔案所使用的資料資料格式 這份文件未指定這個部分。 在未連結的檔案和執行階段實作中,這個部分沒有任何內容 視需要使用

位元欄位、字串和常數定義

DEX_FILE_MAGIC

嵌入標頭項目

常數陣列/字串 DEX_FILE_MAGIC 是 必須出現在 .dex 檔案開頭的位元組 才以利辨識刻意將價值 包含換行符號 ("\n"0x0a) 和 為空值 ("\0"0x00) 偵測特定形式的損毀。此外,這個值 將格式的版本號碼編碼為三十進位數字, 會隨著時間的推移而不斷增加。

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 檔案格式來納入隱藏內容 僅適用於啟動類別路徑中 DEX 檔案的 API 資訊。

注意:版本支援 Android 8.0 新增了此格式的 038 版本。版本 038 新增了位元碼 (invoke-polymorphicinvoke-custom) 和 方法控制代碼

注意:支援 037 版的 該格式是在 Android 7.0 版本中新增。大多數版本 037 Android 版本都使用格式 035 的版本。只有 版本 035037 的差異 新增預設方法和 invoke 的調整。

注意:至少幾個舊版的格式版本都含有 在公開的軟體發布版本中使用。例如: 009 版本用於 M3 版本的 Android 平台 (2007 年 11 月至 12 月)、 且 013 版用於 Android M5 版本 平台(2008 年 2 月至 3 月)。從多個方面來說 版本的 文件。

ENDIAN_CONSTANT 和 REVERSE_ENDIAN_CONSTANT

嵌入標頭項目

常數 ENDIAN_CONSTANT 是用來表示 找到該檔案所在檔案的結尾點。雖然標準廣告 .dex 格式較小型,導入方式可能會 執行位元組切換作業只有在導入時 endian_tagREVERSE_ENDIAN_CONSTANT 的標頭 而不是 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 0 x 1,000 未直接定義在原始碼中 未直接定義在原始碼中 未直接定義在原始碼中
ACC_ANNOTATION 0 x 2,000 宣告為註解類別    
ACC_ENUM 驗證 0x4000 宣告為列舉類型 宣告為列舉值  
(未使用) 0x8000      
ACC_CONSTRUCTOR 0 x 10,000     建構函式方法 (類別或例項初始化器)
ACC_DECLARED_
SYNCHRONIZED
0 x 20,000     宣告了 synchronized

注意:這不會影響 (除了會反映此標記)。

* 只適用於 InnerClass 註解。 且一律不得在 class_def_item 中顯示

修改後的 UTF-8 編碼

為了簡化舊版支援,採用 .dex 格式 為字串資料編碼,採用實際的 UTF-8 修改格式 稱為 MUTF-8這份表單與標準 UTF-8 相同,但以下項目除外:

  • 只會使用一位元組、二位元組和三位元組編碼。
  • 範圍內 U+10000 的碼點... U+10ffff 會編碼為代理配對,每個 並以三位元組編碼的值表示。
  • 碼點 U+0000 採用雙位元組編碼。
  • 純空值位元組 (值 0) 表示結尾 字串和標準的 C 語言解釋。

上述前兩個項目可匯總為:MUTF-8 是一種 UTF-16 的編碼格式,而非直接 Unicode 字元的編碼格式。

上面的最後兩個項目 可讓您同時加入 字串中的程式碼點 U+0000「而且」仍會操縱 並將其視為 C 樣式的空值結尾字串。

然而,U+0000 的特殊編碼方式表示 一般 UTF-8,亦即呼叫標準 C 函式的結果 MUTF-8 字串組合上的 strcmp() 不一定每次都會 指出比較「不等於」字串的對應結果,是否加上正確的帶符號。 需要考量排序 (不只是平等) 時 比較 MUTF-8 字串的方法是 逐一以字元解碼 並比較已解碼的值(不過,如果實作方式比較巧妙 功能)。

請參閱 Unicode 規範 標準:進一步瞭解字元編碼。 MUTF-8 實際上與 (相對較不知名) 編碼 與 UTF-8 相比,使用 CESU-8 每一天

編碼值編碼

嵌入 annotation_element 和 encoded_array_item

encoded_value 是 (幾乎) 經過編碼的片段 任意階層結構化資料編碼的作用是 既精簡又易於剖析

名稱 格式 說明
(value_arg << 5) |值類型 Ubyte 位元組,指出緊接在 沿value 並可選擇在高階三個位元中說明引數 請參閱下方說明,瞭解各種 value 定義。 在大多數情況下,value_arg 會將 緊接後續的 value (以位元組為單位), (size - 1) (例如:0 表示 值需要一個位元組,7 表示需要 八位元組;但例外情況如下。
Ubyte[] 表示值、長度變數 (長度) 和解譯後的位元組 設定不同的 value_type 位元組時 一律為小端子請參閱下列各種值定義, 詳細資料。

價值格式

類型名稱 value_type value_arg格式 value格式 說明
按年計費 0x00 (無;必須為 0) Ubyte [1] 帶正負號的一位元組整數值
價值:Shorts 0x02 大小 - 1 (0...1) 位元組 [size] 帶正負號的雙位元組整數值,加正負號
$_CHAR 0x03 大小 - 1 (0...1) 位元組 [size] 無帶正負號的雙位元組整數值,零延伸
價值 0x04 尺寸 - 1 (0...3) 位元組 [size] 帶正負號的四位元組整數值,正負號
長值 0x06 大小 - 1 (0...7) 位元組 [size] 帶正負號的八位元組整數值,正負號
比價 0x10 尺寸 - 1 (0...3) 位元組 [size] 四位元組位元模式,零延伸至右側,以及 解讀為 IEEE754 32 位元浮點值
VALUE_DOUBLE 0x11 大小 - 1 (0...7) 位元組 [size] 八位元組位元模式,零延伸至右側,以及 解讀為 IEEE754 64 位元浮點值
0x15 尺寸 - 1 (0...3) 位元組 [size] 無正負號 (零擴充) 四位元組整數值, 解譯為索引 proto_ids 區段,代表方法類型值
價值達標 0x16 尺寸 - 1 (0...3) 位元組 [size] 無正負號 (零擴充) 四位元組整數值, 解譯為索引 method_handles 區段,並代表方法控制值
值:VALUE_STRING 0x17 尺寸 - 1 (0...3) 位元組 [size] 無正負號 (零擴充) 四位元組整數值, 解譯為索引 string_ids 區段,且代表字串值
價值類型 0x18 尺寸 - 1 (0...3) 位元組 [size] 無正負號 (零擴充) 四位元組整數值, 解譯為索引 type_ids 部分,代表反映 類型/類別值
欄位 0x19 尺寸 - 1 (0...3) 位元組 [size] 無正負號 (零擴充) 四位元組整數值, 解譯為索引 field_ids 部分,代表反映 欄位值
0x1a 尺寸 - 1 (0...3) 位元組 [size] 無正負號 (零擴充) 四位元組整數值, 解譯為索引 method_ids 部分,代表反映 方法的值
價值:VALUE_ENUM 0x1b 尺寸 - 1 (0...3) 位元組 [size] 無正負號 (零擴充) 四位元組整數值, 解譯為索引 field_ids 部分,代表 列舉型別常數
VALUE_ARRAY 0x1c (無;必須為 0) 已編碼的陣列 值的陣列,格式為 「encoded_array 格式」。檔案大小 value 的標頭為隱含。
價值註解 0 x 1 天 (無;必須為 0) 已編碼的註解 子註解,格式為 「encoded_annotation 格式」。檔案大小 value 的標頭為隱含。
空值 0x1e (無;必須為 0) (無) null 參考值
VALUE_BOOLEAN 0x1f 布林值 (0...1) (無) 1 位元值;false0 true前的1。這個位元會顯示在 value_arg

編碼的陣列格式

名稱 格式 說明
size Ueb128 陣列中的元素數
編碼值 [size] 一系列 size encoded_value 個位元組 依照本節指定的格式,串連

encoded_annotation 格式

名稱 格式 說明
type_idx Ueb128 註解類型這必須是類別 (非陣列或原始) 類型。
size Ueb128 這項註解中的名稱/值對應數量
個元素 action_element[size] 直接內嵌表示註解的元素 (而非 偏移量)。元素必須以遞增順序排序 string_id 索引。

action_element 格式

名稱 格式 說明
名稱_idx Ueb128 元素名稱,以索引的索引表示 「string_ids」專區。字串必須符合 如上定義的 MemberName 語法。
已編碼的值 元素值

字串語法

.dex 檔案內有多個項目。 最後是指字串下列 BNF 樣式定義 指出這些字串可接受的語法。

簡易名稱

SimpleName 是其他名稱的語法基礎 有些事物.dex 格式允許合理的緯度 這比最常見的原文語言還多。簡單來說 名稱是由任何低 ASCII 字母字元或數字組成,但只有少數 特定的低 ASCII 符號,以及 控制、空格或特殊字元自 040 版起 格式必須另外允許使用空格字元 (Unicode Zs 類別)。請注意,代理碼點 (在「U+d800 ... U+dfff」範圍內) 不是 視為有效的名稱字元,但可使用 Unicode 補充值 字元「有效」 (由 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
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 ';'

短描述元

由 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
float
D double
完整/合格/姓名 類別 fully.qualified.Name
[描述元 descriptor 陣列,可遞迴用於 陣列的陣列數量無效,但超過 255 個數字是無效的 維度。

項目和相關結構

本節包含每個頂層項目的定義: 可能會出現在 .dex 檔案中

標題項目

顯示在標題區段中

對齊方式:4 個位元組

名稱 格式 說明
魔法 ubyte[8] = DEX_FILE_MAGIC 神奇的價值請參閱上方「DEX_FILE_MAGIC」下方的討論內容 ,掌握更多詳細資訊。
核對和 Uint adler32 其他檔案的總和檢查碼 (除了 magic 和此欄位);用於偵測檔案毀損情形
簽名 Ubyte [20] 檔案其餘部分的 SHA-1 簽章 (雜湊),但 magicchecksum 和這個欄位);二手 用於識別檔案
檔案大小 Uint 整個檔案 (包含標頭) 的大小,以位元組為單位
標題大小 uint = 0x70 標題 (這個部分) 的大小,以位元組為單位。這樣一來, 沒有一定程度的回溯/前瞻相容性 使格式失效。
endian_tag 標記 uint = ENDIAN_CONSTANT endianness 標記。請參閱上方「ENDIAN_CONSTANT」下方的討論內容 和REVERSE_ENDIAN_CONSTANT」,掌握更多詳細資訊。
連結大小 Uint 連結部分的大小;若該檔案不是,則傳回 0 靜態連結
link_off Uint 從檔案開頭到連結區段,或 如果 link_size == 0,則為 0。偏移值 (如果不是零) 應為 link_data 區段的偏移值。 所指向的資料格式並未由本文件指定; 這個標頭欄位 (和前一個) 則留為掛鉤 和執行階段導入的解釋
map_off Uint 從檔案開頭到地圖項目項目。偏移值,必須 不為零,且應為 data 區段中的偏移值, ,資料應使用由「map_list」指定的格式 。
字串 ID 大小 Uint 字串 ID 清單中的字串數量
string_ids_off Uint 從檔案開頭到字串 ID 清單的偏移值,或者 如果 string_ids_size == 00 (許可 不尋常的極端案例)。偏移值 (如果不是零) 應該位於 string_ids 區段的開頭。
type_ids_size Uint 類型 ID 清單中的元素數量,最多 65535 個
type_ids_off Uint 從檔案開頭到類型 ID 清單,或者 如果 type_ids_size == 00 (許可 不尋常的極端案例)。偏移值 (如果不是零) 必須是 type_ids 的開頭 專區。
proto_ids_size Uint 原型 ID 清單中的元素數量,最多 65535 個
proto_ids_off Uint 從檔案開頭到原型 ID 清單的偏移值,或者 如果 proto_ids_size == 00 (許可 不尋常的極端案例)。偏移值 (如果不是零) 必須是 proto_ids 的開頭 專區。
欄位 ID 大小 Uint 欄位 ID 清單中的元素數量
欄位 ID 停用 Uint 從檔案開頭到欄位 ID 清單,或 如果 field_ids_size == 0,則為 0。偏移量 (如果 非零,但應位於 field_ids 的開頭 專區。
方法 ID 尺寸 Uint 方法 ID 清單中的元素數量
method_ids_off Uint 從檔案開頭到方法 ID 清單,或者 如果 method_ids_size == 0,則為 0。偏移量 (如果 非零,但應位於 method_ids 的開頭 專區。
class_defs_size Uint 類別定義清單中的元素數量
class_defs_off Uint 與類別定義清單之間的偏移值, 如果 class_defs_size == 00 (許可 不尋常的極端案例)。偏移值 (如果不是零) 應該位於 class_defs 區段的開頭。
資料大小 Uint data 部分的大小 (以位元組為單位)。必須是偶數 的倍數(uint) 的倍數。
data_off Uint 從檔案開頭到 「data」專區。

map_list

顯示在資料部分中

從 header_item 參照

對齊方式:4 個位元組

此清單會依序列出檔案中的全部內容。這項服務 包含與 header_item 相關的備援功能 而是適合用來 針對整個系統 檔案。特定類型最多只能在地圖上出現一次,但都沒有 對廣告顯示順序類型的限制 其他格式所隱含的限制 (例如 header 部分必須放在最前面,後面必須加上 string_ids 等)。此外,對應項目必須 依初始偏移量排序,且不得重疊。

名稱 格式 說明
size Uint 清單大小,以項目表示
清單 map_item [尺寸] 清單的元素

map_item 格式

名稱 格式 說明
類型 Ushort 項目類型;請參閱下表
unused Ushort (未使用)
size Uint 在指定偏移處找到的項目數
碳補償 Uint 與相關項目之間的偏移值

類型代碼

項目類型 常數 項目大小 (單位為位元組)
標題項目 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
欄位 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 0 x 1,000 4 + (item.size * 12)
type_list TYPE_TYPE_LIST 0x1001 4 + (item.size * 2)
action_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (item.size * 4)
action_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (item.size * 4)
class_data_item TYPE_CLASS_DATA_ITEM 0 x 2,000 隱含;必須剖析
code_item TYPE_CODE_ITEM 0x2001 隱含;必須剖析
string_data_item TYPE_STRING_DATA_ITEM 0x2002 隱含;必須剖析
偵錯資訊項目 TYPE_DEBUG_INFO_ITEM 0x2003 隱含;必須剖析
<註解項目> TYPE_ANNOTATION_ITEM 0x2004 隱含;必須剖析
已編碼的陣列項目 TYPE_ENCODED_ARRAY_ITEM 0x2005 隱含;必須剖析
Annotation_directory_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 隱含;必須剖析
hideapi_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 Ueb128 此字串的大小,以 UTF-16 代碼單位表示 (也就是「字串」 長度」多個系統中)。也就是說,這是解碼後 該字串。(編碼長度由 0 位元組)。
data Ubyte[] 一系列 MUTF-8 編碼單位 (又稱為八位元、一、位元組) 後面接著值為 0 的位元組。詳情請見 「MUTF-8 (修改後的 UTF-8) 編碼」請參閱上方說明 討論資料格式

注意:則可使用包含 (編碼形式) UTF-16 代理程式碼單位 (即 U+d800 ... U+dfff) 像是獨立或順序錯誤 將 Unicode 編碼轉換為 UTF-16適用於較高階的 字串,拒絕這類無效的編碼。

type_id_item

出現在 type_ids 部分

對齊方式:4 個位元組

名稱 格式 說明
描述元 IDx Uint 編入描述元的 string_ids 清單 視為此類型的字串。字串必須符合 TypeDescriptor (如上所述)。

proto_id_item

顯示在 proto_ids 區段中

對齊方式:4 個位元組

名稱 格式 說明
shorty_idx Uint 為短篇影片編入 string_ids 清單 再擷取這個原型的描述元字串字串必須符合 ShortyDescriptor 的語法,因此必須能夠與 對應至這個項目的傳回類型和參數
return_type_idx Uint 為傳回類型的 type_ids 清單建立索引 這段原型
參數「off_off」 Uint 從檔案開頭到參數類型清單 針對這個原型,如果這個原型沒有,傳回 0 參數。此位移應位於 data 區段,資料應位於 格式由下方 "type_list" 指定。此外, 清單中不得參照 void 類型。

欄位 ID_item

顯示在「field_ids」部分

對齊方式:4 個位元組

名稱 格式 說明
class_idx Ushort 編入 type_ids 清單的這個定義器 ] 欄位。這必須是類別類型,而不是陣列或原始類型。
type_idx Ushort 編入 type_ids 清單 這個欄位
名稱_idx Uint 編入 string_ids 清單以獲得 ] 欄位。字串必須符合 MemberName 的語法。 定義。

method_id_item

顯示在 method_ids 區段中

對齊方式:4 個位元組

名稱 格式 說明
class_idx Ushort 編入 type_ids 清單的這個定義器 方法。這必須是類別或陣列類型,而不是原始類型。
proto_idx Ushort 編入 proto_ids 清單, 這個方法
名稱_idx Uint 編入 string_ids 清單以獲得 方法。字串必須符合 MemberName 的語法。 定義。

class_def_item

出現在「class_defs」部分

對齊方式:4 個位元組

名稱 格式 說明
class_idx Uint 索引編入此類別的 type_ids 清單。 這必須是類別類型,而不是陣列或原始類型。
access_flags Uint 類別的存取旗標 (publicfinal、 等)。查看「access_flags」定義。
Superclass_idx Uint 新增至父類別的 type_ids 清單;或 如果此類別沒有常數值,則值為 NO_INDEX 父類別 (即 Object 等根類別)。 如果有此屬性,這必須是類別類型,而不是陣列或原始類型。
介面關閉 Uint 從檔案開頭到介面清單的偏移值,或 0 (如果沒有的話)。此偏移值 應位於 data 區段中,而 格式應該是 「type_list」。清單中的每個元素 必須是類別類型 (並非陣列或原始類型),而 不得包含任何重複項目。
source_file_idx Uint 將索引建立為 string_ids 清單 檔案,包含 (至少) 這個類別的原始來源檔案。 或特殊值 NO_INDEX,代表缺少 這些資訊任何指定方法的 debug_info_item 可能會覆寫這個來源檔案,但預期大部分類別 都只能來自一個來源檔案
註解關閉 Uint 從檔案開頭到註解結構的偏移值 如果此類別沒有註解,則傳回 0 這個級別。此位移應位於 data 區段,資料應位於 「annotations_directory_item」指定的格式 將所有項目參照此類別做為定義器
class_data_off Uint 距離檔案開頭與相關聯的 這個項目的類別資料;如果沒有類別,則為 0 這個級別的資料。(例如,假設這個類別 為標記介面)。偏移值 (如果不是零) 應位於 data 區段,資料應位於 「class_data_item」指定的格式下方,所有 個項目會參照這個類別做為定義器。
static_values_off Uint 從檔案開頭到初始清單 static 欄位的值,或 0 的值 (如果有的話) 無 (且所有 static 欄位都設為以 0null)。偏移量應該位於 data 區段,資料應該會在 「encoded_array_item」所指定的格式。檔案大小 陣列的列數不得大於 static 的數目 欄位,而且元素會對應至 static 欄位的順序與 對應 field_list。每個陣列的類型 元素必須符合其對應欄位所宣告的類型。 如果陣列中的元素數量少於 static 欄位,接著系統會對剩餘欄位進行初始化調整 且具有類型對應的 0null

call_site_id_item

顯示在「call_site_ids」部分中

對齊方式:4 個位元組

名稱 格式 說明
call_site_off Uint 呼叫網站定義。偏移量應 位於資料區段中,資料則應該採用 「call_site_item」。

call_site_item

顯示在資料部分中

對齊:無 (位元組對齊)

call_site_item 是經過編碼的陣列項目,其中的元素會對應至引數 提供給 Bootstrap 連接器方法。前三個引數如下:

  1. 代表啟動連接器方法 (VALUE_METHOD_HANDLE) 的方法控制代碼。
  2. 啟動連結器應解析的方法名稱 (VALUE_STRING)。
  3. 與要解析的方法名稱類型相對應的方法類型 (VALUE_METHOD_TYPE)。

任何其他引數都是傳遞至 Bootstrap 連接器方法的常數值。這些引數 傳遞順序,且不含任何類型的轉換。

代表 Bootstrap 連接器方法的方法控制代碼必須具備傳回類型 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 (未使用)
欄位或方法 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 Ueb128 這個項目中定義的靜態欄位數量
instance_fields_size Ueb128 這個項目中定義的執行個體欄位數量
Direct_methods_size Ueb128 這個項目中定義的直接方法數量
virtual_methods_size Ueb128 這個項目中定義的虛擬方法數量
static_fields 已編碼的欄位 [static_fields_size] 定義的靜態欄位, 編碼元素。欄位必須按照 field_idx (遞增順序)。
instance_fields 欄位 已編碼欄位 [instance_fields_size] 預先定義的執行個體欄位,以 編碼元素。欄位必須按照 field_idx (遞增順序)。
Direct_methods 編碼方法 [direct_methods_size] 已定義的直接 (staticprivate、 或建構函式) 方法,以 編碼元素。方法必須按照 method_idx (遞增順序)。
virtual_methods 編碼方法 [virtual_methods_size] 已定義的虛擬 (staticprivate、 或建構函式) 方法,以 編碼元素。這份清單「不應」包含沿用的 方法,除非此項目代表的類別遭到覆寫。 方法必須由 method_idx 遞增排序。 虛擬方法的 method_idx「不得」相同 導入任何直接交易方法

注意:所有元素field_idmethod_id 執行個體必須參照相同的定義類別。

編碼欄位格式

名稱 格式 說明
欄位 IDx_diff Ueb128 field_ids 清單建立索引 欄位 (包含名稱和描述元),以差異表示 從清單中前一個元素的索引中。屬性的索引 清單中的第一個元素會直接表示
access_flags Ueb128 欄位 (publicfinal、 等)。查看「access_flags」定義。

編碼方法格式

名稱 格式 說明
method_idx_diff Ueb128 method_ids 清單建立索引 方法 (包含名稱和描述元),以差異表示 從清單中前一個元素的索引中。屬性的索引 清單中的第一個元素會直接表示
access_flags Ueb128 方法的存取旗標 (publicfinal、 等)。查看「access_flags」定義。
代碼關閉 Ueb128 從檔案開頭到 方法;如果這個方法為 abstract,則為 0native。偏移量應該位於 「data」專區。資料的格式是由 「code_item」。

type_list

參照 class_def_item 和 proto_id_item

顯示在資料部分中

對齊方式:4 個位元組

名稱 格式 說明
size Uint 清單大小,以項目表示
清單 類型_項目 [size] 清單的元素

type_item 格式

名稱 格式 說明
type_idx Ushort 編入 type_ids 清單

code_item

從 encoded_method 參照

顯示在資料部分中

對齊方式:4 個位元組

名稱 格式 說明
暫存器大小 Ushort 此代碼使用的暫存器數量
ins_size Ushort 呼叫此方法 程式碼的
outs_size Ushort 傳出引數空間的數量 用於方法叫用的程式碼
嘗試大小 Ushort 這個執行個體的 try_item 數量。如果數值不是零 那麼這些內容會顯示為 tries 陣列,緊接在 執行個體中的 insns
debug_info_off Uint 從檔案開頭到偵錯資訊的偏移值 (行號 + 本地變數資訊) 序列,或 0 (如果) 就不會出現任何資訊偏移值 (如果不是零) 移到 data 區段中的位置。 這項資料是由「debug_info_item」指定。
insns_size Uint 操作說明清單的大小 (以 16 位元程式碼單位為單位)
旅舍 ushort[insns_size] 實際的位元碼陣列。insns 中的程式碼格式 陣列是由隨播文件指定 Dalvik 位元碼。注意事項 儘管這是 ushort 的陣列,但 一些內部結構,建議採用四位元組對齊。另外, 如果嘗試切換的檔案名稱 只對個別ushort執行個體進行處理,而非在 大型的內部結構體。
padding ushort (選用) = 0 設定兩個位元組的邊框間距,讓 tries 以四位元組對齊。 只有在 tries_size 不是零時,才會顯示這個元素 和「insns_size」是奇數。
嘗試 try_item[tries_size] (選填) 陣列,用於指出擷取程式碼例外狀況的位置,並 如何處理這類事件陣列中的元素不得重疊 且順序由低至高排列。這個元素只是 如果 tries_size 不是零,就顯示這個引數。
處理常式 encoded_catch_handler_list(選用) 位元組,代表擷取類型清單和相關 處理常式位址。每個 try_item 都有位元組偏移值 歸入這個結構這個元素只會在 tries_size 不是零。

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 的起始值。

編碼的_catch_handler_list 格式

名稱 格式 說明
size Ueb128 清單大小
清單 已編碼的 catch_handler[handlers_size] 直接表示的處理常式清單,直接表示 (而非位移) 並依序串連

編碼的_catch_handler 格式

名稱 格式 說明
size Sleb128 擷取的擷取類型數量如果值不是正數,則代表 捕獲類型數量的負數,然後接手 由通用處理常式處理例如:0size 表示有全部通用但沒有明確輸入的漁獲。 2size 表示 沒有全部共通的拼圖。還有 -1size 意味著它和所有接收者都買了一串美食
處理常式 編碼類型_addr_pair[abs(size)] 串流 abs(size) 個已編碼項目,每個被抓到一個項目 和類型的測試順序。
全部接收 uleb128(選用) 全部接收處理常式的位元碼位址。這個元素只是 如果 size 不是正數,則顯示預設值。

編碼類型_addr_pair 格式

名稱 格式 說明
type_idx Ueb128 編入type_ids清單中 要擷取的例外狀況
addr Ueb128 關聯例外狀況處理常式的位元碼位址

偵錯資訊項目

從 code_item 參照

顯示在資料部分中

對齊:無 (與位元組對齊)

每個 debug_info_item 都會定義以 DWARF3 為靈感的位元組編碼 會發出 和 (可能) code_item。序列開頭是長度不定 標頭 (長度視方法的數目而定) 參數),後面接著狀態機器位元碼,最後為 輸出為 DBG_END_SEQUENCE 位元組

狀態機器包含五個暫存器。 address 暫存器代表 以 16 位元程式碼單位表示 insns_item。 「address」註冊作業將於每次開始時 0 開始 debug_info 序列,且只能單調遞增。 line 暫存器代表哪個來源行號 必須與由 發出的下一個位置表項目相關聯 共用狀態機器會在序列標頭中初始化,因此 的正向或負向變化,但不得小於 1source_file 暫存器代表 項目編號項目參照的來源檔案。初始化為 class_def_itemsource_file_idx 的值。 其他兩個變數:prologue_endepilogue_begin,是布林旗標 (初始化為 false),指出是否排放下一個位置 應視為方法前瞻性或根狀狀態機器 還必須追蹤最後一個本機變數的名稱和類型 都會註冊 DBG_RESTART_LOCAL 代碼。

標頭如下:

名稱 格式 說明
行開始 Ueb128 狀態機器 line 暫存器的初始值。 不代表實際職位。
參數_大小 Ueb128 經過編碼的參數名稱數量。應該會 每個方法參數一個 (不包括執行個體方法的 this) 會很有幫助
參數名稱 uleb128p1[參數_大小] 方法參數名稱的字串索引。編碼值 NO_INDEX 表示沒有名稱 屬性都可用。類型描述元 和簽章都隱含在方法描述元及簽章中。

位元組代碼值如下:

名稱 格式 引數 說明
資料庫 G_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_idxtype_idx 可能是 NO_INDEX 表示值不明。
資料庫 G_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_idxtype_idxsig_idx可能是 NO_INDEX 來表示這是未知的值。(如果 sig_idx 是 但是 -1,相同的資料可能更多 更有效率地利用運算程式碼 DBG_START_LOCAL)。

注意:請參閱下文的討論內容: 「dalvik.annotation.Signature」深入瞭解 來處理簽章。

資料庫 G_END_LOCAL 0x05 uleb128 register_num register_num:包含本機的註冊 將目前使用中的本機變數標示為超出範圍 地址
DBG_RESTART_LOCAL 0x06 uleb128 register_num register_num:註冊即可重新啟動 會在目前的地址中重新導入本機變數。名稱 和類型會與指定區域的最後一個本機名稱 註冊。
資料庫 G_SET_PROLOGUE_END 0x07 (無) 設定 prologue_end 狀態機器暫存器 表示應新增的下一個位置項目 都考慮到方法的結束 (這是 方法中斷點)。「prologue_end」暫存器為 遭到任何特殊 (>= 0x0a) 運算碼清除。
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。請見下方說明。

特殊 Ocode

值介於 0x0a0xff 之間的運算碼 (包含) 同時移動 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)

Annotation_directory_item

參照自 class_def_item

顯示在資料部分中

對齊方式:4 個位元組

名稱 格式 說明
class_annotations_off Uint 從檔案開頭到直接加上的註解 如果類別沒有直接註解,則傳回 0。 偏移值 (如果不是零) 應位於 「data」專區。指定資料格式 來自「annotation_set_item」。
欄位大小 Uint 這個項目加註的欄位數量
Annotationd_methods_size Uint 這個項目加註的方法數量
Annotationd_parameters_size Uint 方法參數的數量清單以這個項目註解
欄位註解 field_annotation[fields_size] (選用) 相關聯的欄位註解清單。清單的元素必須 目前是依 field_idx 遞增排序。
方法註解 method_annotation[methods_size] (選用) 相關聯的方法註解清單。清單的元素必須 目前是依 method_idx 遞增排序。
參數註解 parameter_annotation[parameters_size] (選用) 相關聯的方法參數註解清單。當 清單必須以 method_idx 為遞增順序排序。

注意:所有元素field_idmethod_id 執行個體必須參照相同的定義類別。

column_annotation 格式

名稱 格式 說明
欄位 IDx Uint 將所需身分寫入 field_ids 清單 註解欄位
註解關閉 Uint 從檔案開頭到註解清單的偏移值 這個欄位。偏移值應位於 data 中的位置 專區。資料的格式是由 「annotation_set_item」。

method_annotation 格式

名稱 格式 說明
method_idx Uint 將所需身分寫入 method_ids 清單 註解的方法
註解關閉 Uint 從檔案開頭到註解清單的偏移值 方法。偏移量應該位於 「data」專區。資料的格式是由 「annotation_set_item」。

「parameter_annotation 格式」

名稱 格式 說明
method_idx Uint 將所需身分寫入 method_ids 清單 方法,其中包含要為參數加上註解的方法
註解關閉 Uint 從檔案開頭到註解清單的偏移值 方法參數。偏移量應該位於 「data」專區。資料的格式是由 「annotation_set_ref_list」。

action_set_ref_list

從 parameters_annotations_item 參照的

顯示在資料部分中

對齊方式:4 個位元組

名稱 格式 說明
size Uint 清單大小,以項目表示
清單 asset_set_ref_item[size] 清單的元素

action_set_ref_item 格式

名稱 格式 說明
註解關閉 Uint 從檔案開頭到參照註解集的偏移值 或 0 (如果此元素沒有註解)。 偏移值 (如果不是零) 應位於 data 中的位置 專區。資料的格式是由 「annotation_set_item」。

action_set_item

參照自 Annotation_directory_item、field_annotations_item、 method_annotations_item 和 annotation_set_ref_item

顯示在資料部分中

對齊方式:4 個位元組

名稱 格式 說明
size Uint 資源大小,
項目 asset_off_item[size] 組合的所有元素。元素必須以新順序排序 上傳者:type_idx

action_off_item 格式

名稱 格式 說明
註解/關閉 Uint 從檔案開頭到註解。 偏移值應該位於 data 區段的位置, 該位置的資料格式則是由 「annotation_item」。

<註解項目>

從 annotation_set_item 參照

顯示在資料部分中

對齊:無 (與位元組對齊)

名稱 格式 說明
顯示設定 Ubyte 此註解的預期顯示設定 (請見下方)
Annotation 已編碼的註解 編碼的註解內容,格式為 「encoded_annotation 格式」低於 「encoded_value 編碼」。

瀏覽權限值

這些是 中 visibility 欄位的選項 annotation_item:

名稱 說明
VISIBILITY_BUILD 0x00 且只會在建構時間顯示 (例如在編譯期間) 其他程式碼)
VISIBILITY_RUNTIME 0x01 預計在執行階段顯示
可視性_系統 0x02 但只有基礎系統才會顯示 (而非一般使用者程式碼)

已編碼的陣列項目

參照自 class_def_item

顯示在資料部分中

對齊:無 (與位元組對齊)

名稱 格式 說明
已編碼的陣列 表示已編碼陣列值的位元組 (採用指定格式) 依據「encoded_array格式」低於「encoded_value」 編碼」。

hideapi_class_data_item

本節包含各類別使用之受限介面的相關資料。

注意: Android 10.0 推出隱藏的 API 功能 ,僅適用於啟動類別路徑中類別的 DEX 檔案。 日後推出的版本可能會擴增下列旗標清單 。若需更多資訊,請參閲 非 SDK 介面的限制

名稱 格式 說明
size Uint 這個區塊的總大小
偏移 uint[] class_idx 建立索引的偏移陣列。 索引 class_idx 的零陣列項目是指 這個「class_idx」沒有任何資料,或所有隱藏的 API 則為零 否則,陣列項目不是零,並含有 隱藏 API 標記的陣列 這個class_idx
flag uleb128[] 每個類別的隱藏 API 標記陣列串聯。 下表說明可能的旗標值。 旗標的編碼順序與欄位和方法相同 進行編碼。

限制標記類型:

名稱 說明
許可清單 0 可自由使用,且由 Google 支援的介面 官方記錄的 Android 架構 套件索引
可疑項目清單 1 無論應用程式的 目標 API 級別
列入黑名單 2 無論應用程式的 目標 API 級別。 存取上述其中一種介面會導致 執行階段錯誤
Greylist-max-o 3 可用於 Android 8.x 以下版本的非 SDK 介面 除非受到限制
灰色清單-max-p 4 可用於 Android 9.x 的非 SDK 介面 除非受到限制
灰色清單-max-q 5 可用於 Android 10.x 的非 SDK 介面 除非受到限制
Greylist-max-r 6 可用於 Android 11.x 的非 SDK 介面 除非受到限制

系統註解

系統註解可用於表示各種反射程序 類別 (以及方法和欄位) 的相關資訊。這是 通常只會由用戶端 (非系統) 程式碼間接存取。

系統註解在 .dex 檔案中會顯示為 顯示設定為 VISIBILITY_SYSTEM 的註解。

dalvik.annotation.AnnotationDefault

顯示在註解介面中的方法上

每個項目都會附加 AnnotationDefault 註解 註解介面,用於表示預設繫結。

名稱 格式 說明
註解 此註解的預設繫結,以註解表示 註解不需包含由 註解;只有缺少預設值時,才會有預設值。

dalvik.annotation.EnclosingClass

出現在課堂上

每個類別都會附加 EnclosingClass 註解 定義為其他類別的成員、個別類別,或 未在方法主體中定義 (例如合成 內部類別)。凡是含有這項註解的類別,也都必須有 InnerClass 註解。此外,類別也不得含有 EnclosingClassEnclosingMethod 註解。

名稱 格式 說明
類別 是最嚴格範圍限制這個類別的類別

dalvik.annotation.EnclosingMethod

出現在課堂上

每個類別都會附加 EnclosingMethod 註解 該程式碼是在方法主體中定義具備上述條件的所有課程 註解也必須有 InnerClass 註解。 此外,類別不得同時有 EnclosingClass 以及 EnclosingMethod 註解

名稱 格式 說明
方法 如何從容錯範圍限制這個類別

dalvik.annotation.InnerClass

出現在課堂上

每個類別都會附加 InnerClass 註解 這項定義位於其他類別定義的詞術範圍中 包含此註解的任何類別也必須同時具備 EnclosingClass 註解 EnclosingMethod 註解。

名稱 格式 說明
name 字串 原本宣告的這個類別簡單名稱 (不包含任何 套件前置字元)。如果此類別為匿名,則名稱會是 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() 等方法 如果沒有相關資訊,則會在執行階段返回預設行為。

加入參數中繼資料時,編譯器必須包含資訊 ,因為參數中繼資料 包含參數是否為合成或強制性。

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」也不會提供 類型註解接收器參數不存在於實際方法中 簽章。

名稱 格式 說明
名稱 String[] 相關方法的正式參數名稱。陣列 不得為空值,如果沒有正式參數,則不得為空白。以下 如果具有該索引的正式參數沒有名稱,則陣列必須為空值。
如果參數名稱字串空白或包含「.」、「;」、「[」或「/」再按 java.lang.reflect.MalformedParametersException 將於以下時間擲回 執行階段。
accessFlags 整數 [] 相關方法正式參數的存取旗標。 陣列不得為空值,但如果沒有正式參數,則不得為空白。
值是採用下列值的位元遮罩:
  • 0x0010 :最後,參數宣告最終
  • 0x1000: 合成,由編譯器引入 參數
  • 0x8000:已授權,參數為合成資料,但也由語言暗示 規格
,瞭解如何調查及移除這項存取權。 如果未在這個組合之外設定任何位元, java.lang.reflect.MalformedParametersException 會在執行階段擲回。

dalvik.annotation.Signature

出現在類別、欄位及方法中

每個類別都會附加 Signature 註解 欄位或方法,按較複雜型別定義的 而不是以 type_id_item 代表。 .dex 格式未定義簽名的格式;該資料來源 只是用來代表來源的任何簽名 就必須成功導入該語言的 語意因此,系統通常不會剖析 (或驗證) 簽名 實際操作簽名就交給我們 。使用 因此撰寫時應該不必在 只接收有效簽章 (明確受到保護) 的假設 無法完全預測 無效的簽名。

因為簽章字串常有大量重複的內容 Signature註解是定義為陣列的 字串,其中重複元素自然是指 基礎資料,簽章則會成為 陣列中的所有字串提取方式沒有規則 將簽章分割成獨立的字串;完全取決於 可產生 .dex 檔案的工具

名稱 格式 說明
String[] 此類別或成員的簽章,形式為 將容器串連起來

Dalvik.annotation.Throws

顯示在方法上

Throws 註解附加至每個方法 並宣告一或多個例外狀況類型

名稱 格式 說明
類別 [] 擲回的例外狀況類型陣列