0Pricing
Android Academy · 강의

시작 시간과 기준선 프로필

콜드 스타트 속도를 높입니다.

시작 시간과 기준선 프로필은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

첫인상: 앱 시작

시작 시간은 모든 사용자가 가장 먼저 경험하는 요소입니다. Google Play도 느린 시작을 품질 문제로 표시합니다. 빠른 콜드 시작은 앱을 고급스럽게 느끼게 하지만, 느린 시작은 사용자가 앱을 떠나게 만듭니다.

이 학습에서는 세 가지 시작 유형, 시작을 느리게 만드는 요소, 그리고 콜드 시작을 크게 빠르게 만드는 최신 도구인 앱 시작과 기준 프로필을 알아봅니다.

콜드, 웜, 핫 시작

Android는 가장 느린 경우부터 가장 빠른 경우까지 세 가지 시작 시나리오를 정의합니다.

  • 콜드 시작: 프로세스가 존재하지 않습니다. Android가 프로세스를 만들고 Application을 실행한 다음 첫 화면을 표시합니다. 가장 느리며 최적화의 우선순위가 가장 높습니다.
  • 웜 시작: 프로세스는 살아 있지만 Activity를 다시 만들어야 합니다.
  • 핫 시작: Activity가 여전히 메모리에 있으므로 앞으로 가져오기만 하면 됩니다. 거의 즉시 완료됩니다.

최적화 작업은 콜드 시작에 집중합니다. 신규 사용자와 다시 방문한 사용자가 가장 자주 경험하는 시작 방식이기 때문입니다.

시작 시간 측정

측정하지 않은 것은 개선할 수 없습니다. 간단한 방법은 두 가지입니다.

  • Logcat: 시스템이 첫 프레임까지 걸린 시간이 포함된 Displayed 줄을 기록합니다.
  • Macrobenchmark: StartupTimingMetric이 안정적이고 반복 가능한 콜드 시작 수치를 제공합니다.

아래 adb 명령을 실행하고 Displayed 줄을 확인하십시오.

# Cold-start the app and log time to first frame
adb shell am start -W -S com.example.app/.MainActivity

# Output includes:
#   TotalTime: 412   <- ms to first frame
# Or filter logcat:
adb logcat | grep "Displayed com.example.app"

Application.onCreate를 가볍게 유지하기

Application.onCreate()의 모든 코드는 첫 프레임 전에 메인 스레드에서 실행됩니다. 여기서 수행하는 무거운 초기화는 시작을 직접 지연시킵니다.

아래의 잘못된 버전은 여러 라이브러리를 즉시 초기화합니다. 첫 화면에 필요하지 않은 작업은 지연하거나 백그라운드에서 실행하십시오.

// SLOW: blocks the first frame with eager init
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        Analytics.init(this)        // network, disk
        ImageLoader.preload(this)   // heavy
        Database.warmUp(this)       // disk I/O
    }
}
// Each of these adds milliseconds before the user sees anything.

Jetpack 앱 시작 라이브러리

앱 시작 라이브러리는 각각 시간을 소모하는 여러 라이브러리 콘텐츠 제공자를 하나의 공유 제공자로 대체하고, 초기화 순서와 종속성을 명확하게 표현할 수 있게 합니다.

각 구성 요소에 대해 Initializer를 구현하면 앱 시작 라이브러리가 종속성 순서에 따라 한 번씩 실행합니다.

class AnalyticsInitializer : Initializer<Analytics> {
    override fun create(context: Context): Analytics {
        return Analytics.init(context.applicationContext)
    }
    // Runs after Logger is ready
    override fun dependencies() = listOf(LoggerInitializer::class.java)
}
// Registered via a single merged provider in the manifest,
// avoiding one ContentProvider per library.

지연 초기화와 백그라운드 초기화

시작 시 즉시 실행할 작업의 순서를 정하는 것보다 더 좋은 방법은 시작 시 작업 자체를 줄이는 것입니다. 두 가지 방법이 있습니다.

  • 지연: Kotlin의 by lazy를 사용해 처음 사용할 때 무거운 객체를 만듭니다.
  • 백그라운드: UI와 관련 없는 초기화를 메인 스레드 밖으로 옮깁니다.

이제 사용자가 아직 필요로 하지 않는 작업이 첫 프레임을 막지 않습니다.

class MyApp : Application() {
    // Built only when first accessed, not during onCreate
    val imageLoader by lazy { ImageLoader.build(this) }

    override fun onCreate() {
        super.onCreate()
        // Push non-critical setup off the main thread
        CoroutineScope(Dispatchers.Default).launch {
            Analytics.init(applicationContext)
        }
    }
}

AOT와 JIT: 첫 실행이 느린 이유

기본적으로 Android는 해석과 JIT(Just-In-Time) 컴파일을 섞어 앱의 바이트코드를 실행합니다. 자주 실행되는 코드가 처음 실행될 때는 해석되므로 느리며, 런타임이 해당 코드를 네이티브 코드로 컴파일하는 것은 그 이후입니다.

