세상사는 이야기 / 도움이 되었다면 배너 클릭 부탁드려요~ →→→

2018년 6월 26일 화요일

[Unity Android] Gradle MultiDex을 이용한 Dex 64k 참조 제한 해결 방법 정리

글확인 전 아래링크부터 확인

Android 빌드 64K 참조 제한 해결 방법에 대해 정리한다.(Unity 2018.1)

발생 원인은 아래 링크 참고
https://developer.android.com/studio/build/multidex
두 오류 모두 공통 숫자인 65,536을 표시합니다. 이 숫자는 단일 DEX(Dalvik Executable) 바이트코드 파일 내에서 코드가 호출할 수 있는 참조의 총 개수를 나타냅니다. 이 페이지에서는 multidex라는 앱 구성을 활성화하여 이 제한을 넘는 방법을 설명합니다. multidex는 앱이 다중 DEX 파일을 빌드하고 읽을 수 있게 해줍니다.

64K 에러 메시지들
Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536
trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.
Error:The number of method references in a .dex file cannot exceed 64K.
Error:Execution failed for task ':app:transformClassesWithDexForRelease'.

해결 방법
64K 참조 제한의 해결 방법 아래 두가지가 있다
  1. Project  Export 후 Android Stdio에서 빌드
    1. https://developers.facebook.com/docs/audience-network/unity?locale=ko_KR
  1. mainTemplate.gradle 
    1. MultiDex 사용
      1. https://medium.com/@abhpatidar/solving-unity-dex-issue-538e134c8809
    2. ProGuard를 이용한 방법
      1. https://www.androidhuman.com/lecture/proguard/2017/02/16/reduce-method-count-with-proguard/

1번 내용은 많기 때문에 유니티의 새로운 기능이며, 따로 Export 하지 않아도 되는 2-1 MultiDex 사용하겠다.




Custom Gradle template 사용하여 해결
  1.  Build System -> Gradle 선택
  2.  mainTemplate.gradle 파일 설정
PlayerSettings -> Publishing Settings -> Build / Custom Gradle Template 체크

Custom Gradle Template 체크하면 Plugins/Android폴더 아래 파일이 생긴다.

3. mainTemplate.gradle 파일 수정
     maintemplate.gradle 새로 정리된 링크

// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
repositories {
jcenter()
maven { url "https://maven.google.com/"}
}

dependencies {
   classpath 'com.android.tools.build:gradle:2.3.0' // Unity 2018.1 : Gradle version 4.0.1    //classpath 'com.android.tools.build:gradle:3.0.1' // Unity 2018.2 : Gradle version 4.2.1
}
}

allprojects {
   repositories {
      jcenter()
      maven { url 'https://maven.google.com'}
      flatDir {
        dirs 'libs'
      }
   }
}

apply plugin: 'com.android.application'

dependencies {
    // PC에 설치 되어있는 버전을 사용(하단 그림)
    compile 'com.android.support:multidex:1.0.1'
    compile fileTree(dir: 'libs', include: ['*.jar'])
**DEPS**}

android {
    compileSdkVersion **APIVERSION**
    buildToolsVersion '**BUILDTOOLS**'

    defaultConfig {
        minSdkVersion    **MINSDKVERSION**
        targetSdkVersion **TARGETSDKVERSION**
        applicationId '**APPLICATIONID**'
        multiDexEnabled true
        ndk {
            abiFilters **ABIFILTERS**
        }
        versionCode    **VERSIONCODE**
        versionName    '**VERSIONNAME**'
    }
    dexOptions {
        javaMaxHeapSize "4g"
    }

    lintOptions {
        abortOnError false
    }

    aaptOptions {
        noCompress '.unity3d', '.ress', '.resource', '.obb'**STREAMING_ASSETS**
    }

**SIGN**
    buildTypes {
          debug {
            minifyEnabled **MINIFY_DEBUG**
            // 삭제 하지 않으면 에러 발생 
            useProguard **PROGUARD_DEBUG**      // 2018.2 수정
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD**
              jniDebuggable true
          }
          release {
            minifyEnabled **MINIFY_RELEASE**
            // 삭제 하지 않으면 에러 발생 
            useProguard **PROGUARD_RELEASE**     // 2018.2 수정
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD**
              **SIGNCONFIG**
          }
    }
**PACKAGING_OPTIONS**
}


**SOURCE_BUILD_SETUP**

필요 하다면 자신의 multidex 버전 확인
C:\Users\User\AppData\Local\Android\Sdk\extras\android\m2repository\com\android\support\multidex
  1. AndoidManidest.xml파일에 MultiDexApplication추가
    android:name="android.support.multidex.MultiDexApplication"
<application android:allowBackup="true" android:icon="@drawable/app_icon" android:label="@string/app_name" android:theme="@style/UnityThemeSelector" android:debuggable="false" android:isGame="false"
android:  -



추가 - 2019.07.25
- -https://today7e.blogspot.com/2019/07/unity-android-comandroidbuildapitransfo.html

Android Resolver 1.2.122 사용시 
mainTemplate.gradle이 아래와 같이 android.useAndroidX" true값이 들어가 있으면 빌드시 에러가 발생한다.
// Android Resolver Repos Start
([rootProject] + (rootProject.subprojects as List)).each {
    ext {
        it.setProperty("android.useAndroidX", true)
        it.setProperty("android.enableJetifier", true)
    }
}


그럴 경우 AndoidManidest.xml파일에 MultiDexApplication추가
  android:name="androidx.multidex.MultiDexApplication"

댓글 6개:

  1. 작성자가 댓글을 삭제했습니다.

    답글삭제
    답글
    1. 확인은 한번더 해야하지만 아래처럼 알고 있습니다.

      2017.1 and 2017.2 use
      Android plugin version 2.1.0
      Gradle version 2.14

      2017.4 and 2018.1 use
      Android plugin version 2.3.0
      Gradle version 4.0.1

      2018.2 uses
      Android plugin version 3.0.1
      Gradle version 4.2.1

      삭제
    2. 유니티가 깔려있는 아래 폴더를 확인해 보세요~
      Editor\Data\PlaybackEngines\AndroidPlayer\Tools\gradle\lib

      삭제
    3. 제가 질문을 잘 못 한거 같아 삭제했는데 그 사이 답을 달아주셨네요 감사합니다. 다시 확인해 보겠습니다.

      삭제
  2. 안녕하세요.
    제가 유니티 5.4.5를 사용하다가 2018로 버전업을 하였고,
    이후 빌드를 하는 중에 에러가 발생을 하였습니다.

    발생한 에러는 CommandWithNoStdoutInvokationFailure: Gradle prewarm failed. 입니다.
    그래들 빌드 관련해서 이슈인 것 같은데,
    어디서 부터 봐야 할지 난감하네요.
    도움이 될만한 것이 있을까요?

    답글삭제
    답글
    1. 2018버전이 몇인가요? 아래 링크한번 확인해보세요
      https://forum.unity.com/threads/gradle-prewarm-failed-in-unity-2018-3-3f1.620206/

      삭제