구형 엘지폰에서만 오류나는 현상 조치

신형 단말기와 구형 단말기에 앱이 구동되고 있는 상황이다.
모두 엘지폰이다.
하지만 같은 소스에 로직을 수정했는데
신형 단말기는 잘되는데 구형 단말기에서 오류가 난다.

오류 수정을 위해 그동안 삽질은 스튜디오 버전을 낮춰보기도 하고  NDK 버전도 낮춰 보기도 했다.
하지만 모든게 똑 같았으며 같은 소스에 버전체크를 하면서 바이패스 코드를 넣기도 했다.
하지만 그부분만 넘어가면 또 다른 오류를 토해 냈다.

보안 때문에 MDM 및 SSL-VPN, VGuard 등에서 오류를 토해내었다.
해당 모듈의 회사는 그 이전 버전도 지원하다고 하였다.
구형 엘지폰의 API 버전은 19 였다.

문제의 해결방안이 더이상 없을 정도로 모든 경우의 수를 다 시도했으며 우리의 희망은 꺼져 가는 듯 했다.
나에게 이런 시련이 왜 닥치는걸까? 하며 원망도 했다.
하지만 회사 사무실에서는 더이상 시도할 방법이 나오질 않았다.

토요일 새벽 4시에 잠에서 깨었다.
기존에 잘되던 소스와 안되는 소스를 비교하기 시작했다.
com.android.support:multidex:1.0.0 이 추가 되었다는 걸 발견했다.

이문제는 보통 MultiDex 일명 64K 참조 문제라고 한다.
안드로이드 앱 파일(APK)에는 DEK(Dalvik Executable) 파일 형식의 실행가능한 바이트 코드가 포함이 되는데 이 파일이 단일 파일내에서 참조될 수 있는 메소드의 총 개수를 65,535개로 제한되어 나타나는 문제이다. 안드로이드 5.0(API 레벨 21) 미만에서는 multidex 지원 라이브러리로 사용하며 이상에서는 여러개 파일의 DEK 파일을 로드 하는 것을 지원한다.

1. build.gradle(Module: app)
android {
defaultConfig {
multiDexEnabled true <- 추가, API 21 이상일 경우 이것만 추가하면 됨, 하지만 이하일 경우 3번 수정해야 함
}
dexOptions {
javaMaxHeapSize = "4g" <- 최대 4기가 설정
}
}

dependencies {
compile 'com.android.support:multidex:1.0.1' <- API 21 이하일 경우 추가
}

2. gradle.properties
org.gradle.jvmargs=-Xmx5120m <- 힙 최대 사이즈 + 1024

3. AndroidManifest.xml 값 변경 <-- API 버전이 21 이하일 경우 여기 수정해야 함
    <application
        android:name="com.example.chaeseongjong.corailworkerapp.workerapp" -> android:name="android.support.multidex.MultiDexApplication"

이와 같이 하니까 오류가 나지 않고 실행이 되는 것이다.
드디어 해결의 실마리가 보이기 시작했다.
역시 문제가 해결이 되지 않을때는 잠시 쉬는게 답인거 같다.

댓글

이 블로그의 인기 게시물

한글 2010 에서 Ctrl + F10 누르면 특수문자 안뜰 때

아이폰에서 RFID 사용하는 방법

VCC 와 GND 는 무엇일까?