- Javaソースコードのコンパイル:javacを介してソースコードを.classファイルにコンパイルします
- マルチDEX下請け:スクリプトは、特定のルールに従ってクラスをメインdexとセカンダリdexに分割し、構成ファイルを生成します
- Proguardの最適化と難読化:.classファイルを圧縮、最適化、難読化する
- 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の下請けプロセス
- manifest_keep.txtを生成して
、AndroidManifest.xml内のすべてのコンポーネントクラス(Activity、Service、Receiver、ContentProviderを含む)を解析します。これらのクラスは、Applicationエントリクラスと一緒にmanifest_keep.txtファイルに配置されます。 - majorexlist.txtファイル
を生成するmainfest_keep.txtですべてのクラスの直接参照されているクラスを見つけ、majorexlist.txtに保存します。
パラメータを受け取るための複数のdexdxツールを生成し、maindexlist.txtファイルに含まれるすべてのクラスをメインdexにコンパイルし、他のdexを生成します。
MutiDexの読み込み原理
BaseDexClassLoader(findClass)
|
DexPathList(dexElementsをトラバース)