アプリのスタートアップ Android Jetpack の一部。
App Startup ライブラリは、アプリの起動時にコンポーネントを初期化する簡単で効率的な方法を提供します。ライブラリ デベロッパーとアプリ デベロッパーのどちらも、App Startup を使用して起動シーケンスを簡素化し、初期化の順序を明示的に設定できます。
初期化する必要があるコンポーネントごとに個別のコンテンツ プロバイダを定義する代わりに、App Startup では、単一のコンテンツ プロバイダを共有するコンポーネント初期化子を定義できます。これにより、アプリの起動時間が大幅に短縮されます。
セットアップ
ライブラリまたはアプリで Jetpack Startup を使用するには、Gradle ファイルに次の行を追加します。
Groovy
dependencies { implementation "androidx.startup:startup-runtime:1.1.1" }
Kotlin
dependencies { implementation("androidx.startup:startup-runtime:1.1.1") }
アプリ起動時にコンポーネントを初期化する
アプリとライブラリは、多くの場合、アプリの起動時に直ちにコンポーネントを初期化する必要があります。このニーズを満たすには、コンテンツ プロバイダを使用して各依存関係を初期化する必要がありますが、コンテンツ プロバイダはインスタンス化のコストが高くなり、起動シーケンスが不必要に遅くなる可能性があります。また、Android はコンテンツ プロバイダを不確定の順序で初期化します。App Startup では、アプリの起動時にコンポーネントを初期化し、依存関係を明示的に定義するための効率的な方法が提供されます。
アプリの起動を使用して起動時にコンポーネントを自動的に初期化するには、アプリの初期化が必要なコンポーネントごとにコンポーネント初期化子を定義する必要があります。
コンポーネント初期化子を実装する
Initializer<T>
インターフェースを実装するクラスを作成して、各コンポーネント イニシャライザを定義します。このインターフェースは、次の 2 つの重要なメソッドを定義します。
create()
メソッド。コンポーネントの初期化に必要なすべてのオペレーションが含まれ、T
のインスタンスを返します。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
に依存します。この依存関係は、App Startup が最初に 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
が含まれているため、App Startup は ExampleLogger
の前に WorkManager
を初期化します。
マニフェスト エントリを設定する
App Startup には、InitializationProvider
という特別なコンテンツ プロバイダが含まれています。これを使用して、コンポーネント初期化子を検出して呼び出します。App Startup は、まず InitializationProvider
マニフェスト エントリの <meta-data>
エントリを確認することで、コンポーネント初期化子を検出します。次に、App Startup は、すでに検出しているイニシャライザに対して dependencies()
メソッドを呼び出します。
つまり、App Startup がコンポーネント イニシャライザを検出できるようにするには、次のいずれかの条件を満たす必要があります。
- コンポーネント イニシャライザには、
InitializationProvider
マニフェスト エントリの下に、対応する<meta-data>
エントリがあります。 - コンポーネント イニシャライザは、すでに検出可能なイニシャライザから
dependencies()
メソッドにリストされます。
WorkManagerInitializer
と ExampleLoggerInitializer
の例をもう一度考えてみましょう。App Startup がこれらのイニシャライザを検出できるようにするには、マニフェスト ファイルに次の行を追加します。
<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
は ExampleLoggerInitializer
の依存関係であるため、WorkManagerInitializer
に <meta-data>
エントリを追加する必要はありません。つまり、ExampleLoggerInitializer
が検出可能であれば、WorkManagerInitializer
も検出可能です。
tools:node="merge"
属性を使用すると、競合するエントリがマニフェスト マージツールによって適切に解決されるようになります。
lint チェックを実行する
App Startup ライブラリには、コンポーネント初期化子が正しく定義されているかどうかを確認するために使用できる一連の lint ルールが含まれています。これらの lint チェックを実行するには、コマンドラインから ./gradlew :app:lintDebug
を実行します。
コンポーネントを手動で初期化する
通常、App Startup を使用する場合、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
- Google がバグを修正できるよう問題を報告します。
あなたへのおすすめ
- 注: JavaScript がオフになっている場合はリンクテキストが表示されます
- アプリ アーキテクチャ: データレイヤ - WorkManager でタスクのスケジュールを設定する - Android デベロッパー
- アプリ アーキテクチャ: データレイヤ - DataStore - Android デベロッパー