반응형
APK를 빌드하고 나서 Analyze APK를 클릭하면 위처럼 dex 파일과 디렉터리로 구성된 빌드 결과물을 확인할 수 있습니다.
그런데, 프로가드 적용 유무에 따라 이 분석 결과가 달라집니다. 무슨 연관이 있을까요?
DEX (Dalvik Executable) 파일이란?
- DEX 파일은 안드로이드 애플리케이션의 바이트코드를 담고 있는 파일입니다.
- 안드로이드는 Dalvik/ART(안드로이드 런타임)를 사용해 DEX 파일을 실행합니다.
- 모든 자바 클래스 파일(.class)들은 하나 이상의 DEX 파일로 변환되어 안드로이드 패키지(APK)에 포함됩니다.
- DEX 파일은 메모리와 성능 최적화를 위해 설계되었으며, 앱의 크기와 성능에 중요한 영향을 미칩니다.
DEX와 ProGuard의 연관성
- ProGuard가 DEX 파일 생성에 미치는 영향
- ProGuard는 코드 난독화와 최적화를 통해 APK와 DEX 파일의 크기를 줄이는 데 기여합니다.
- ProGuard를 통해 불필요한 클래스나 메서드를 제거하면, DEX 파일의 크기가 줄어듭니다.
- 난독화된 코드는 DEX 파일의 메서드 및 클래스 개수를 줄이는 효과가 있습니다. 이는 안드로이드 앱이 겪는 64K 메서드 제한(DEX 메서드 한도) 문제를 완화하는 데도 유리합니다.
- ProGuard가 없을 때 DEX의 영향
- ProGuard 없이 빌드된 DEX 파일에는 모든 클래스와 메서드가 원래 이름으로 포함됩니다.
- 이로 인해 DEX 파일이 커지고, 앱의 성능과 보안이 저하될 수 있습니다. 공격자는 난독화되지 않은 코드를 쉽게 분석해 앱을 해킹하거나 수정할 수 있습니다.
- ProGuard와 멀티 DEX
- 만약 ProGuard를 통해 최적화하지 않는다면, 메서드 개수가 64K 한도를 초과해 멀티 DEX가 필요할 수 있습니다.
- ProGuard는 불필요한 메서드와 클래스들을 제거해 멀티 DEX로 분할되는 것을 방지하고, 앱의 로딩 속도를 높이는 데 기여합니다.
ProGuard와 DEX 생성 과정의 단계
- 소스 코드 컴파일: 자바/코틀린 코드를 .class 파일로 컴파일합니다.
- ProGuard 난독화 및 최적화: .class 파일을 난독화 및 최적화합니다.
- DEX 변환: 최적화된 .class 파일을 DEX 파일로 변환합니다.
- APK 빌드: DEX 파일과 리소스를 묶어 APK 파일을 생성합니다.
그래서 프로가드를 적용하기 이전에는 MultiDex를 활용하여 메서드 개수 제한에 대한 대응을 진행했었습니다.
android {
...
defaultConfig {
...
multiDexEnabled true
}
...
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
하지만 결국 근본적인 보안 문제를 고려하여 프로가드를 적용하게 되었고 빌드 파일 자체의 효율을 증가시킬 수 있었습니다.
아래와 같은 장점들에 해당됩니다.
- 앱 크기가 작아지고, DEX 파일도 최소화됨.
- 멀티 DEX를 사용하지 않아도 되는 경우가 많음.
- 난독화된 DEX 파일로 보안이 강화됨.
반응형