Debbi Story

[Jetpack] App Startup 본문

안드로이드/Jetpack

[Jetpack] App Startup

Debbi 2021. 7. 2. 03:19
728x90

 

안녕하세요. Jetpack 라이브러리에 있는 App Startup을 알아보려합니다.

 

기존에는 Application 클래스에서 외부라이브러 등을 초기화를 했었습니다.

 

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        // initialize component
    }
}

 

 앱 시작 라이브러리는 애플리케이션 시작시 구성 요소를 초기화하는 간단하고 효율적인 방법을 제공합니다. 라이브러리 개발자와 앱 개발자는 모두 앱 시작을 사용하여 시작 시퀀스를 간소화하고 초기화 순서를 명시 적으로 설정할 수 있습니다.

초기화해야하는 각 구성 요소에 대해 별도의 콘텐츠 공급자를 정의하는 대신 앱 시작을 사용하면 단일 콘텐츠 공급자를 공유하는 구성 요소 이니셜 라이저를 정의 할 수 있습니다. 이렇게하면 앱 시작 시간이 크게 향상 될 수 있습니다.

 

https://developer.android.com/topic/libraries/app-startup

 

App Startup  |  Android Developers

The App Startup library provides a straightforward, performant way to initialize components at application startup. Both library developers and app developers can use App Startup to streamline startup sequences and explicitly set the order of initializatio

developer.android.com

 

1. dependency 추가

 

dependencies {
    implementation "androidx.startup:startup-runtime:1.0.0"
}

 

 

2.Initializer 구현

Initializer<T>인터페이스 를 구현하는 클래스를 만들어 각 구성 요소 이니셜 라이저를 정의합니다 . 이 인터페이스는 두 가지 중요한 방법을 정의합니다.

  •  create()메서드는 구성 요소를 초기화하는 데 필요한 모든 작업을 포함하고의 인스턴스를 반환합니다 T.
  • dependencies()다른 목록을 반환하는 방법, Initializer<T>이니셜 라이저가에 따라 달라 객체. 이 메서드를 사용하여 앱이 시작시 이니셜 라이저를 실행하는 순서를 제어 할 수 있습니다.

예를 들어 앱이 WorkManager시작시 초기화해야하며 종속되어 있다고 가정합니다 . 다음 WorkManagerInitializer을 구현 하는 클래스를 정의하십시오 Initializer<WorkManager>.

 

 

// Initializes WorkManager.
class WorkManagerInitializer : Initializer<WorkManager> {
    override fun create(context: Context): WorkManager {
        val configuration = Configuration.Builder().build()
        WorkManager.initialize(context, configuration)
        return WorkManager.getInstance(context)
    }
    override fun dependencies(): List<Class<out Initializer<*>>> {
        // No dependencies on other libraries.
        return emptyList()
    }
}

 

 

 dependencies()메서드는 WorkManager다른 라이브러리에 의존하지 않기 때문에 빈 목록을 반환합니다 .

앱이 또한라는 라이브러리에 의존한다고 가정 ExampleLogger차례에 따라 달라집니다 WorkManager. 이 종속성은 앱 시작이 WorkManager먼저 초기화되었는지 확인해야 함을 의미합니다 . 다음 ExampleLoggerInitializer을 구현 하는 클래스를 정의하십시오 Initializer<ExampleLogger>

 

 

// Initializes ExampleLogger.
class ExampleLoggerInitializer : Initializer<ExampleLogger> {
    override fun create(context: Context): ExampleLogger {
        // WorkManager.getInstance() is non-null only after
        // WorkManager is initialized.
        return ExampleLogger(WorkManager.getInstance(context))
    }

    override fun dependencies(): List<Class<out Initializer<*>>> {
        // Defines a dependency on WorkManagerInitializer so it can be
        // initialized after WorkManager is initialized.
        return listOf(WorkManagerInitializer::class.java)
    }
}

 

 

 위 내용을 요약해보면 WorkManager를 반환하는 WorkManagerInitializer를 만들고 의존하는 instance가 없어 emptyList()를 반환합니다. ExampleLoggerInitializer 클래스는 WorkManager에 의존하기 때문에 위에서 먼저 만든 WorkManagerInitializer 클래스를 dependencies()에서 반환해 줍니다. 이렇게 하면 WorkManager가 먼저 초기화되고 ExampleLogger에서는 null 아닌 WorkManager instance를 받게 됩니다. 

 

 

 

 

3. Manifest 설정

 

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <!-- This entry makes ExampleLoggerInitializer discoverable. -->
    <meta-data  android:name="com.example.ExampleLoggerInitializer"
          android:value="androidx.startup" />
</provider>

 

여기서 <meta-data> 에 ExampleLoggerInitializer만 추가하면 dependencies에 있는 WorkManagerInitializer 초기화 되기때문에 WorkManagerInitializer를 추가하지 않아도 됩니다.

 

tools:node="merge"속성은 manifest merger tool 충돌하는 항목을 올바르게 해결하도록합니다.

 

 

- 수동 초기화 lazy initialization

 

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data android:name="com.example.ExampleLoggerInitializer"
              tools:node="remove" />
</provider>

 

<meta-data>에 tools:node="remove"를 설정하면 해당 component는 자동초기화 되지않는다.

<provider>에 tools:node="remove"를 설정하면 모든 component 비활성화

 

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer::class.java)

 

manifest에서 비활성화 후에 위 코드처럼 수동초기화를 할 수 있습니다.

 

 

- 간단한 활용 방법

참고) https://github.com/skydoves/Pokedex/blob/main/app/src/main/java/com/skydoves/pokedex/initializer/TimberInitializer.kt

class TimberInitializer : Initializer<Unit> {

    override fun create(context: Context) {
        if (BuildConfig.DEBUG) {
            Timber.plant(Timber.DebugTree())
            Timber.d("TimberInitializer is initialized.")
        }
    }

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

 

유명한 logging 라이브러리 Timber를 초기화 방법입니다.

반환할 instance가 없다면 Unit으로 설정할 수 있습니다.

 

이상으로 App Startup에 대해 알아보았습니다.

 

'안드로이드 > Jetpack' 카테고리의 다른 글

[Jetpack] DataStore  (0) 2021.06.22