카테고리 없음
[르탄즈 5기] Chapter 01-2 안드로이드 아키텍처
박매트
2024. 1. 17. 17:34
바이트코드 : 우리가 작성한 코틀린 코드를 가상 머신인 안드로이드 런타임에서 이해할 수 있도록 변환한 코드입니다.
APK : 안드로이드 패키지(Android Package)의 줄임말로 안드로이드 설치 파일의 확장자명으로 사용됩니다.
* 특정 앱의 APK 파일이 있으면 스마트폰에 수동으로 해당 앱을 설치할 수 있습니다
소스 코드 작성 -> 설치 파일 생성 -> 업로드 -> 앱 등록 -> 앱 선택/설치 -> 스마트폰에서 실행
코드가 스마트폰에서 실행되는 과정
-
1. 빌드(컴파일 + 비밀번호): 'B.설치 파일 생성' 단계는 빌드를 통해 진행합니다. 이 과정에서 먼저 소스 코드를 바이트코드로 변환하며 APK 매니저에서 비밀번호를 가지고 있는 키 스토어와 조합해서 최종 설치 파일을 생성합니다.
-
2. 파일 검증: 'C. 업로드' 단계로 단순히 파일을 업로드하는 데서 끝나는 게 아니라 구글 플레이 스토어에서 앱을 검수하는 과정을 거칩니다. 이 때 설치 파일이 정상적으로 동작하는지, 보안상의 문제는 없는지 등을 검사합니다.
-
3. 플랫폼 버전 체크: 'E. 앱 선택' 단계입니다. 스마트폰으로 구글 플레이 스토어에 접속하면 스마트폰의 플랫폼 버전을 확인한 다음 설치 가능한 앱의 목록만 보여줍니다.
-
4. AOT 컴파일 / 설치 권한 체크: 'E. 앱 설치' 단계입니다. APK 파일을 설치하면 리눅스에서 실행 가능한 파일로 안드로이드폰 내부에서 한 번 더 컴파일합니다. 이 과정을 통해 실행 속도가 빨라지며 사용자에게 기능의 사용권한을 요청합니다.
-
5. JIT 컴파일 / 실행 권한 체크: 'F. 스마트폰에서 실행' 단계입니다. 4.에서 설치할 때는 필요한 파일만 컴파일합니다. 그리고 첫 번째 앱을 실행할 때 미리 컴파일되지 않은 파일을 호출하면서 리눅스 실행 파일로 컴파일합니다. 그리고 권한 중에 '실행 시 권한'이 포함되어 있으면 해당 코드가 동작해서 사용자에게 확인 요청을 합니다.
용어 정리
컴파일 : 사람이 읽을 수 있는 형태의 소스 코드를 컴퓨터가 읽을 수 있는 형태의 기계어로 변환해주는 과정
** 컴퓨터는 기계어만 이해하고 동작하는데 이 기계어의 구조를 사람이 이해하는 것이 어려워 C, 자바, 코틀린과 같은 컴퓨터 언어가 생겨난 것입니다.
리눅스에서 빌드 : 리눅스에서 빌드란 소스 코드를 컴퓨터가 읽을 수 있는 기계어로 번역(컴파일)하고, 내가 만든 소스 코드에서 사용하는 라이브러리와 연결(Link)해서 최종 실행 파일 형태로 만드는 것
안드로이드에서의 빌드 :
-
리눅스 컴파일과의 차이점은 안드로이드에는 리소스(Resource)라는 개념이 있음안드로이드는 2단계로 컴파일을 나눌 수 있음
1단계 : 바이트 코드 단계
-
다음 그림과 같이 소스 코드와 리소스(이미지 파일, 음악 파일 등), 라이브러리까지 한 번에 컴파일 해줍니다.
-
이 때 생성된 파일은 안드로이드 플랫폼에서 인식할 수 있는 바이트코드로 컴파일 됩니다.
-
이 파일은 스마트폰에서 바로 실행할 수 없습니다.
2단계 : APK 파일 생성 단계
-
안드로이드의 빌드는 1단계에서 생성된 파일을 APK 매니저라는 도구로 개발자가 설정한 패스워드와 조합해서 설치 파일인 APK 파일로 만들어줍니다.
-
이렇게 1단계와 2단계를 모두 거쳐 APK 파일이 생성되는 과정을 빌드라고 합니다.
APK와 AAB
-
AAB는 안드로이드가 새롭게 제안하는 APK 파일을 대체하는 빌드 파일 형태입니다.
-
구글 플레이 스토어에 AAB 파일 형태로 앱을 등록하면 사용자가 앱을 다운로드 할 때 사용자의 디바이스에 필요한 모듈만 골라서 APK 파일로 다시 생성해줍니다.예) 영어, 일본어, 중국어를 지원하는 앱을 AAB 파일로 등록하면 각 디바이스에 필요한 언어 파일만 모아서 설치 되도록 해줍니다.
설치와 실행
-
안드로이드의 아키텍처는 앱 설치부터 실행 후 종료할 때까지 계속 따라다니면서 관여합니다.
-
우리가 설치하는 앱이 가장 상단에 있는 애플리케이션 영역에서 동작하고, 안드로이드는 중간에 있는 안드로이드 런타임 영역에서 개발자가 만든 앱을 제어합니다.

-
위 그림의 우측 위에서부터 순서대로 앱을 설치하면 설치 파일의 일부가 리눅스 운영체제에서 실행 할 수 있는 파일 형태로 한 번 더(이미 빌드 시에 한 번 컴파일된 상태) 컴파일되는데 이런 구조를 AOT(Ahead of Time)라고 합니다.
-
플랫폼 버전 5.0 롤리팝에서는 이와 같이 모든 파일이 설치 시 컴파일 되는 형태였다가 효율성의 문제로 일부만 컴파일되는 형태로 변경되었습니다.
-
앱을 실행하면 호출되는 파일 중에서 컴파일 되지 않았던 파일이 한 번 더 컴파일 되는데 이 구조를 JIT(Just in Time)라고 합니다.
-
안드로이드는 이렇게 AOT와 JIT라는 2개의 컴파일 형태를 같이 사용함으로써 효율성을 높이고 있습니다.
+ 안드로이드는 왜 두 번이나 컴파일을 하나요?
-
AOT 컴파일을 하면 설치 시 모두 컴파일 되므로 사용할 때 속도는 빠르지만, 컴파일된 파일만큼 디스크의 용량을 차지합니다.
-
즉, 많은 앱을 설치할 수 없습니다.
-
반면에 JIT 컴파일을 하면 호출 시 컴파일 되므로 잠시 성능에 영향을 줄 수는 있지만 한 번 컴파일된 이후로는 AOT와 동일한 속도를 내고, 디스크의 용량을 적게 차지합니다.
-
이 두 컴파일 방식은 각기 장단점이 있으므로 안드로이드는 상황에 맞춰서 컴파일을 두 번 합니다.