Android를 쓰는 사람들이 설치하는 앱(.apk) 파일은 여러 소스와 리소스를 모아 둔 압축 파일(Android Package)이다.
1. Assets 폴더
- 데이터 파일(db, json, text 파일)이나 폰트 파일, 동영상 파일처럼 용량이 큰 파일이 저장됨
- 해당 폴더 내의 파일들은 컴파일 되지 않고 원본 형태 그대로 저장되며 런타임에서 직접 액세스함
- 무조건 생성되는 폴더는 아니고 필요에 따라 생성됨.
2. Lib 폴더
- 네이티브 코드(C/C++로 작성된 라이브러리)가 저장됨
- 네이티브 코드: CPU 아키텍처나 운영체제 등 각각의 플랫폼에 맞게 실행할 수 있도록 플랫폼 별로 컴파일 된 코드
- Java/Kotlin 소스에서 JNI(Java Native Interface)를 통해 네이티브 코드를 사용할 수 있음.
- ARM(armeabi-v7a): 스마트폰에서 주로 사용.
- ARM64(arm64-v8a): 최신 스마트폰에서 사용.
- x86/x86_64: 일부 태블릿이나 에뮬레이터에서 사용.
- 무조건 생성되는 폴더는 아니고 필요에 따라 생성됨.
3. Meta-INF 폴더
- APK 파일의 무결성 및 서명 정보를 저장하는 폴더
- 본 폴더와 하기 3개의 파일은 APK를 서명하는 과정에서 apksigner 또는 jarsigner에 의해 생성됨.
- 구성 요소
- MANIFEST.MF
# 예시 Manifest-Version: 1.0 # 파일 포맷 버전 Created-By: 1.8.0_202 (Oracle Corporation) # 본 파일을 생성한 JDK 정보 Name: res/layout/activity_main.xml # APK 패키지 내 개별 파일 이름 SHA-256-Digest: abc123def456ghi789... # 개별 파일의 SHA-256 해쉬 값 Name: classes.dex SHA-256-Digest: xyz123lmn456opq789...
- Meta-INF 폴더를 제외 한 APK 패키지 내 모든 파일 목록과 각 파일의 해시 값을 포함.
- 리스트의 항목들은 각 파일들의 경로와 해쉬 값을 Base64로 인코딩한 값임.
- 파일 해쉬 값을 저장함으로서 개별 파일의 무결성을 검증.
- CERT.SF
# 예시 Signature-Version: 1.0 # 서명 포맷 버전 SHA-256-Digest-Manifest: qrs123tuv456wxy789... # MANIFEST.MF 파일 전체의 SHA-256 해쉬 값 Name: res/layout/activity_main.xml # APK 패키지 내 개별 파일 이름 SHA-256-Digest: abc123def456ghi789... # 개별 파일의 SHA-256 해쉬 값 Name: classes.dex SHA-256-Digest: xyz123lmn456opq789...
- APK 서명을 위해 생성된 인증서 파일
- MANIFEST.MF 파일의 무결성을 검증하기 위한 MANIFEST.MF 파일의 해쉬 정보를 저장함.
- CERT.RSA
- CERT.SF 파일의 내용을 서명자(개발자)의 비공개 키로 서명한 데이터와 서명자(개발자)의 공개키 인증서이며 소유자, 발행자, 일련번호, 유효기간, 인증서 지문, 알고리즘 등이 저장된 바이너리 파일.
- 텍스트 파일이 아니라 바로 열어볼 순 없고 keytool이나 openssl 명령어를 통해 확인 가능
keytool -printcert -file output_dir/META-INF/CERT.RSA
openssl pkcs7 -inform DER -in output_dir/META-INF/CERT.RSA -print_certs -text
- MANIFEST.MF
4. res 폴더
- 앱에서 사용하는 리소스 파일을 모아둔 폴더로, 해당 폴더에 있는 리소스 파일들은 컴파일 되어있기 때문에 .xml 형태가 아니라 .flat 확장자로 존재함.
- 이미지 리소스 (res/drawable/), UI 레이아웃 (res/layout/) 등
5. AndroidManifest.xml
- 앱의 빌드 툴, Android OS나 Google Play에 관한 필수 정보 등 앱의 핵심 메타데이터를 포함한 파일.
- AndroidManifest.xml 파일은 하기 3가지 구성요소가 필수로 정의되어있어야 하며 그렇지 않을 경우 앱이 동작하지 않음.
- 패키지 명
- 앱에서 사용하는 권한
- 구성 요소(Activity, Service, BR, CP)
6. classes.dex
- Java/Kotlin 소스 파일을 DVM이나 ART 가상머신에서 실행시킬 수 있도록 변환한 파일.
- 소스 파일(.java/.kt)을 컴파일 하면 각각의 소스 파일이 바이트 코드(.class)로 컴파일 되는데, 이후 모든 바이트 코드를 하나로 묶어서 실제 실행 가능한 파일인 classes.dex 파일로 만드는 것.
- 메서드나 클래스의 갯수가 64K를 넘어가면 classes2.dex, classes3.dex 등등 여러 개의 dex 파일로 생성됨.
7. resources.arsc
- 컴파일 된 res 폴더에 있는 리소스 파일(.flat)들의 인덱스와 매핑 정보를 저장한 바이너리 파일
- 런타임에서 R 클래스로 특정 리소스에 접근하면 이 resourcees.arsc 파일에서 해당 리소스 파일을 찾아 메모리에 올림.
참고
'mobile > android' 카테고리의 다른 글
Android 정렬 (Feat. zipalign) (0) | 2025.03.23 |
---|---|
상용 앱 APK 추출해보기 (Feat. ADB) (3) | 2025.01.04 |
Android Build Process (1) (3) | 2025.01.04 |