앱 시작 Android Jetpack의 구성요소

앱 시작 라이브러리를 사용하면 애플리케이션 시작 시 구성요소를 간단하고 효율적으로 초기화할 수 있습니다. 라이브러리 개발자는 물론 앱 개발자도 앱 시작을 사용하여 시작 시퀀스를 간소화하고 초기화 순서를 명시적으로 설정할 수 있습니다.

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

설정

라이브러리 또는 앱에서 Jetpack Startup을 사용하려면 Gradle 파일에 다음을 추가합니다.

Groovy

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

Kotlin

dependencies {
    implementation("androidx.startup:startup-runtime:1.1.1")
}

앱 시작 시 구성요소 초기화

앱과 라이브러리는 앱이 시작되는 즉시 구성요소를 초기화해야 하는 경우가 많습니다. 콘텐츠 제공자를 사용하여 각 종속 항목을 초기화하면 이러한 요구를 충족할 수 있지만, 콘텐츠 제공자를 인스턴스화하는 데는 비용이 많이 들고 시작 시퀀스가 불필요하게 느려질 수 있습니다. 또한 Android는 콘텐츠 제공자를 결정되지 않은 순서로 초기화합니다. 앱 시작은 앱 시작 시 구성요소를 초기화하고 종속 항목을 명시적으로 정의하는 더 효율적인 방법을 제공합니다.

앱 시작을 사용하여 시작 시 구성요소를 자동으로 초기화하려면 앱에서 초기화해야 하는 각 구성요소의 구성요소 이니셜라이저를 정의해야 합니다.

구성요소 이니셜라이저 구현

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

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

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

Kotlin

// 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()
    }
}

Java

// Initializes WorkManager.
class WorkManagerInitializer implements Initializer<WorkManager> {

    @Override
    public WorkManager create(Context context) {
        Configuration configuration = Configuration.Builder().build();
        WorkManager.initialize(context, configuration);
        return WorkManager.getInstance(context);
    }

    @Override
    public List<Class<Initializer<?>>> dependencies() {
        // No dependencies on other libraries.
        return emptyList();
    }

}

WorkManager가 다른 라이브러리에 종속되지 않으므로 dependencies() 메서드는 빈 목록을 반환합니다.

앱이 ExampleLogger라는 라이브러리에도 종속되고 이 라이브러리는 WorkManager에 종속된다고 가정해 보겠습니다. 이 종속 항목은 앱 시작이 먼저 WorkManager를 초기화하는지 확인해야 한다는 것을 의미합니다. Initializer<ExampleLogger>를 구현하는 ExampleLoggerInitializer 클래스를 정의합니다.

Kotlin

// 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)
    }
}

Java

// Initializes ExampleLogger.
class ExampleLoggerInitializer implements Initializer<ExampleLogger> {

    @Override
    public ExampleLogger create(Context context) {
        // WorkManager.getInstance() is non-null only after
        // WorkManager is initialized.
        return ExampleLogger(WorkManager.getInstance(context));
    }

    @Override
    public List<Class<Initializer<?>>> dependencies() {
        // Defines a dependency on WorkManagerInitializer so it can be
        // initialized after WorkManager is initialized.
        return Arrays.asList(WorkManagerInitializer.class);
    }
}

dependencies() 메서드에 WorkManagerInitializer를 포함하므로 앱 시작은 ExampleLogger 전에 WorkManager를 초기화합니다.

매니페스트 항목 설정

앱 시작에는 구성요소 이니셜라이저를 검색하고 호출하는 데 사용하는 InitializationProvider라는 특수한 콘텐츠 제공자가 포함되어 있습니다. 앱 시작은 먼저 InitializationProvider 매니페스트 항목에서 <meta-data> 항목을 확인하여 구성요소 이니셜라이저를 검색합니다. 그런 다음 앱 시작은 이미 발견된 이니셜라이저에 dependencies() 메서드를 호출합니다.

즉, 앱 시작에서 구성요소 이니셜라이저를 검색할 수 있으려면 다음 조건 중 하나를 충족해야 합니다.

  • 구성요소 이니셜라이저는 InitializationProvider 매니페스트 항목 아래에 상응하는 <meta-data> 항목이 있습니다.
  • 구성요소 이니셜라이저는 이미 검색 가능한 이니셜라이저의 dependencies() 메서드에 나열됩니다.

WorkManagerInitializerExampleLoggerInitializer를 사용한 예를 다시 생각해 보세요. 앱 시작이 이러한 이니셜라이저를 검색할 수 있도록 하려면 매니페스트 파일에 다음을 추가합니다.

<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>

WorkManagerInitializer<meta-data> 항목은 추가할 필요가 없습니다. WorkManagerInitializerExampleLoggerInitializer의 종속 항목이기 때문입니다. 즉, ExampleLoggerInitializer를 검색할 수 있으면 WorkManagerInitializer도 검색됩니다.

tools:node="merge" 속성은 매니페스트 병합 도구가 충돌하는 항목을 올바르게 해결하도록 합니다.

린트 검사 실행

앱 시작 라이브러리에는 구성요소 이니셜라이저를 올바르게 정의했는지 확인하는 데 사용할 수 있는 린트 규칙 집합이 포함되어 있습니다. 명령줄에서 ./gradlew :app:lintDebug을 실행하여 이러한 린트 검사를 실행할 수 있습니다.

수동으로 구성요소 초기화

일반적으로 앱 시작을 사용할 때 InitializationProvider 객체는 AppInitializer라는 항목을 사용하여 애플리케이션 시작 시 구성요소 이니셜라이저를 자동으로 검색하고 실행합니다. 그러나 시작 시 앱에 필요하지 않은 구성요소를 수동으로 초기화하기 위해 AppInitializer를 직접 사용할 수도 있습니다. 이를 지연 초기화라고 하며 시작 비용을 최소화할 수 있습니다.

먼저 수동으로 초기화하려는 모든 구성요소에 대해 자동 초기화를 사용 중지해야 합니다.

개별 구성요소의 자동 초기화 사용 중지

단일 구성요소의 자동 초기화를 사용 중지하려면 매니페스트에서 구성요소의 이니셜라이저의 <meta-data> 항목을 삭제합니다.

예를 들어 매니페스트 파일에 다음을 추가하면 ExampleLogger의 자동 초기화가 사용 중지됩니다.

<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>

단순히 항목을 삭제하는 대신 항목에 tools:node="remove"를 사용하여 병합 도구가 다른 모든 병합된 매니페스트 파일에서도 항목을 삭제하도록 합니다.

모든 구성요소에 자동 초기화 사용 중지

모든 자동 초기화를 사용 중지하려면 매니페스트에서 InitializationProvider의 전체 항목을 삭제합니다.

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    tools:node="remove" />

수동으로 구성요소 이니셜라이저 호출

구성요소의 자동 초기화가 사용 중지된 경우 AppInitializer를 사용하여 해당 구성요소와 종속 항목을 수동으로 초기화할 수 있습니다.

예를 들어 다음 코드는 AppInitializer를 호출하고 ExampleLogger를 수동으로 초기화합니다.

Kotlin

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

Java

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer.class);

따라서 WorkManagerExampleLogger의 종속 항목이므로 앱 시작도 WorkManager를 초기화합니다.

의견 보내기

다음 리소스를 통해 의견을 보내고 아이디어를 공유해 주세요.

Issue Tracker
버그를 수정할 수 있도록 문제를 신고해 주세요.