안드로이드 개발자 로드맵 — Part1: The Android Platform

Jaewoong Eum·2022년 1월 28일
79

원문은 The 2022 Android Developer Roadmap — Part1에서 확인하실 수 있습니다.

안드로이드 채팅 솔루션에 관심이 있으신 분들은 Stream의 Android Chat Messaging Tutorial 페이지를 방문해 주시길 바랍니다.

안드로이드 생태계는 지속적으로 성장하고 있습니다. 매일 새로운 솔루션과 자료들이 소개되면서 개발 속도가 놀라울 정도로 향상되었고, 개발자들의 삶을 한 층 더 편리하게 만들어 주고 있습니다.

총 5부로 연재될 안드로이드 개발자 로드맵 시리즈에서는 2022 Android Developer Roadmap을 따라 안드로이드의 전반적인 생태계에 대하여 다룰 예정이며, 안드로이드 개발자로서 어떻게 발전할 수 있는지에 대한 전반적인 관점을 제공합니다.

2022 Android Developer Roadmap은 현 안드로이드 생태계를 종합적으로 이해할 수 있도록 설계되었으며, 제공되는 로드맵을 따라 개념을 파악하는 데 도움이 되는 학습 곡선을 제공합니다.

이번 1부에서는, 다음과 같이 안드로이드 로드맵의 상위 4개의 섹션을 다룰 예정입니다.

  • Android Programming Languages (안드로이드 프로그래밍 언어)
  • Android OS (안드로이드 운영체제)
  • The Android Platform (안드로이드 플랫폼)
  • App Manifest (앱 매니페스트)

시작하기에 앞서, 방대한 학습 곡선을 보고 당황하지 않으셨으면 좋겠습니다. 학습하실 때는 본인에게 필요하다고 생각되는 부분만 골라서 학습 하실 것을 권장드립니다. 또한, 이 로드맵은 주관적 견해에 기반하여 작성된 것이기 때문에 일부 다른 의견이 있으시다면 언제든지 제보해 주시면 감사드리겠습니다.

총 5부로 연재될 이 시리즈 포스트에 대하여 새로운 알림 받고 싶으시다면, GitHub의 watchers에 참여하시거나 Twitter의 Stream을 팔로우 부탁드립니다.

Android Programming Languages

대부분의 네이티브 안드로이드 앱은 Kotlin, Java, C/C++으로 작성됩니다. Kotlin과 Java는 안드로이드 애플리케이션을 개발하는데 사용되는 주요 언어이며, C/C++은 Java Native Interface (JNI)를 사용하여 네이티브 함수를 호출하는 고성능 및 하드웨어 기반 앱을 개발하는 데 사용됩니다.

이번 섹션에서는 Kotlin과 Java에 대하여 다루어보고자 합니다.

Java

구글이 십수 년 전 첫 안드로이드 OS를 세상에 내놓았을 때, 당시 구글은 Java를 안드로이드 앱 개발을 위한 주요 언어로 채택했습니다.

왜 구글은 Java를 선택했을까요? 가장 오래된 객체 지향 언어 중 하나인 Java는 당시에 사람들에게 이미 친숙한 언어였기 때문에, 많은 사람들이 안드로이드 개발 환경에 적응하기 쉬웠습니다. 또한 모바일 임베디드 디바이스 위에서 동작하기에는 상당히 무거운 Java Virtual Machine (JVM)을 대체할 만한 Dalvik Virtual Machine (DVM)를 통하여 메모리를 보다 효율적으로 관리하고, 스마트폰이라는 한정된 자원 위에서 동작할 수 있는 최적화된 환경을 구축할 수 있었기 때문입니다.

Kotlin

Kotlin은 JetBrains에서 개발된 언어입니다. 처음부터 JVM 환경을 타겟팅 하고 있었으며, 함수형 프로그래밍과 객체지향 프로래밍이 결합된 형태로 디자인되었습니다.

Kotlin이 안드로이드 개발에 잘 유리한 이유는 다음과 같습니다:

  • 상호운용성: Kotlin은 Java와 100% 상호 운용되며 JVM 환경과의 상호 운용성을 지원합니다.
  • 안전성: 안드로이드 문서에 따르면 Kotlin 코드로 작성된 안드로이드 앱은 크래시가 발생할 확률이 통계적으로 약 20% 감소한다고 설명합니다.
  • 비동기: Kotlin은 코루틴이라는 비동기 솔루션을 언어 차원에서 지원하고 있습니다.

