안드로이드 Jetpack AppStartUp을 사용하면서 무작성 빠르다고 해서 사용을 했던 것 같은데,
이해를 가질 필요가 있어 정리하고자 합니다.
AppStartUp는 앱에 콜드 스타트 상황을 가정하고 전역으로 초기화를 해야 할 때, Application에서 초기화를 해야 합니다. 즉, 앱을 시작할 때 구성요소를 초기화하는 간단하고 성능 기준에 부합하는 방법을 구현하는 것입니다.
(*콜드 스타트는 앱이 처음부터 시작되는 것을 말한다.)
저의 문제점은
> 콘텐트 프로바이더를 자주 사용을 안 해봐서 이해가 없었던 것입니다.
여기서, 그럼 일반적인 라이브러리도 있지만, 콘텐트 프로바이더를 사용하는 라이브러리는 어떨까요?
일반적으로 우리가 사용하는 콘텐트 프로바이더는 매니페스트에서 정의를 할 수 있는데, 이는 앱이 실행될 때, 각각은 인스턴스화 하는 과정을 거칩니다.
이에 발생하는 단점들이 있는데.
- 라이브러리 각각마다 사용하는 콘텐트 프로바이더가 있고 이것들은 각각 코스트를 가지고 있기 때문에, 인스턴스화할 콘텐츠 프로바이더가 많아질수록 앱 로딩 속도는 저하가 일어납니다.
- 안드로이드는 라이브러리 초기화에 대한 순서를 보장하지 않습니다. 이에 라이브러리를 초기화하면서 순서가 엉켜 잘못된 동작을 할 수 있습니다.
그러면 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
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은 라이브러리이긴 하지만, 라이브러리가 아닌 코드 설정(?) 같은 느낌을 개인적으로 받습니다.
조금 더 작동 방법, 왜 사용하는지를 명확하게 하고 설득할 수 있는 그런 실력을 기르고 싶습니다.
감사합니다.
🧶문서는 항상 수정될 수 있습니다. 비판은 환영하며 감사하게 생각합니다.
'안드로이드' 카테고리의 다른 글
[안드로이드] nowinandroid 를 보면서 개인적으로 기억하고 싶은 것들 (0) | 2022.05.29 |
---|---|
[안드로이드] 빠르게 개발하려면 flowWithLifecycle (1) | 2022.03.09 |
[안드로이드] 앱 오프닝 광고 구현 Version: Kotlin (0) | 2022.01.14 |
[안드로이드] repeatOnLifecycle 을 사용하며. (0) | 2021.12.26 |
[안드로이드] 힐트(Hilt)를 사용하면서 - @Binds (4) | 2021.12.19 |
댓글