Programming/Android

[Android Roadmap] Part1: The Android Platform

코딩뽀시래기 2023. 1. 24. 02:40
728x90

 

📌 Part1: The Android Platform

 

 

The Android Platform: The 2022 Android Developer Roadmap - Part 1

Want to start learning Android development? This 2022 Android Developer Roadmap will take you from zero to hero in no time.

getstream.io


 

1️⃣ Android Programming Languages

  • Kotlin, Java: Android 기본 언어
  • C++: JNI(Java Native Interface)를 사용해 Native 함수를 호출하는 '성능 지향' 또는 '하드웨어 기반' 기능 개발에 이용

 

✅ JNI(Java Native Interface)란?

  • Java 외의 다른 언어(C/C++ 등)과 Java 사이의 연결을 위한 인터페이스
  • Java에서 C/C++을 사용할 수도 있고, C/C++에서 Java를 사용할 수도 있음.

 


 

🔴 Java

 

- Google이 Java를 안드로이드 앱 개발의 주요 언어로 선택한 이유?

  • Java가 당시 사람들에게 이미 친숙한 언어였기 때문에 개발 환경에 적응이 쉬웠음.
  • 무거운 JVM(Java Virtual Machine)을 대체할 수 있는 DVM(Dalvik Virtual Machine)을 통해 메모리를 효율적으로 관리 가능
  • 스마트폰이라는 한정된 자원에서 동작할 수 있는 최적의 환경을 구축할 수 있음.

 

 

JVM(Java Virtual Machine)과 DVM(Dalvik Virtual Machine)

  • Java를 컴파일 할 때, Java를 컴파일 한 Java Byte Code를 기계어로 변환하는 데에 JVM이 사용됨.
  • 라이센스 문제와 메모리 효율성의 문제로 안드로이드는 JVM 대신 DVM 사용
  • 라이센스 문제: 라이센스 비용 지불 문제
  • 효율성 문제: JVM은 스택 기반 모델이기 때문에 많은 메모리를 요구함.
  • DVM의 장점: 레지스터 기반 모델로 적은 메모리에 최적화되어 있고, JVM에 비해 명령이 단순하고 처리 속도가 빠름. 여러 개 VM 인스턴스를 실행할 수 있으며, 프로세스 독립성과 메모리 관리/스레딩을 지원함.

 


 

🟡 Kotlin

  • JetBrains에서 개발한 언어
  • JVM 환경을 타겟팅
  • 함수형 프로그래밍과 객체지향 프로그래밍이 결합된 형태

 

- Kotlin이 안드로이드 개발에 유리한 이유?

  • 상호운용성: Java와 100% 상호 운용되고, JVM 환경과 상호 운용성 지원
  • 안정성: Kotlin 코드로 작성된 안드로이드 앱은 Crash 확률이 약 20% 감소
  • 비동기: 코루틴(Coroutines)이라는 비동기 솔루션을 언어 차원에서 지원
  • Google이 2019년에 Android 개발은 Kotlin 우선이 될 것이라고 발표

 

 

✅ JVM 환경을 이용하는 이유?

  • 메모리 안정성 보장
  • Buffer Overflow 방지 (*Buffer Overflow: 프로그램이 실행될 때 입력받는 값이 많아 Buffer 이후의 공간을 침범)
  • 동적 메모리 할당 문제 예방

 

✅ Kotlin 코드의 Crash 확률이 더 적은 이유?

  • 일반적인 프로그래밍 실수를 방지하는 데 도움이 되는 언어 기능이 있음.
  • Null 안정성: null이 될 수 있는 타입도 지원. null 포인터로 인한 프로그램 중단 예방.
  • 정적 타입 지정 언어: 모든 프로그램의 구성요소를 컴파일 시점에서 알 수 있고, 컴파일러가 타입을 검증해 줌. 개발자가 타입을 선언하지 않고 컴파일러가 정확성을 검증하므로 프로그램이 오류로 중단될 가능성이 적어짐.

 