추가적으로, Google은 2019년도 Google I/O에서 Android’s Kotlin-first approach을 선언하였습니다. 그 이후로 Kotlin을 이용하여 개발되는 안드로이드 앱은 기하급수적으로 증가하는 추세를 보였습니다.

만약에 여러분들이 안드로이드 앱 개발에 입문하고 계신다면, 위와 같은 이유들로 Kotlin은 좋은 선택이 될 것입니다.

Android Operating Systems

안드로이드 플랫폼은 리눅스 커널을 기반으로 하고 있으며, 리눅스의 보안 기능들을 안드로이드 OS 디자인에 사용하여 다양한 이득을 취하였습니다. 리눅스 커널은 1991년도에 생성된 이후로, 수백만 개의 보안에 민감한 시스템들에 사용되어 왔으며, 수천 명의 엔지니어들이 끊임없이 연구, 테스트, 개선해온 오랜 역사를 가지고 있습니다.

안드로이드 문서에 따르면, 안드로이드는 다음과 같은 리눅스 보안 기능들을 활용하고 있습니다.

  • 사용자 기반 권한 모델
  • 프로세스 분리
  • 안전한 프로세스 간 통신(IPC)을 위한 확장 가능한 메커니즘
  • 커널의 불필요한 부분 및/또는 안전하지 않은 부분을 제거하는 기능

리눅스의 또 다른 주요 기능은 다중 사용자 운영 체제인데, 이를 통해 여러 사용자가 메모리, CPU 리소스, RAM, 애플리케이션과 같은 독립적인 시스템 리소스에 액세스할 수 있습니다. 또한 사용자 간에 할당하는 리소스 공간을 서로 분리하여, 사용자 간의 데이터를 서로 안전하게 보호할 수 있습니다.

안드로이드 플랫폼은 리눅스의 멀티 유저 시스템의 장점을 취함과 동시에, Application Sandbox라는 안드로이드 자체 기능을 포함하고 있습니다. 이는 사용자간의 앱 할당 리소스를 분리하고, 시스템을 악성 앱으로부터 보호하는 역할을 하고 있습니다. 자세한 내용은 Application Sandbox를 참조하시는 것을 권장드립니다.

Android Platform Architecture

안드로이드 플랫폼 아키텍처는 리눅스 커널 위에 총 6개의 계층으로 구성되어 있습니다. (실제 아키텍처는 위의 이미지와 반대 순서로 계층을 이루고 있습니다.)

각 계층을 하나씩 살펴보도록 하겠습니다.

The Linux Kernel

리눅스 커널은 안드로이드 아키텍처의 핵심 입니다. 리눅스 커널은 저수준의 메모리와 사용 가능한 모든 하드웨어 드라이버 (와이파이 드라이버, 카메라 드라이버, 블루투스 드라이버, 디스플레이 드라이버 및 모든 주변 장치 드라이버)들을 Low Memory Killer Daemon를 통해 관리합니다.

Hardware Abstraction Layer (HAL)

The hardware abstraction layer (HAL)은 표준 인터페이스를 정의함으로써 하드웨어와 상위 계층의 Java API 프레임워크를 중계하고, 별도의 고차 함수들의 수정 없이 저수준 기능들을 구현할 수 있도록 합니다.

HAL 구현체들은 모듈로 패키지화되어 공유 라이브러리(.so 파일)로 저장되며, 필요한 시간에 안드로이드 시스템에 의해 적재됩니다.

Android Runtime

Android Runtime (ART)는 안드로이드에서 사용되는 애플리케이션 런타임 시스템이며, 안드로이드 생태계의 핵심 기능 중 하나입니다. ART는 안드로이드 5.0 (롤리팝) 혹은 그 이상의 디바이스에서 Dalvik Virtual Machine을 대체하기 위해 개발되었습니다.

ART의 주요 역할은 DEX 바이트코드를 시스템이 이해할 수 있는 기계어로 변환하여 DEX(Dalvik Executable Format)를 실행하는 것입니다.

