앱 시작 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()
메서드에 나열됩니다.
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>
항목을 추가할 필요가 없습니다. WorkManagerInitializer
가 ExampleLoggerInitializer
의 종속 항목이기 때문입니다.
즉, 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);
따라서 WorkManager
도 ExampleLogger
의 종속 항목이므로 App Startup은 WorkManager
도 초기화합니다.
의견 보내기
다음 리소스를 통해 의견을 보내고 아이디어를 공유해 주세요.
- Issue Tracker
- 버그를 수정할 수 있도록 문제를 신고해 주세요.
추천 서비스
- 참고: JavaScript가 사용 중지되어 있으면 링크 텍스트가 표시됩니다.
- 앱 아키텍처: 데이터 영역 - WorkManager로 작업 예약 - Android 개발자
- 앱 아키텍처: 데이터 영역 - Datastore - Android 개발자