앱 시작 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> 인터페이스 이 인터페이스는 두 가지 중요한 메서드를 정의합니다.

  • create() 메서드: 구성요소를 초기화하고 T 인스턴스를 반환합니다.
  • dependencies() 메서드: 나머지 항목의 목록을 반환합니다. 이니셜라이저가 의존하는 Initializer<T> 객체입니다. 이 메서드를 사용하여 시작 시 앱이 이니셜라이저를 실행하는 순서를 제어합니다.

예를 들어 앱이 WorkManager 시작할 때 초기화합니다. WorkManagerInitializer 클래스를 정의합니다. Initializer<WorkManager>를 구현합니다.

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

자바

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

}

dependencies() 메서드는 빈 목록을 반환합니다. WorkManager가 다른 라이브러리에 종속될 수 있습니다

앱이 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)
    }
}

자바

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

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

  • 구성요소 이니셜라이저에는<meta-data> InitializationProvider 매니페스트 항목을 찾습니다.
  • 구성요소 이니셜라이저는dependencies() 이니셜라이저가 있는지 확인합니다.

WorkManagerInitializer가 있는 예시를 다시 생각해 보세요. ExampleLoggerInitializer 앱 시작에서 이러한 항목을 발견할 수 있도록 하기 위해 초기화하려면 매니페스트 파일에 다음을 추가합니다.

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

자바

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

따라서 WorkManager이 다음과 같기 때문에 앱 시작은 WorkManager도 초기화합니다. ExampleLogger의 종속 항목

의견 보내기

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

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