Android - 기본사항

Posted by RoadtoS7 on December 26, 2020 · 3 mins read

:zero: 안드로이드 기본 사항

  • 안드로이드 앱을 만들 수 있는 언어로는 Java, Kotlin, C++이 존재한다.
  • 안드로이드 SDK 툴은 데이터, 리소스 파일, 소스코드를 함께 컴파일하여 안드로이드 패키지인 APK를 만든다.
  • 안드로이드 패키지는 끝에 .apk 붙는 파일을 말한다.
  • APK 파일은 안드로이드를 기반으로 돌아가는 기기들이 앱을 설치하기 위해서 사용하는 파일이다.


:one: 샌드박스

  • 안드로이드 앱은 자신만의 보안 샌드박스에 속한다.

  • 이 샌드박스는 다음과 같은 안드로이드 보안기능으로 보호된다.

  1. 안드로이드 운영체제는 멀티 유저(다중 사용자) 리눅스 시스템이다.
  2. 시스템은 기본적으로 하나의 앱에 하나의 고유한 사용자 아이디를 부여한다. (이 아이디는 시스템만 사용하며, 앱은 알지 못한다.)
  3. 시스템은 앱안에 있는 모든 파일들에 대한 권한을 설정하여, 해당 앱에 할당된 사용자 ID만이 앱 내의 파일에 접근할 수 있도록 한다.
  4. 각 프로세스마다 가상머신(VM, Virtual Machine)이 존재하며, 따라서 한 앱의 코드는 다른 앱과 독립적으로 실행된다.
  5. 기본적으로 모든 앱은 자신만의 리눅스 프로세스안에서 실행된다.
    안드로이드 시스템은 앱의 구성요소 중 하나라도 실행되어야 한다면, 해당 앱이 들어있는 프로세스를 실행하며,
    프로세스가 더이상 필요하지 않거나, 다른 앱을 위해서 메모리를 회수해야하는 경우 프로세스를 종료시킨다.


:two: 안드로이드 시스템은 최소 권한 원칙을 구현한다.

  • 안드로이드 시스템은 위와 같은 방식을 통해서 최소 권한 원칙을 구현한다.

  • 다시 말해서, 앱은 작업을 수행하기 위해 필요한 구성요소에만 액세스 권한을 가진다.
    그 이상은 접근할 수 없다.

  • 이렇게 하면 매우 안전한 환경이 구성되어서 앱이 시스템으로부터 권한을 받지 못한 부분에는 접근하지 못하게 된다.


:three: 다른 앱과 데이터를 공유하고, 시스템의 서비스에 접근하는 방법

  1. 두개의 앱이 같은 사용자 아이디를 갖도록 설정할 수 있다.
    • 이런 경우 두 앱은 서로의 파일에 접근할 수 있다.
    • 시스템 리소스를 절약하기 위해서 같은 사용자 아이디를 가진 앱을 같은 리눅스 프로세스에서 실행되고, 같은 VM을 사용하도록 할 수 있다. 또한 이러한 앱은 같은 인증서로 서명되어야 한다.
  2. 앱이 기기의 데이터를 접근할 권한을 요청할 수 있다.
    • 이 때 사용자는 이 권한을 명시적으로 부여해야 한다.


:four: 안드로이드 시스템은 어떤 앱이든 다른 앱의 구성요소를 시작시킬 수 있다는 점에서 독특하다.

  • 예를 들어서 앱에서 사진을 촬영하고자 하는 경우, 이 기능을 수행하는 다른 앱이 있을 가능성이 높다.
    이런 경우, 액티비티를 직접 개발하는 대신, 우리 앱에서 사진 찍는 기능을 수행하는 앱을 사용하면 된다.
    다른 앱의 사진 찍는 기능을 사용할 때 카메라 앱의 코드를 포함하거나 링크할 필요가 없다.
    대신 사진 찍는 액비티를 시작시키기만 하면된다.


:five: 시스템은 앱의 구성요소를 시작할 때, 그 앱에 대한 프로세스를 시작하고(앱이 실행중이지 않은 경우), 해당 구성요소에 필요한 클래스를 인스턴스화 한다.

  • 예를 들어서 앱이 카메라앱의 사진 찍는 액티비티를 시작하면, 해당 액티비티는 우리 앱의 프로세스가 아니라 카메라 앱의 프로세스에서 실행된다.

  • 따라서 안드로이드 앱은 다른 시스템에서 실행되는 앱과 달리 단일 진입점(예: main함수)이 없다.


:six: 앱은 직접적으로 다른 앱을 실행시킬 수 없다. 안드로이드 시스템을 통해서 가능하다.

  • 이유: 시스템이 각 앱을 다른 앱에 접근할 수 없도록 설정된 파일 권한을 가진 별도의 프로세스에서 실행시킨다.

  • 따라서 앱은 직접적으로 다른 앱을 실행시킬 수 없다. 안드로이드 시스템을 통해서 가능하다.

  • 다른 앱의 구성요소를 실행시키려면, 시스템에 메시지를 전달하여, 다른 앱의 구성요소를 실행시키고 싶다는 인텐트(intent, 의도)를 밝혀야 한다.

  • 그럼 시스템에서 대신 해당 요소를 실행시켜 준다.