App_Dev/Android

[ 앱 개발자 도전기 : 안드로이드 ] 안드로이드 운영체제 부분 정리하기.

안다미로 : Web3 & D.S 2024. 11. 5. 17:54

 

 

 

[ 앱 개발자 도전기 : 안드로이드 ] 안드로이드 운영체제 부분 정리하기.

 


 

 

∇ 안드로이드 운영 체제 관련 정리

목   차

1. 운영 체제란 ?
2. 안드로이드 운영체제의 구조 [ 운영체제 + 플랫폼 ]
3. 안드로이드 OS의 특징
4. 안드로이드에서 네이티브 코드란?
5. 프로세스와 스레드
6. 프로세스 우선순위

 

 


 

1. 운영 체제란 ?


 

  ☆ 운영체제란, Operating System으로  일반적으로   "OS" 라고 말합니다.

 

           ◎ 운영체제컴퓨터 시스템의 기본적인 구성요소이며, 

                " 하드웨어와 소프트웨어 응용 프로그램을 연결하고 관리하는 시스템 소프트웨어 " 라고 할 수 있습니다.

 

          ◎  커널(Kernel)은 운영체제의 핵심이 되는 부분으로, 

                 하드웨어와 프로그램 사이에 인터페이스를 제공하고 하드웨어와 소프트웨어의  리소스를 관리합니다.

 

          ☆ 즉, 운영체제는 '커널'을 통해 시스템 전반을 통제합니다.

 

 


           ∇ 운영체제의 대표적인 기능들.

 

 

                   1. 리소스 관리.

                           √  컴퓨터의 CPU, 메모리(RAM), 보조 기억장치 및 네트워크와 같은 하드웨어 리소스를 관리합니다.

                           √   운영체제, 프로그램, 드라이버와 같은 소프트웨어 리소스도 관리합니다.

 

                   2. 장치 드라이버

                           √  키보드, 마우스, 모니터와 같은 하드웨어 장치를 제어하기 위한 장치 드라이버를 제공합니다.

 

                   3. 사용자 인터페이스(UI)

                           √  사용자가 컴퓨터와 상호작용할 수 있는 UI(User Interface, 사용자 인터페이스)를 제공합니다.

 

                   4. 보안 ( Security )

                           √  사용자 및 프로그램의 보안을 관리하고, 사용자 인증 및 권한 관리 드의 기능을 제공합니다.

 

                   5. 프로그램 실행

                     √  프로그램을 실행하고, 프로그램이 컴퓨터의 하드웨어 및 소프트웨어 리소스에 엑세스 가능하도록 합니다.

 

 


2. 안드로이드 운영체제의 구조 [ 운영체제 + 플랫폼 ]


 

    ※  안드로이드 운영체제

         "리눅스(Linux) 커널 " 과 이에 기반한 " 안드로이드 소프트웨어 스택 " 으로 구성되어 있습니다.

 

 

           ◎ 안드로이드 운영체제에서,  ' 리눅스 커널 ' 이 가지는  특징들

     

                     - 안드로이드 운영체제의 핵심인 리눅스 커널은 안드로이드 운영체제 상에서 하드웨어를 제어하고

                           안드로이드 앱과 다른 시스템 서비스가 상호 작용할 수 있도록 인터페이스를 제공합니다.

 

                     - " 리눅스 커널 " 은 멀티태스킹, 메모리 관리, 네트워킹 등

                          안드로이드 구현 및 활용 측면에서 필요한 다양한 기능을 제공합니다.

 

                     -  안드로이드 운영체제에서 ' 리눅스 커널 ' 은 모바일 기기의 하드웨어 리소스를 관리하고

                         이를 통해서 안드로이드 앱은 카메라 * 스피커 * 마이크 * 사진 등등의 하드웨어 리소를 이용하여

                        유저에게 다양한 기능들을 제공 가능합니다.

 

                     - " 리눅스 커널 " 안드로이드 운영체제에서 보안을 담당 합니다.


 

 

           ◎ 안드로이드 소프트웨어 스택을 구성하는 4개의 주요 계층들

 

 

                     1. 응용 프로그램 계층 ( Application Layer ) 

 

                         ● 안드로이드 운영체제의 가장 상위 계층으로, 사용자와 상호 작용하는 애플리케이션들을 포함.

 

                         ● 안드로이드 사용자 경험의 핵심을 이루며, 다양한 종류의 애플리케이션들이 모두 이 계층에서 실행.

 

                         ● 사용자 인터페이스, 애플리케이션 로직, 데이터 관리 및 다양한 기능을 수행하는 애플리케이션들로 구성.

 


 

 

                     2. 애플리케이션 프레임워크 계층 ( Application Framework Layer )

 

                         ● 안드로이드 운영체제에서 제공하는 애플리케이션 개발을 위한

                                 API ( Application Programming Interface) 를 제공하는 계층입니다.

 

                         ● " 안드로이드 응용 프로그램 계층 " 과   " 안드로이드 런타임 계층 " 사이에 위치하며,

                                 안드로이드 애플리케이션 개발자들이 안드로이드 운영체제에서 제공하는 다양한 기능들을 

                                   활용 가능하도록 도와줍니다.

 

                         ● 안드로이드 4대 컴포넌트들 ( Activity, Service, Broadcast receiver, Content Provider ) , DB 연동,

                                  메시지 전송, 위치 정보, 각종 센서 등을 다룰 수 있는 API를 제공합니다.

 

                         ● 안드로이드 리소스 관리 및 액티비티 관리와 같은 중요한 기능들을 포함합니다.

 

                         ● 핵심 도듈식 시스템 구성 요소/서비스 재활용을 단순화, Android 앱 제작에 필요한 빌딩 블록 구성.

 

