Android MultiDexの解析と使用
4106 ワード
Android MultiDexの解析と使用
背景
Apkが反復的に更新されるにつれて、apkが一定のサイズに達すると、apkをコンパイルするときに次のエラーが発生する可能性があります.
最近のapkコンパイルで発生したエラーログは次のとおりです.
このコンパイルエラーの主な原因は、各DEXファイルのメソッド数がshortタイプ構造で保存されているため、各DEXのメソッド数のサイズが制限されているためです.Dexの主な構成:-Android FrameWorkメソッド数-Libメソッド数-自分で書いたコードメソッド数
解決方法: Android 5.0以下:Android 5.0以下はDalvik仮想マシンを使用しているため、Dalvik仮想マシンはApkが稼働している間にload Dexファイルに行くので、Googleが提供しているmultiDexのjarパッケージを使用してパケット化とパケット化を行い、Apkが起動したときにマルチdexパケット化プロセスを行うことができます. Android 5.0以上:Android 5.0以上デフォルトは実用ART仮想マシン、ART仮想マシンはDexパッケージ生成.oatファイルを直接サポートし、apk起動後にoatファイルに直接追加します.
MultiDex使用 APkのminSdkが21以上の場合、build.gradleで次のように構成します. APKのminSdkが20以下の場合はmultidex support libraryを使用します.具体的には
アプリケーションの書き換えまたは構成:1.アプリケーションを書き換えていない場合は、Android Manifest.xmlで次のように構成します.
2.アプリケーションを書き換えた場合は、以下のように継承MultiDexApplicationを直接使用できます.
MultiDexApplicationを継承せずに、直接Applicationの初期化でMultiDexを初期化することもできます
上のいくつかのステップでMultiDexの初期化が完了し、次にパケットdexの構成が完了します.
最初のdexファイルに追加するファイルを動的に構成できます.具体的には、次のように構成されています.まずmainDexに含まれるjavaファイルを構成するファイルを作成します: その後build.gradleで構成します:
以上でMultiDexの構成が完了し、65535の問題はほぼ解決しました.
まとめ
現在、65535を解決するには、主に次の方法があります.1.コードを削減し、apkサイズを小さくすることは、標準を治す方法ではありません.2.マルチDexテクノロジーを使用すると、このテクノロジーは冷負荷が長くなり、時には崩壊することもあります.
背景
Apkが反復的に更新されるにつれて、apkが一定のサイズに達すると、apkをコンパイルするときに次のエラーが発生する可能性があります.
Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
最近のapkコンパイルで発生したエラーログは次のとおりです.
trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.
このコンパイルエラーの主な原因は、各DEXファイルのメソッド数がshortタイプ構造で保存されているため、各DEXのメソッド数のサイズが制限されているためです.Dexの主な構成:-Android FrameWorkメソッド数-Libメソッド数-自分で書いたコードメソッド数
解決方法:
MultiDex使用
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 25
multiDexEnabled true
}
...
}
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 25
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
アプリケーションの書き換えまたは構成:1.アプリケーションを書き換えていない場合は、Android Manifest.xmlで次のように構成します.
"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
package="com.example.myapp">
"android.support.multidex.MultiDexApplication" >
...
2.アプリケーションを書き換えた場合は、以下のように継承MultiDexApplicationを直接使用できます.
public class MyApplication extends MultiDexApplication { ... }
MultiDexApplicationを継承せずに、直接Applicationの初期化でMultiDexを初期化することもできます
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(context);
Multidex.install(this);
}
}
上のいくつかのステップでMultiDexの初期化が完了し、次にパケットdexの構成が完了します.
最初のdexファイルに追加するファイルを動的に構成できます.具体的には、次のように構成されています.
com/example/MyClass.class
com/example/MyOtherClass.class
android {
buildTypes {
release {
multiDexKeepFile file('dex.keep')
...
}
}
}
以上でMultiDexの構成が完了し、65535の問題はほぼ解決しました.
まとめ
現在、65535を解決するには、主に次の方法があります.1.コードを削減し、apkサイズを小さくすることは、標準を治す方法ではありません.2.マルチDexテクノロジーを使用すると、このテクノロジーは冷負荷が長くなり、時には崩壊することもあります.