ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 9 : 안드로이드 아키텍처 개요
    책 내용 정리/안드로이드 스튜디오 Arctic Fox & 프로그래밍 2023. 8. 14. 18:26

    차례 : 

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

    9.2 리눅스 커널

    9.3 안드로이드 런타임 - ART

    9.4 안드로이드 라이브러리

    9.4.1 C/C++ 라이브러리

    9.5 앱 프레임워크

    9.6 앱

    9.7 요약

     

     

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

    안드로이드 시스템은 소프트웨어 스택(stack)의 형태로 구성된다.

    • 앱, 운영체제, 런타임 환경, 미들웨어, 각종 서비스와 라이브러리 등이 겹겹이 쌓여 구성된 것이라고 볼 수 있다.

     

     

    9.2 리눅스 커널

    리눅스 커널은 안드로이드 소프트웨어 스택의 맨 밑에 위치하며, 장치 하드웨어의 기반 운영체제 역할을 담당한다. 

     

    안드로이드는 리눅스 커널만을 사용한다. 원래 리눅스는 Desktop이나 서버의 컴퓨터에서 사용하기 위해 개발되었다. 그러나 리눅스 커널의 효율성과 성능이 좋으므로 안드로이드 소프트웨어 스택의 핵심으로 모바일 장치에서도 사용된다. 

     

    9.3 안드로이드 런타임 - ART

    안드로이드 런타임이란??

     

    더보기

    안드로이드 런타임이란??

    애플리케이션을 관리 (메모리, 프로세스) 하기 위해 컴파일러나 가상머신이 사용하는 기존 코드 라이브러리

    또는 애플리케이션이 실행되고 있는 동안의 동작을 말합니다.

     

    안드로이드 스튜디오에서 안드로이드 앱이 빌드될 때는 바이트 코드 형태로 컴파일 된다.  그리고 장치에 앱이 설치될 때 안드로이드 런타임(ART)AOT(Ahead-of-time) 컴파일을 수행햐여 바이트 코드를 프로세서가 필요로 하는 기계어로 일괄 변환한다. 이렇게 변환된 형태를 ELF라고 한다. 앱이 실행 될때마다 ELF 버전으로 실행되서 앱 실행 속도가 빠르고 배터리 수명도 향상된다.

     

    5.x 이전의 안드로이드 버전에서는 JIT(Just-in-time)  컴파일 방법을 사용하여 바이트 코드를 하나씩 기계어로 변환하면서 실행하였다. 

     

    ART는 앱이 설치될때 미리 컴파일을 수행하는 것이고, JIT 앱이 실행하고 실행 되면서 컴파일을 수행하는 것이다. 이것이 속도 차이를 만들어 낸다. 

     

    ART JIT 둘다 장단점이 있어서 지금은 둘다 혼용해서 사용하고 있다고 한다. 

     

    안드로이드 런타임 채택 흐름: 

    Dalvik VM (JIT 방식)  ->  ART (AOT 방식) -> 혼용

     

    자세한 내용 : https://from-android-to-server.tistory.com/40

     

     

    9.4 안드로이드 라이브러리

    안드로이드 개발 환경에서 문자열 처리, 네트워킹, 파일 처리와 같은 일반적인 작업을 지원하기 위해 제공되는 표준 자바 라이브러리에 추가하여 안드로이드 라이브러리도 포함된다.

    • 앱 프레임워크 라이브러리
    • 사용자 인터페이스 생성
    • 그래픽 드로잉
    • 데이터 베이스 등등

    chat gpt가 인기 있다는 앱 프레임워크 라이브러리

    더보기
    1. Android Jetpack: Google에서 제공하는 안드로이드 앱 개발을 위한 컴포넌트 라이브러리의 모음입니다. Jetpack은 안드로이드 앱 개발을 단순화하고 표준화하기 위한 도구로, 데이터베이스 관리, UI 디자인, 라이프사이클 관리, 네비게이션 등 다양한 기능을 제공합니다.
    2. Retrofit: 네트워크 요청을 처리하고 RESTful API와의 통신을 간편하게 해주는 라이브러리입니다. Retrofit을 사용하면 서버와의 통신을 쉽게 설정하고 관리할 수 있습니다.
    3. Glide: 이미지 로딩 및 캐싱을 관리해주는 라이브러리로, 안드로이드 앱에서 이미지를 효율적으로 처리하고 표시하는 데 도움을 줍니다.
    4. Room: SQLite 데이터베이스를 사용하는 앱을 위한 라이브러리로, 데이터베이스 관련 작업을 추상화하여 개발자가 간편하게 데이터를 저장하고 관리할 수 있도록 합니다.
    5. Firebase: Google의 클라우드 기반 플랫폼으로, 실시간 데이터베이스, 사용자 인증, 클라우드 메시징, 애널리틱스 등 다양한 기능을 제공하여 개발자들이 안드로이드 앱을 빠르게 개발하고 운영할 수 있도록 도와줍니다.
    6. Dagger: 의존성 주입(Dependency Injection)을 지원하는 라이브러리로, 앱의 구성 요소를 느슨하게 결합시켜 유지보수와 테스트를 용이하게 만들어줍니다.

     

    핵심 안드로이드 라이브러리

    더보기
    1. Material Components for Android: Google의 머터리얼 디자인 가이드라인을 따르는 UI 컴포넌트 라이브러리로, 앱의 시각적인 디자인을 향상시켜주는 다양한 UI 요소를 제공합니다.
    2. android.app: 이 패키지에는 Activity, Service, BroadcastReceiver, ContentProvider 등의 클래스가 포함됩니다. 예를 들어, Activity 클래스는 사용자 인터페이스 화면을 나타내는데 사용되며, 앱의 다양한 화면을 구성하는 데 활용됩니다.
    3. android.content: Intent 클래스는 다른 컴포넌트로부터 액션 요청을 보내거나 데이터를 전달하는 데 사용됩니다. 예를 들어, 액티비티 간 데이터를 전달하거나, 다른 앱의 기능을 호출할 때 Intent를 사용할 수 있습니다.
    4. android.database: 안드로이드 앱 내에서 데이터베이스를 관리할 때 사용됩니다. SQLiteDatabase 클래스를 사용하여 SQLite 데이터베이스를 생성하고 조작할 수 있습니다. 데이터를 저장하거나 검색하는 등의 작업을 처리할 수 있습니다.
    5. android.graphics: Bitmap 클래스는 이미지 데이터를 처리하고 표현하는 데 사용됩니다. 이미지 리사이징, 필터 적용, 그리기 작업 등을 처리할 수 있습니다.
    6. android.hardware: 카메라와 관련된 기능을 사용할 때 Camera 클래스나 Camera2 API를 사용할 수 있습니다. 또한, 센서 데이터를 수집하고 처리하기 위해 SensorManager 클래스를 활용할 수 있습니다.
    7. android.os: 앱의 스레드 관리 및 핸들링을 위해 Handler 클래스를 사용할 수 있습니다. UI 업데이트나 비동기 작업을 처리할 때 유용합니다.
    8. android.view: View 클래스 및 이를 상속받은 다양한 위젯들을 사용하여 사용자 인터페이스를 구성할 수 있습니다. LinearLayout, TextView, Button 등을 사용하여 UI 레이아웃을 디자인할 수 있습니다.
    9. android.widget: ListView, RecyclerView, Spinner 등의 위젯을 사용하여 데이터 목록을 표시하거나 선택할 수 있습니다. 예를 들어, RecyclerView를 사용하여 스크롤 가능한 목록을 만들 수 있습니다.
    10. android.webkit: 웹 뷰(WebView)를 사용하여 앱 내에서 웹 페이지를 표시할 수 있습니다. 이를 통해 웹 컨텐츠를 앱에 통합할 수 있습니다.

     

    9.4.1 C/C++

    안드로이드 런타임 핵심 라이브러리는 자바 기반이며, 개발자가 안드로이드 앱을 작성하는데 필요한 주요 API를 제공한다. 그러나 핵심 라이브러리는 대부분 실제 작업을 직접 수행하지는 않는다. 핵심 라이브러리는 C/C++ 기반 라이브러리의 코드를 감싸고 있는 자바 Wrapper다. 

     

    예를 들어, 장치 화면에 3D 그래픽을 그리기 위해 android opengl 라이브러리의 코드를 호출하면 OpenGL ES C++ 라이브러리의 코드를 호출한다. 이 라이브러리 코드는 그리기 작업을 수행하기 위해 내부의 리눅스 커널과 함께 작동된다.

     

    C/C++ 라이브러리에는 폭넓고 다양한 함수가 포함되어 있다. 

    Chat gpt가 알려준 라이브러리들
    
    Android NDK (Native Development Kit):
    안드로이드 NDK는 C와 C++로 작성된 네이티브 코드를 안드로이드 앱에 통합할 수 있도록 도와주는 도구 모음입니다. NDK를 사용하면 기능을 최적화하거나 기존 C/C++ 라이브러리를 재사용할 수 있습니다.
    
    JNI (Java Native Interface):
    JNI는 자바 코드와 C/C++ 코드 간의 상호 작용을 가능하게 해주는 인터페이스입니다.
    자바에서 C/C++ 함수를 호출하거나 C/C++에서 자바 메서드를 호출하는 데 사용됩니다.
    
    Android System APIs:
    안드로이드 시스템의 기능에 접근하기 위한 다양한 함수와 클래스가 포함되어 있습니다. 
    예를 들어, 파일 시스템 액세스, 네트워크 통신, 센서 데이터 수집 등을 위한 함수들이 포함됩니다.
    
    OpenGL ES:
    OpenGL ES는 2D 및 3D 그래픽을 렌더링하기 위한 그래픽 라이브러리입니다. 
    C/C++을 사용하여 고성능 그래픽 앱을 개발할 때 사용됩니다.
    
    SQLite:
    SQLite는 경량이면서도 포괄적인 관계형 데이터베이스 엔진으로, 안드로이드에서 데이터베이스 관련 
    작업을 수행할 때 자주 사용됩니다.
    
    OpenAL:
    OpenAL은 오디오 기능을 지원하는 크로스 플랫폼 3D 사운드 API입니다.
    C/C++로 오디오 기능을 구현할 때 사용할 수 있습니다.
    
    Libcurl:
    Libcurl은 URL을 통해 데이터를 다운로드하거나 업로드하는 기능을 제공하는 라이브러리로,
    네트워크 통신을 쉽게 처리할 수 있습니다.
    
    Boost C++ Libraries:
    Boost는 C++ 개발을 위한 확장된 라이브러리 집합으로, 
    다양한 기능과 유틸리티를 제공하여 개발 속도를 높이고 코드 품질을 향상시킬 수 있습니다.
    
    OpenSSL:
    OpenSSL은 암호화와 보안 기능을 제공하는 라이브러리로, 네트워크 통신이나 데이터 보호에 사용됩니다.
    
    libjpeg, libpng, libtiff 등 이미지 처리 라이브러리:
    이미지 파일을 읽고 쓰는 기능을 제공하는 라이브러리들로, 이미지 처리 앱을 개발할 때 사용됩니다.

     

    이런 라이브러리를 직접 사용할 필요가 있는 경우에는 안드로이드 NDK(Native Development Kit)을 사용하면 된다.

     

    자바 코드에서 JNL(Java Native Interface를 사용해서 자바나 코틀린이 아닌 다른 언어 (C or C++ 등)의 네이티브 함수를 호출하는 것이 NDK의 목적이다.

     

    (이부분은 추후 시간 될때 직접 해보는게 좋을 것 같다.) 

     

    9.5 앱 프레임워크

    앱 프레임워크는 안드로이드 앱이 실행되고 관리되는 환경을 구성하는 서비스의 집합체이다. 

     

    안드로이드 앱이 재사용과 상호 운용 및 교체 가능한 컴포넌트를 구성된다는 개념을 이 프레임워크가 구현한다.

     

    핵심 서비스들 :

    더보기
    • Activity Manager : 앱의 생명주기와 Activity 스택을 제어한다. 
    • Content Provider : 앱이 다른 앱과 데이터를 공유할 수 있게 해준다.
    • Resource Manager : 코드에 포함되지 않은 리소스(문자열, 색상 설정, 사용자 인터페이스 레이아웃 등)을 사용하게 해준다.
    • Notification Manager :  앱이 사용자에게 경고나 알림을 보여 줄 수 있게 해준다. 
    • View System : 앱의 사용자 인터페이스 생성에 사용되는 확장 가능한 뷰의 집합니다.
    • Package Manager : 장치에 설치된 다른 앱에 관한 정보를 앱에서 알 수 있게 해준다.
    • Window Manager : 장치의 화면에 나타내는 모든 앱의 창을 관리한다.
    • Location Manager : 앱의 변경 정보를 수신할 수 있게 해주는 위치 서비스를 사용하게 해준다.

     

    9.6 앱

    안드로이드 소프트웨어 스택에 맨 위에 있는 것이 앱계층이다. 안드로이ㄷ에 구현된 네이티브 앱과 사용자가 설치하거나 개발한 앱으로 구성된다. 

     

    9.7 요약

    안드로이드는 소프트웨어 스택 아키텍처의 형태로 구현되었다.

    리눅스 커널, 런타임 환경 & 라이브러리, 앱 프레임워크, 앱 등으로 스택을 구성한다.

     

    앱은 자바나 코틀린으로 작성되고 안드로이드 스튜디오 빌드 환경에서 바이트 코드 형태로 컴파일 된다. 나중에 앱이 장치에 설치될 때 안드로이드 런타임(ART)이 바이트 코드를 장치의 프로세서가 필요로 하는 네이티브 명령어로 일괄 변환한다. 앱 실행과 앱 디자인의 재사용 구현 관점 모두에서 안드로이드 아키텍처의 목표는 성능과 효율이다. 

Designed by Tistory.