Cách bật multidexing với thư viện hỗ trợ Android Multidex mới


142

Tôi muốn sử dụng thư viện hỗ trợ Multidex mới để phá vỡ giới hạn phương thức cho một trong các ứng dụng của mình.

Với Android Lollipop, Google đã giới thiệu một thư viện hỗ trợ multidex giúp bạn dễ dàng truy cập multidex.

Những bước cần thiết để sử dụng thư viện này và để xây dựng ứng dụng của tôi với sự hỗ trợ của multidex?


multidex hỗ trợ thư viện bên thứ ba vào ứng dụng của bạn
Keshav Gera

Câu trả lời:


293

Biên tập:

Android 5.0 (API cấp 21) trở lên sử dụng ART hỗ trợ đa phương tiện. Do đó, nếu bạn minSdkVersiontừ 21 trở lên, thư viện hỗ trợ multidex là không cần thiết.


Sửa đổi của bạn 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'
}

Nếu bạn đang chạy thử nghiệm đơn vị, bạn sẽ muốn bao gồm điều này trong Applicationlớp của mình :

public class YouApplication extends Application {

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

}

Hoặc chỉ làm cho applicationlớp của bạn mở rộngMultiDexApplication

public class Application extends MultiDexApplication {

}

Để biết thêm thông tin, đây là một hướng dẫn tốt.


2
Nếu bạn đang sử dụng các công cụ xây dựng mới nhưng đây chắc chắn là cách tốt nhất.
Janusz

1
@ jem88 Bạn đã cập nhật gradle của bạn lên 1.0 ?? Bạn nên ở trên 2.2. + (Hãy xem trong của bạn gradle-wrapper.properties) Những điểm chính: 1 buildToolsVersion của bạn cần phải là 21.1.1 trở lên. 2 thêm multiDexEnabled truevào defaultConfig của build.gradle của bạn (chú ý không có =) 3 thêm'com.android.support:multidex:1.0.0'
Chad Bingham

3
Nếu chúng ta không sử dụng lớp ứng dụng thì sao? Là thêm android:name="android.support.multidex.MultiDexApplication"vào applicationthẻ trong AndroidManifest.xmlđủ?
Buddy

1
biên dịch 'com.android.support:multidex:1.0.1' không cần thiết trong 23
Naveed Ahmad

3
@NaveedAhmad, theo tài liệu của nhà phát triển google : ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'.
Sakiboy ngày

44

Các bước sau đây là cần thiết để bắt đầu đa dexing:

Thêm android-support-multidex.jar vào dự án của bạn. Bạn có thể tìm thấy bình trong thư mục SDK Android / sdk / ngoại tuyến / android / support / multidex / library / libs

Bây giờ bạn có thể để lớp ứng dụng của mình mở rộng MultiDexApplication

public class MyApplication extends MultiDexApplication

hoặc bạn ghi đè AttachBaseContext như thế này:

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

Tôi đã sử dụng phương pháp ghi đè vì điều đó không gây rối với hệ thống phân cấp lớp của lớp ứng dụng của bạn.

Bây giờ ứng dụng của bạn đã sẵn sàng để sử dụng đa dex. Bước tiếp theo là thuyết phục gradle xây dựng một apk đa năng. Nhóm công cụ xây dựng đang làm việc để làm cho việc này dễ dàng hơn, nhưng hiện tại bạn cần thêm phần sau vào phần android của ứng dụng build.gradle

   dexOptions {
      preDexLibraries = false
   }

Và phần sau đây cho phần chung của ứng dụng build.gradle

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

Thông tin thêm có thể được tìm thấy trên blog Alex Lipovs .


9
Làm thế nào tôi có thể sử dụng này mà không có lớp?
lacas

3
@Janusz có thể sử dụng tùy chọn multidex mà không cần gradle?
Devrim

1
Tôi không nghĩ rằng điều này là có thể mà không có lớp.
Janusz

5
Sửa lỗi Eclipse là gì, không phải lớp?
portfoliobuilder

Dự án của tôi không tạo tệp lớp, tôi đã tạo một tệp và làm theo các bước của bạn, nhưng nó không hoạt động với tôi
BaDo

16

SIMPLY, để kích hoạt multidex, bạn cần ...

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

Ngoài ra, bạn phải thay đổi tệp kê khai của bạn. Trong tệp kê khai của bạn, thêm lớp MultiDexApplication từ thư viện hỗ trợ multidex vào phần tử ứng dụng như thế này

<?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
Điều này sẽ không cho phép đa dexing. Bạn vẫn còn thiếu lớp ứng dụng.
Chad Bingham

1
Cảm ơn cho nhận xét, Điều này làm việc cho trường hợp của tôi. Đây là liên kết tôi nhận được tài liệu tham khảo từ developer.android.com/tools/building/multidex.html
smoothumut

1
À bạn đúng rồi đấy. Có vẻ như bạn không cần phải có nó trong lớp ứng dụng của mình trừ khi bạn đang chạy thử nghiệm.
Chad Bingham