이 때문에 콜드 시작과 첫 스크롤이 더 느리게 느껴집니다. 기준 프로필은 설치 시 중요한 코드를 AOT(Ahead-Of-Time)로 컴파일하도록 기기에 알려 이 문제를 해결합니다.

기준 프로필이란

기준 프로필은 중요한 사용자 흐름(시작, 첫 스크롤)에서 실행되는 클래스와 메서드의 목록입니다. 이 프로필을 앱과 함께 제공하면 설치 시 기기가 해당 메서드를 AOT로 컴파일하므로 첫 실행부터 네이티브 속도로 실행됩니다.

Google에 따르면 코드 기능을 변경하지 않고 프로필만 추가해도 시작 성능이 20~40% 향상되는 경우가 많습니다.

// build.gradle.kts
plugins { id("androidx.baselineprofile") }

dependencies {
    baselineProfile(project(":baselineprofile"))
}
// The generated profile ships as
//   assets/dexopt/baseline.prof
// and is applied automatically at install.

기준 프로필 생성

기기에서 중요한 경로를 실행하는 작은 테스트를 작성하면 프로필을 생성할 수 있습니다. 도구가 실행된 메서드를 기록하고 프로필 파일을 작성합니다. 그런 다음 이를 커밋하고 다시 빌드합니다.

다음은 시작과 스크롤을 캡처하는 일반적인 생성기입니다.

@RunWith(AndroidJUnit4::class)
class BaselineProfileGenerator {
    @get:Rule val rule = BaselineProfileRule()

    @Test
    fun generate() = rule.collect(packageName = "com.example.app") {
        pressHome()
        startActivityAndWait()
        // exercise the critical journey
        device.findObject(By.res("feed")).fling(Direction.DOWN)
    }
}
// Run the generateBaselineProfile Gradle task to produce the file.

향상 효과 확인

항상 벤치마크로 향상 효과를 확인하십시오. 프로필을 적용한 경우와 적용하지 않은 경우의 시작을 비교합니다(CompilationMode.None 대 프로필이 적용된 Partial).

측정하지 않으면 프로필이 도움이 되었음을 입증할 수 없습니다. 오래된 프로필은 오히려 성능을 저하시킬 수도 있습니다. 자주 실행되는 경로가 크게 바뀔 때마다 프로필을 다시 생성하십시오.

@Test
fun startupWithProfile() = rule.measureRepeated(
    packageName = "com.example.app",
    metrics = listOf(StartupTimingMetric()),
    iterations = 10,
    startupMode = StartupMode.COLD,
    compilationMode = CompilationMode.Partial() // uses the baseline profile
) {
    pressHome()
    startActivityAndWait()
}

시작 최적화 계획

다음과 같이 반복 가능한 계획으로 정리해 보겠습니다.

  • Macrobenchmark와 adb am start -W로 콜드 시작을 측정합니다.
  • Application.onCreate를 줄입니다. by lazy로 지연하고 작업을 메인 스레드 밖으로 옮깁니다.
  • 앱 시작을 사용해 콘텐츠 제공자를 병합하고 초기화 순서를 정합니다.
  • 중요한 경로를 AOT 컴파일하도록 기준 프로필을 함께 제공합니다.
  • 벤치마크로 효과를 확인하고 프로필을 최신 상태로 유지합니다.

그 결과 사용자가 알아차릴 만큼 빠른 첫 프레임을 얻을 수 있습니다.

빠른 확인

앱과 함께 기준 프로필을 제공합니다. 시작 성능을 향상하기 위해 기준 프로필은 주로 어떤 작업을 하나요?

복습: 첫 프레임부터 빠르게

가장 눈에 잘 띄는 성능 지표인 시작 성능을 최적화하는 방법을 배웠습니다.

  • 콜드 시작을 최적화하고 Macrobenchmark와 adb am start -W로 측정합니다.
  • Application.onCreate를 가볍게 유지합니다. 지연 초기화와 백그라운드 UI 외 작업을 사용합니다.
  • 앱 시작 라이브러리를 사용해 제공자를 병합하고 초기화 순서를 정합니다.
  • 기준 프로필을 함께 제공해 설치 시 자주 실행되는 코드를 AOT로 컴파일하고 첫 실행부터 네이티브 속도로 실행합니다.
  • 항상 벤치마크로 향상 효과를 확인하고 프로필을 최신 상태로 유지합니다.

이로써 성능 최적화 및 프로파일링 과정을 마쳤습니다. 이제 성능을 측정하고, 재구성을 제어하고, 누수를 해결하고, 빠르게 시작할 수 있습니다.

자주 묻는 질문

“시작 시간과 기준선 프로필” 강의는 무료인가요?

네 — “시작 시간과 기준선 프로필” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“시작 시간과 기준선 프로필”에서 뭘 배우나요?

콜드 스타트 속도를 높입니다. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Android Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“시작 시간과 기준선 프로필” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 성능 측정
  2. 재구성 길들이기
  3. 메모리 누수와 해결 방법
  4. 시작 시간과 기준선 프로필
← Android Academy(으)로 돌아가기