App Startup   Входит в Android Jetpack.

Библиотека App Startup позволяет легко и эффективно инициализировать компоненты при запуске приложения. Разработчики библиотек и приложений могут использовать App Startup, чтобы оптимизировать последовательность запуска и явно задать порядок инициализации.

Вместо того чтобы определять отдельные поставщики контента для каждого компонента, который необходимо инициализировать, App Startup позволяет определить инициализаторы компонентов, которые используют один поставщик контента. Это может значительно сократить время запуска приложения.

Настроить

Чтобы использовать Jetpack Startup в библиотеке или приложении, добавьте в файл Gradle следующее:

Groovy

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

Kotlin

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

Инициализация компонентов при запуске приложения

Приложения и библиотеки часто полагаются на то, что компоненты инициализируются сразу после запуска приложения. Для этого можно использовать поставщиков контента, но они требуют много ресурсов и могут замедлить запуск приложения. Кроме того, Android инициализирует поставщиков контента в неопределенном порядке. App Startup позволяет более эффективно инициализировать компоненты при запуске приложения и явно определять их зависимости.

Чтобы использовать App Startup для автоматической инициализации компонентов при запуске, необходимо определить инициализатор для каждого компонента, который требуется инициализировать приложению.

Реализация инициализаторов компонентов

Вы определяете каждый инициализатор компонента, создавая класс, который реализует интерфейс Initializer<T>. Этот интерфейс определяет два важных метода:

  • Метод create(), который содержит все необходимые операции для инициализации компонента и возвращает экземпляр T.
  • Метод dependencies(), который возвращает список других объектов 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();
    }

}

Метод dependencies() возвращает пустой список, так как WorkManager не зависит от других библиотек.

Предположим, что ваше приложение также зависит от библиотеки ExampleLogger, которая, в свою очередь, зависит от WorkManager. Это означает, что вам нужно убедиться, что App Startup сначала инициализирует WorkManager. Определите класс ExampleLoggerInitializer, реализующий Initializer<ExampleLogger>:

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

Поскольку вы включили WorkManagerInitializer в метод dependencies(), App Startup инициализирует WorkManager перед ExampleLogger.

Как настроить записи манифеста

В App Startup есть специальный поставщик контента InitializationProvider, который используется для поиска и вызова инициализаторов компонентов. App Startup обнаруживает инициализаторы компонентов, сначала проверяя запись <meta-data> в записи манифеста InitializationProvider. Затем App Startup вызывает методы dependencies() для всех уже обнаруженных инициализаторов.

Это означает, что для того, чтобы инициализатор компонента был обнаружен App Startup, должно выполняться одно из следующих условий:

  • Инициализатор компонента имеет соответствующую запись <meta-data> в записи манифеста InitializationProvider.
  • Инициализатор компонента указан в методе 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>

Вам не нужно добавлять запись <meta-data> для WorkManagerInitializer, потому что WorkManagerInitializer зависит от ExampleLoggerInitializer. Это означает, что если ExampleLoggerInitializer виден, то WorkManagerInitializer тоже виден.

Атрибут tools:node="merge" позволяет инструменту объединения манифестов правильно разрешать конфликты.

Запустить проверку lint

Библиотека App Startup содержит набор правил 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);

В результате App Startup также инициализирует WorkManager, поскольку WorkManager зависит от ExampleLogger.

Отправить отзыв

Поделитесь с нами своими отзывами и идеями, используя следующие ресурсы:

Система отслеживания ошибок
Сообщайте о проблемах, чтобы мы могли их устранить.