クラスファイルとDexファイルの違い

クラスファイルの論理構造

image.png

ファイルヘッダー
タイプ 名前
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ファイル

image.png

クラスファイルとdexの違い

image.png

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中的偏移量,参数类型
    }
复制代码
インデックスエリアとデータエリア

image.png

クラスファイルとdexファイル

クラスファイル

  • 各クラスには独立した定数プールがあり、冗長なコードになります
  • 各クラスはファイルに属しています
  • スタックベースのバイトコード

dexファイル

  • 定数はデータ領域に記録され、すべてのクラスがインデックスを介して定数の値を取得し、同じ定数をマージできるため、クラスコードの冗長性が大幅に低下します。モバイルインストールパッケージのサイズを保存します。
  • すべてのクラスは同じファイル内にあり、multdexであっても、ファイルの総数はクラスファイルよりもはるかに少なくなります(I / 0操作のオーバーヘッドを削減します)
  • 仮想レジスタベースのバイトコード(メモリの節約)

おすすめ

転載: juejin.im/post/7085747632932388894