Android MultiDexの解析と使用

4106 ワード

Android MultiDexの解析と使用
背景
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メソッド数-自分で書いたコードメソッド数
解決方法:
  • 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で次のように構成します.
  • android {
        defaultConfig {
            ...
            minSdkVersion 21 
            targetSdkVersion 25
            multiDexEnabled true
        }
        ...
    }
  • APKのminSdkが20以下の場合はmultidex support libraryを使用します.具体的には
  • 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ファイルに追加するファイルを動的に構成できます.具体的には、次のように構成されています.
  • まずmainDexに含まれるjavaファイルを構成するファイルを作成します:
  • その後build.gradleで構成します:
  • com/example/MyClass.class
    com/example/MyOtherClass.class
    android {
        buildTypes {
            release {
                multiDexKeepFile file('dex.keep')
                ...
            }
        }
    }

    以上でMultiDexの構成が完了し、65535の問題はほぼ解決しました.
    まとめ
    現在、65535を解決するには、主に次の方法があります.1.コードを削減し、apkサイズを小さくすることは、標準を治す方法ではありません.2.マルチDexテクノロジーを使用すると、このテクノロジーは冷負荷が長くなり、時には崩壊することもあります.