App Startup Android Jetpack 的一部分。

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> 介面的類別,藉此定義每個元件初始化器。這個介面定義了兩個重要方法:

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

}

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

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

設定資訊清單項目

應用程式 Startup 包含一個名為 InitializationProvider 的特殊內容供應器,用於探索及呼叫元件初始化器。應用程式 Startup 會先檢查 InitializationProvider 資訊清單項目底下的 <meta-data> 項目,藉此探索元件初始化器。接著,應用程式啟動程序會針對已找到的任何初始化器呼叫 dependencies() 方法。

也就是說,為了讓 AppStartup 偵測到元件初始化器,必須滿足下列其中一項條件:

  • 元件初始化器在 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>

您不需要為 WorkManagerInitializer 新增 <meta-data> 項目,因為 WorkManagerInitializerExampleLoggerInitializer 的依附元件。也就是說,如果可供探索,ExampleLoggerInitializer 就是 WorkManagerInitializer

tools:node="merge" 屬性可確保資訊清單合併工具正確解析任何衝突的項目。

執行 Lint 檢查

應用程式啟動程式庫包含一組 Lint 規則,可讓您檢查是否已正確定義元件初始化器。您可以透過指令列執行 ./gradlew :app:lintDebug 來執行這些 Lint 檢查。

手動初始化元件

一般而言,當您使用應用程式啟動功能時,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,因為 WorkManagerExampleLogger 的依附元件。

提供意見

歡迎透過下列資源與我們分享意見和想法:

Issue Tracker
報告問題,幫助我們修正錯誤。