▼ 코드는 어떻게 앱으로 만들어지고 스마트폰에서 실행 될까?
1. 소스 코드 작성 : 코틀린으로 소스 코드를 작성
2. 설치 파일 생성 : 명령을 통해 안드로이드에서 실행될 수 있는 설치 파일의 형태로 변환
3. 업로드 : 구글 플레이 스토어에 앱을 업로드
4. 앱 등록 : 구글 플레이 스토어에 앱을 등록
5. 앱 선택/설치 : 스마트폰으로 구글 플레이 스토어에 접속한 다음 설치할 앱을 선택/설치
6. 스마트폰에서 실행 : 아이콘을 터치해서 앱을 실행
▼ 코드가 스마트폰에서 실행되는 과정
① 빌드(컴파일 + 비밀번호) : [B. 설치 파일 생성] 단계는 빌드를 통해 진행
- 이 과정에서 먼저 소스 코드를 바이트코드로 변환하여 APK 매니저에게 비밀번호를 가지고 있는 키 스토어와 조합해서 최종 설치 파일을 생성
② 파일 검증 : [C. 업로드] 단계로 단순히 파일을 업로드하는 데서 끝나는 게 아니라 구글 플레이 스토어에서 앱을 검수하는 과정을 거침
- 이때, 설치 파일이 정상적으로 동작하는지, 보안상의 문제는 없는지 등을 검사
③ 플랫폼 버전 체크 : [E. 앱 선택] 단계
- 스마트폰으로 구글 플레이 스토어에 접속하면 스마트폰의 플랫폼 버전을 확인한 다음 설치 가능한 앱의 목록만 보여줌
④ AOT 컴파일 / 설치 권한 체크 : [E. 앱 설치] 단계
- APK파일을 설치하면 리눅스에서 실행 가능한 파일로 안드로이드폰 내부에서 한 번 더 컴파일 함.
- 이 과정을 통해 실행 속도가 빨라지며 사용자에게 기능의 사용 권한을 요청함.
⑤ JIT 컴파일 / 실행 권한 체크 : [F. 스마트폰에서 실행] 단계
- ④에서 설치할 때는 필요한 파일만 컴파일 함, 그리고 첫 번째 앱을 실행할 때 미리 컴파일되지 않은 파일을 호출하면서 리눅스 실행 파일로 컴파일 함. 그리고 권한 중에 '실행 시 권한'이 포함되어 있으면 해당 코드가 동작해서 사용자에게 확인 요청을 함.
* 바이트 코드 : 우리가 작성한 코틀린 코드를 가상 머신인 안드로이드 런타임에서 이해할 수 있도록 변환한 코드
* APK : 안드로이드 패키지의 줄임말로, 안드로이드 설치 파일의 확장자명으로 사용됨. 특정 앱의 APK 파일이 있으면 스마트폰에 수동으로 해당 앱을 설치할 수 있음
▼ 빌드
- 빌드 Build
- 소스 코드를 변환해서 안드로이드에서의 실행 파일인 APK 파일로 만드는 것
- 소스 코드를 기계어로 변환한 후 라이브러리와 연결해서 실제 실행 파일로 만드는 과정
- 안드로이드는 리눅스 커널 기반이므로 리눅스 시스템에서의 빌드를 이해하는 것이 좋다.
- 컴파일 Compile
- 사람이 읽을 수 있는 형태의 소스 코드를 컴퓨터가 읽을 수 있는 형태의 기계어로 변한해주는 과정
- 컴퓨터는 기계어만 이해하고 동작하는데 이 기계어의 구조를 사람이 이해하는 것이 어려워 C, 자바, 코틀린 과 같은 컴퓨터 언어가 생겨난 것
- 리눅스에서의 빌드
- 소스 코드를 컴퓨터가 읽을 수 있는 기계어로 번역(컴파일)하고, 내가 만든 소스 코드에서 사용하는 라이브러리와 연결(Link)해서 최종 실행 파일 형태로 만드는 것
- 안드로이드에서의 빌드
리눅스 컴파일과의 차이점은 안드로이드에는 리소스(Resource) 라는 개념이 있다.
안드로이드는 2단계로 컴파일
º1단계 : 바이트코드 단계
다음 그림과 같이 소스 코드와 리소스(이미지 파일, 음악 파일 등), 라이브러리까지 한 번에 컴파일 해줌,
이때 생성된 파일은 안드로이드 플랫폼에서 인식할 수 있는 바이트코드로 컴파일 됨,
이 파일은 스마트폰에서 바로 실행할 수 없다.
º 2 단계 : APK 파일 생성 단계
안드로이드의 빌드는 1단계에서 생성된 파일을 APK 매니저 라는 도구로 개발자가 설정한 패스워드와 조합해서 설치 파일인 APK 파일로 만들어 줌.
=> 이렇게 1단계와 2단계를 모두 거쳐 APK 파일이 생성된 과정을 빌드라고 함.
* APK 와 AAB
- AAB 는 안드로이드가 새롭게 제안하는 APK 파일을 대체하는 빌드 파일 형태
구글 플레이 스토어에 AAP 파일 형태로 앱을 등록하면 사용자가 앱을 다운로드할 때 사용자의 디바디스에 필요한 모듈만 골라서 APK 파일로 다시 생성 해줌.
▼ 설치와 실행
- 우리가 설치하는 앱이 가장 상단에 있는 애플리케이션 영역에서 동작하고, 안드로이드는 중간에 있는 안드로이드 런타임 영역에서 개발자가 만든 앱을 제어한다.
- 위 그림의 우측 위에서부터 순서대로 앱을 설치하면 설치 파일의 일부가 리눅스 운영체제에서 실행할 수 있는 파일 형태로 한 번 더 (이미 빌드 시에 한 번 컴파일 된 상태) 컴파일 되는데 이런 구조를 AOT (Ahead Of Time) 이라고 함.
→ 플랫폼 버전 5.0 롤리팝에서는 이와 같이 모든 파일이 설치 시 컴파일 되는 형태였다가 효율성의 문제로 일부만 컴파일되는 형태로 변경
- JIT (Just-In-Time) : 앱을 실행하면 호출되는 파일 중에서 컴파일되지 않았던 파일이 한 번 더 컴파일 되는 구조
=> 안드로이드는 AOT 와 JIT 라는 2개의 컴파일 형태를 같이 사용함으로써 효율성을 높이고 있다.
* 안드로이드는 왜 컴파일을 두번이나 할까?
AOT 컴파일을 하면 설치 시 모두 컴파일되므로 사용할 때 속도는 빠르지만, 컴파일된 파일만큼 디스크의 용량을 차지한다. 즉, 많은 앱을 설치할 수 없다.
반면에, JIT 컴파일을 하면 호출 시 컴파일되므로 잠시 성능에 영향을 줄 수는 있지만 한 번 컴파일된 이후로는 AOT와 동일한 속도를 내고, 디스크의 용량을 적게 차지한다.
이 두 컴파일 방식은 각기 장단점이 있으므로 안드로이드는 상황에 맞춰서 컴파일을 두 번 한다.
'안드로이드 프로그래밍 > kotlin' 카테고리의 다른 글
[Android Studio] 자동 저장, 코드 자동 완성, 디버깅, 성능 모니터 (0) | 2022.02.13 |
---|---|
[Android Studio] 안드로이드 스튜디오 이해하기 (0) | 2022.02.13 |
[Android Studio] 03. 젯팩, 뷰 바인딩, 코루틴 (0) | 2022.02.12 |
[Android Studio] 01. 안드로이드와 코틀린 (0) | 2022.02.12 |
[kotlin syntax] 01_코틀린 활용 (0) | 2022.01.28 |