에러상황 : 해당기기는 OS Versioni:16 / 앱 minVersion:16 / 테스트가 잘 안되어 있는 OS 대상으로 앱을 실행한 결과 앱이 죽는 현상 발생 . 에러문구는 아래와같다.
"Cause by : java.lang.ClassNotFoundException: com.google.firebase.provider.FirebaseInitProvider"
- 문제접근 방향: DEX 의 제한성과 연관이 있다고 판단함
- 이유 : DEX(Dalik Executable) 기본 제약조건은 65,563 가지의 방법으로 코드의 양(SDK , 라이브러리 , 프레임 워크 와 같은 모든 메소드)을 고정한다.
이때 모든 코드의 양이 위의 고정값을 초과하였을때 나머지 초과되는 부분을 컴파일 하지 않아서 위에서 찾을 수 없다고 생긴 에러이다.
그래서 MultiDex 를 제안 해제를 활성화 시키면 고정값 이상을 열어주는 것 이기 때문에 모든 부분을 컴파일 시켜서 찾지 못한다는 에러를 잡아 줄 수 있다고 생각함
- 해결방법 :
< 1. app : build.gradle > 아래의 라이브러리 추가===============
dependencies {
...
implementation 'com.android.support:multidex:1.0.1'
...}
< 2. app : build.gradle > 코드추가==========================
defaultConfig {
...
multiDexEnabled true
...
}
< 3. AndroidManifest.xml > 코드추가======================
<application
...
android:name="android.support.multidex.MultiDexApplication">
...<application>
위의 3. 에서 이미 개인의 커스텀 Application 이 이미 있는 경우가 있다. 그래서 위의 코드를 추가할 곳이 없다. 이때에는 당황하지 않고, 해당 클래스로 들어간다.
예를 들어 android:name="android.test.BaseApplication" 이라고 하면 BaseApplication 클래스로 들어가서
BaseApplication 의 상속을 받고있는(아마 기본적으로 Application 을 받고 있을것이다.) 여기서
Application 을 MultiDexApplication 으로 바꿔주면 된다.
public class BaseApplication extends MultiDexApplication {
...
}
이상태로 MultiDex 를 제대로 활성화 시켜주면 위의 문제는 해결된다.
* 여기서잠깐! MultiDex 란???
- Dex 란??
- 안드로이드 응용프로그램은 .dex 파일로 컴파일된다. .dex 파일은 차례로 단일 .apk 파일로 압축된다.
DVM (Dalvik Virtual Machine) 은 .dex 파일을 사용하여 바이트 코드를 실행하는 구조로 되어있음.
- Dalvik 이란(Dalvik 가상머신)??
- JAVA 는 OS 위에 바로 돌아가는 다른언어와 달리 소스코드->(변환)->바이트코드->(변환)->OS 위에 존재하는 VM을 기반으로 작동한다.
즉, OS 와 VM 이어주는 역할을 하는 응용프로그램이 Dalvik 이다. 현재는 안드로이드4.4.4(킷캣) 버전 이전의 플렛폼에적용(이후 부터는 ART(Android Run Time)
적용 되어있다.)되어있다.
- Dalvik 장점 :
- 그때 그때 앱을 컴파일 해서 어플을 실행시킨다. 그래서 다양한 기기에 대한 호환성이 높다는 장점이 있다.
- Dalvik 단점 :
- 앱 실행시 컴파일-> CPU -> 사용증가 -> 배터리사용 ->성능저하 라는 단점이 있다.
-끝-