본문 바로가기

Android

[Android] Android 앱 아이콘을 클릭하는 순간부터 화면에 그려지기까지

 

안드로이드와 관련된 공부를 하다보면 뷰는 어떻게 그려지는지, API를 호출할 땐 어떻게 비동기를 활용하는지 등등 다양한 기술을 고민하게 되는데요, 앱을 클릭하는 시점부터 앱이 화면에 그려지는 과정까지 자세하게 살펴본 적이 있나요?

 

생각해보니 과연 이 과정을 자세하게 설명할 수 있을까 하는 생각이 들어,, 🤔

Android 앱 아이콘을 누를 때부터 화면에 그려지는 시점까지 내부에서 일어나는 일을 정리해보려고 합니다.

 

우리는 보통 `MainActivity`가 실행된다고 생각하지만, 실제로는 (어떻게 보면 당연한..?) 그 전에 여러 시스템 컴포넌트가 협력하여 앱 프로세스를 생성하고 Activity를 시작하는 과정이 존재합니다.

 

 

1️⃣ 사용자가 앱 아이콘을 클릭한다

사용자가 홈 화면에서 앱 아이콘을 클릭하면 Launcher 앱이 해당 요청을 처리합니다.

Launcher는 Android 시스템에서 일반적인 앱이지만, 홈 화면 역할을 하는 특수한 앱입니다.

 

앱을 실행할 때 Launcher는 내부적으로 다음과 같은 Intent를 생성합니다.

Intent(Intent.ACTION_MAIN).apply {
    addCategory(Intent.CATEGORY_LAUNCHER)
}

 

이 Intent는 앱의 entry Activity를 찾기 위한 요청입니다.

AndroidManifest에서 다음과 같이 정의된 Activity가 실행 대상이 됩니다.

 

<intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>

 

Launcher는 이 Intent를 ActivityManagerService(AMS)로 전달합니다.

 

 

 

2️⃣ ActivityManagerService가 앱 실행을 관리한다

ActivityManagerService(AMS)는 Android 시스템에서 앱 실행과 Activity lifecycle을 관리하는 핵심 시스템 서비스입니다.

 

Launcher로부터 앱 실행 요청을 받은 AMS는 다음을 확인합니다.

  • 앱 프로세스가 이미 실행 중인지
  • 실행 중이지 않다면 새로운 프로세스를 생성해야 하는지

 

이미 실행 중인 경우

앱 프로세스가 이미 존재 한다면 `기본 프로세스 사용 -> Activity만 생성`

 

실행 중이지 않은 경우

앱이 처음 실행되는 경우에는 새로운 앱 프로세스를 생성해야 합니다.

이때 등장하는 것이 zygote 프로세스입니다.

 

 

 

3️⃣ Zygote가 새로운 앱 프로세스를 생성한다

Android에서는 앱 프로세스를 생성할 때 Zygote 프로세스를 사용합니다.

Zygote는 Android 시스템이 부팅될 때 미리 생성되는 프로세스입니다.

 

Zygote는 다음과 같은 역할을 합니다.

  • Android Runtime 로드
  • 공통 라이브러리 로드
  • 새로운 앱 프로세스 생성

앱 실행 요청이 들어오면 AMS는 Zygote에게 `새로운 앱 프로세스를 생성해라` 라고 요청합니다.

 

Zygote는 내부적으로 fork() 시스템 호출을 사용하여 새로운 프로세스를 생성합니다.

Zygote
   ↓ fork()
App Process 생성

 

이 방식의 장점은 다음과 같습니다.

  • 이미 로드된 라이브러리를 공유 가능
  • 앱 실행 속도 향상
  • 메모리 사용 효율 증가

 

 

 

 

4️⃣ 새로운 앱 프로세스에서 ActivityThread가 시작

Zygote가 새로운 프로세스를 생성하면 해당 프로세스에서 ActivityThread가 실행됩니다.

 

`ActivityThread`는 Activity가 아니라 앱 프로세스를 관리하는 메인 클래스입니다.

 

ActivityThread의 역할은 다음과 같습니다.

  • 앱의 메인 스레드 관리
  • Activity lifecycle 처리
  • 시스템과의 통신

 

