新しいAndroid Multidexサポートライブラリでマルチデキシングを有効にする方法


142

新しいMultidexサポートライブラリを使用して、アプリの1つに対するメソッドの制限を破りたいです。

Android Lollipopにより、Googleはmultidexを容易にするmultidexサポートライブラリを導入しました。

このライブラリを使用し、multidexをサポートするアプリをビルドするには、どのような手順が必要ですか?


アプリケーションへのmultidexサポートサードパーティライブラリ
Keshav Gera

回答:


293

編集:

Android 5.0(APIレベル21)以降では、マルチデキシングをサポートするARTを使用します。したがって、minSdkVersion21以上の場合、multidexサポートライブラリは必要ありません。


あなたの修正build.gradle

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0"

         defaultConfig {
             minSdkVersion 14 //lower than 14 doesn't support multidex
             targetSdkVersion 22

             // Enabling multidex support.
             multiDexEnabled true
         }
}

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
}

単体テストを実行している場合は、これをApplicationクラスに含める必要があります。

public class YouApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

}

または、applicationクラスを拡張するMultiDexApplication

public class Application extends MultiDexApplication {

}

詳細について、これは良いガイドです。


2
新しいビルドツールをまだ使用している場合、これは間違いなく進むべき道です。
Janusz 14

1
@ jem88あなたのgradleを1.0に更新しましたか?2.2。+を使用している必要があります(で確認してくださいgradle-wrapper.properties)重要なポイント:1 buildToolsVersionは21.1.1以降である必要があります。 2multiDexEnabled true build.gradleのdefaultConfigに追加します(aがないことに注意してください=3'com.android.support:multidex:1.0.0'
Chad Bingham

3
アプリケーションクラスを使用しない場合はどうでしょうか。タグandroid:name="android.support.multidex.MultiDexApplication"への追加applicationAndroidManifest.xml十分ですか?
バディ

1
コンパイル 'com.android.support:multidex:1.0.1'は23では必要ありません
Naveed Ahmad

3
Googleの開発者向けドキュメントによると、@NaveedAhmad: ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'
Sakiboy 2017

44

マルチデクシングを開始するには、次の手順が必要です。

android-support-multidex.jarをプロジェクトに追加します。jarファイルは、Android SDKフォルダー/ sdk / extras / android / support / multidex / library / libsにあります。

次に、アプリアプリケーションクラスにMultiDexApplicationを拡張させます。

public class MyApplication extends MultiDexApplication

または、次のようにattachBaseContextをオーバーライドします。

protected void attachBaseContext(Context base) {
 super.attachBaseContext(base);
 MultiDex.install(this);
}

オーバーライドアプローチを使用したのは、それがアプリケーションクラスのクラス階層に影響しないためです。

これで、アプリでマルチdexを使用する準備ができました。次のステップは、gradleにマルチdexのAPKを構築するように説得することです。ビルドツールチームはこれを簡単にするために取り組んでいますが、現時点では、アプリのbuild.gradleのAndroid部分に以下を追加する必要があります。

   dexOptions {
      preDexLibraries = false
   }

そして、あなたのアプリbuild.gradleの一般的な部分に続く

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

詳細については、Alex Lipovsブログをご覧ください


9
グラドルなしでこれをどのように使用できますか?
lacas

3
@Januszグラドルなしでmultidexオプションを使用することは可能ですか?
Devrim 2014年

1
グラドルなしではこれは不可能だと思います。
Janusz

5
gradleではなくEclipse Antの修正とは何ですか?
ポートフォリオ

私のプロジェクトはgradleファイルを作成しません、私はそれを作成してあなたのステップに従いましたが、それは私のために機能しません
BaDo

16

簡単に言うと、multidexを有効にするには、次のことが必要です...

android {
compileSdkVersion 21
buildToolsVersion "21.1.0"

defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 21
    ...

    // Enabling multidex support.
    multiDexEnabled true
}
...
}

dependencies {
implementation 'com.android.support:multidex:1.0.0'
}

また、マニフェストファイルを変更する必要があります。マニフェストで、multiDexApplicationクラスをmultidexサポートライブラリから次のようにアプリケーション要素に追加します

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.android.multidex.myapplication">
   <application
       ...
       android:name="android.support.multidex.MultiDexApplication">
       ...
   </application>
</manifest>

1
これはマルチデクシングを有効にしません。アプリケーションクラスがまだありません。
Chad Bingham

1
コメントをありがとう、これは私の場合にはうまくいきました。これは、developer.android.com
tools / building / multidex.html

1
ええ、あなたの権利。テストを実行している場合を除き、アプリケーションクラスに含める必要はないようです。
チャドビンガム2015

わかりません。私のアプリケーションマニフェストには既に名前タグがあります。私はそれを私に置き換えてandroid:name="android.support.multidex.MultiDexApplication くださいとは思いません..
mboy

1
@mboy:いいえ、MainActivityとアプリケーションクラスは異なります。アプリケーションクラスの詳細については、こちらをご覧ください:rominirani.com/android-application-class
akshay7692

