📌 Part1: The Android Platform
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
'Programming > Android' 카테고리의 다른 글
[Android Roadmap] Part4: Design Patterns and Architecture (1/2) (0) | 2023.02.21 |
---|---|
[Android Roadmap] Part2: App Components (0) | 2023.01.31 |
[Android/Kotlin] viewBinding 세팅 (0) | 2022.10.25 |
[UMC 3rd/Android] 파파고 UI 구현 (xml) (0) | 2022.10.11 |
[UMC 3rd/Android] 주요 Layout (0) | 2022.09.28 |