クラスファイルの論理構造
ファイルヘッダー
タイプ | 名前 | 量 |
---|---|---|
u4 | 魔数 | 1 |
u2 | マイナーバージョン番号 | 1 |
u2 | メジャーバージョン番号 | 1 |
マジックナンバーの唯一の機能は、これが0xCAFEBABEの固定値を持つ許容可能なクラスファイルであることを仮想マシンに通知することです。
一定のプール
タイプ | 名前 | 量 |
---|---|---|
u2 | 一定のプール数 | 1 |
cp_info | 絶え間ない | 一定のプール数-1 |
コンスタントプールはクラスファイルのリソースウェアハウスであり、多くのスペースを占有します。
定数プールコンテナのカウントは1から始まるため、定数の数はcount-1です。
cp_infoは何を保持できますか
- リテラル
- 文字列リテラル
- 最終定数の値
- プリミティブデータ型の値
- シンボル
- クラスとインターフェースの完全修飾名
- フィールド名とタイプ
- メソッド名とタイプ
cp_infoの構造
struct cp_info {
u1 tag;//类型
u1 info[]; //数据
}
复制代码
鬼ごっこ | リテラルを表します | サブディビジョン構造 |
---|---|---|
1 | ストリング | Utf8_info |
3 | 4バイト値(int) | Integer_info |
4 | 4バイト値(フロート) | Float_info |
5 | 8バイト値(フロート) | Long_info |
6 | 8バイト値(double) | Double_info |
7 | クラスとインターフェースの完全修飾名 | Class_info |
8 | タイプjava.lang.Stringの定数インスタンス | String_info |
9 | 分野 | Fieldref_info |
10 | 方法 | Methodref_info |
11 | クラスが実装するインターフェース | InterfaceMethodref_info |
12 | フィールドまたはメソッドの名前とタイプ | NameAndType_info |
15 | メソッドハンドル | MethodHandle_info |
16 | メソッドタイプ | MethodType_info |
18 | 動的呼び出し | InvokeDynamic_info |
定数プール内の文字列
struct CONSTANT_String_info{
u1 tag = 8; //固定取值8
u2 string_index;//指向某个Utf8_info在常量池中的索引
}
struct CONSTANT_Utf8_info{
u1 tag = 1; //固定取值1
u2 length;//Utf8编码的字节数组的长度
u1 bytes[length];//Utf8编码的字节数组
}
复制代码
クラス情報
タイプ | 名前 | 量 |
---|---|---|
u2 | アクセス修飾子 | 1 |
u2 | このクラス | 1 |
u2 | スーパークラス | 1 |
u2 | インターフェイス数 | 1 |
u2 | インターフェース | インターフェイス数 |
フィールドテーブル
タイプ | 名前 | 量 |
---|---|---|
u2 | フィールドテーブル数 | 1 |
field_info | 分野 | フィールドテーブル数 |
フィールドには、メソッド内のローカル変数を除いて、クラスレベルとインスタンスレベルの変数が含まれます。
メソッドテーブル(メソッドの説明を保存)
タイプ | 名前 | 量 |
---|---|---|
u2 | メソッドテーブル数 | 1 |
method_info | 分野 | メソッドテーブル数 |
属性情報
構造
- 属性名:属性値
dexファイル
クラスファイルとdexの違い
dexファイルのファイルヘッダー
struct DexHeader{
u1 magic[8];//魔数和版本号
u4 checksum;//adler32算法校验码
u1 signature[kSHA1DigestLen];//文件内容签名
u4 fileSize;//文件总大小
u4 headerSize;//文件头大小
u4 endianTag;//字节序
u4 linkSize;
u4 linkOff;
u4 mapOff;
}
复制代码
dexファイルのインデックス領域
struct DexStringId{
u4 stringDataOff;//string_data_item的文件偏移量
}
struct DexTypeId{
u4 descriptorIdx;//指向dexStringId的索引
}
struct DexFieldId{
u2 classIdx;//所在类,指向dexTypeId的索引
u2 typeIdx;//类型,指向dexTypeId的索引
u4 nameIdx;//字段名,指向dexStringId的索引
}
struct DexMethodId{
u2 classIdx;//索引到typeIds,表示所在类
u2 protoIdx;//索引到protoIds,表示方法原型
u4 nameIdx;//索引到stringIds,表示方法名
}
struct DexProtoId{
u2 shortyIdx;//索引到stringIds,表示短描述符
u2 returnTypeIdx;//索引到typeIds,表示返回值类型
u4 parametersOff;//type_list中的偏移量,参数类型
}
复制代码
インデックスエリアとデータエリア
クラスファイルとdexファイル
クラスファイル
- 各クラスには独立した定数プールがあり、冗長なコードになります
- 各クラスはファイルに属しています
- スタックベースのバイトコード
dexファイル
- 定数はデータ領域に記録され、すべてのクラスがインデックスを介して定数の値を取得し、同じ定数をマージできるため、クラスコードの冗長性が大幅に低下します。モバイルインストールパッケージのサイズを保存します。
- すべてのクラスは同じファイル内にあり、multdexであっても、ファイルの総数はクラスファイルよりもはるかに少なくなります(I / 0操作のオーバーヘッドを削減します)
- 仮想レジスタベースのバイトコード(メモリの節約)