안드로이드는 리눅스 커널 기반의 모바일 플랫폼 전용 운영체제이자 오픈소스 소프트웨어다.
안드로이드는 원래 디지털 카메라용 OS를 개발하려고 하던 신생 회사의 이름이었다. 휴대폰이 등장하고, 휴대폰에 카메라가 접목되어 나오면서 디지털 카메라 시장이 약간 주춤했고, 안드로이드 역시 트렌드에 맞춰가기 위해 휴대폰의 OS를 개발하기 시작하면서 지금의 안드로이드 OS가 개발되었다고 한다.
2005년 구글이 안드로이드를 인수했고, 안드로이드 OS에 맞는 애플리케이션 개발을 위해 젯브레인과 협업하여 인텔리제이 기반의 IDE인 안드로이드 스튜디오를 만들었다. 초기에 구글은 안드로이드 공식 언어로 자바를 선택했는데, 나는 종종 왜 구글이 자바를 선택했는지 이유가 궁금했다.
아래 글을 읽어보면, 일단 기술적인 이유, 즉 자바라는 언어가 가진 장점이 주된 이유 중 하나였던 것 같다. 일단 자바는 멀티 플랫폼 언어다.
C나 C++ 로 작성된 소스코드는 컴파일러에 의해 어셈블리 코드로 변환되고, 어셈블리 코드는 어셈블러에 의해 기계어, 즉 컴퓨터가 읽을 수 있는 코드로 변환된다. 만약 이 과정이 윈도우에서 이루어졌다면, 윈도우에서 생성된 머신코드는 윈도우에서만 실행할 수 있기 때문에 맥이나 우분투같은 타 OS에서 실행하려면 처음부터 다시 소스코드를 컴파일 해야한다. 즉 플랫폼에 종속적이다.
그러나 자바의 경우는 다르다. 자바로 작성된 소스코드는 javac라는 자바 컴파일러에 의해 바이트코드로 변환되고, 이 바이트 코드는 JVM이라는 가상머신의 컴파일러에 의해 각 OS에 맞게 실행될 수 있도록 변환된다. 그러니까 어느 OS든 JVM이 설치되어 있다면 다시 컴파일 할 필요 없이 자바 소스코드를 실행할 수 있다는 뜻이며, 이는 곧 플랫폼에 독립적임을 뜻한다.
또한 자바는 가비지 컬렉션이 자동으로 메모리 관리를 해주는 장점도 존재했다. 여튼 이러한 기술적인 이유들도 있었고, 또다른 이유로는 자바라는 언어가 가진 대중성이었다. 안드로이드가 개발되던 초기에 자바는 인기있고 대중적인 언어였고(지금도 역시 마찬가지지만), 따라서 개발자 시장엔 자바 개발자들이 넘쳐났다. 자바같은 대중적이고 접근하기 쉬운 언어를 사용해야 안드로이드 개발에 관심을 갖는 개발자들이 많아질테고, 그들이 안드로이드 개발에 빠르게 적응할 수 있다면 그것이 곧 안드로이드의 빠른 성장을 불러올 수 있기 때문이었다.
자바는 배우기 쉽고, 강력한 언어다. 하지만 자바의 문법 특성 상 코드가 길어질수록 장황해지고 복잡해진다. 이는 곧 생산성 측면에서 좋지 않고, 당시 자바를 두고 오라클과의 저작권 분쟁도 있었기에 구글 입장에서는 자바의 대안이 필요했다.
코틀린은 젯브레인에서 만든 JVM 기반의 언어다. 자바와 100% 호환되면서도, 간결한 문법과 null safety 등 기존 자바의 단점을 보완할 수 있었기에 자바의 대안으로서 충분했다. 따라서 2017년, 구글은 안드로이드 공식 언어로 코틀린을 추가하였다.
안드로이드는 오픈소스 소프트웨어 스택이다.
오픈소스
소프트웨어 스택?
그럼 안드로이드 플랫폼 구조를 하나씩 살펴보자.
안드로이드는 리눅스 커널 기반이다. 안드로이드는 리눅스 커널을 사용하여 메모리 및 드라이버, 전원 관리 등의 작업을 한다.
Linux Kernel
안드로이드는 수많은 리눅스 배포판 중 하나인 셈이다.
자바 API 프레임워크의 요청에 따라 오디오, 블루투스, 카메라와 같은 하드웨어 모듈의 기능을 사용할 수 있도록 라이브러리 모듈을 제공한다.
안드로이드 런타임(ART), HAL 등 많은 핵심 안드로이드 구성요소와 서비스가 사용하는 C/C++로 작성된 라이브러리다. 안드로이드는 C/C++과 같은 네이티브 코드로 안드로이드 앱의 일부를 구현할 수 있도록 NDK(Native Development Kit)를 제공하고 있다.
ART는 안드로이드의 애플리케이션 및 일부 시스템 서비스에서 사용하는 관리형 런타임이다. ART가 뭔지, 왜 등장했는지 이해하기 위해선 먼저 JVM과 DVM(Dalvik Virtual Machine)에 대해 이해하고 넘어가야 한다. 위에서 이미 언급했지만 안드로이드는 초기에 공식 언어로 자바를 선택했고, 따라서 안드로이드 역시 JVM을 사용할 수 있었으나, 당시 데스크탑에 비해 CPU 및 배터리 측면에서 모바일 환경은 다소 열악했고, 또한 라이센스 문제도 있었기 때문에 안드로이드 환경에서의 JVM은 적합하지 않았다.
따라서 안드로이드에 최적화된 가상머신인 Dalvik virtual machine, 즉 DVM이 등장했다. 자바로 작성된 소스코드가 자바 컴파일러에 의해 바이트 코드로 컴파일되는 과정까지는 데스크탑이나 안드로이드나 동일하지만, 안드로이드에서는 ‘덱스 컴파일러’에 의해 바이트 코드가 DVM이 읽을 수 있는 덱스 파일로 변환된다.
덱스 파일과 다른 리소스 파일 및 key store가 합쳐져 하나의 APK 파일이 생성된다.
DVM은 JIT 컴파일 방식을 사용한다. 즉 런타임 시에 실시간으로 컴파일을 하기 때문에 설치 시 속도가 빨랐으며, 레지스터 기반이기 때문에 스택 기반의 JVM보다 빠른 성능을 낼 수 있었다.
하지만 런타임 시에 컴파일을 하기 때문에 실행 속도가 느렸고, 번역한 정보를 메모리에 올렸기 때문에 메모리 부하가 컸으며, 배터리 성능 면에서도 좋지 않았다. 이를 개선하기 위해 안드로이드 Froyo 버전 이후 Trace JIT 방식을 사용했지만, 이 역시 성능을 개선하기에는 한계가 존재했다.
Trace JIT
이러한 DVM의 단점을 개선하여 나온 것이 바로 ART다. ART 환경에서는 앱 설치 시 한번에 컴파일을 하기 때문에 설치 속도가 느리며, 앱 용량이 커진다는 단점이 존재했으나 런타임에 컴파일을 하지 않기 때문에 실행 속도가 많이 개선되었으며, CPU의 부하가 감소되어 배터리 성능을 향상시킬 수 있었다.
안드로이드의 모든 기능은 자바로 작성된 API를 통해 사용할 수 있다.
안드로이드는 이메일, 달력, 카메라, 전화 등 기본 어플을 함께 제공한다. 이렇게 기본적으로 포함된 앱은 기본적인 기능을 제공할 뿐만 아니라, 개발자가 개발하고 있는 자체 앱에서도 접근하여 기본 앱의 기능을 사용할 수 있다. 예를 들어서 개발중인 앱에서 SMS 메시지를 전달하려는 경우 해당 기능을 직접 구현할 필요 없이 이미 설치된 메시지 앱을 호출하면 된다.