빌딩 블록 종류

(1) View System(목록, 그리드, 텍스트 상자, 버튼 및 삽입)
- 가능한 웹 브라우저를 포함하여 앱의 UI를 빌드하는 데 사용 가능, 기능이 풍부하며 확장 가능

(2) ResourceManager
- 현지화 된 문자열, 그래픽 및 레이아웃 파일과 같은 코드가 아닌 리소스에 대한 액세스 제공 

(3) NotificationManager
- 모든 앱이 상태 표시 줄에 사용자 지정 알림을 표시 할 수 있도록 지원

(4) Activity Manager
- 앱의 수명 주기를 관리하고 공통 탐색 백스택 제공 

(5) 콘텐츠 제공자 (Content Providers)
- 앱이 주소록 앱과 같은 다른앱의 데이터에 액세스하거나 자신의 데이터를 공유 할 수 있도록 지원

 

 

                     3 - 1. 안드로이드 런타임 계층 ( Android Runtime Layer )

 

                         ● 안드로이드 애플리케이션을 실행하는 데 필요한 기능(컴파일)을 제공하는 계층.

 

                         ● 안드로이드에서는 이전에는  JVM(자바 가상 머신) 기반의 런타임 환경인 Dalvik을 사용하다가

                                                           최근에는 ART( 안드로이드 런타임)을 사용하고 있습니다.

 

                         ● ART는 JIT( Just-In-Time ) 컴파일러가 아닌 AOT(Ahead - Of - Time) 컴파일러를 사용하기 때문에

                               Dalvik보다 성능이 뛰어나지만, 더 많은 메모리를 소모합니다.

 

                         ● 이 계층에서는 네이티브 코드(C/C++)를 실행할 수 있는 인터페이스를 제공합니다.

 

 

 

 

 

                     3 - 2. 네이티브 라이브러리 계층 ( Native Library Layer )

 

                         ● 안드로이드 애플리케이션이 실행될 때 사용되는 C / C++ 라이브러리들을 포함하는 계층.

 

                         ●  네이티브 라이브러리의 안드로이드 시스템 라이브러리를 통해 안드로이드 운영체제에서

                             다양한 시스템 레벨의 기능들

                             ( 그래픽 처리, 오디오 및 비디오 인코딩/디코딩, 네트워크 연결, 데이터베이스 엑세스 등 ) 을 수행.

 

                         ● 이 계층을 통해 안드로이드 NDK( Native  Development Kit ) 를 사용하여,

                              C / C++ 코드를 작성하고, 이를 안드로이드 애플리케이션에 포함시켜 사용할 수 있습니다.

 

 


 

                     4. 하드웨어 추상화 계층 ( HAL : Hardware Abstraction Layer )

 

                         ● 안드로이드 운영체제는 다양한 하드웨어 ( 카메라, GPS, 조도 센서, wifi 모듈 등)과 함께 동작하는데,

                               이 계층에서는 각각의 하드웨어를 추상화시켜서 애플리케이션 프레임워크 계층(2번)에 제공합니다.

 

                         ●  하드웨어의 추상화된 인터페이스를 이용하는 덕분에,

                               안드로이드 앱 개발자들은 하드웨어와 관련된 복잡한 작업을 수행하지 않아도 됩니다.

 

                         ● 하드웨어 추상화 계층은,  리눅스 커널 - 하드웨어(드라이버) 사이에서 작동합니다.

 


          ☆ 정리해보자면,

                  안드로이드 운영체제(OS)는

                  리눅스 커널과 4개의 안드로이드-소프트웨어 스택으로 구성되어 있으며,

 

      " 리눅스 커널 " 은 안드로이드 운영체제의 핵심적인 관리자 역할을 수행하고 

      " 각각의 계층 " 에서는 필요한 기능들을 제공하여 안드로이드 애플리케이션 개발에 필요한 환경을 제공 !

 

 