Tôi không hiểu điều này .. Bản kê khai ứng dụng của tôi đã có thẻ tên. Tôi không nghĩ rằng tôi sẽ thay thế nó bằng android:name="android.support.multidex.MultiDexApplication Xin vui lòng hướng dẫn cho tôi ..
mboy

1
@mboy: Không, MainActivity và lớp ứng dụng là khác nhau. Biết thêm về lớp ứng dụng tại đây: rominirani.com/android-application- class
akshay7692 17/03/2016

9

Trong build.gradle của bạn thêm phụ thuộc này:

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

một lần nữa trong tệp build.gradle của bạn thêm dòng này vào khối defaultConfig :

multiDexEnabled true

Thay vì mở rộng lớp ứng dụng của bạn từ Ứng dụng, hãy mở rộng nó từ MultiDexApplication ; giống :

public class AppConfig extends MultiDexApplication {

bây giờ bạn tốt để đi! Và trong trường hợp bạn cần nó, tất cả MultiDexApplication

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

6

xây dựng. nâng cấp

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

AndroidManifest.xml

<application
    android:name="androidx.multidex.MultiDexApplication"

3

Bước 1: Thay đổi build.THER

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

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

Bước 2: Cài đặt trên lớp Ứng dụng

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

Bước 3: Thay đổi lớp. Sản phẩm

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

Nó sẽ hoạt động!. Cảm ơn.


Tôi đang nhận được "Không thể tìm thấy biểu tượng cho MultiDex". Bất cứ ai cũng phải đối mặt với vấn đề này trước đây?
Aung Myint Thein

2

Đây là một cách tiếp cận cập nhật kể từ tháng 5 năm 2020, với Android X.

Dành cho minSdk > = 21

Bạn không cần phải làm bất cứ điều gì. Tất cả các thiết bị này đều sử dụng máy ảo Android RunTime (ART), hỗ trợ đa chiều nguyên bản.

Dành cho minSdk <21

Trong mô-đun -level của bạn build.gradle, đảm bảo rằng các cấu hình sau được điền:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

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

Sau đó, bạn src/main/AndroidManifest.xmlcần khai báo MultiDexApplicationapplication:name:

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

1

Thêm vào AndroidManifest.xml:

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

HOẶC LÀ

MultiDex.install(this);

trong phương thức AttachBaseContext của Ứng dụng tùy chỉnh của bạn

hoặc Ứng dụng tùy chỉnh của bạn mở rộng MultiDexApplication

thêm multiDexEnables = true trong build.gradle của bạn

defaultConfig {
    multiDexEnabled true
}

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

@Harsha không nên sử dụng cái này nhưng hãy thử thêm LargeHeap vào tệp kê khai của bạn <application android: LargeHeap = "true"> </ application>
Malik Abu Qaoud

android: LargeHeap = "true" android: allowBackup = "true" được thêm cả hai
Harsha

thêm phần này vào tệp gradle >>>>>>>>> dexOptions {javaMaxHeapSize "4g"}
Malik Abu Qaoud

1

Trước tiên, bạn nên thử với Proguard (Điều này làm sạch tất cả các mã không sử dụng)

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

Nếu bạn muốn kích hoạt multi-dex trong dự án của mình thì chỉ cần truy cập gradle.builder

và thêm phần này vào phần phụ thuộc của bạn

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

sau đó bạn phải thêm

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

// Enabling multidex support.
multiDexEnabled true}

Sau đó mở một lớp và mở rộng nó ra Ứng dụng Nếu ứng dụng của bạn sử dụng mở rộng lớp Ứng dụng, bạn có thể ghi đè phương thức oncret () và gọi

   MultiDex.install(this) 

để kích hoạt multidex.

và cuối cùng thêm vào bảng kê khai của bạn

 <?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

tập tin lớp của bạn nằm trong dự án studio android của bạn
pavel

0

Tất cả các câu trả lời ở trên là tuyệt vời

Ngoài ra, hãy thêm cái này nếu không ứng dụng của bạn sẽ bị sập như của tôi mà không có lý do

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

0

Với androidx, các thư viện hỗ trợ cổ điển không còn hoạt động.

Giải pháp đơn giản là sử dụng mã sau

Trong build.gradletập tin của bạn

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

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

Và trong tệp kê khai của bạn chỉ cần thêm thuộc tính tên vào thẻ ứng dụng

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

Nếu ứng dụng của bạn đang nhắm mục tiêu API 21 trở lên thì multidex được bật theo mặc định.

Bây giờ nếu bạn muốn loại bỏ nhiều vấn đề bạn gặp phải khi cố gắng hỗ trợ multidex - trước tiên hãy thử sử dụng thu nhỏ mã bằng cách cài đặt minifyEnabled true.


-2

chỉ cần thêm đoạn trích này trong build.gradle cũng hoạt động tốt

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);
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.