Android Developers 공식 문서 읽어보기
서론
안드로이드 앱은 kotlin, java, C++ 언어를 사용하여 구현할 수 있다.
안드로이드 SDK 도구는 코드를 데이터 및 리소스 파일과 함께 컴파일하는데, APK 또는 Android App Bundle로 컴파일한다.
Android package
- .apk로 끝나는 보관 파일이다.
- 런타임에 필요한 안드로이드 앱의 콘텐츠가 포함되어 있다.
- 안드로이드 지원 기기가 앱을 설치하는 데에 사용한다.
Android App Bundle
- .aab로 끝나는 보관 파일이다.
- 런타입에 필요하지 않은 추가 메타데이터를 비롯한 안드로이드 앱 프로젝트의 콘텐츠가 포함되어 있다.
- AAB는 publising format으로 안드로이드 기기에 설치할 수 없다. APK 생성 및 서명을 다음 단계로 연기시킨다.
이런 상황에서 구글 플레이를 통해 앱을 배포한다고 하면, 구글 플레이 서버는 앱 설치를 요청하는 특정 기기에 필요한 리소스와 코드만 포함하는 최적화된 APK를 생성한다.
각 안드로이드 앱은 자체 보안 샌드박스에 상주하며, 다음 보안 기능으로 보호된다.
- 안드로이드 운영체제는 각 앱이 서로 다른 사용자인 멀티 사용자 리눅스 시스템이다.
- 기본적으로 시스템은 각 앱에 고유한 리눅스 사용자 ID를 할당한다.
- 이 ID는 시스템에서만 사용하며 앱에서는 알 수 없다.
- 시스템은 앱에 할당된 사용자 ID만 액세스할 수 있도록 앱의 모든 파일에 관한 권한을 설정한다.
- 각 프로세스에는 자체 가상 머신이 있으므로 앱의 코드가 다른 앱과 격리된 상태로 실행된다.
- 기본적으로 모든 앱이 앱 자체의 리눅스 프로세스에서 실행된다.
- 안드로이드 시스템은 앱의 구성요소 중 하나를 실행해야 할 때 프로세스를 시작하고, 더 이상 필요하지 않거나 시스템이 다른 앱을 위해 메모리를 복구해야 하면 프로세스를 종료한다.
안드로이드 시스템은 최소 권한의 원칙을 구현한다. 기본적으로 각 앱은 작업을 실행하는 데 필요한 구성요소에만 액세스할 수 있으며 그 이상은 허용되지 않는다. 그러므로 앱은 안전한 환경에서 실행되며, 권한을 받지 못한 부분에 대해서는 액세스할 수 없게 된다.
그렇지만, 앱이 다른 앱과 데이터를 공유하고 앱이 시스템 서비스에 액세스하는 방법은 여러가지가 있다.
- 두 앱이 동일한 리눅스 사용자 ID를 공유하도록 할 수 있다.
- 두 앱은 서로의 파일에 액세스 가능하다.
- 시스템 리소스를 절약하기 위해 사용자 ID가 동일한 앱은 같은 리눅스 프로세스에서 실행되는데, 그뿐 아니라 동일한 가상머신을 공유하도록 설정할 수도 있다.
- 두 앱은 동일한 인증서로 서명되어야 한다.
- 앱은 기기의 위치, 카메라, 블루투스 연결과 같은 기기 데이터에 액세스하기 위한 권한을 요청할 수 있다.
앱의 구성요소
안드로이드 앱의 필수 구성요소는 Activity, Service, Broadcast receiver, Content provider가 있다. 이는 시스템이나 사용자가 앱에 진입할 수 있는 진입점이다. 각 구성요소에는 생성 및 소멸 방식을 정의하는 고유한 수명주기가 있다.
각 요소에 대해서는 별도의 포스팅에서 정리한다.
- Activity
- Service
- Broadcast receiver
- Content provider
[TIL-240325]