https://developer.android.com/studio/build/multidex?hl=ko#mdex-pre-l

https://softwaree.tistory.com/52

안드로이드 5.0(API 수준 21, Lollipop) 이전의 플랫폼 버전에서는 앱코드 실행을 위해 **Dalvik 런타임(JIT 컴파일 방식)**을 사용한다. 기본적으로 Dalvik에서는 APK당 하나의 classes.dex (Davlik Executable : .dex) 바이트 코드 파일로 앱을 제한한다. 단일 DEX 파일 내에서 참조 될 수 있는 메서드의 총 개수는 65,536(64K)개이며 여기에는 Android 프레임워크 메서드, 라이브러리 메서드, 자체 코드에 있는 메서드가 포함된다.

Untitled

앱의 minSdk가 20이하인 경우 이를 우회하려면 build.gradle 파일에서 multidex 라이브러리를 추가하고, Application 클래스에서 MultiDex.install() 메소드를 호출하면 된다. 이렇게 하면 안드로이드 시스템이 여러 개의 dex 파일을 로드하여 사용할 수 있다.

minSdkVersion이 21 이상으로 설정되면 멀티덱스가 기본적으로 사용 설정되며 멀티덱스 라이브러리가 필요하지 않습니다.

안드로이드 5.0 이상에서 멀티덱스 지원

https://thinking-face.tistory.com/entry/Android-Runtime-with-ART-AOT-JIT-DEX?category=753800

안드로이드 5.0 이상에서는 **ART(AOT 컴파일 방식)**라는 런타임을 사용하며 기본적으로 APK 파일에 여러 개의 DEX파일을 로드하는 것을 지원한다. ART는 앱 설치 시 사전 컴파일을 실행하여 classes**N**.dex파일을 스캔하고 미리 컴파일하여 Android 기기에서 실행할 수 있도록 dex2oat 도구를 사용하여 단일 OAT 파일로 컴파일한다.

하지만 이런 AOT 방식에도 단점이 있다. 앱이 클 수록 번역하는 시간도 오래 걸리는데, 주로 앱을 설치 할 때 번역하므로 설치 시간이 길어지는 문제가 있다. 또한 바이트코드를 풀어서 기계어로 쓰기 때문에 앱의 용량도 늘어난다.

Untitled

Android 7.0 (Nougat) 이후

결국은 하이브리드

AOT, JIT을 모두 활용한다. 앱을 처음 실행할 때는 무조건 JIT로 실행하여 설치 시간을 줄이고, 앱을 사용하지 않을 때 AOT로 조금씩 컴파일 한다. 이렇게 하면 설치 시간과 성능을 모두 잡을 수 있다!

Multidex를 구현하려면 앱 수준의 build.gradle 파일에서 multidex 라이브러리를 추가하고, Application 클래스에서 MultiDex.install() 메소드를 호출하면 됩니다. 이렇게 하면 안드로이드 시스템이 여러 개의 dex 파일을 로드하여 사용할 수 있습니다.

하지만 Multidex를 사용하면 빌드 시간이 오래 걸리고, 메모리 사용량이 증가할 수 있습니다. 또한 Multidex를 사용하는 앱은 기본적으로 느려질 수 있으며, 앱의 크기도 증가합니다. 따라서 사용하기 전에 장단점을 고려하여야 합니다.

하지만 안드로이드 앱을 개발할 때 64K 메소드 제한으로 인한 오류가 발생할 수 있기 때문에 Multidex를 사용하는 것이 권장됩니다. 이를 통해 앱이 크기가 커져도 안정적으로 동작할 수 있습니다.


ProGuard 및 R8

https://black-jin0427.tistory.com/89