APK 파일 구조

2025. 1. 7. 13:58·mobile/android

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

 

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 파일에서 해당 리소스 파일을 찾아 메모리에 올림.

 

 

참고


안드로이드 APK 서명에 대하여 + java 코드상에서 APK 파일로부터 인증서 정보 가져오기.

저작자표시 비영리 변경금지 (새창열림)

'mobile > android' 카테고리의 다른 글

Android 정렬 (Feat. zipalign)  (0) 2025.03.23
상용 앱 APK 추출해보기 (Feat. ADB)  (3) 2025.01.04
Android Build Process (1)  (3) 2025.01.04
'mobile/android' 카테고리의 다른 글
  • Android 정렬 (Feat. zipalign)
  • 상용 앱 APK 추출해보기 (Feat. ADB)
  • Android Build Process (1)
9a6riel
9a6riel
  • 9a6riel
    잡다한 공간
    9a6riel
  • 전체
    오늘
    어제
    • 분류 전체보기
      • algorithm
      • cs
        • network
        • os
      • mobile
        • android
        • test
      • language
        • kotlin
        • java
      • security
      • troubleshooting
      • etc.
        • ai
        • article review
        • project
  • 블로그 메뉴

    • 링크

    • 공지사항

      • read.me
    • 인기 글

    • 태그

      foreach
      Val
      codegpt
      var
      Java
      zipalign
      JVM
      AI
      build
      CONTINUE
      ADB
      android
      apk
      Kotlin
      Ollama
      llm
      align
      AAB
      ChatGPT
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.1
    9a6riel
    APK 파일 구조
    상단으로

    티스토리툴바