illis:site
article thumbnail

안드로이드 개발자가 되어 가지고 안드로이드의 기본 개념을 한 번도 정리해본 적이 없었다.

퇴사하고 시간도 많으니 처음부터 정리해볼까라는 생각이 들었고, 이왕이면 블로그에 정리해보기로 했다. 

(여러 문서와 사이트, 책을 참고하여 작성하고 있으나 객관적이지 않을 수 있는 점 참고 부탁드립니다.)

더보기

❗️ 업데이트 노트 ❗️

[ 230102 ] 안드로이드의 개념, 플랫폼, 컴파일 내용 추가 

[ 230501 ]

AOT, JIT 컴파일러 내용 수정

안드로이드 특징 및 컴포넌트 내용 추가

[ 230502 ]

안드로이드 앱 설계 원칙 추가


안드로이드란?

간단하게 설명하자면 안드로이드란 모바일, 태블릿, 티비 등에서 동작하는 리눅스 기반 오픈소스 운영체제이다.

더 자세한 설명은 나무위키를 참고해보자.

 

안드로이드 플랫폼

안드로이드 플랫폼은 리눅스 운영체제 안에서 리눅스와 상호작용하면서 동작한다. 

JVM의 역할

앱 개발 언어로 자바(요즘은 kotlin)를 사용하기 때문에 JVM 이 필요했고 구글에서 개발한 DVM(Darvik VM)이 그 역할을 대신했다. 요즘에는 DVM 을 ART(Android Runtime)가 대신하고 있다. (참고: https://developer.android.com/guide/platform?hl=ko) 

 

플랫폼 아키텍처  |  Android 개발자  |  Android Developers

Android is an open source, Linux-based software stack created for a wide array of devices and form factors. The following diagram shows the major components of the Android platform. The foundation of the Android platform is the Linux kernel. For example…

developer.android.com

안드로이드 컴파일

그렇다면 안드로이드 앱은 어떻게 모바일, 태블릿, 티비 등에서 실행될 수 있는 것일까 궁금해진다.

안드로이드 개발자라면 일반적으로는 안드로이드 스튜디오를 사용할텐데, 실제 앱이 기기에서 동작하기 까지 다음과 같은 과정을 거친다.

  1. 안드로이드 스튜디오에서 소스 코드 작성
  2. 소스 코드 빌드
    1. 바이트 코드로 컴파일
    2. 패스워드와 조합하여 APK로 패키징
  3. APK 파일 생성
  4. 구글 플레이 스토어에 앱 등록 -> 다운로드
  5. 기기에 설치, 아이콘 클릭
    1. AOT 컴파일 / 설치 권한 체크
    2. JIT 컴파일 / 실행 권한 체크
  6. 앱 실행

AOT와 JIT

컴파일은 프로그램이 실제 목적 시스템에서 실행되기 위해 기계어로 번역하는 과정을 말한다. 

AOT는 Ahead Of Time의 약자로 앱 설치시 리눅스에서 실행 가능한 파일로 한 번 더 컴파일 되는 과정을 의미한다.
JIT는 Just In Time의 약자로 앱 실행시 컴파일되지 않았던 파일이 한 번 더 컴파일되는 과정을 의미한다.
이런 과정은 모두 앱의 빠른 실행과 성능을 위해 필요한 과정이다.

프로그램이 실행되기 위해선 반드시 컴파일 과정을 거쳐야 하며 AOT와 JIT는 필요에 따라 다른 컴파일 과정을 거친다. 책에서는 이렇게 설명하고 있었는데 정확히 각각의 컴파일 방식이 어떤 목적을 위해서 구분되어 있는건지 이해가 안돼서 더 자세히 찾아보았다.

AOT  JIT
프로그램이 실행되기 전에 미리 컴파일하는 과정 프로그램을 실행하는 시점에 즉석으로 컴파일하는 과정

즉, AOT는 프로그램이 실행될 때마다 번역하고 있으면 성능이 떨어지니 실행되기 전에 한 번 컴파일을 거치는 것이고 JIT는 인터프리터처럼 그때그때 필요한 번역을 진행한다는 것이었다.

 

안드로이드처럼 UI를 그려야 하는 프론트엔드 언어는 UI를 수정할 때마다 전체 컴파일을 진행하면 생산성이 떨어지기 때문에 즉각적인 피드백을 주기 위해 JIT 컴파일이 진행되고, 배포하는 시점에는 AOT 컴파일을 통해 실제 실행될 프로그램을 사전에 컴파일해서 실제 내 핸드폰에서 실행이 될 수 있는 것이다.

 

안드로이드 특징

- 다양한 진입점과 상호작용

안드로이드는 일반적인 애플리케이션과 다르게 여러 프로세스에서 실행될 수 있고 진입점 또한 다양하다. (일반적인 프로그램처럼 main()과 같은 단일 진입점이 존재하지 않음.) 예를 들어 SNS 앱에서 사진을 촬영하여 공유하려고 카메라 앱을 호출해서 사진을 찍고 다시 돌아오는 경우, 쇼핑몰 앱에서 결제를 진행한 후 결과를 전달받는 경우 등 다른 앱과 상호작용하는 경우가 많다.

 

- 데이터와 상태 관리

그렇기 때문에 안드로이드 컴포넌트는 언제든 실행되고, 의도치 않게 종료되는 것에 대비를 해야한다. 이런 컴포넌트의 생명주기는 개발자가 제어하는 것이 아니라 시스템에서 제어하기 때문이다. 이는 즉, 앱이 사용하는 데이터와 상태에 대한 정보를 컴포넌트에 저장해선 안된다는 것을 의미한다.

 

안드로이드 컴포넌트

안드로이드의 컴포넌트는 앱을 구성하는 구성요소들을 의미한다. 생성과 소멸을 안드로이드 시스템에서 제어하기 때문에 이에 대비해야 한다. 안드로이드의 컴포넌트 중 앱의 진입점이 되는 중요 구성요소들이 있는데 이를 안드로이드의 4대 컴포넌트라고 한다.

자세한 설명은 여기를 참고.

  • 액티비티: 사용자와 상호작용하기 위한 인터페이스를 포함한 화면.
  • 서비스: 백그라운드에서 앱을 계속 실행하기 위한 구성요소. 앱을 사용하다 보면 오랜 시간이 걸리는 작업이 있는데 그 작업을 하는 동안 사용자와 상호작용이 끊어지지 않게 하기 위해 사용한다.
  • 브로드캐스트 리시버: 앱 외부에서 이벤트를 앱에 전달할 수 있도록 지원하는 구성 요소.
  • 콘텐츠 프로바이더: 파일 시스템, SQLite 데이터베이스, 웹이나 앱이 접근할 수 있는 공유형 앱 데이터를 관리하는 구성 요소.
profile

illis:site

@illis

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!