[Android/Kotlin] 2 안드로이드 아키텍처

[Android/Kotlin] 2 안드로이드 아키텍처

이번에 공부할 핵심 키워드는 컴파일, 빌드, 런타임, APK 이다.


  • 코드는 어떻게 앱으로 만들어지고 스마트폰에서 실행되는지 알아보자

  • 지금부터 작성한 소스 코드의 설치 파일 생성 과정과 스마트폰에서 실행 되기까지의 전 과정에 대해 알아보겠다.

img

소스 코드 작성에서 실행까지

  • 소스 코드 작성에서 실행까지는 아주 간단하다.
  • 먼저 간략하게 무엇을 하는지 나열해보자.
    • 소스 코드 작성: 코틀린으로 소스 코드를 작성한다.
    • 설치 파일 생성: 명령을 통해 안드로이드에서 실행될 수 있는 설치 파일의 형태로 반환한다.
    • 업로드: 구글 플레이 스토어에 앱을 업로드한다.
    • 앱 등록: 구글 플레이 스토어에 앱을 등록한다.
    • 앱 선택 / 설치: 스마트폰으로 구글 플레이 스토어에 접속한 다음 설치할 앱을 선택/설치 한다.
    • 스마트폰에서 실행: 아이콘을 터치해 앱을 실행한다.

코드가 스마트폰에서 실행되는 과정

  • 앞서 간단하게 설명했던 소스 코드 작성에서 실행까지의 단계가 실제 내부에서는 어떻게 진행되는지 알아보겠다.

img

  1. 빌드(컴파일 + 비밀번호): ‘B.설치 파일 생성’ 단계는 빌드를 통해 진행한다. 이 과정에서 먼저 소스 코드를 바이트코드로 변환하며 APK 매니저에서 비밀번호를 가지고 있는 키 스토어와 조합해서 최종 설치 파일을 생성한다.

  2. 파일 검증: ‘C. 업로드’ 단계로 단순히 파일을 업로드하는 데서 끝나는 게 아니라 구글 플레이 스토어에서 앱을 검수하는 과정을 거친다. 이 때 설치 파일이 정상적으로 동작하는지, 보안상의 문제는 없는지 등을 검사한다.

  3. 플랫폼 버전 체크: ‘E. 앱 선택’ 단계이다. 스마트폰으로 구글 플레이 스토어에 접속하면 스마트폰의 플랫폼 버전을 확인한 다음 설치 가능한 앱의 목록만 보여준다.

  4. AOT 컴파일 / 설치 권한 체크: ‘E. 앱 설치’ 단계입니다. APK 파일을 설치하면 리눅스에서 실행 가능한 파일로 안드로이드폰 내부에서 한 번 더 컴파일한다. 이 과정을 통해 실행 속도가 빨라지며 사용자에게 기능의 사용권한을 요청한다.

  5. JIT 컴파일 / 실행 권한 체크: ‘F. 스마트폰에서 실행’ 단계이다. 4.에서 설치할 때는 필요한 파일만 컴파일한다. 그리고 첫 번째 앱을 실행할 때 미리 컴파일되지 않은 파일을 호출하면서 리눅스 실행 파일로 컴파일한다. 그리고 권한 중에 ‘실행 시 권한’이 포함되어 있으면 해당 코드가 동작해서 사용자에게 확인 요청을 한다.

여기서 잠깐!

  • 바이트코드와 APK
    • 바이트 코드란 우리가 작성한 코틀린 코드를 가상 머신인 안드로이드 런타임에서 이해할 수 있도록 변환한 코드이다.
    • APK는 안드로이드 패키지(Android Package)의 줄임말로 안드로이드 설치 파일의 확장자명으로 사용된다.
    • 특정 앱의 APK 팡링 있으면 스마트폰에 수동으로 해당 앱을 설치할 수 있다.

빌드

  • 빌드란 소스 코드를 변환해서 안드로이드의 실행 파일인 APK 파일로 만드는 것이다.
  • 빌드는 소스 코드를 기계어로 변환한 후 라이브러리와 연결해서 실제 실행 파일로 만드는 과정을 일컫는 용어이다.
  • 안드로이드는 리눅스 커널 기반이므로 리눅스 시스템의 빌드를 이해하는 것이 안드로이드 스튜디오 이해에 도움이 된다.

컴파일이란?

  • 컴파일(Compile)이란 사람이 읽을 수 있는 형태의 소스 코드를 컴퓨터가 읽을 수 있는 형태의 기계어로 변환해주는 과정이다.
  • 컴퓨터는 기계어만 이해하고 동작하는데 이 기계어의 구조는 사람이 이해하는 것이 어렵기 때문에 C언어, 자바, 코틀린과 같은 컴퓨터 언어가 생겨났다.