✅ 표현력이 높고 간결

  • 적은 노력으로 많은 작업 가능
  • 상용구 코드를 적게 사용하면서 아이디어를 풍부하게 표현 가능
  • 함수 타입에 대한 지원: 함수형 프로그래밍을 지원하여 가독성을 높이고, 유지보수를 용이하게 함. 함수를 통해 불변데이터 구조를 사용하므로 다중스레드를 사용해도 안정적.

 

✅ 코루틴(Coroutines)의 장점

  • 비동기 코드를 차단 코드처럼 쉽게 사용할 수 있음
  • 네트워크 호출, 로컬 데이터 액세스 등 백그라운드 작업 관리를 단순화 가능

 


 

2️⃣ Android OS

  • Android 플랫폼은 Linux Kernel을 기반으로 함.
  • Linux 보안 기능을 Android OS 디자인에 사용하여 다양한 이득

 

- Android OS에 사용된 Linux 보안 기능

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

 

- 다중 사용자 운영 체제(Multiuser Operating System)

  • Linux
    • 여러 사용자가 메모리, CPU, 리소스, RAM, 애플리케이션 같은 독립적인 시스템 리소스에 액세스 가능
    • 사용자 간에 할당하는 리소스 공간을 서로 분리하여 사용자 간의 데이터를 서로 안전하게 보호 가능

 

  • Android Platform
    • Linux의 다중 사용자 시스템의 장점을 취함
    • Application Sandbox라는 안드로이드 자체 기능 포함.
    • Application Sandbox: 사용자간의 앱 할당 리소스를 분리하고, 시스템을 악성 앱으로부터 보호하는 역할

 


 

3️⃣ Android Platform Architecture

  • Android Platform Architecture는 Linux Kernel 위에 총 6개의 계층으로 구성되어 있음.
  • 실제 Architecture는 위 이미지와 반대 순서의 계층

 


 

🔴 The Linux Kernel

  • Android Platform Architecture의 핵심
  • 저수준의 메모리와 사용 가능한 모든 하드웨어 드라이버들을 Low Memory Killer Daemon을 통해 관리

 

 

Low Memory Killer Daemon이란?

  • 실행 중인 Android 시스템의 메모리 상태를 모니터링
  • 메모리가 부족할 때 다른 앱의 프로세스를 죽임으로써 메모리 확보
  • 앱 상태에 따라 우선순위를 매기고, 가장 우선순위가 높은 앱의 프로세스부터 메모리가 확보될 때까지 하나씩 죽임.
  • 우선순위가 높다는 것은 현재 죽여도 큰 문제가 발생하지 않는 앱이라고 판단된 앱임.

 


 

🟠 Hardware Abstraction Layer(HAL)

  • 표준 인터페이스를 정의함으로써 하드웨어와 상위 계층의 Java API 프레임워크를 중계하고, 별도의 고차 함수들의 수정 없이 저수준 기능들을 구현할 수 있도록 함.
  • HAL 구현체들을 모듈로 패키지화 되어 공유 라이브러리로 저장되며, 필요한 시간에 안드로이드 시스템에 의해 적재됨.

 


 

🟡 Android Runtime(ART)

  • Android에서 사용되는 애플리케이션 런타임 시스템
  • Android 생태계의 핵심 기능 중 하나
  • ART는 Android version 5.0 (Lollipop) 또는 그 이상의 디바이스에서 DVM(Dalvik Virtual Machine)을 대체하기 위해 개발
  • 주요 역할: DEX Byte Code를 기계어로 변환하여 DEX(Dalvik Executable Format)를 실행하는 것
  • 저메모리 디바이스에서 여러 가상 머신을 실행하기 위해 고안됨.
  • 일부 주요 기능들은 Android 애플리케이션 실행 속도와 직접적인 연관이 있음.

 

- ART의 대표적인 기능

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

 

 

✅ DEX(Dalvik Executable Format)란?

  • Dex 파일에는 Android 런타임에서 궁극적으로 실행되는 코드가 포함되어 있음.
  • ART 위에서 동작시키기 위해서는 .class 파일을 .dex 파일로 만드는 과정이 필요

 