안드로이드 소프트웨어 스택

 


 

 

3. 안드로이드 OS의 특징.


 

         1. 오픈 소스

 

                √ 개발자들이 소스 코드에 접근하여 이를 수정하고서 배포 가능.

                √ 다양한 제조사가 자신들의 디바이스에 커스텀화 된 안드로이드 버전을 개발 가능.


         2. 다양한 하드웨어 지원

 

                √ 안드로이드는 다양한 하드웨어 플랫폼을 지원, 이식 = 포팅이 쉬움.

                √ 제조업체가 다양한 종류의 기기를 출시할 수 있게 하며, 소비자에게는 더 많은 선택권을 제공 가능.


         3. 구글 서비스와의 통합

 

                √ 구글 플레이 스토어를 포함한 구글의 다양한 서비스와 밀접하게 통합.

                √ 사용자는 앱, 게임, 책, 영화 등 다양한 컨텐츠에 쉽게 접근.


         4. 커스터마이징 가능

 

                √ 안드로이드는 홈 스크린 위젯, 라이브 배경화면, 다양한 런처 앱 등을 통해 사용자 맞춤화가 가능.

                √ 자신의 디바이스를 개인의 취향에 맞게 조정.


         5. 멀티태스킹

 

                √ 강력한 멀티태스킹 기능을 지원.

                √ 사용자가 여러 애플리케이션을 동시에 실행하고 쉽게 전환.


         6. 기타.

 

                √ 보안, 정기적인 업데이트, API 지원, 대규모 사용자 풀 등등..

 

 


 

 

4. 안드로이드에서 네이티브 코드란?


     - 안드로이드에서 네이티브 코드란,  C/C++ 등의 언어로 작성된 코드문을 의미합니다.

 

              - > 네이티브 코드는 안드로이드 운영체제에서 직접 실행되기 때문에 

                       Java 혹은 Kotlin과 같은 안드로이드 프로그래밍 언어보다 더 높은 성능을 제공합니다.

 

              - > 안드로이드에서 네이티브 코드를 사용하려면, 안드로이드 NDK(Native Development Kit)을 사용해야 합니다.

                     NDK는 C/C++ 등의 네이티브 언어로 개발된 코드를 컴파일하고,

                    안드로이드 OS 상에서 실행 가능한 형태로 변환시켜주는 도구입니다.

 

              - > NDK를 사용하려면, JNI ( Java Native Interface )를 사용하여 네이티브 코드와 자바 코드를 연결시켜줘야 함

                   JNI를 사용하면 자바 코드에서 네이티브 함수를 호출하거나,

                   네이티브 코드에서 자바 객체를 생성하거나, 자바 콜백 함수를 호출할 수 있습니다.

 

 

                 ★ 주의할 점.

                         - 네이티브 코드는 안드로이드 OS와 밀접하게 연관되어 있기에, 호환성 문제가 발생 가능합니다.

                         - 네이티브 코드는 일반적으로 자바나 코틀린보다 낮은 수준의 언어로 작성되기 때문에,

                                보안 문제와 메모리 누수 등의 문제가 발생 가능합니다.

 

 


5. 프로세스와 스레드

 


     ☆ " 프로세스 "" 스레드 " 는 모두 컴퓨터 시스템에서  " 실행 단위 " 를 나타냅니다.

            = > " 실행 단위 " 란  프로그램 코드를 실행할 수 있는 최소한의 단위(규모)를 의미합니다.

 

 

 

         ∇ 프로세스 ( Process )

                 ※ " 프로세스 " 는 실행중인  "프로그램의 인스턴스"이고  하나 이상의 스레드를 통해 실행됩니다.

  

                            - "프로그램 인스턴스"라는 것은,  특정 프로그램이  메모리(RAM)의 영역과 CPU 등

                                자원을 할당 받아서 실행되고 있는 상태를 의미합니다.

 

                                 == " 프로세스 " 는 운영체제로부터 자원을 할당받는데,

                                        이렇게 할당 받은 자원을 가지고 독립적으로 실행 됩니다.

 

                            ★ '프로세스'는 메모리공간 * 파일핸들링*네트워크 연결 등, 자원을 독립적으로 사용하기 때문에

                                     일반적으로 하나의 프로세스는 다른 프로세스에 접근할 수 없습니다.

 

                           ☆ 프로세스가 다른 프로세스와 통신을 하기 위해서는

                                IPC ( Inter-Process Communication ) 메커니즘을 사용해야 합니다.

 

                                    - > IPC는 다른 프로세스와 데이터를 주고받기 위한 방법으로,

                                        안드로이드 환경에서는 [ Binder,  Intent,  Content Provider ] 등의 IPC 메커니즘을 주로 사용 !

 

