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 참조 제한의 해결 방법 아래 두가지가 있다
- Project Export 후 Android Stdio에서 빌드
- mainTemplate.gradle
- MultiDex 사용
- ProGuard를 이용한 방법
- https://developer.android.com/studio/build/shrink-code?hl=ko
1번 내용은 많기 때문에 유니티의 새로운 기능이며, 따로 Export하지 않아도 되는
2-2. ProGuard를 이용한 방법을 사용하겠다.
ProGuard를 사용하면 코드 난독화 / 최적화, 코드 축소를 통해 미사용 코드를 제거 하여 Dex64K를 해결 할 수 있다.
ProGuard를 사용하면 코드 난독화 / 최적화, 코드 축소를 통해 미사용 코드를 제거 하여 Dex64K를 해결 할 수 있다.
mainTemplate.gradle을 이용한 방법
참고자료
Custom Gradle template 사용
- Build System -> Gradle 선택
- mainTemplate.gradle 설정
- Custom Gradle Template 설정
PlayerSettings -> Publishing Settings -> Build / Custom Gradle Template 체크 -> User Proguard File 체크
Plugins/Android폴더 아래 mainTemplate.gradle / proguard-user File 파일이 생긴다.
// 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 # 내부클래스 원상태 유지 적용
안녕하세요 한민님 정말 큰도움 받고갑니다!! 감사드려요
답글삭제도움이 되셨다니 다행이네요~
답글삭제자주 자료 올리겠습니다~