리눅스 커널
안드로이드는 리눅스 커널을 기반으로 구글에서 제작한 모바일 운영체제입니다. 리눅스 커널은 ART(Android Runtime)이라 불리는 앱을 실행하는 역할을 수행하고 스레딩 및 메모리와 같은 기본 기능을 수행합니다.
안드로이드 런타임(Android Runtime, ART)
면접에서 Dalvik VM과 ART에 대해 얘기하니까 반응이 좋았습니다!!
안드로이드 버전 5.0(API Lv 21 이상) 이전에는 Dalvik이 안드로이드 앱을 실행했지만 안드로이드 버전 5.0 이상을 실행하는 기기의 경우 ART가 Davik을 대체했습니다.
- Dalvik : Android OS에서 사용되는 VM 중 하나로 안드로이드 앱의 Java Byte Code를 실행하는 데 사용되었습니다. 주요 특징으로는 JIT(Just-In-Time) 컴파일러를 사용해 앱 실행시 Byte Code를 기계어로 번역해 실행 속도를 향상했지만 실시간 번역을 수행하기 때문에 초기 부팅 시에 일부 지연이 발생했습니다.
- ART : AOT(Ahead-of-Time) 컴파일러를 사용해 앱 설치시 미리 기계어로 번역해 실행 시간이 Dalvik보다 빠릅니다. ART는 DEX 파일을 실행해 저용량 메모리 기기에서 여러 VM을 실행하도록 설계되었습니다. DEX 파일은 안드로이드용으로 설계된 바이트 코드 형식으로, 최소 메모리 공간에 맞게 최적화돼 있습니다.
하드웨어 추상화 계층(HAL : Hadware abstraction layer)
안드로이드 앱이 기기의 하드웨어와 소통할 수 있도록 도와주는 중간 계층입니다. 이를 통해 안드로이드 앱은 특정 기기의 하드웨어에 직접 접근하지 않고도 상위 수준의 Java API를 통해 기기의 기능을 사용할 수 있습니다.
안드로이드 OS의 기본 보안 메커니즘
안드로이드 어플리케이션은 모든 데이터 및 리소스 파일과 함께 코드를 컴파일해 하나의 APK를 만들며 앱을 설치할 때 바로 이 파일을 사용하고 다음과 같은 안드로이드 보안 기능으로 보호됩니다.
- Multi User Linux System: 안드로이드는 Linux 기반의 OS로 각 앱은 독립된 사용자로 취급되어 다수의 사용자가 동시에 시스템을 사용할 수 있습니다.
- 파일 권한 및 격리 : 시스템은 각 앱에 할당된 사용자 ID를 기반으로 ID를 할당받은 사용자만 시스템에 액세스 할 수 있습니다. 따라서 앱은 자신의 디렉토리와 데이터만 접근이 가능하며 다른 앱의 데이터는 접근할 수 없습니다.
- 프로세스 격리 : 각 앱의 프로세스는 자체 가상 머신(VM)에서 실행되고 다른 앱과 격리되어 실행됩니다.
- 동적 프로세스 관리 : 안드로이드 시스템은 앱의 구성 요소 중 실행해야 하는 요소가 있을 때 프로세스를 시작하며 필요하지 않을 때는 프로세스를 종료해 효율적으로 자원을 사용함으로써 앱 간의 간섭을 방지합니다.
그렇다면 어떻게 앱이 다른 앱과 데이터를 공유하고 시스템 서비스에 액세스 할 수 있을까요?
- 두 개의 앱이 같은 Linux ID를 공유하도록 만들 수 있습니다. 이 경우 두 앱은 서로의 파일에 액세스 할 수 있으며 시스템 리소스 절약을 위해 사용자 ID가 동일한 앱이 같은 Linux Process에서 실행되고 같은 VM을 공유하도록 설정할 수 있습니다. 또한 이러한 앱은 같은 인증서로 서명해야 합니다.
- 명시적 권한 부여로 여러 가지 기기 데이터에 액세스 권한을 요청할 수 있습니다.
Android Component
컴포넌트는 안드로이드 앱 개발 핵심 요소로 어플리케이션을 개발할 때 사용하는 개념으로 한마디로 정의하면 어플리케이션의 구성 요소라고 할 수 있습니다. 안드로이드 앱의 기본 구조도 컴포넌트에 기반을 두므로 하나의 앱은 다수의 컴포넌트로 구성됩니다. 또한 안드로이드에서는 클래스로 컴포넌트를 개발합니다. 즉, 하나의 클래스가 하나의 컴포넌트가 되며 클래스 중에서도 생명주기를 안드로이드 시스템에서 관리한다면 컴포넌트 클래스입니다.
컴포넌트의 중요한 특징 중 하나는 어플리케이션 안에서 독립된 실행 단위라는 점입니다. 독립된 실행 단위란 컴포넌트끼리 서로 종속되지 않아 코드의 결합이 발생하지 않습니다. 또한 앱의 실행 시점이 다양할 수 있습니다. 카카오톡을 예로 들면 일반적으로 앱 아이콘을 터치해 실행할 수 도 있고 사용자가 메시지를 클릭하면 채팅 화면이 열립니다. 이처럼 앱의 실행 시점을 다양할 수 있고 이로 인해 안드로이드 앱에서는 메인 함수 개념이 없다고 말합니다.
안드로이드 4대 컴포넌트
- 액티비티(Activity) : 화면을 구성하는 컴포넌트로 사용자와 상호 작용하는 인터페이스 화면입니다.
- 서비스(Service) : 백그라운드 작업을 하는 컴포넌트로 장시간 수행 되어야 하는 작업을 수행합니다.
- 브로드 캐스트 리시버(Broadcast Receiver) : 안드로이드 시스템에서 전송되는 이벤트를 실행시킵니다. 여기서의 이벤트는 사용자 이벤트가 아닌 배터리 방전, 부팅 완료 같은 상황을 말합니다.
- 콘텐츠 프로바이더(Content Provider) : 앱의 간의 데이터를 공유합니다. 하나의 앱이 다른 앱에 데이터를 공유하려면 콘텐츠 프로바이더를 생성합니다.
인텐트
4대 컴포넌트 중 세 가지(Activity, Service, Broadcast Receiver)는 인텐트라는 비동기식 메시지로 활성화됩니다. 인텐트는 한마디로 컴포넌트를 실행하기 위해 시스템에 전달하는 메시지로 일종의 메신저라고 생각하면 됩니다. 즉 데이터를 담는 클래스로 이 데이터는 컴포넌트를 실행하기 위한 정보이며 이 정보가 담긴 인텐트 객체를 시스템에 전달하면 컴포넌트가 실행됩니다.
public Intent(Context packageContext, Class<?> cls) {
mComponent = new ComponentName(packageContext, cls);
}
인텐트 엑스트라 데이터
A 액티비티에서 B 액티비티를 실행할 때 데이터를 전달하려면 인텐트에 컴포넌트 실행을 요청할 때 Extra Data를 이용하면 됩니다. Extra Data는 인텐트에 담는 부가 정보이며 putExtra() 함수를 사용해 구현할 수 있습니다.
public @NonNull Intent putExtra(String name, CharSequence value)
첫 번째 매개변수는 데이터의 식별자이며 두 번째 매개변수가 전달할 데이터입니다. 이 함수는 각 타입의 데이터를 담을 수 있도록 오버로딩으로 선언되어 있습니다. 다음은 인텐트에 데이터를 추가하는 코드입니다.
val intent = Intent(requireContext(), StartActivity()::class.java)
intent.putExtra("data1", "hello")
intent.putExtra("data2", 10)
인텐트로 실행된 컴포넌트에서 엑스트라 데이터를 가져오려면 인텐트 객체의 프로퍼티를 사용합니다. 그리고 그 인텐트 객체의 getInExtra() 함수로 데이터를 가져옵니다. 데이터를 가져오는 함수 또한 타입별로 여러 개 제공합니다.
val data1 = intent.getStringExtra("data1")
val data2 = intent.getIntExtra("data2")
인텐트 유형
- 명시적 인텐트 : 위 코드처럼 클래스 레퍼런스 타입을 이용하며 앱 내부의 컴포넌트를 요청할 때 사용합니다.
- 암시적 인텐트 : 외부 앱의 컴포넌트를 사용할 때 사용하며 AndroidManifest.xml 파일에 선언된 인텐트 필터를 사용합니다. 인텐트 필터는 컴포넌트를 외부에서 인텐트로 실행할 수 있게 만들어줍니다.
- 인텐트 필터의 하위 태그
<action> : 컴포넌트의 기능을 나타내는 문자열
<category> : 컴포넌트가 포함되는 범주를 나타내는 문자열
<data> : 컴포넌트에 필요한 데이터 정보
<activity
android:name=".view.intro.myPage.NoRegistsStoreActivity"
android:exported="true" >
<intent-filter>
<action android:name="ACTION_EDIT"/>
</intent-filter>
</activity>
'Android' 카테고리의 다른 글
Android Fragment Life Cycle (0) | 2023.12.26 |
---|---|
Android Activity Life Cycle (3) | 2023.12.26 |
Android Main Thread (2) | 2023.12.23 |
Anroid REST API 연동기 [GET] (3) | 2023.12.22 |
Android Gallery Permission (0) | 2023.12.17 |