ART 아키텍처는 저메모리 디바이스에서 여러 가상 머신을 실행하기 위해 고안되었습니다. 특히 일부 주요 기능들은 안드로이드 애플리케이션 실행 속도와 직접적인 연관성이 있습니다. ART의 대표적인 기능은 다음과 같습니다.

  • Ahead-of-time (AOT) 및 just-in-time (JIT) 컴파일
  • 향샹된 가비지 컬렉터
  • 앱 패키지의 DEX 파일을 축약된 기계 코드로 변환(Android 9(API 수준 28+)
  • 세부 진단 및 에러 보고, 여러 감시점 설정 기능 등을 포함한 디버깅 지원 개선

자세한 내용은 Android Runtime (ART) and Dalvik을 참고해주세요.

Native C/C++ Libraries

안드로이드 플랫폼에는 Native Development Kit (NDK) 위에서 동작하는 네이티브 API가 포함되어 있습니다.

Native API를 사용하면 네이티브 동작들을 관리하고 카메라, 센서, 그래픽 및 오디오와 같은 물리적 장치 구성 요소에 접근할 수 있습니다. 또한 상위 수준 계층에 노출되므로 Java API 프레임워크에서 물리적 디바이스의 구성 요소를 제어할 수 있습니다.

Java API Framework (Application Framework)

Java API 프레임워크는 Java와 Kotlin으로 작성된 안드로이드 라이브러리의 집합으로, 안드로이드 OS의 전체적인 기능들을 제공합니다. Android API는 확장 가능한 View System, 재사용 가능한 구성 요소 및 시스템 관리자가 포함됩니다.

Java API 프레임워크에서 제공하는 강력한 API 중 하나는 최근 구글이 심혈을 기울여 개발하고 있는 Android Jetpack 라이브러리입니다. Jetpack은 개발자들이 비즈니스 로직에 집중할 수 있도록하고, 지속적으로 발생하는 보일러 플레이트 코드를 줄여 개발 속도를 가속화하는데 도움을 주고 있습니다.

Lifecycle, UI Toolkit, Navigation, Security, Caching, Scheduler, Dependency Injection 등의 다양한 솔루션을 제공합니다. 이 내용들은 다음 포스트에서 조금 더 자세히 다루어볼 예정입니다.

System Apps

시스템 앱은 이메일 앱, 문자 앱, 달력 앱, 인터넷 브라우저, 연락처 등 과같이 사전에 설치된 앱을 의미하며, ROM과 함께 시스템 파티션에 위치합니다. 시스템 앱의 구성은 스마트폰 제조사에 따라 달라질 수 있습니다. 자세한 내용은 시스템 앱을 참조해주세요.

이번 섹션에서 안드로이드 플랫폼의 전반적인 아키텍처의 대해서 다루었습니다. 자세한 내용은 Android Platform Architecture을 참조해주세요.

App Manifest

모든 안드로이드 프로젝트에는 반드시 패키지 이름, 진입점, 구성 요소, 권한 및 메타데이터와 같은 앱 대한 필수 정보를 정의하는 AndroidManifest.xml 파일이 있어야 합니다.

Package Name and Application ID

모든 안드로이드 프로젝트는 반드시 AndroidManifest.xml 안에 앱의 고유한 앱 ID를 나타내는 패키지 정보가 포함되어야 합니다. 또한 매니페스트 파일은 반드시 /src/main 폴더에 위치해야 합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="io.getstream.chat.android.ui">

패키지 정보는 안드로이드 시스템 (물리적 디바이스)와 Google Play에서 본인의 앱이라는 것을 증명할 수 있는 유일한 방법입니다. 안드로이드 빌드 툴은 패키지 정보를 다음과 같이 사용합니다.

  • 패키지 이름을 앱 리소스의 네임스페이스로 적용합니다.
  • 매니페스트 파일에 암시적으로 정의된 클래스 이름을 판별하는데 사용됩니다. 가령, 위의 예시 매니페시트 파일에서 액티비티는 <activity android:name=".MainActivity">와 같이 정의하지만, 이를 io.getstream.chat.android.ui.MainActivity로 재정의합니다.

자세한 내용은 App Manifest Overview를 참조해주세요.

마무리

이로써 2022 Android Developer Roadmap 1부 포스트를 마무리합니다. 이번 섹션에서는 안드로이드 OS 아키텍처의 디테일한 부분을 다루었으며, 포스트를 통해서 안드로이드 앱이 실제 OS에서 어떻게 동작하는지 대략적으로 이해하는데 도움이 되었으면 좋겠습니다.

다시 한 번 말씀드리지만, 로드맵의 방대한 양에 절대 당황하지마시고 학습에 필요한 부분만 선택적으로 학습하시는 것을 권장드립니다.

다음 포스트는 Stream 블로그에 가장 먼저 연재될 예정이며, 추후 velog에 번역본이 포스팅 될 예정입니다.

즐거운 코딩 되시길 바랍니다!

작성자 엄재웅 (skydoves)

profile
http://github.com/skydoves

2개의 댓글

comment-user-thumbnail
2022년 4월 8일

너무나도 잘 읽었습니다! 감사드립니다 :)

답글 달기
comment-user-thumbnail
2023년 4월 11일

양질의 포스팅 감사합니다. 잘 읽었습니다 :)

답글 달기