Cara mengaktifkan multidexing dengan pustaka dukungan Android Multidex baru

142

Saya ingin menggunakan pustaka dukungan Multidex baru untuk melanggar batas metode untuk salah satu aplikasi saya.

Dengan Android Lollipop Google memperkenalkan perpustakaan dukungan multidex yang membuatnya mudah untuk multidex.

Langkah apa yang diperlukan untuk menggunakan perpustakaan ini dan membangun aplikasi saya dengan dukungan multidex?

Janusz
sumber
multidex mendukung perpustakaan pihak ketiga ke aplikasi Anda
Keshav Gera

Jawaban:

293

Edit:

Android 5.0 (API level 21) dan lebih tinggi menggunakan ART yang mendukung multidexing. Oleh karena itu, jika Anda minSdkVersionberusia 21 atau lebih tinggi, pustaka dukungan multidex tidak diperlukan.


Ubah Anda 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'
}

Jika Anda menjalankan tes unit, Anda ingin memasukkan ini ke dalam Applicationkelas Anda :

public class YouApplication extends Application {

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

}

Atau hanya membuat applicationkelas Anda diperluasMultiDexApplication

public class Application extends MultiDexApplication {

}

Untuk info lebih lanjut, ini adalah panduan yang bagus.

Chad Bingham
sumber
2
Jika Anda menggunakan alat build baru namun ini jelas cara untuk pergi.
Janusz
1
@ jem88 Anda memperbarui grader Anda menjadi 1,0 ?? Anda harus menggunakan 2.2. + (Lihat di Anda gradle-wrapper.properties) Poin utama: 1 buildToolsVersion Anda harus 21.1.1 atau lebih tinggi. 2 tambahkan multiDexEnabled trueke konfigurasi default Anda dari build.gradle Anda (perhatikan tidak ada =) 3 tambahkan'com.android.support:multidex:1.0.0'
Chad Bingham
3
Bagaimana kalau kita tidak menggunakan kelas aplikasi? Apakah menambahkan android:name="android.support.multidex.MultiDexApplication"ke applicationtag sudah AndroidManifest.xmlmencukupi?
Buddy
1
kompilasi 'com.android.support:multidex:1.0.1' tidak diperlukan dalam 23
Naveed Ahmad
3
@NaveedAhmad, menurut docs pengembang google: ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'.
Sakiboy
44

Langkah-langkah berikut diperlukan untuk memulai multi dexing:

Tambahkan android-support-multidex.jar ke proyek Anda. Guci dapat ditemukan di folder Android SDK Anda / SDK / ekstra / Android / dukungan / multidex / perpustakaan / libs

Sekarang Anda membiarkan aplikasi kelas aplikasi Anda memperpanjang MultiDexApplication

public class MyApplication extends MultiDexApplication

atau Anda mengganti attachBaseContext seperti ini:

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

Saya menggunakan pendekatan override karena itu tidak mengacaukan dengan hierarki kelas dari kelas aplikasi Anda.

Sekarang aplikasi Anda siap menggunakan multi dex. Langkah selanjutnya adalah meyakinkan gradle untuk membangun apk multi-dexed. Tim alat build sedang berupaya mempermudah ini, tetapi untuk saat ini Anda perlu menambahkan yang berikut ini ke bagian android dari build.gradle aplikasi Anda

   dexOptions {
      preDexLibraries = false
   }

Dan berikut ini ke bagian umum aplikasi Anda build.gradle

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

Info lebih lanjut dapat ditemukan di blog Alex Lipovs .

Janusz
sumber
9
bagaimana saya bisa menggunakan ini tanpa gradle?
lacas
3
@ Janusz apakah mungkin menggunakan opsi multidex tanpa gradle?
Devrim
1
Saya rasa ini tidak mungkin tanpa gradle.
Janusz
5
Apa yang diperbaiki dengan Eclipse Ant, bukan gradle?
portfoliobuilder
Proyek saya tidak membuat file gradle, saya membuat satu dan mengikuti langkah Anda, tetapi itu tidak berfungsi untuk saya
BaDo
16

SIMPLY, untuk mengaktifkan multidex, Anda harus ...

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'
}

Anda juga harus mengubah file manifes Anda. Dalam manifes Anda, tambahkan kelas MultiDexApplication dari pustaka dukungan multidex ke elemen aplikasi seperti ini

<?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>
smoothumut
sumber
1
Ini tidak akan memungkinkan multi dexing. Anda masih melewatkan kelas aplikasi.
Chad Bingham
1
Terima kasih atas komentarnya, Ini berhasil untuk kasus saya. Berikut ini tautan yang saya dapatkan referensi dari developer.android.com/tools/building/multidex.html
smoothumut
1
Ya benar. Sepertinya Anda tidak perlu memilikinya di kelas aplikasi kecuali Anda menjalankan tes.
Chad Bingham
Saya tidak mendapatkan ini .. Manifes aplikasi saya sudah memiliki tag nama. Saya tidak berpikir saya akan menggantinya dengan android:name="android.support.multidex.MultiDexApplication Tolong bimbing saya ..
mboy
1
@ mboy: Tidak, MainActivity dan kelas aplikasi berbeda. Ketahui lebih lanjut tentang kelas aplikasi di sini: rominirani.com/android-aplikasi-kelas
akshay7692
9

