티스토리 뷰

아래 에러 발생시에 해결 방법

 java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 

Caused by: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 


java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:	
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:	
com.android.tools.r8.CompilationFailedException: Compilation failed to complete	
com.android.tools.r8.utils.AbortException: Error: Program type already present: com.android.vending.billing.IInAppBillingService	

 

해결 방법: 

 

multidex용 앱 구성

multidex 구성을 사용하도록 앱 프로젝트를 설정하려면 앱이 지원하는 최소 Android 버전에 따라 앱 프로젝트에서 다음 내용을 변경해야 할 수 있습니다.

minSdkVersion이 21 이상으로 설정되어 있을 경우 아래와 같이 모듈 수준의 build.gradle 파일에서 multiDexEnabled를 true로 설정하기만 하면 됩니다.

android {
    defaultConfig
{
       
...
        minSdkVersion
21
        targetSdkVersion
28
       
multiDexEnabled true
   
}
   
...
}

 

그러나 minSdkVersion이 20 이하로 설정되어 있으면 다음과 같이 multidex 지원 라이브러리를 사용해야 합니다.

  • multidex를 활성화하고 multidex 라이브러리를 종속성으로 추가할 수 있도록 아래와 같이 모듈 수준 build.gradle 파일을 변경합니다.

    android {
        defaultConfig
    {
           
    ...
            minSdkVersion
    15
            targetSdkVersion
    28
           
    multiDexEnabled true
       
    }
       
    ...
    }

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

     

  • Application 클래스 재정의 여부에 따라 다음 중 하나를 수행합니다.
    • Application 클래스를 재정의하지 않을 경우 매니페스트 파일을 편집하여 <application> 태그에서 android:name을 다음과 같이 설정합니다.

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

       

    • Application 클래스를 재정의할 경우 다음과 같이 MultiDexApplication을 확장하도록 변경합니다(해당할 경우).

      public class MyApplication extends MultiDexApplication { ... }

       

    • 또는 Application 클래스를 재정의하지만 기본 클래스를 변경할 수 없을 경우 attachBaseContext() 메서드를 재정의하고 MultiDex.install(this)을 호출하여 multidex를 활성화합니다.

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

       

앱을 빌드할 때 Android 빌드 도구는 기본 DEX 파일(classes.dex)과 지원하는 DEX 파일(classes2.dex, classes3.dex 등)을 필요에 따라 구성합니다. 그 후 빌드 시스템이 모든 DEX 파일을 APK로 패키징합니다.

런타임에서 multidex API는 특수 클래스 로더를 사용하여 (기본 classes.dex 파일)에서만 검색하는 대신) 메서드에서 사용할 수 있는 모든 DEX 파일을 검색합니다.

multidex 지원 라이브러리의 제한사항

multidex 지원 라이브러리에는 몇 가지 알려진 제한사항이 있으며, 이 라이브러리를 앱 빌드 구성에 통합할 때 이러한 제한사항을 파악하고 테스트해야 합니다.

  • 시작 중에 기기 데이터 파티션에 DEX 파일을 설치하는 작업은 복잡하며, 보조 DEX 파일이 큰 경우 ANR(Application Not Responding) 오류가 발생할 수 있습니다. 이 경우, ProGuard로 코드 축소를 적용하여 DEX 파일의 크기를 최소화하고 미사용 코드를 제거해야 합니다.
  • Dalvik linearAlloc 버그(Issue 22586) 때문에, Android 4.0(API 레벨 14) 미만의 플랫폼 버전이 실행 중인 기기에서는 multidex를 사용하는 앱이 시작되지 않을 수도 있습니다. API 레벨 14 미만을 대상으로 하는 경우, 시작 시나 특정 클래스 그룹이 로드될 때 앱에 문제가 있을 수 있으므로, 이러한 플랫폼 버전에서 테스트를 수행해야 합니다. 코드 축소는 이러한 잠재적 문제들을 줄이거나 완전히 없앨 수도 있습니다.
  • multidex 구성을 사용하는 앱이 매우 큰 메모리 할당을 요청하는 경우에는, Dalvik linearAlloc 제한(Issue 78035)으로 인해 런타임 중에 이 애플리케이션이 다운될 수도 있습니다. Android 4.0(API 레벨 14)에서는 할당 제한이 늘어났지만, Android 5.0(API 레벨 21) 미만의 Android 버전에서는 앱이 이 제한에 걸릴 수도 있습니다.

참고 : https://developer.android.com/studio/build/multidex.html?hl=ko

 

댓글

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음



Total
Today
Yesterday
최근에 달린 댓글