새로운 Android Multidex 지원 라이브러리로 멀티 덱싱을 활성화하는 방법


142

새로운 Multidex 지원 라이브러리를 사용하여 내 앱 중 하나의 방법 제한을 깨고 싶습니다.

Google은 Android Lollipop을 통해 멀티 덱스를 쉽게 만들 수있는 멀티 덱스 지원 라이브러리를 도입했습니다.

이 라이브러리를 사용하고 멀티 덱스 지원으로 내 앱을 빌드하려면 어떤 단계가 필요합니까?


응용 프로그램에 타사 라이브러리를 지원 multidex
Keshav 게라에게

답변:


293

편집하다:

Android 5.0 (API 레벨 21) 이상은 멀티 덱싱을 지원하는 ART를 사용합니다. 따라서 minSdkVersion21 이상인 경우 멀티 덱스 지원 라이브러리가 필요하지 않습니다.


당신의 수정 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하여 build.gradle 당신의 defaultConfig에은 (통지하지 않는이 =) (3)가 추가'com.android.support:multidex:1.0.0'
차드 빙햄

3
애플리케이션 클래스를 사용하지 않으면 어떨까요? 추가인가 android:name="android.support.multidex.MultiDexApplication"application에 태그 AndroidManifest.xml충분?
버디

1
'com.android.support:multidex:1.0.1'컴파일은 23에서 필요하지 않습니다
Naveed Ahmad

3
구글 개발자 문서에 따르면 @NaveedAhmad : ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'.
Sakiboy

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);
}

재정의 접근법을 사용했는데 응용 프로그램 클래스의 클래스 계층 구조를 망칠 수 없습니다.

이제 앱에서 멀티 덱스를 사용할 수 있습니다. 다음 단계는 gradle에게 multi dexed 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
gradle없이 어떻게 사용할 수 있습니까?
lacas

3
@Janusz는 gradle없이 multidex 옵션을 사용할 수 있습니까?
Devrim

1
나는 이것이 gradle 없이는 가능하지 않다고 생각합니다.
야누스

5
Gradle이 아닌 Eclipse Ant 수정 프로그램이란 무엇입니까?
포트폴리오

내 프로젝트는 gradle 파일을 만들지 않고 하나를 만들고 단계를 수행했지만 작동하지 않습니다.
BaDo

16

간단히, 멀티 덱스를 활성화하려면 다음을 수행해야합니다.

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

또한 매니페스트 파일을 변경해야합니다. 매니페스트에서 multidex 지원 라이브러리의 MultiDexApplication 클래스를 다음과 같이 애플리케이션 요소에 추가하십시오.

<?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
멀티 덱스를 사용할 수 없습니다. 여전히 응용 프로그램 클래스가 누락되었습니다.
채드 빙엄

1
의견에 감사드립니다.이 사건은 저의 경우에 효과적이었습니다. 저는 여기에서 참조 얻은 링크입니다 developer.android.com/tools/building/multidex.html
smoothumut

1
그래, 네 권리 테스트를 실행하지 않는 한 응용 프로그램 클래스에 필요하지 않은 것 같습니다.
채드 빙엄

나는 이것을 얻지 못한다. 내 응용 프로그램 매니페스트에는 이미 이름 태그가 있습니다. 내가 그것을 대신 할 것이라고 생각하지 말아 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

3

다음은 2020 년 5 월 현재 Android X를 사용한 최신 접근 방식입니다.

옵션 minSdk> = 21

당신은 아무것도 할 필요가 없습니다. 이러한 모든 장치는 멀티 덱스를 기본적으로 지원하는 Android RunTime (ART) VM을 사용합니다.

들어 minSdk<21

당신의에서 모듈 -level 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

build.gradle에 multiDexEnabled = true 추가

defaultConfig {
    multiDexEnabled true
}

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

@Harsha는 이것을 사용하지 않는 것이 좋지만 manifest 파일에 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

프로젝트에서 멀티 덱스를 활성화하려면 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) 

멀티 덱스를 활성화합니다.

마지막으로 매니페스트에 추가하십시오.

 <?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?
채드 빙엄

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 이상을 대상으로하는 경우 멀티 덱스는 기본적으로 활성화되어 있습니다.

이제 멀티 덱스를 지원하려고하는 많은 문제를 해결하려면 먼저 설정을 통해 코드 축소를 사용해보십시오 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.