アプリのスタートアップ 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() メソッドにリストされます。

WorkManagerInitializerExampleLoggerInitializer の例をもう一度考えてみましょう。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>

WorkManagerInitializerExampleLoggerInitializer の依存関係であるため、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);

その結果、WorkManagerExampleLogger の依存関係であるため、App Startup は WorkManager も初期化します。

フィードバックを送信

以下のリソースを通じてフィードバックやアイデアをお寄せください。

Issue Tracker
Google がバグを修正できるよう問題を報告します。