9

build.gradleに次の依存関係を追加します。

compile 'com.android.support:multidex:1.0.1'

もう一度build.gradleファイルで、次の行をdefaultConfigブロックに追加します。

multiDexEnabled true

Applicationからアプリケーションクラスを拡張する代わりに、MultiDexApplicationから拡張します。お気に入り :

public class AppConfig extends MultiDexApplication {

これで準備完了です!そして、あなたがそれを必要とする場合、すべてMultiDexApplicationがします

public class MultiDexApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}


3

ステップ1: build.gradeを変更する

defaultConfig {
    ...
    // Enabling multidex support.
    multiDexEnabled true
}

dependencies {
    ...
    compile 'com.android.support:multidex:1.0.0'
}

ステップ2:アプリケーションクラスの設定

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        MultiDex.install(this);
    }
}

ステップ3: grade.propertiesを変更する

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

それが動作します!。ありがとう。


「MultiDexのシンボルが見つかりません」と表示されます。誰かが以前にこの問題に直面しましたか?
Aung Myint Thein

2

Android Xでの2020年5月の最新のアプローチを以下に示します。

ために minSdk > = 21

何もする必要はありません。これらのデバイスはすべて、multidexをネイティブでサポートするAndroid RunTime(ART)VMを使用します。

ために minSdk 21 <

あなたには、モジュールレベルのbuild.gradle、以下の構成が装着されていることを確認してください。

android {
    defaultConfig {
        multiDexEnabled true
    }
}

dependencies {
    implementation 'androidx.multidex:multidex:2.0.1'
}

次に、あなたのsrc/main/AndroidManifest.xmlニーズを宣言するMultiDexApplicationapplication:name

<manifest package="com.your.package"
          xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:name="androidx.multidex.MultiDexApplication" />
</manifest>

1

AndroidManifest.xmlに追加:

android:name="android.support.multidex.MultiDexApplication" 

または

MultiDex.install(this);

カスタムアプリケーションのattachBaseContextメソッド内

またはあなたのカスタムアプリケーションはMultiDexApplicationを拡張します

build.gradleにmultiDexEnabled = trueを追加します

defaultConfig {
    multiDexEnabled true
}

dependencies {
    compile 'com.android.support:multidex:1.0.0'
    }
}

@Harshaこれを使用することはお勧めしませんが、マニフェストファイルにlargeHeapを追加してみてください<application android:largeHeap = "true"> </ application>
Malik Abu Qaoud

android:largeHeap = "true" android:allowBackup = "true"が両方追加されました
Harsha

これをgradleファイルに追加します>>>>>>>>> dexOptions {javaMaxHeapSize "4g"}
Malik Abu Qaoud

1

まず、Proguardを試す必要があります(これにより、すべてのコードが使用されなくなります)

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

0

プロジェクトでmulti-dexを有効にする場合は、gradle.builderに移動します

これを依存関係に追加します

 dependencies {
   compile 'com.android.support:multidex:1.0.0'}

次に追加する必要があります

 defaultConfig {
...
minSdkVersion 14
targetSdkVersion 21
...

// Enabling multidex support.
multiDexEnabled true}

次に、クラスを開いてApplicationに拡張します。アプリでApplicationクラスを拡張して使用している場合は、oncrete()メソッドをオーバーライドして呼び出します。

   MultiDex.install(this) 

multidexを有効にします。

最後にマニフェストに追加します

 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
   ...
     android:name="android.support.multidex.MultiDexApplication">
   ...
   </application>
 </manifest> 

1
なにgradle.builder
Chad Bingham

Android StudioプロジェクトにあるGradleファイル
Pavel

0

上記のすべての答えは素晴らしいです

また、これを追加しないと、アプリは理由もなく私のようにクラッシュします

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

0

androidxでは、クラシックサポートライブラリは機能しなくなりました。

簡単な解決策は、次のコードを使用することです

あなたのbuild.gradleファイル

android{
  ...
  ...
  defaultConfig {
     ...
     ...
     multiDexEnabled true
  }
  ...
}

dependencies {
  ...
  ...
  implementation 'androidx.multidex:multidex:2.0.1'
}

そしてマニフェストで、アプリケーションタグに名前属性を追加するだけです

<manifest ...>
    <application
        android:name="androidx.multidex.MultiDexApplication"
     ...
     ...>
         ...
         ...
    </application>
</manifest>

アプリケーションがAPI 21以上をターゲットにしている場合、multidexはデフォルトで有効になっています。

ここで、multidexをサポートしようとして直面する多くの問題を取り除きたい場合は、まず設定によるコード圧縮を使用してみてくださいminifyEnabled true


-2

これをbuild.gradleに追加するだけでもうまくいきます

android {
   compileSdkVersion 22
   buildToolsVersion "23.0.0"

     defaultConfig {
         minSdkVersion 14 //lower than 14 doesn't support multidex
         targetSdkVersion 22

         **// Enabling multidex support.
         **multiDexEnabled true****
     }
}

-5

Multi_Dex.java

public class Multi_Dex extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.