https://developer.android.com/guide/components/fundamentals
 

이 문서는 안드로이드의 기본 개념에 대해 설명한 문서로

  앱을 작성 할 수 있는 언어(Kotlin, java, c++),

  앱 실행 파일(apk, aab),

  시스템 보안(linux base, plop, component),

  데이터 공유, 시스템 자원 접근 방법 에 대해 설명한다.


요약

개발언어 

  • Kotlin(Java, C++) 언어로 코드 작성

실행파일

  • 안드로이드 SDK를 사용해 코드 컴파일
  • apk, aab 파일이 생성
  • apk 파일은 기기에 바로 설치가능,
  • aab 파일은 바로 설치가 안되고 구글 플레이 스토어를 통해 한다.

시스템 보안(security)

  • 안드로이드는 멀티유저 리눅스 OS를 기반
    • 각 앱다른 사용자가 된다.
    • 각 앱에게 시스템만 알 수 있는 리눅스 user ID가 주어진다.
    • user ID를 통해 파일 접근 권한이 설정된다.
    • 각 app(user) 마다 따로 VM을 제공
    • 모든 앱은 자신의 리눅스 프로세스에서 실행된다.
      • 앱은 component 들로 구성
        component 중 하나라도 실행이 필요하면 앱을 실행
        실행되는 component가 없다면 앱을 종료
       
  • 안드로이드 시스템의 PLOP(principle of least privilege)
    • 안드로이드 시스템은 앱에 최소 권한의 원칙을 적용한다.
    • 원칙 적용을 위해 component 라는 것을 만들었다.
      component는 명확하게 목표만을 수행하는 객체이다.
      앱은 이 component 들이 모여 만들어진다.
    • component 기반 환경은
      앱이 시스템의 특정 자원을 사용하기 위해서는 반드시 permission을 얻어야
      사용 할 수 있는 굉장히 안전한 환경이 만들어 진다.

데이터 공유, 시스템 자원 접근 방법

  • 두 개의 앱이 서로의 자원을 자유롭게 사용 방법:
    서로 같은 인증서로 서명하면 된다.
    앱이 서로간의 데이터를 제한없이 공유 할 수 있다. (같은 linux ID가 할당되기 때문)
  • 시스템 자원 접근 방법:
    명시적으로 자원에 대한 권한을 시스템에 요청 할 수 있다.
    사용자가 이를 허용하면 접근 가능.

 

개발 언어

 

우리의 목표는 애플리케이션을(앱) 만드는 (개발가 되는) 것이다.

앱을 만드려면 컴퓨터에 명령을 내릴 수 있어야 한다.

 

 

 

개발 언어는 사람이 이해할 수 있는 언어로 

컴퓨터에 다양하고 복잡한 명령들을 만들 수 있게 해준다.

보통 우리가 개발 언어로 명령어들을 만들면

컴퓨터가 이해할 수 있는 명령어로 변환을 하게되는데 이것을 컴파일 이라고 한다.

 

 

 

이메일을 보낸다고 해보자.

어떤 웹사이트에 로그인해서 이메일을 보낼 수 있다.

하지만 이건 내가 해야한다.

 

 

 

이메일이 동작하는 방식을 이해하면 

화면을 통하지 않고 컴퓨터에게 명령만으로 이메일을 보내는 방법을 알 수 있다.

컴퓨터에게 명령은 프로그램을 만들면 할 수 있고

이 프로그램은 개발 언어를 통해 만들어 진다.

 

 

 

다시 처음으로 돌아와

안드로이드 기기에 이메일을 보내는 것을 화면이 아닌 기기에 명령을 통해 하고 싶다.

명령을 만들기위해서는 프로그램을 만들어야 한다.

프로그램을 만들기 위해서는 개발 언어가 필요하다.

이 개발 언어는 안드로이드를 만든 운영체제에서 정해준다.

 

 

 

안드로이드는 코틀린, 자바, C++를 개발 언어로 지원한다.