✅ ART를 사용하는 이유

  • 대부분 모바일 장치는 메모리, 처리 성능 및 배터리 수명이 제한되므로 JVM보다 ART가 우수한 성능을 제공

 

Ahead-of-time(AOT) 및 just-in-time(JIT) 컴파일

  • AOT: 소스 코드를 미리 컴파일하는 방식
  • JIT: 소스 코드가 서버에서 컴파일되는 것이 아니라 사용자의 브라우저에서 컴파일되는 방식

 


 

🟢 Native C/C++ Libraries

  • Android 플랫폼에는 Native Development Kit(NDK) 위에서 동작하는 Native API가 포함

 

- Native API를 사용하면?

  • Native 동작 관리
  • 카메라, 센서, 그래픽 및 오디오와 같은 물리적 장치 구성 요소에 접근 가능
  • 상위 수준 계층에 노출되므로 Java API Framework에서 물리적 디바이스의 구성 요소 제어 가능

 

 

✅ Native Development Kit(NDK)란?

  • Android에서 C/C++ 코드를 사용할 수 있게 해주는 도구 모음

 


 

🔵 Java API Framework (Application Framework)

  • Java와 Kotlin으로 작성된 Android 라이브러리 집합
  • Android OS의 전체적인 기능 제공
  • 확장 가능한 View System, 재사용 가능한 구성 요소 및 시스템 관리자가 포함됨

 

- Android Jetpack

  • Android API Framework에서 제공하는 가장 강력한 API 중 하나
  • 개발자들이 비즈니스 로직에 집중할 수 있도록 함
  • 지속적으로 발생하는 Boilerplate code를 줄여 개발 속도를 가속화하는데 도움
  • Lifecycle, UI Toolkit, Navigation, Security, Caching, Scheduler, Dependency Injection 등의 다양한 솔루션을 제공

 

 

✅ 보일러플레이트 코드(Boilerplate code)란?

  • 최소한의 변경으로 여러 곳에서 재사용되며, 반복적으로 비슷한 형태를 띄는 코드
  • 매번 프로그래밍을 할 때마다 Boilerplate code를 작성하는 것은 비효율적이고 귀찮음.
  • 리팩토링을 하게 되면 Boilerplate code도 같이 수정해야 하는 경우가 많기 때문에 더욱 복잡해짐.

 


 

🟣 System Apps

  • 이메일 앱, 문자 앱, 달력 앱 등 사전에 설치된 앱을 의미
  • ROM과 함께 System Partition에 위치
  • System Apss의 구성은 스마트폰 제조사에 따라 달라질 수 있음.

 


 

4️⃣ App Manifest

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

 


 

🔴 Package Name and Application ID

  • 모든 Android 프로젝트는 반드시 AndroidManifest.xml 안에 앱의 고유한 ID를 나타내는 패키지 정보가 포함
  • Manifest 파일은 반드시 /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">
    …

 

  • 패키지 정보
    • Android System(물리적 디바이스)와 Google Play에서 본인의 앱이라는 것을 증명할 수 있는 유일한 방법
    • 패키지 이름을 앱 리소스의 네임스페이스로 적용
    • Manifest 파일에 암시적으로 정의된 클래스 이름을 판별하는 데 사용
    • 위의 예시 Manifest 파일에서 Activity는 <activity android:name=".MainActivity">와 같이 정의하지만, 이를 io.getstream.chat.android.ui.MainActivity로 재정의

 


 

📌 Android Developer Roadmap

https://github.com/skydoves/android-developer-roadmap

 

GitHub - skydoves/android-developer-roadmap: 🗺 The 2022 Android Developer Roadmap suggests learning paths to understanding An

🗺 The 2022 Android Developer Roadmap suggests learning paths to understanding Android development. - GitHub - skydoves/android-developer-roadmap: 🗺 The 2022 Android Developer Roadmap suggests learn...

github.com

 

728x90