본문 바로가기
안드로이드

[안드로이드] Jetpack AppStartUp 이해를 위한 정리

by keel_im 2022. 1. 27.
반응형

안드로이드 Jetpack AppStartUp을 사용하면서 무작성 빠르다고 해서 사용을 했던 것 같은데,

이해를 가질 필요가 있어 정리하고자 합니다.

AppStartUp는 앱에 콜드 스타트 상황을 가정하고 전역으로 초기화를 해야 할 때, Application에서 초기화를 해야 합니다. 즉, 앱을 시작할 때 구성요소를 초기화하는 간단하고 성능 기준에 부합하는 방법을 구현하는 것입니다.

(*콜드 스타트는 앱이 처음부터 시작되는 것을 말한다.) 

저의 문제점은

> 콘텐트 프로바이더를 자주 사용을 안 해봐서 이해가 없었던 것입니다. 

여기서, 그럼 일반적인 라이브러리도 있지만, 콘텐트 프로바이더를 사용하는 라이브러리는 어떨까요? 

 

일반적으로 우리가 사용하는 콘텐트 프로바이더는 매니페스트에서 정의를 할 수 있는데, 이는 앱이 실행될 때, 각각은 인스턴스화 하는 과정을 거칩니다.

이에 발생하는 단점들이 있는데.

  1. 라이브러리 각각마다 사용하는 콘텐트 프로바이더가 있고 이것들은 각각 코스트를 가지고 있기 때문에,  인스턴스화할 콘텐츠 프로바이더가 많아질수록 앱 로딩 속도는 저하가 일어납니다.
  2. 안드로이드는 라이브러리 초기화에 대한 순서를 보장하지 않습니다. 이에 라이브러리를 초기화하면서 순서가 엉켜 잘못된 동작을 할 수 있습니다.

 


그러면 Jetpack StartUp에서는

  • 단일 콘텐츠 공급자를 사용하여 프로그램을 호출합니다.
    • Jetpack AppStartUp 은 각각의 프로바이더를 사용하는 라이브러리들을  단일로 통합하여 매니페스트에 정의를 할 수 있도록 하였습니다. 당연히 1개로 통합을 하니 그만큼 코스트가 줄어들어 앱 로딩에 부담이 살아집니다. 
    • 모든 라이브러리에 대해 단일 콘텐츠 소스를 사용하여 효율적으로 만들고, 앱의 시작 시간이 크게 단축
  • 라이브러리가 초기화되어야 하는 순서를 결정할 때 라이브러리를 돕습니다.

 


그러면 이제 사용을 한번 해보겠습니다. 사용방법은 심플합니다.

1. 의존성 설정

implementation("androidx.startup:startup-runtime:1.1.0")

안드로이드는 라이브러리 버전마다, 코틀린 버전마다, agp 버전마다 파편화가 심하기 때문에 버전 사용은 항상 유의해주세요.

그래서 저는 buildSrc 를 애용합니다.

https://github.com/keelim/nandaDiagnosis/blob/master/buildSrc/src/main/java/Dep.kt

 

GitHub - keelim/nandaDiagnosis: Hi This is keelim`s android project

Hi This is keelim`s android project. Contribute to keelim/nandaDiagnosis development by creating an account on GitHub.

github.com

2. Initializer 작성

class TimberInitializer : Initializer<Unit> {

  override fun create(context: Context) {
    if (BuildConfig.DEBUG) {
      Timber.plant(Timber.DebugTree())
    }
  }

  override fun dependencies(): List<Class<out Initializer<*>>> {
    return emptyList()
  }
}

저는 Timber를 한번 사용해보겠습니다.  위 동작은 디버그 동작시에만 Timber 로그가 찍힐 수 있도록 설정하는 것입니다.

3. 매니페스트 설정

<provider
        android:name="androidx.startup.InitializationProvider"
        android:authorities="${applicationId}.androidx-startup"
        android:exported="false"
        tools:node="merge">
        <meta-data
            android:name="com.keelim.nandadiagnosis.initialize.TimberInitializer"
            android:value="androidx.startup" />
</provider>

위 처럼 기재를 해주시면 라이브러리 사용은 끝났습니다. 


Jetpack AppStartUp은 라이브러리이긴 하지만, 라이브러리가 아닌 코드 설정(?) 같은 느낌을 개인적으로 받습니다. 

조금 더 작동 방법, 왜 사용하는지를 명확하게 하고 설득할 수 있는 그런 실력을 기르고 싶습니다. 

감사합니다. 

🧶문서는 항상 수정될 수 있습니다. 비판은 환영하며 감사하게 생각합니다.

반응형

댓글