안드로이드 아키텍처는 플랫폼의 실제적인 동작 구조 또는 형태를 말합니다. 작성한 소스 코드가 디바이스에 설치되면 이 아키텍처 구조 안에서 모든 동작이 결정됩니다.
코드는 어떻게 앱으로 만들어지고 스마트폰에서 실행될까요? 지금부터 작성한 소스 코드의 설치 파일 생성 과정과 스마트폰에서 실행되기까지의 전 과정에 대해 알아보겠습니다.
소스 코드 작성에서 실행까지는 아주 간단합니다. 아래와 같은 과정을 거치게 됩니다.
A. 소스 코드 작성: 코틀린으로 소스 코드를 작성합니다.
B. 설치 파일 생성: 명령을 통해 안드로이드에서 실행될 수 있는 설치 파일의 형태로 변환합니다.
C. 업로드: 구글 플레이 스토어에 앱을 업로드합니다.
D. 앱 등록: 구글 플레이 스토어에 앱을 등록합니다.
E. 앱 선택/설치: 스마트폰으로 구글 플레이 스토어에 접속한 다음 설치할 앱을 선택/설치합니다.
F. 스마트폰에서 실행: 아이콘을 터치해서 앱을 실행합니다.
앞서 간단하게 설명했던 소스 코드 작성에서 실행까지의 단계가 실제 내부에서는 어떻게 진행되는지 살펴보겠습니다.
① 빌드(컴파일 + 비밀번호): ‘B. 설치 파일 생성’ 단계는 빌드를 통해 진행합니다. 이 과정에서 먼저 소스 코드를 바이트코드로 변환하며 APK 매니저에서 비밀번호를 가지고 있는 키 스토어와 조합해서 최종 설치 파일을 생성합니다.
② 파일 검증: ‘C. 업로드’ 단계로 단순히 파일을 업로드하는 데서 끝나는 게 아니라 구글 플레이 스토어에서 앱 을 검수하는 과정을 거칩니다. 이때 설치 파일이 정상적으로 동작하는지, 보안상의 문제는 없는지 등을 검사합니다.
③ 플랫폼 버전 체크: ‘E. 앱 선택’ 단계입니다. 스마트폰으로 구글 플레이 스토어에 접속하면 스마트폰의 플랫폼 버전을 확인한 다음 설치 가능한 앱의 목록만 보여줍니다.
④ AOT 컴파일/설치 권한 체크: ‘E. 앱 설치’ 단계입니다. APK 파일을 설치하면 리눅스에서 실행 가능한 파일로 안드로이드폰 내부에서 한 번 더 컴파일합니다. 이 과정을 통해 실행 속도가 빨라지며 사용자에게 기능의 사용 권한을 요청합니다.
⑤ JIT 컴파일/실행 권한 체크: ‘F. 스마트폰에서 실행’ 단계입니다. ④에서 설치할 때는 필요한 파일만 컴파일합니다. 그리고 첫 번째 앱을 실행할 때 미리 컴파일되지 않은 파일을 호출하면서 리눅스 실행 파일로 컴파일합니다. 그리고 권한 중에 ‘실행 시 권한’이 포함되어 있으면 해당 코드가 동작해서 사용자에게 확인 요청을 합니다.
소스 코드를 변환해서 안드로이드의 실행 파일인 APK 파일로 만드는 것을 빌드(Build)라고 합니다. 빌드는 소스 코드를 기계어로 변환한 후 라이브러리와 연결해서 실제 실행 파일로 만드는 과정을 일컫는 용어입니다. 안드로이드는 리눅스 커널 기반이므로 리눅스 시스템의 빌드를 이해하는 것이 도움이 됩니다.
컴파일(Compile)이란 사람이 읽을 수 있는 형태의 소스 코드를 컴퓨터가 읽을 수 있는 형태의 기계어로 변환해주는 과정입니다. 컴퓨터는 기계어만 이해하고 동작하는데 이 기계어의 구조를 사람이 이해하는 것이 어려워 C, 자바, 코틀린과 같은 컴퓨터 언어가 생겨난 것입니다.
리눅스에서 빌드란 소스 코드를 컴퓨터가 읽을 수 있는 기계어로 번역(컴파일)하고, 내가 만든 소스 코드에서 사용하는 라이브러리와 연결Link해서 최종 실행 파일 형태로 만드는 것입니다.
안드로이드에서의 빌드를 이해하기 위해서는 먼저 컴파일 과정부터 다시 살펴보는 것이 좋습니다. 리눅스 컴파일과의 차이점은 안드로이드에는 리소스(Resource)라는 개념이 있다는 점입니다. 안드로이드는 2단계로 컴파일을 나눌 수 있습니다.
먼저, 1단계는 바이트코드 단계입니다. 다음 그림과 같이 소스 코드와 리소스(이미지 파일, 음악 파일 등), 라이브러리까지 한 번에 컴파일해줍니다. 이때 생성된 파일은 안드로이드 플랫폼에서 인식할 수 있는 바이트코드로 컴파일됩니다. 이 파일은 스마트폰에서 바로 실행할 수 없습니다.
2단계는 APK 파일 생성 단계입니다. 안드로이드의 빌드는 1단계에서 생성된 파일을 APK 매니저라는 도구로 개발자가 설정한 패스워드와 조합해서 설치 파일인 APK 파일로 만들어줍니다. 이렇게 1단계와 2단계를 모두 거쳐 APK 파일이 생성되는 과정을 빌드라고 합니다.
안드로이드의 아키텍처는 앱 설치부터 실행 후 종료할 때까지 계속 따라다니면서 관여합니다. 우리가 설치하는 앱이 가장 상단에 있는 애플리케이션 영역에서 동작하고, 안드로이드는 중간에 있는 안드로이드 런타임 영역에서 개발자가 만든 앱을 제어합니다.안드로이드의 아키텍처는 앱 설치부터 실행 후 종료할 때까지 계속 따라다니면서 관여합니다. 우리가 설치하는 앱이 가장 상단에 있는 애플리케이션 영역에서 동작하고, 안드로이드는 중간에 있는 안드로이드 런타임 영역에서 개발자가 만든 앱을 제어합니다.
위 그림의 우측 위에서부터 순서대로 앱을 설치하면 설치 파일의 일부가 리눅스 운영체제에서 실행할 수 있는 파일 형태로 한 번 더(이미 빌드 시에 한 번 컴파일된 상태) 컴파일되는데 이런 구조를 AOT(Ahead of Time)라고 합니다. 플랫폼 버전 5.0 롤리팝에서는 이와 같이 모든 파일이 설치 시 컴파일되는 형태였다가 효율성의 문제로 일부만 컴파일되는 형태로 변경되었습니다.
앱을 실행하면 호출되는 파일 중에서 컴파일되지 않았던 파일이 한 번 더 컴파일되는데 이 구조를 JIT(Just-in-Time)라고 합니다. 안드로이드는 이렇게 AOT와 JIT라는 2개의 컴파일 형태를 같이 사용함으로써 효율성을 높이고 있습니다.
AOT 컴파일을 하면 설치 시 모두 컴파일되므로 사용할 때 속도는 빠르지만, 컴파일된 파일만큼 디스크의 용량을 차지합니다. 즉, 많은 앱을 설치할 수 없습니다. 반면에 JIT 컴파일을 하면 호출 시 컴파일되므로 잠시 성능에 영향을 줄 수는 있지만 한 번 컴파일된 이후로는 AOT와 동일한 속도를 내고, 디스크의 용량을 적게 차지합니다.
이 두 컴파일 방식은 각기 장단점이 있으므로 안드로이드는 상황에 맞춰서 컴파일을 두 번 합니다.
위 내용은 『이것이 안드로이드다 with 코틀린』(3판)의 내용을 재구성하여 작성되었습니다.
안드로이드 스튜디오를 활용한 Kotlin 문법부터 오픈 API를 활용한 도서관 지도 앱 개발까지! 최신 버전으로 실습 환경을 제공하는 『이것이 안드로이드다 with 코틀린』(3판)으로 누구보다 빠르게 새로운 코틀린 안드로이드를 경험해 보세요!
이전 글 : 데이터, 모든 게 다 준비돼 있어도 실패할 수 있다
최신 콘텐츠