img

리눅스에서의 빌드

  • 리눅스에서 빌드란 소스 코드를 컴퓨터가 읽을 수 있는 기계어로 번역(컴파일)하고, 내가 만든 소스 코드에서 사용하는 라이브러리와 연결(Link)해서 최종 실행 파일 형태로 만드는 것이다.

img

안드로이드에서의 빌드

  • 안드로이드에서의 빌드를 이해하기 위해서는 먼저 컴파일 과정부터 다시 살펴보는 것이 좋다.
  • 리눅스 컴파일과의 차이점은 안드로이드에는 리소스(Resource)라는 개념이 있다는 점이다.
  • 안드로이드는 2단계로 컴파일을 나눌 수 있다.
  • 먼저, 1단계는 바이트 코드 단계이다.
    • 다음 그림과 같이 소스 코드와 리소스(이미지 파일, 음악 파일 등), 라이브러리까지 한 번에 컴파일 해준다.
    • 이 때 생성된 파일은 안드로이드 플랫폼에서 인식할 수 있는 바이트코드로 컴파일 된다.
    • 이 파일은 스마트폰에서 바로 실행할 수 없다.

img

  • 2단계는 APK 파일 생성 단계이다.
  • 안드로이드의 빌드는 1단계에서 생성된 파일을 APK 매니저라는 도구로 개발자가 설정한 패스워드와 조합해서 설치 파일인 APK 파일로 만들어준다.
  • 이렇게 1단계와 2단계를 모두 거쳐 APK 파일이 생성되는 과정을 빌드라고 한다.

img

여기서 잠깐!

  • APK와 AAB
    • AAB는 안드로이드가 새롭게 제안하는 APK 파일을 대체하는 빌드 파일 형태이다.
    • 구글 플레이 스토어에 AAB 파일 형태로 앱을 등록하면 사용자가 앱을 다운로드 할 때 사용자의 디바이스에 필요한 모듈만 골라서 APK 파일로 다시 생성해준다.
      • 예를 들어 영어, 일본어, 중국어를 지원하는 앱을 AAB 파일로 등록하면 각 디바이스에 필요한 언어 파일만 모아서 설치 되도록 해준다.

설치와 실행

  • 안드로이드의 아키텍처는 앱 설치부터 실행 후 종료할 때까지 계속 따라다니면서 관여한다.
  • 우리가 설치하는 앱이 가장 상단에 있는 애플리케이션 영역에서 동작하고, 안드로이드는 중간에 있는 안드로이드 런타임 영역에서 개발자가 만든 앱을 제어한다.

img

Android Architecture

  • 위 그림의 우측 위에서부터 순서대로 앱을 설치하면 설치 파일의 일부가 리눅스 운영체제에서 실행 할 수 있는 파일 형태로 한 번 더(이미 빌드 시에 한 번 컴파일된 상태) 컴파일되는데 이런 구조를 AOT(Ahead of Time)라고 한다.
  • 플랫폼 버전 5.0 롤리팝에서는 이와 같이 모든 파일이 설치 시 컴파일 되는 형태였다가 효율성의 문제로 일부만 컴파일되는 형태로 변경되었다.
  • 앱을 실행하면 호출되는 파일 중에서 컴파일 되지 않았던 파일이 한 번 더 컴파일 되는데 이 구조를 JIT(Just in Time)라고 한다.
  • 안드로이드는 이렇게 AOT와 JIT라는 2개의 컴파일 형태를 같이 사용함으로써 효율성을 높이고 있다.

여기서 잠깐!

  • 안드로이드는 왜 두 번이나 컴파일을 하는가?
    • AOT 컴파일을 하면 설치 시 모두 컴파일 되므로 사용할 때 속도는 빠르지만, 컴파일된 파일만큼 디스크의 용량을 차지한다.
    • 즉, 많은 앱을 설치할 수 없다.
    • 반면에 JIT 컴파일을 하면 호출 시 컴파일 되므로 잠시 성능에 영향을 줄 수는 있지만 한 번 컴파일된 이후로는 AOT와 동일한 속도를 내고, 디스크의 용량을 적게 차지한다.
    • 이 두 컴파일 방식은 각기 장단점이 있으므로 안드로이드는 상황에 맞춰서 컴파일을 두 번 한다.

© 2023. All rights reserved.

by SoftyChoo