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

2018년 8월 9일 목요일

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

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


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

발생 원인은 아래 링크 참고
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://docs.toast.com/ko/Game/Gamebase/ko/unity-started/
    2. ProGuard를 이용한 방법
      1. https://developer.android.com/studio/build/shrink-code?hl=ko

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

ProGuard를 사용하면 코드 난독화 / 최적화, 코드 축소를 통해 미사용 코드를 제거 하여 Dex64K를 해결 할 수 있다.


Custom Gradle template 사용
  1.  Build System -> Gradle 선택
  2.  mainTemplate.gradle 설정
  3.  Custom Gradle Template 설정
PlayerSettings -> Publishing Settings -> Build / Custom Gradle Template 체크 -> User Proguard File 체크


Plugins/Android폴더 아래 mainTemplate.gradle / proguard-user File 파일이 생긴다.


3. mainTemplate.gradle 파일



// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
    }
}

allprojects {
   repositories {
      flatDir {
        dirs 'libs'
      }
   }
}

apply plugin: 'com.android.application'

dependencies {
    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**'
    }

    lintOptions {
        abortOnError false
    }

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

**SIGN**
    buildTypes {
          debug {
            minifyEnabled **MINIFY_DEBUG**
            useProguard **PROGUARD_DEBUG**
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD**
              jniDebuggable true
          }
          release {
            minifyEnabled **MINIFY_RELEASE**
            useProguard **PROGUARD_RELEASE**
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'**USER_PROGUARD**
              **SIGNCONFIG**
          }
    }
**PACKAGING_OPTIONS**
}


**SOURCE_BUILD_SETUP**

4.proguard-user 파일

예제

# Begin: Debug ProGuard rules
-dontobfuscate

-keepattributes SoureFile,LineNumberTable

# End: Debug ProGuard rules

난독화 옵션
  • dontwarn 패키지명.** : 지정해서 경고 무시
  • keep class 패키지명.** : 난독화가 필요하지 않은 경우
         keep class com.example.classname : ClassNotFoundException에러나 난독화를 진행하지 않고 유지하는 옵션
  • ignorewarnings : 경고 무시
  • dontoptimize : 최적화 하지 않기
  • dontshrink : 사용하지 않는 메소드 유지
  • keepclassmembers : 특정 클래스 멤버 원상태 유지
        keepclassmembers class com.example.classname { 접근제어자 *; } : 특정 클래스의 맴버 원상태 유지
  • keepattributes : 내부 클래스 원상태 유지 적용
        keepattributes InnerClasses # 내부클래스 원상태 유지 적용

자세한 내용은 아래 링크 참조 

댓글 2개:

  1. 안녕하세요 한민님 정말 큰도움 받고갑니다!! 감사드려요

    답글삭제
  2. 도움이 되셨다니 다행이네요~
    자주 자료 올리겠습니다~

    답글삭제