アプリの起動 Android Jetpack の一部。

App Startup ライブラリを使用すると、簡単かつ効率的に初期化できます。 自動的に作成されます。ライブラリ デベロッパーとアプリ デベロッパーの両方 App Startup を使用して、起動シーケンスを簡素化し、順序を明示的に設定できます。 必要ありません。

コンポーネントごとに個別のコンテンツ プロバイダを定義するのではなく、 初期化では、App Engine の初期化関数を 提供します。これにより、アプリの起動時間が大幅に短縮されます。

設定

ライブラリまたはアプリで Jetpack Startup を使用するには、Gradle に以下を追加します ファイル:

Groovy

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

Kotlin

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

アプリ起動時にコンポーネントを初期化する

アプリやライブラリでは多くの場合、実行時にコンポーネントを アプリが起動しますこのニーズを満たすには、コンテンツ プロバイダを使用して 各依存関係を初期化するが、コンテンツ プロバイダのインスタンス化にはコストがかかる 起動シーケンスが不必要に遅くなる可能性があります。また、Android は 不確定の順序でコンテンツ プロバイダを初期化します。アプリの起動は アプリ起動時に明示的にコンポーネントを初期化 依存関係を定義します。

アプリの起動を使用して起動時にコンポーネントを自動的に初期化するには、以下を行う必要があります。 アプリが実行する必要のあるコンポーネントごとに、コンポーネントイニシャライザを定義します。 初期化します。

コンポーネントイニシャライザを実装する

各コンポーネント初期化子を定義するには、 Initializer<T> インターフェース。 このインターフェースでは、次の 2 つの重要なメソッドを定義します。

  • create() メソッド。これには、 コンポーネントを初期化し、T のインスタンスを返します。
  • dependencies() メソッド。このメソッドは、他の Pod のリストを返します。 イニシャライザが依存する 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()
    }
}

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 が含まれているため、アプリは Startup は、ExampleLogger の前に WorkManager を初期化します。

マニフェスト エントリをセットアップする

アプリの起動には、InitializationProvider という特別なコンテンツ プロバイダが含まれています。 コンポーネントイニシャライザを検出して呼び出すために使用することができます。アプリの起動 最初に <meta-data> エントリを確認することで、コンポーネント初期化子を検出します。 これは InitializationProvider マニフェスト エントリの下にあります。次に、App Startup が呼び出し すでに検出されているイニシャライザの dependencies() メソッド。

つまり、コンポーネント初期化子をアプリが検出できるようにするには、 起動するには、次のいずれかの条件を満たす必要があります。

  • コンポーネント初期化子には、対応する <meta-data> エントリが InitializationProvider マニフェスト エントリ。
  • コンポーネント初期化子は、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" 属性を使用すると、マニフェスト マージが確実に統合されます。 ツールで競合するエントリを適切に解決します。

lint チェックを実行する

App Startup ライブラリには、一連の lint ルールが含まれており、これを使用して コンポーネントイニシャライザが正しく定義されているかどうかを確認できます。次を実行します。 これらの lint チェックを行うには、コマンドラインから ./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 が初期化されるため、App Startup も WorkManager を初期化します。 ExampleLogger の依存関係。

フィードバックを送信

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

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