프로세스의 메모리 영역 구조

 

프로세스 구조

 

                           ◇ 프로세스의 메모리 영역

                              

                                     1. Code(Text) : 프로세스가 실행할 코드를 저장하는 메모리 영역입니다.

                                           - 이 영역은 읽기 전용으로, 실행 중에 수정이 불가능합니다. 

 

                                     2. Data : 전역(Global) 변수와 정적(Static) 변수가 저장되는 메모리 영역입니다.

                                           - 이 영역은 실행 중에 수정이 가능합니다.

                                                    - BSS : 초기화되지 않은 변수가 저장되는 곳

                                                    - Data : 초기화된 변수가 저장되는 

 

                                     3. Heap : 동적으로 할당되는 메모리 영역입니다.

                                           - 메모리를 동적으로 할당하여 사용하는 경우,  이 영역에서 할당됩니다.

 

                                     4. Stack : 함수 호출과 관련된 지역 변수 * 매개변수 * 함수 호출 시 저장되는 

                                                      반환 주소 등이 저장되는 메모리 영역입니다.

                                            - 스택은 후입선출(LIFO) 구조로 동작하며, 함수 호출과 관련된 정보가 스택에 쌓이고

                                                  함수가 반환되면 해당 정보가 스택에서 제거됩니다.

 

 


 

         ∇ 스레드 ( Thread )

                 ※  " 스레드 " 는 프로세스 내부에서 실행되는 실행 단위입니다.

 

                            - 스레드부모 프로세스 내의 메모리 공간을 차지하고,

                                               부모 프로세스로부터 자원을 공유 받아아서 사용합니다.

 

                                        == 모든 영역의 자원을 공유하는 것 X

                                                  - > 스레드는 프로세스의 메모리 영역 중 Code, Data, Heap 영역만 공유

                                                        [ Stack 영역은 고유하게 가지게 됨 ]

 

                                                  - > 스레드는 프로세스로부터 자원을 공유 받기 때문에, 

                                         하나의 프로세스에서 여러개의 스레드가 동시 실행되는 경우, 자원 충돌(경합)이 발생 가능.

 

                                                 - > 자원 충돌을 방지하기 위해, 

                                                        스레드는 프로세스 내에서 공유한 자원에 대해 동기화 과정이 필요.

 

 


 

         ∇ 안드로이드에서 프로세스와 스레드.

 

                  ※ 안드로이드 앱은 일반적으로 하나의 프로세스에서 실행되며,

 

                       각각의 액티비티, 서비스, 브로드캐스트 리시버, 콘텐츠 프로바이더 등의 컴포넌트는 

                       단일 스레드 모델에 따라, 단일 스레드에서 실행 됩니다.

 

 

                           § 안드로이드에서 단일-스레드 모델을 사용하는 이유.

 

                                  √ 앱의 생명 주기를 관리하기 용이

                                  √ UI 업데이트 및 이벤트 처리를 단순하게 만들 수 있다는 점.

 

                                  + √ 불필요하게 멀티-스레드 방식을 사용하는 경우,

                                         CPU와 메모리 자원을 과도하게 사용하여 기기의 성능에 부정적 영향을 줄 수 있음.

 

                                     But,

                                        필요한 경우 manifest 파일에서 컴포넌트가 실행되는 프로세스를 별도로 지정할 수 있고

                                            여러 스레드를 사용하여 앱을 실행 가능합니다.

 

 

 

                        § 안드로이드에서 멀티 프로세스 개념도 중요하지만, 더 중요한 것은 멀티 스레드

 

                                ◎ 안드로이드 앱은 일반적으로 '단일-스레드'에서 실행되는데

                                         이 단일 스레드를  '메인스레드' 혹은 'UI스레드'라고 합니다.

 

                                   - > 안드로이드앱이  단일 스레드로 실행되는 과정에서,

                                        네트워크 작업 * 데이터베이스 작업 * 파일 입출력 등 자원을 많이 소모하는 작업을 하는 경우에                                            UI 스레드는 비중 높은 작업들이 완료될 때가지 멈춘 상태를 유지하게 됩니다.

 

                                             -- > 이 경우 '5초 이상 동안' UI 스레드가 멈춰 있게 되면,

                                                    ANR(Application Not Responding) 오류가 발생하게 됩니다.

 

                                       ☆ 이 문제를 해결하기 위해서,  

                                            무거운 작업들은 UI 스레드에서 분리하여 별도의 스레드가 처리하도록 하는 방식의

                                            멀티-스레드 방식을 사용해야 합니다.

 

 

                        § 안드로이드에서 멀티 스레드 방식을 사용할 때, 지켜야하는 규칙들.

 

                             ○ UI 업데이트는 메인 스레드(UI스레드)에서만 처리해야 합니다.

                                   : UI업데이트를 메인 스레드에서 처리하지 않으면, 앱이 느려지거나 멈추는 문제 발생 가능

                                           - > 백그라운드 스레드에서 작업한 후

                                                 그 결과를 가지고 메인 스레드에서 UI를 업데이트 해야합니다.

 

 

                             ○ 백그라운드 작업은 별도의 스레드에서 처리해야 합니다.

                                   : 메인 스레드에서는 오랜 시간이 걸리는 작업을 처리하지 않아야 합니다.

                                           - > 대신에, Coroutine, RxJava 와 같은 라이브러리들 혹은

                                                             AsyncTask, Handler, ThreadPoolExecutor 등과 클래스들을 통하여

                                                 백그라운드 스레드에서 작업을 처리해야 합니다.

 

                                          - > 특히, 안드로이드 앱에서 네트워크 작업 등의 I/O 작업은 반드시 비동기적으로 처리!

 

 

                             ○ 메모리 누수에 대해서 고려해야 합니다.

                                   : 멀티 스레드는 단일 스레드보다 더 많은 메모리를 소모하므로, 

                                     작업이 완료된 후 AsyncTask 같은 객체의 참조를 해제하여 메모리 누수를 방지해야 합니다.

 

 

                             ○ 공유 자원에 대한 접근에 주의해야 합니다.

                                   : 여러 개의 스레드가 동시에 공유 자원에 접근하는 경우,

                                      안전성을 높이기 위해서는 Synchronized 또는 Lock 등을 통한 추가적이 작업이 필요합니다.

 

 

                                                       

 

                                

 


 

 