대부분은 코틀린을 통해 개발 한다.

 

JAVA를 개발 언어로 사용한다면 조금 특수한 환경이다.

안드로이드가 처음 나올당시에는 JAVA 만 지원했었다.

그러기 때문에 오래된 애플리케이션 이거나

개발자가 자바만 할 줄 아는경우가 특수한 환경이 될 수 있다.

 

C의 특성중에 기계어와 비슷하여 빠르고 이식성이 좋다는 특징을 알고있다.

C++는 카메라, 화면과같이 하드웨어와 직접 통신하는고 빠른 연산을 필요로 하는

특화된 프로그램(또는 라이브러리)을 개발하는데  사용하는 것으로 알고 있다.(정확하지 않음)

 

 

실행 파일

 
안드로이드 SDK 툴은 작성한 코드와 리소스 파일을 컴파일하여
APK 또는 Android App Bundle 파일을 생성한다.
 
안드로이드 패키지(.apk)
런타임(앱 실행 시)에 필요한 내용들을 담고 있고,
안드로이드 기기에 앱을 설치하는데 사용하는 파일이기도 하다.

 

안드로이드 앱 번들(.aab)
안드로이드 앱 프로젝트의 내용을 담고 있고,
런타임시 필요없는 추가적인 메타 데이터들을 포함하고 있다.
 

 

 

 

 

 

AAB는 기기에 직접 설치 할 수 없다.
이 파일은 APK생성과 서명을 나중에 진행 한다.
 
예를 들어 구글 플레이를 통해 앱을 배포 할 때,

구글 플레이의 서버는 기기에

오직 필요한 코드와 리소스만을 담은
최적화된 APK를 생성한다.

 

 

 

 

 

 

각 안드로이드 앱은

아래의 안드로이드 보안 특징들로부터 보호되는
보안 샌드박스에 존재한다.

  • 안드로이드 OS는 
    각 앱이 하나의 사용자인
    리눅스 멀티유저 시스템이다.

  • 기본적으로
    시스템은 각 앱에 유일한 리눅스 사용자 ID를 할당한다.
    이 ID는 시스템만 사용하며, 앱은 알지 못한다.
    시스템은 앱의 파일 접근 권한을 이 ID를 통해 허용한다.

  • 각 프로세스는 자신의 VM을 갖는다.
    그러므로 코드는 다른 앱들로부터 독립되어 실행된다.

 

 

 

 

 

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

 

각 앱은 기본적으로 오로지
요청한 작업 외에는 하지 않는
컴포넌트에만 접근 할 수 있다.
 
이것은
앱이 권한을 부여받지 않는 한
시스템에 접근 할 수 없는

매우 안전한 환경을 만든다.
 

 

 


하지만
1) 다른 앱들과 데이터를 공유하고
2) 시스템에 접근 할 수

있는 방법이 있다.
 

  • 두 앱이 데이터 공유를 위해
    같은 리눅스 사용자 ID를 할당 할 수 있다.
    서로의 파일에 접근이 가능해진다.

    시스템은 자원을 아끼기 위해
    같은 사용자 ID를 쓰는 앱은
    프로세스VM도 함께 사용한다.

    앱은 반드시 같은 인증서로 서명되어야 한다.

  • 앱은
    블루투스, 카메라, 위치와 같은 기기의 데이터에 접근을 위해
    권한을 요청 할 수 있다.

    사용자는 명시적으로 권한을 요청해야 한다.

기타

apk vs aab
apk 파일은 안드로이드 기기에 바로 설치 할 수 있어,
하지만 모든 리소스가 담겨있어 용량이 크다.

반면, aab 파일은 설치 할 수도 없고 파일 자체는 APK파일과 용량도 비슷 할 것이다. 
하지만 플레이스토어와 같은 서비스에서는

이 파일을 다운 받는 기기마다 최적화된 APK를 만들어줘
앱을 다운 받는데 사용하는 네트워크, 서버 비용을 아낄 수가 있다.

+ Recent posts