วิธีเปิดใช้งาน multidexing ด้วยไลบรารีการสนับสนุน Android Multidex ใหม่


142

ฉันต้องการใช้ไลบรารีการสนับสนุน Multidex ใหม่เพื่อแบ่งขีด จำกัด วิธีสำหรับหนึ่งในแอพของฉัน

ด้วย Android Lollipop Google ได้แนะนำไลบรารีการสนับสนุนแบบหลายหน้าจอที่ทำให้ง่ายในการทวีคูณ

จำเป็นต้องใช้ขั้นตอนใดบ้างในการใช้ไลบรารีนี้และสร้างแอปของฉันด้วยการรองรับ multidex


multidex รองรับไลบรารี่ของบุคคลที่สามในแอปพลิเคชันของคุณ
Keshav Gera

คำตอบ:


293

แก้ไข:

Android 5.0 (API ระดับ 21) ขึ้นไปใช้ ART ซึ่งรองรับการทำงานแบบหลายเธรด ดังนั้นหากคุณminSdkVersionมีอายุ 21 ปีขึ้นไปไม่จำเป็นต้องใช้ไลบรารีการสนับสนุน 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

1
@ jem88 คุณได้อัพเดท gradle เป็น 1.0 ?? คุณควรอยู่ใน 2.2. + (ดูในของคุณgradle-wrapper.properties) ประเด็นสำคัญ: 1 buildToolsVersion ของคุณต้องเป็น 21.1.1 หรือสูงกว่า 2เพิ่มลงmultiDexEnabled trueใน defaultConfig ของคุณ build.gradle (สังเกตว่าไม่มี=) 3เพิ่ม'com.android.support:multidex:1.0.0'
Chad Bingham

3
ถ้าเราไม่ใช้คลาสแอพพลิเคชั่นล่ะ? เพิ่มandroid:name="android.support.multidex.MultiDexApplication"ในapplicationแท็กAndroidManifest.xmlเพียงพอหรือไม่
บัดดี้

1
รวบรวม 'com.android.support:multidex:1.0.1' ไม่จำเป็นใน 23
อาเหม็ด Naveed

3
@NaveedAhmad ตามเอกสารนักพัฒนาซอฟต์แวร์ ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'Google:
Sakiboy

44

จำเป็นต้องใช้ขั้นตอนต่อไปนี้เพื่อเริ่มการทำ dexing หลายอัน:

เพิ่ม 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 ขั้นตอนต่อไปคือการโน้มน้าวให้ผู้สร้างสร้าง apk ที่มีหลาย dexed ทีมงานเครื่องมือสร้างกำลังทำงานเพื่อทำให้สิ่งนี้ง่ายขึ้น แต่ในขณะที่คุณต้องเพิ่มสิ่งต่อไปนี้ในส่วน Android ของแอปของคุณ build.gradle

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

ข้อมูลเพิ่มเติมสามารถพบได้บนอเล็กซ์ Lipovs บล็อก


9
ฉันจะใช้สิ่งนี้ได้อย่างไร
lacas

3
@ Janusz เป็นไปได้ไหมที่จะใช้ตัวเลือก multidex โดยไม่ต้อง gradle?
Devrim

1
ฉันไม่คิดว่ามันจะเป็นไปได้หากไม่มีการไล่ระดับ
Janusz

5
Eclipse Ant fix คืออะไร
portfoliobuilder

โครงการของฉันไม่ได้สร้างไฟล์ gradle ฉันสร้างและทำตามขั้นตอนของคุณแล้ว แต่มันไม่ได้ผลสำหรับฉัน
BaDo

16

SIMPLY ในการเปิดใช้งาน 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'
}

นอกจากนี้คุณต้องเปลี่ยนไฟล์รายการ ในไฟล์ Manifest ของคุณให้เพิ่มคลาส 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
สิ่งนี้จะไม่เปิดใช้งานการทำ dexing หลายรายการ คุณยังไม่มีคลาสแอปพลิเคชัน
แช้ดบิงแฮม

1
ขอบคุณสำหรับความคิดเห็นสิ่งนี้ใช้ได้กับกรณีของฉัน นี่คือลิงค์ที่ฉันได้รับการอ้างอิงจากdeveloper.android.com/tools/building/multidex.html
smoothumut

1
ใช่แล้วคุณล่ะ ดูเหมือนว่าคุณไม่จำเป็นต้องใช้มันในคลาสแอพพลิเคชั่นของคุณเว้นแต่คุณจะทำการทดสอบ
Chad Bingham

ฉันไม่ได้รับสิ่งนี้ .. รายการแอปพลิเคชันของฉันมีแท็กชื่อแล้ว ฉันไม่คิดว่าฉันจะแทนที่ด้วย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 block:

multiDexEnabled true

แทนการขยายชั้นเรียนของคุณได้จากแอพลิเคชันขยายได้จาก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

3

นี่คือวิธีการที่ทันสมัยจนถึงเดือนพฤษภาคม 2020 พร้อม Android X

สำหรับminSdk> = 21

คุณไม่จำเป็นต้องทำอะไร อุปกรณ์เหล่านี้ทั้งหมดใช้ VM Android RunTime (ART) ซึ่งรองรับหลายระดับ

สำหรับminSdk<21

ในโมดูลระดับของคุณbuild.gradleตรวจสอบให้แน่ใจว่าการกำหนดค่าต่อไปนี้ถูกบรรจุ:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

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

จากนั้นsrc/main/AndroidManifest.xmlความต้องการของคุณจะประกาศMultiDexApplicationเป็นapplication: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

เพิ่ม multiDexEnabled = true ใน build.gradle ของคุณ

defaultConfig {
    multiDexEnabled true
}

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

@Harsha ไม่แนะนำให้ใช้สิ่งนี้ แต่ลองเพิ่ม largeHeap ไปยังไฟล์ Manifest ของคุณ <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}

จากนั้นเปิดคลาสและขยายไปยังแอปพลิเคชันหากแอปของคุณใช้ขยายคลาสแอปพลิเคชันคุณสามารถแทนที่วิธี 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

ไฟล์ gradle ของคุณซึ่งตั้งอยู่ในโครงการ android studio ของคุณ
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

เพียงแค่เพิ่ม snipped นี้ใน 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.