Di build.gradle Anda tambahkan dependensi ini:

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

lagi di file build.gradle Anda tambahkan baris ini ke blok defaultConfig :

multiDexEnabled true

Alih-alih memperluas kelas aplikasi Anda dari Aplikasi , tambahlah dari MultiDexApplication ; Suka :

public class AppConfig extends MultiDexApplication {

sekarang kamu baik untuk pergi! Dan jika Anda membutuhkannya, yang diperlukan MultiDexApplicationhanyalah

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

build.gradle

multiDexEnabled true
implementation 'androidx.multidex:multidex:2.0.1'

AndroidManifest.xml

<application
    android:name="androidx.multidex.MultiDexApplication"
Isaak Osipovich Dunayevsky
sumber
3

Langkah 1: Ubah build.grade

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

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

Langkah 2: Pengaturan pada kelas Aplikasi

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

Langkah 3: Ubah grade.properties

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

Itu akan berhasil !. Terima kasih.

sonnv1368
sumber
Saya mendapatkan "Tidak dapat menemukan simbol untuk MultiDex". Adakah yang pernah mengalami masalah ini sebelumnya?
Aung Myint Thein
2

Berikut ini adalah pendekatan terbaru pada Mei 2020, dengan Android X.

Untuk minSdk> = 21

Anda tidak perlu melakukan apa pun. Semua perangkat ini menggunakan Android RunTime (ART) VM, yang mendukung multidex secara asli.

Untuk minSdk<21

Di tingkat modul Anda build.gradle, pastikan bahwa konfigurasi berikut diisi:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

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

Kemudian, src/main/AndroidManifest.xmlkebutuhan Anda untuk menyatakan MultiDexApplicationsebagai application:name:

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

Tambahkan ke AndroidManifest.xml:

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

ATAU

MultiDex.install(this);

dalam metode attachBaseContext Aplikasi kustom Anda

atau Aplikasi kustom Anda memperpanjang MultiDexApplication

tambahkan multiDexEnabled = true di build.gradle Anda

defaultConfig {
    multiDexEnabled true
}

dependencies {
    compile 'com.android.support:multidex:1.0.0'
    }
}
Malik Abu Qaoud
sumber
@Harsha tidak disarankan untuk menggunakan ini tetapi cobalah untuk menambahkan largeHeap ke file manifes Anda <application android: largeHeap = "true"> </application>
Malik Abu Qaoud
android: largeHeap = "true" android: allowBackup = "true" ditambahkan keduanya
Harsha
tambahkan ini ke file gradle >>>>>>>>> dexOptions {javaMaxHeapSize "4g"}
Malik Abu Qaoud
1

Pertama, Anda harus mencoba dengan Proguard (Ini membersihkan semua kode yang tidak terpakai)

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'
        }
    }
}
Moises Apaza Q
sumber
0

Jika Anda ingin mengaktifkan multi-dex dalam proyek Anda, maka cukup buka gradle.builder

dan tambahkan ini di dependencie Anda

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

maka Anda harus menambahkan

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

// Enabling multidex support.
multiDexEnabled true}

Kemudian buka kelas dan perluas ke Aplikasi Jika aplikasi Anda menggunakan memperluas kelas Aplikasi, Anda dapat mengganti metode oncrete () dan memanggil

   MultiDex.install(this) 

untuk mengaktifkan multidex.

dan akhirnya tambahkan ke manifes Anda

 <?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> 
pavel
sumber
1
Apa gradle.builder?
Chad Bingham
file gradle Anda yang terletak di proyek studio android Anda
pavel
0

Semua jawaban di atas luar biasa

Juga tambahkan ini jika tidak aplikasi Anda akan mogok seperti milik saya tanpa alasan apa pun

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
Abhishek Mathur
sumber
0

Dengan Androidx, pustaka dukungan klasik tidak lagi berfungsi.

Solusi sederhana adalah dengan menggunakan kode berikut

Dalam build.gradlefile Anda

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

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

Dan dalam manifes Anda cukup tambahkan atribut nama ke tag aplikasi

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

Jika aplikasi Anda menargetkan API 21 atau di atas multidex diaktifkan secara default.

Sekarang jika Anda ingin menyingkirkan banyak masalah yang Anda hadapi mencoba untuk mendukung multidex - coba dulu menggunakan kode menyusut dengan pengaturan minifyEnabled true.

mayank1513
sumber
-2

hanya menambahkan potongan ini di build.gradle juga berfungsi dengan baik

android {
   compileSdkVersion 22
   buildToolsVersion "23.0.0"

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

         **// Enabling multidex support.
         **multiDexEnabled true****
     }
}
Chirag Thummar
sumber
-5

Multi_Dex.java

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