本文件將說明 .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 |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
檔案版面配置
名稱 | 格式 | 說明 |
---|---|---|
標頭 | 標題項目 | 頁首 |
字串 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-handle
和
const-method-type
。(這些指令都會參閱
位元碼集摘要
)。在 Android 10 中,039
版本會擴充 DEX 檔案格式來納入隱藏內容
僅適用於啟動類別路徑中 DEX 檔案的 API 資訊。
注意:版本支援
Android 8.0 新增了此格式的 038
版本。版本 038
新增了位元碼
(invoke-polymorphic
和 invoke-custom
) 和
方法控制代碼
注意:支援 037
版的
該格式是在 Android 7.0 版本中新增。大多數版本 037
Android 版本都使用格式 035
的版本。只有
版本 035
和 037
的差異
新增預設方法和 invoke
的調整。
注意:至少幾個舊版的格式版本都含有
在公開的軟體發布版本中使用。例如:
009
版本用於 M3 版本的
Android 平台 (2007 年 11 月至 12 月)、
且 013
版用於 Android M5 版本
平台(2008 年 2 月至 3 月)。從多個方面來說
版本的
文件。
ENDIAN_CONSTANT 和 REVERSE_ENDIAN_CONSTANT
嵌入標頭項目
常數 ENDIAN_CONSTANT
是用來表示
找到該檔案所在檔案的結尾點。雖然標準廣告
.dex
格式較小型,導入方式可能會
執行位元組切換作業只有在導入時
endian_tag
為 REVERSE_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_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 位元值;false 和0
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 簽章 (雜湊),但
magic 、checksum 和這個欄位);二手
用於識別檔案
|
檔案大小 | 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 == 0 為 0 (許可
不尋常的極端案例)。偏移值 (如果不是零)
應該位於 string_ids 區段的開頭。
|
type_ids_size | Uint | 類型 ID 清單中的元素數量,最多 65535 個 |
type_ids_off | Uint | 從檔案開頭到類型 ID 清單,或者
如果 type_ids_size == 0 為 0 (許可
不尋常的極端案例)。偏移值 (如果不是零)
必須是 type_ids 的開頭
專區。
|
proto_ids_size | Uint | 原型 ID 清單中的元素數量,最多 65535 個 |
proto_ids_off | Uint | 從檔案開頭到原型 ID 清單的偏移值,或者
如果 proto_ids_size == 0 為 0 (許可
不尋常的極端案例)。偏移值 (如果不是零)
必須是 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 == 0 為 0 (許可
不尋常的極端案例)。偏移值 (如果不是零)
應該位於 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 代理程式碼單位 (即
|
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 | 類別的存取旗標 (public 、final 、
等)。查看「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 欄位都設為以
0 或 null )。偏移量應該位於
data 區段,資料應該會在
「encoded_array_item 」所指定的格式。檔案大小
陣列的列數不得大於 static 的數目
欄位,而且元素會對應至
static 欄位的順序與
對應 field_list 。每個陣列的類型
元素必須符合其對應欄位所宣告的類型。
如果陣列中的元素數量少於
static 欄位,接著系統會對剩餘欄位進行初始化調整
且具有類型對應的 0 或 null 。
|
call_site_id_item
顯示在「call_site_ids」部分中
對齊方式:4 個位元組
名稱 | 格式 | 說明 |
---|---|---|
call_site_off | Uint | 呼叫網站定義。偏移量應 位於資料區段中,資料則應該採用 「call_site_item」。 |
call_site_item
顯示在資料部分中
對齊:無 (位元組對齊)
call_site_item 是經過編碼的陣列項目,其中的元素會對應至引數 提供給 Bootstrap 連接器方法。前三個引數如下:
- 代表啟動連接器方法 (VALUE_METHOD_HANDLE) 的方法控制代碼。
- 啟動連結器應解析的方法名稱 (VALUE_STRING)。
- 與要解析的方法名稱類型相對應的方法類型 (VALUE_METHOD_TYPE)。
任何其他引數都是傳遞至 Bootstrap 連接器方法的常數值。這些引數 傳遞順序,且不含任何類型的轉換。
代表 Bootstrap 連接器方法的方法控制代碼必須具備傳回類型 java.lang.invoke.CallSite
。前三種參數類型如下:
java.lang.invoke.Lookup
java.lang.String
java.lang.invoke.MethodType
任何額外引數的參數類型取決於常數值。
method_handle_item
出現在 method_handles 區段
對齊方式:4 個位元組
名稱 | 格式 | 說明 |
---|---|---|
method_handle_type | Ushort | 方法控點的型別;請參閱下表 |
unused | Ushort | (未使用) |
欄位或方法 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] | 已定義的直接 (static 、private 、
或建構函式) 方法,以
編碼元素。方法必須按照
method_idx (遞增順序)。
|
virtual_methods | 編碼方法 [virtual_methods_size] | 已定義的虛擬 (static 、private 、
或建構函式) 方法,以
編碼元素。這份清單「不應」包含沿用的
方法,除非此項目代表的類別遭到覆寫。
方法必須由 method_idx 遞增排序。
虛擬方法的 method_idx 「不得」相同
導入任何直接交易方法
|
注意:所有元素field_id
和
method_id
執行個體必須參照相同的定義類別。
編碼欄位格式
名稱 | 格式 | 說明 |
---|---|---|
欄位 IDx_diff | Ueb128 | 為 field_ids 清單建立索引
欄位 (包含名稱和描述元),以差異表示
從清單中前一個元素的索引中。屬性的索引
清單中的第一個元素會直接表示
|
access_flags | Ueb128 | 欄位 (public 、final 、
等)。查看「access_flags 」定義。
|
編碼方法格式
名稱 | 格式 | 說明 |
---|---|---|
method_idx_diff | Ueb128 | 為 method_ids 清單建立索引
方法 (包含名稱和描述元),以差異表示
從清單中前一個元素的索引中。屬性的索引
清單中的第一個元素會直接表示
|
access_flags | Ueb128 | 方法的存取旗標 (public 、final 、
等)。查看「access_flags 」定義。
|
代碼關閉 | Ueb128 | 從檔案開頭到
方法;如果這個方法為 abstract ,則為 0
或 native 。偏移量應該位於
「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 | 擷取的擷取類型數量如果值不是正數,則代表
捕獲類型數量的負數,然後接手
由通用處理常式處理例如:0 的 size
表示有全部通用但沒有明確輸入的漁獲。
2 的 size 表示
沒有全部共通的拼圖。還有 -1 的 size
意味著它和所有接收者都買了一串美食
|
處理常式 | 編碼類型_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
暫存器代表哪個來源行號
必須與由 發出的下一個位置表項目相關聯
共用狀態機器會在序列標頭中初始化,因此
的正向或負向變化,但不得小於
1
。source_file
暫存器代表
項目編號項目參照的來源檔案。初始化為
class_def_item
中 source_file_idx
的值。
其他兩個變數:prologue_end
和
epilogue_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_idx 或 type_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_idx 、type_idx 或
sig_idx 可能是 NO_INDEX
來表示這是未知的值。(如果 sig_idx 是
但是 -1 ,相同的資料可能更多
更有效率地利用運算程式碼 DBG_START_LOCAL )。
注意:請參閱下文的討論內容:
「 |
資料庫 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 | (無) | 提供 line 和 address 暫存器
發出位置項目,並清除 prologue_end 和
epilogue_begin 。請見下方說明。
|
特殊 Ocode
值介於 0x0a
和 0xff
之間的運算碼
(包含) 同時移動 line
和 address
少量登錄,然後發出新的位置表項目。
遞增單位的公式如下:
DBG_FIRST_SPECIAL = 0x0a // the smallest special opcode DBG_LINE_BASE = -4 // the smallest line number increment DBG_LINE_RANGE = 15 // the number of line increments represented adjusted_opcode = opcode - DBG_FIRST_SPECIAL line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE) address += (adjusted_opcode / DBG_LINE_RANGE)
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_id
和
method_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
註解。此外,類別也不得含有
EnclosingClass
和
EnclosingMethod
註解。
名稱 | 格式 | 說明 |
---|---|---|
值 | 類別 | 是最嚴格範圍限制這個類別的類別 |
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 | 整數 [] | 相關方法正式參數的存取旗標。
陣列不得為空值,但如果沒有正式參數,則不得為空白。 值是採用下列值的位元遮罩:
java.lang.reflect.MalformedParametersException 會在執行階段擲回。
|
dalvik.annotation.Signature
出現在類別、欄位及方法中
每個類別都會附加 Signature
註解
欄位或方法,按較複雜型別定義的
而不是以 type_id_item
代表。
.dex
格式未定義簽名的格式;該資料來源
只是用來代表來源的任何簽名
就必須成功導入該語言的
語意因此,系統通常不會剖析 (或驗證) 簽名
實際操作簽名就交給我們
。使用
因此撰寫時應該不必在
只接收有效簽章 (明確受到保護) 的假設
無法完全預測
無效的簽名。
因為簽章字串常有大量重複的內容
Signature
註解是定義為陣列的
字串,其中重複元素自然是指
基礎資料,簽章則會成為
陣列中的所有字串提取方式沒有規則
將簽章分割成獨立的字串;完全取決於
可產生 .dex
檔案的工具
名稱 | 格式 | 說明 |
---|---|---|
值 | String[] | 此類別或成員的簽章,形式為 將容器串連起來 |
Dalvik.annotation.Throws
顯示在方法上
Throws
註解附加至每個方法
並宣告一或多個例外狀況類型
名稱 | 格式 | 說明 |
---|---|---|
值 | 類別 [] | 擲回的例外狀況類型陣列 |