본문 바로가기
개발/Android

[Android] APK 파헤치기

by du.it.ddu 2025. 1. 5.

우리가 열심히 개발한 안드로이드 프로젝트는 결과적으로 APK(또는 AAB)로 변환됩니다.
APK는 Android Application Package의 약자로, 이름부터 안드로이드 어플리케이션을 위한 묶음이며 확장자는 apk입니다.

과거에는 안드로이드 어플리케이션의 결과물이 APK만 존재했었고, 이것을 플레이스토어에 올리기도 하고 인터넷 등을 통해 공유하여 설치할 수 도 있었습니다.
그러다 AAB(Android App Bundle)이라는 것이 소개되고 어느순간 플레이스토어 배포는 AAB만이 가능한 형태로 바뀌었습니다.
왜 이렇게 바꾸었을까요?

우리는 안드로이드 앱을 개발할 때, 다양한 종류의 기기, 국적 등에 대응하기 위해 다양한 방법을 시도합니다.
DPI 별로 이미지 리소스를 나누거나, 국적별로 문자열 리소스를 나누는 등의 것들이죠.
APK의 경우는 이것을 모두 하나의 apk 파일에 압축하고 기기에서 필요한 리소스를 쓸 수 있게 한 방식이었습니다.

이것의 단점은 기기에서 불필요한 것들이 모두 포함되기 때문에 APK의 크기가 매우 커진다는 것이고, 이것은 앱의 크기가 커진다는 것과도 마찬가지를 의미합니다.

이러한 비효율적인 문제를 해결하기 위해 기기에 필요한 리소스만 설치할 수 있는 형태인 AAB가 등장하게 되었습니다.

APK는 어떻게 만들어질까요?

안드로이드 빌드에 관심이 있는 분이라면 이 그림을 본 적이 있을 듯 합니다.
위 그림은 안드로이드 프로젝트가 어떻게 컴파일되어 최종적으로 APK가 만들어지는 과정을 나타낸 것으로 읽기만 해도 큰 흐름을 이해할 수 있습니다.

첫번째, 소스코드와 리소스, AIDL 파일 그리고 여러 라이브러리들을 컴파일합니다.
컴파일된 결과물로 DEX 파일들과 컴파일된 리소스들이 생성되며, 확장자는 dex입니다.

두번째, DEX 파일들과 컴파일된 리소스 파일, 그리고 키스토어로 서명하여 APK를 만들어냅니다

여러가지로 생략된 단계가 있겠지만, 이 포스팅은 빌드 과정을 상세히 다루는 것이 목적이 아니므로 생략합시다.
우린 여기서 APK가 결과적으로 어떤 것들의 묶음인지 추측이 가능합니다.
DEX 파일들과 컴파일된 리소스들 등이 포함되있음을 직관적으로 추측할 수 있겠죠.

그럼 실제로 그런지 한번 APK를 뜯어봅시다.

 

APK를 뜯어봅시다.

Mac, Android Studio Ladybug | 2024.2.1 Patch 2 기준으로,
Build 메뉴 하위에 Anaylze APK라는 옵션을 볼 수 있습니다.
이것은 이름 그대로 APK를 분석할 수 있는 방법을 제공합니다.

이 옵션을 선택하면 APK를 선택할 수 있습니다.
현재 자신이 개발하고 있는 프로젝트에서 APK를 생성하거나 아무 프로젝트나 만들어서 선택해봅시다.
저는 신규 프로젝트를 생성해서 디폴트로 만들어지는 프로젝트를 사용했습니다.

 

그럼 위와 유사한 형태의 화면을 볼 수 있습니다.
APK의 실제 사이즈와 다운로드시의 사이즈, 그리고 APK 안에 어떤 것들이 있는지 확인할 수 있습니다.

위에서 얘기했던 대로 여러개의 DEX파일들과 리소스 파일, 그리고 처음보는 몇 가지들이 보이는 것을 확인할 수 있습니다.

DEX 파일

DEX 파일은 Dalvik Executable의 준말입니다. 즉, 안드로이드 런타임 환경(달빅 가상머신)에서 실행되는 소스코드가 포함되어 있는 실행파일을 의미합니다.
위 이미지에서 볼 수 있듯이 우리가 작성한 프로젝트의 코드들이 들어있으며 함수의 이름이나 코드의 양을 볼 수 있고 바이트코드까지 볼 수 있습니다.

이 사실로 알 수 있듯이, APK만 있다면 프로젝트의 구조나 코드를 얼마든지 확인할 수 있기 때문에 보안적인 문제가 될 수 있습니다.
그래서 우린 실제 서비스되는 앱의 경우 난독화를 적용하게 되는 것이죠.

 

res 폴더

빌드 과정에서 앱의 리소스가 함께 패키징되는 것을 확인할 수 있었습니다.
보시다시피 앱에서 사용된 리소스들이 그대로 APK안에 위치하는 것을 볼 수 있으며, 모든 DPI가 함께 들어있습니다.
AAB는 이러한 문제를 해결하므로 리소스들이 나뉘어진 형태로 묶여있겠다는 것을 추측할 수 있겠죠.

 

ARSC 파일

파일 목록을 보다보면 resources.arsc와 같은 파일을 확인할 수 있습니다.
ARSC 파일은 앱의 리소스 목록을 테이블 형식으로 포함하는 Android 리소스 테이블 파일입니다. 리소스 이름, 속성 및 ID와 같은 정보를 포함하고 있습니다.

우리는 빌드 과정에서 앱의 리소스들이 컴파일되는 과정을 볼 수 있었습니다.
따라서 리소스들은 APK 파일이 생성될 때 바이너리 파일로 변환되며, 그것이 ARSC 파일입니다.

 

이외에도 AndroidManiest.xml, META-INF 등을 파일목록에서 확인할 수 있습니다.

사실 대부분의 경우 APK파일을 뜯어볼 일은 잘 없겠습니다만, 우리가 개발한 것이 어떻게 결과물이 되고, 어떤 결과물이 되는지 알아두는 것은 디테일을 더할 수 있는 방법 중 하나인 것 같습니다. :)

다음엔 AAB를 파헤쳐보도록 하겠습니다.

 

반응형