AndroidDexファイルのコンパイルプロセス

  1. Javaソースコードのコンパイル:javacを介してソースコードを.classファイルにコンパイルします
  2. マルチDEX下請け:スクリプトは、特定のルールに従ってクラスをメインdexとセカンダリdexに分割し、構成ファイルを生成します
  3. Proguardの最適化と難読化:.classファイルを圧縮、最適化、難読化する
  4. dexファイルに変換:dx \ d8は、.classファイルをdexファイルに変換します

Androiddexコンパイルプロセス

ここに写真の説明を挿入

DEXフォーマット構造図

ここに写真の説明を挿入
詳細:DEXファイルの構造を理解するための記事が表示されます

MutiDexプロジェクトの背景

64kアプリケーションの制限: Dalvik形式への変換に失敗しました:dex:method IDを実行できません[0,0xffff]:65536
理由:
1。DexOpt最適化の制限
初期のAndroidシステムでは、DexOptは各クラスのメソッドIDを取得していました。リンクリストに存在します。リンクリストの長さはshortタイプで保存されるため、メソッドIDの数は65536を超えることはできません。
2. dalvikバイトコードの制限
Dalvikのinvoke-kind命令セット、メソッド参照の数を示すために16ビットを設定、最大値は65536、invoke-kind {vC、vD、vE、vF、vG}、meth @ BBBB

MutiDexソリューションをAndroid5.0に導入する前:Android 5.0以降
はDalvik実行可能ファイルサブパッケージサポートライブラリ
を使用してください:Android 5.0以降のバージョンはARTランタイムを使用し、後者はAPKファイルからの複数のDEXファイルのロードをネイティブにサポートします。ARTは、アプリケーションのインストール時に事前コンパイルを実行し、classesN.dexファイルをスキャンして、Androidデバイスが実行できるように単一の.oatファイルにコンパイルします。したがって、minSdkVersionが21以上の場合、Dalvik実行可能ファイルサブパッケージサポートライブラリは必要ありません。

要約すると、minSdkVersionを21以上に設定するか、下請けサポートライブラリを追加して、
build.gradleminSdkVersion
を21に変更します。

android {
    defaultConfig {
        ......
        minSdkVersion 21
        targetSdkVersion 26
        multiDexEnabled true
        versionCode 1
        versionName "1.0"
        ......
    }
    
}

下請けサポートライブラリを追加する

android {
    defaultConfig {
        ......
        minSdkVersion 15
        targetSdkVersion 26
        multiDexEnabled true
        versionCode 1
        versionName "1.0"
        ......
    }
    
dependencies {
	......
    compile'com.android.support:multidex:1.0.3'
}
    
}

アプリケーションコードの変更(2つの方法)
1。アプリケーションはMultiDexApplicationを継承します
2. MultiDex.install(this)を呼び出して、下請けを有効にします

MutiDexの下請けプロセス

  1. manifest_keep.txtを生成して
    、AndroidManifest.xml内のすべてのコンポーネントクラス(Activity、Service、Receiver、ContentProviderを含む)解析します。これらのクラスは、Applicationエントリクラスと一緒にmanifest_keep.txtファイルに配置されます。
  2. majorexlist.txtファイル
    生成するmainfest_keep.txtですべてのクラスの直接参照されているクラスを見つけ、majorexlist.txtに保存します。

  3. パラメータを受け取るための複数のdexdxツールを生成し、maindexlist.txtファイルに含まれるすべてのクラスをメインdexにコンパイルし、他のdexを生成します。

MutiDexの読み込み原理

BaseDexClassLoader(findClass)
|
DexPathList(dexElementsをトラバース)

おすすめ

転載: blog.csdn.net/yanwenyuan0304/article/details/106349219