Chapter 01. 코틀린 안드로이드 이해하기
1. 안드로이드와 코틀린
1.1 운영체제와 플랫폼
안드로이드 플랫폼은 리눅스 운영체제 안에서 리눅스와 상호작용하면서 동작한다. 전체 아키텍처 위쪽에 안드로이드가 실행되는 런타임 영역이 존재한다.
- System Apps
- Java API Framework
Native C/C++ Libraries Android Runtime - Hardware Abstraction Layer (HAL)
- Linux Kernal
1.2 플랫폼 버전과 API 레벨
- 안드로이드는 사용하는 플랫폼 버전과 별개로 API 레벨이 있다.
- API는 개발자에게 안드로이드 플랫폼의 기능을 사용할 수 있게 제공하는 도구이다.
- API 레벨에 따라 새로운 기능이 추가되거나 코드 전체를 변경해야 하는 경우가 있으므로 레벨이 변경될 때마다 기존 코드를 확인해봐야 한다.
- 안드로이드 개발자 사이트는 최신 버전에 대한 정보뿐만 아니라 사용 현황 등도 확인할 수 있다.
1.3 코틀린
- 과거 안드로이드 플랫폼에 대한 설명에는 JVM(정확히는 Dalvik VM)이 항상 따라붙었는데, 자바 가상 머신 위에서 앱이 동작했기 때문이다.
- 현재는 이를 대신해 안드로이드 런타임(Android RunTime, ART)을 사용한다. JVM이 없지만 여전히 가상머신 위에서 동작한다는 점에서 자바 동작 구조를 차용하고 있다.
- 자바에서 최근 코틀린으로 안드로이드 개발 언어가 바뀌고 있는 추세다.
- 인텔리제이를 기반으로 안드로이드 스튜디오가 만들어졌다.
1.4 함수형 프로그래밍 언어 코틀린
코틀린은 함수형 프로그래밍을 표방하고 있다. 객체지향 프로그래밍은 클래스 내부에 있는 함수에서만 로직을 작성하지만, 함수형 프로그래밍은 이러한 제한 없이 어디서나 작성할 수 있다.
1.5. 안드로이드 개발에 있어서 자바와 코틀린의 차이
안드로이드 앱을 개발할 때는 코틀린도 객체지향 언어처럼 클래스 내에서 로직을 작성해야 한다. 여전히 안드로이드는 자바와 코틀린을 동시에 지원하므로 자바의 형식에 맞춰 코틀린으로도 개발해야 한다. 그럼에도 불구하고 자바보다는 코틀린으로 간결한 코드를 작성할 수 있다.
2. 안드로이드 아키텍처
- 소스코드 -빌드-> 앱 설치 파일 -등록-> 앱스토어 -설치-> 실행
책에서 다루는 안드로이드 플랫폼은 단순 안드로이드 운영체제와 앱이 동작하는 소프트웨어까지만 포함한다. 하지만 넓게 보면 안드로이드 스튜디오와 앱이 거래되는 플레이스토어, 앱이 동작하는 안드로이드 스마트폰까지가 하나의 거대한 안드로이드 플랫폼이다.
2.1 소스 코드 작성에서 실행까지
- A. 소스코드 작성
- B. 설치파일 생성: 명령을 통해 안드로이드에서 실행될 수 있는 설치 파일의 형태로 변환
- C. 업로드
- D. 앱 등록
- E. 앱 선택/설치
- F. 앱 선택/설치
- G. 스마트폰에서 실행: 아이콘을 터치해서 앱을 실행
2.2 코드가 스마트폰에서 실행되는 과정
- 빌드(컴파일+비밀번호): 설치파일 생성 단계는 빌드를 통해 진행한다. 이 과정에서 먼저 소스코드를 바이트코드로 변환하여 APK 매니저에서 비밀번호를 가지고 있는 키 스토어와 조합해서 최종 설치 파일을 생성한다.
- 파일 검증: 업로드 단계로 구글 플레이 스토어에서 앱을 검수하는 과정을 거친다. 설치 파일이 정상적으로 동작하는지, 보안상의 문제는 없는지 등을 검사한다.
- 플랫폼 버전 체크: 앱 선택 단계이다. 스마트폰으로 구글 플레이 스토어에 접속하면 스마트폰의 플랫폼 버전을 확인한 다음 설치 가능한 앱의 목록만 보여준다.
- AOT 컴파일/설치 권한 체크: 앱 설치 단계이다. APK 파일을 설치하면 리눅스에서 실행 가능한 파일로 안드로이드폰 내부에서 한 번 더 컴파일한다. 이 과정을 통해 실행 속도가 빨라지며 사용자에게 기능의 사용 권한을 요청한다.
- JIT 컴파일/실행 권한 체크: 스마트폰에서 실행 단계이다. 이전 단계에서는 필요한 파일만 컴파일한다. 그리고 첫번째 앱을 실행할 때 미리 컴파일되지 않은 파일을 호출하면서 리눅스 실행 파일로 컴파일한다. 그리고 권한 중에 ‘실행 시 권한’이 포함되어 있으면 해당 코드가 동작해서 사용자에게 확인 요청을 한다.
2.3 빌드
소스 코드를 변환해서 안드로이드에서의 실행 파일인 APK 파일로 만드는 것을 빌드라고 한다. 빌드는 소스 코드를 기계어로 변환한 후 라이브러리와 연결해서 실제 실행 파일로 만드는 과정을 일컫는 용어이다.
리눅스에서의 빌드
소스코드를 컴퓨터가 읽을 수 있는 기계어로 번역(컴파일)하고, 내가 만든 소스 코드에서 사용하는 라이브러리와 연결(Link)해서 최종 실행 파일 형태로 만드는 것이다.
안드로이드에서의 빌드
리눅스 컴파일과 달리 안드로이드에는 리소스(Resource) 개념이 있다.
- 1단계: 바이트코드 단계: 소스 코드와 리소스(이미지 파일, 음악 파일 등), 라이브러리까지 한 번에 컴파일한다. 이때 생성된 파일은 안드로이드 플랫폼에서 인식할 수 있는 바이트 코드로 컴파일된다. 이 파일은 스마트폰에서 바로 실행할 수 없다.
- 2단계: APK 파일 생성 단계이다. 안드로이드의 빌드는 1단계에서 생성된 파일을 APK 매니저라는 도구로 개발자가 설정한 패스워드와 조합해서 설치 파일인 APK 파일로 만들어준다.
이렇게 1단계와 2단계를 모두 거쳐 APK 파일이 생성된 과정을 빌드라고 한다.
2.4 설치와 실행
안드로이드 아키텍처는 앱 설치부터 실행 후 종료할 때까지 계속 따라다니면서 관여한다. 우리가 설치하는 앱이 가장 상단에 있는 애플리케이션 영역에서 동작하고, 안드로이드는 중가ㅓㄴ에 있는 안드로이드 런타임 영역에서 개발자가 만든 앱을 제어한다.