Android 앱의 main thread (UI thread)는 ActivityThread에 의해 관리됩니다.

 

 

 

5️⃣ Application 객체가 생성된다

앱 프로세스가 시작되면 다음 단계로 Application 객체가 생성됨니다.

이 과정에서 다음과 같은 메서드가 호출됩니다.

 

Application.attach()
Application.onCreate()

 

즉, 앱이 시작될 때 가장 먼저 실행되는 코드가 바로 `Application.onCreate()` 입니다.

 

예를 들어 다음과 같은 코드가 실행됩니다.

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        // 앱 전역 초기화
    }
}

 

이제 여기부터는 많이 아실 것이라고 생각이 드는데, 여기서 보통 다음과 같은 초기화를 수행합니다.

  • DI 초기화
  • 로그 시스템 초기화
  • analytics 설정
  • 전역 설정

 

 

 

6️⃣ Activity가 생성된다

Application이 생성된 이후에 드디어 Activity 생성 과정이 실행됩니다.

이때 ActivityThread는 시스템으로부터 Activity 실행 요청을 받아 다음 과정을 수행합니다.

 

Activity 객체 생성
↓
attach()
↓
onCreate()
↓
onStart()
↓
onResume()

 

즉,  우리가 일반적으로 알고 있는 Activity lifecycle이 이 시점부터 시작됩니다.

예를 들어, `MainActivity`가 실행되는 과정은 다음과 같습니다.

 

MainActivity 생성
↓
onCreate()
↓
onStart()
↓
onResume()

 

그리고 이 시점이 되면 드디어 화면에 UI가 표시됩니다!

 

 

 

7️⃣ Activity의 View가 화면에 그려진다

Activity가 실행되면 `setContentView()` 또는 Compose UI가 호출됩니다.

예를 들어 기존 View 시스템에서는 다음 코드가 실행됩니다.

 

setContentView(R.layout.activity_main)

 

Compose를 사용하는 경우에는 아래 코드가 실행되겠죠?

setContent {
    MainScreen()
}

 

이 단계에서 Android는 ViewRootImpl을 통해 실제 화면에 UI를 렌더링합니다.

이후부터 사용자는 앱과 상호작용을 할 수 있게 됩니다.

 

 

마지막으로 Android 앱 실행부터 Activity 생성까지 전체 흐름을 다시 정리하면 다음과 같습니다.

 

1. 사용자 앱 아이콘 클릭
2. Launcher가 Intent 생성
3. ActivityManagerService가 실행 요청 처리
4. Zygote가 새로운 앱 프로세스 생성
5. ActivityThread 시작
6. Application 생성
7. Activity 생성
8. UI 렌더링

 

 

이 과정들을 이해하면 단순히 API를 사용하고 화면에 뷰를 그리는 것을 넘어 플랫폼의 동작 원리를 기반으로 문제를 해결하는데 많은 도움이 되지 않을까 싶습니다 😗

 

 

 

📚 참고

https://source.android.com/docs/core/runtime/zygote?hl=ko

 

Zygote 프로세스 정보  |  Android Open Source Project

2026년부터 트렁크 안정 개발 모델과 일치하고 생태계의 플랫폼 안정성을 보장하기 위해 2분기와 4분기에 AOSP에 소스 코드를 게시합니다. AOSP를 빌드하고 기여하려면 aosp-main 대신 android-latest-releas

source.android.com

 

https://source.android.com/docs/core/runtime?hl=ko

 

Android 런타임 및 Dalvik  |  Android Open Source Project

2026년부터 트렁크 안정 개발 모델과 일치하고 생태계의 플랫폼 안정성을 보장하기 위해 2분기와 4분기에 AOSP에 소스 코드를 게시합니다. AOSP를 빌드하고 기여하려면 aosp-main 대신 android-latest-releas

source.android.com

 

https://dev.to/nikhildupally/what-happens-when-you-click-on-an-app-in-android-a-deep-dive-4dk4

 

What Happens When You Click on an App in Android: A Deep Dive

What Happens When You Click on an App in Android: A Deep Dive Have you ever wondered...

dev.to