6. 프로세스 우선순위


   ※ " 프로세스 우선순위 " 란

          프로세스가 시스템 자원을 어떤 우선순위를 가지고 사용할지를 결정하는 방법을 의미!

             == 중요도가 낮은 프로세스부터 종료시키면서, 시스템 자원을 관리합니다.


 

              ☆ 안드로이드 개발자가 '안드로이드 프로세스 우선순위를 알아야 하는 이유

 

                     @ 안드로이드는 메모리가 부족할 때, 중요도가 낮은 프로세스를 제거하기 때문에

                            개발자는 어떤 상황에서 자신의 앱이 종료될 수 있는지를 알고 대비해야 함.

 

                     @ 안드로이드 프로세스 우선순위에 따라 CPU 자원(시간)을 배분하는 CPU-스케쥴링을 하기 때문에

                            개발자는 자신의 앱이 필요한 성능과 배터리 소모 현황 등을 파악하고 최적화해야 합니다.

 

                     @ 안드로이드 프로세스 우선순위에 따라 메모리, 네트워크, 파일 등을 할당하기 때문에

                              개발자는 자신의 앱이 필요한 자원을 적절하게 요청하고 해제해야 합니다.

 

 


       ◇ 안드로이드의 프로세스 우선 순위.

 

                  § 안드로이드의 프로세스 우선 순위는 5가지로 분류됩니다.

                      

                      + 중요도가 높은 순서대로

 

 

                         A. 활성 프로세스 ( Foreground Process )

                              : 현재 사용자와 직접 상호작용하는 Activity나 Service를 가진 프로세스.

 

                         B. 화면에 보이는 프로세스 ( VIsible Process )

                              : 현재 화면에 보이지만 사용자와 상호작용하지는 않는 Activit나 Service를 가진 프로세스.

 

                         C. 시작된 서비스 프로세스 ( Started Service Process )

                              : 화면에 직접적으로 표시되지는 않지만, 계속 실행되는 서비스를 가진 프로세스.

 

                         D. 백그라운드  프로세스 ( Background Process )

                              : 화면에 보이지 않는 액티비티나 실행 중이지 않는 서비스를 가진 프로세스.

 

                         E. 빈 프로세스 ( Empty Process )

                              : 앱의 수명주지가 종료되고 메모리에 캐시되어 남아있는 프로세스.