App-Start Teil von Android Jetpack

Die App-Startbibliothek bietet eine einfache, leistungsstarke Methode zur Initialisierung beim Start der Anwendung. Sowohl Bibliotheken- als auch App-Entwickler kann App-Start-ups nutzen, um Startsequenzen zu optimieren und die Reihenfolge der Initialisierung bei.

Anstatt separate Contentanbieter für jede Komponente zu definieren, müssen Sie können Sie mit App Startup Komponenteninitialisierer definieren, einzelnen Contentanbieter nutzen. Dadurch kann die App-Startzeit erheblich verkürzt werden.

Einrichten

Wenn Sie Jetpack Startup in Ihrer Bibliothek oder App verwenden möchten, fügen Sie Folgendes zu Ihrem Gradle hinzu. Datei:

Groovy

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

Kotlin

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

Komponenten beim Start der App initialisieren

Bei Anwendungen und Bibliotheken müssen Komponenten häufig sofort initialisiert werden, die App gestartet wird. Sie können diesen Bedarf erfüllen, indem Sie Contentanbieter nutzen, Initialisierung jeder Abhängigkeit, aber die Instanziierung von Contentanbietern ist teuer. und die Startreihenfolge unnötig verlangsamen. Außerdem kann Android initialisiert Contentanbieter in einer unbestimmten Reihenfolge. Das App-Start-up bietet leistungsstärkere Möglichkeit, Komponenten beim Start der App zu initialisieren, ihre Abhängigkeiten zu definieren.

Um mithilfe des App-Starts Komponenten automatisch beim Start zu initialisieren, müssen Sie Definieren Sie einen Komponenteninitialisierer für jede Komponente, die die App zum Initialisieren.

Komponenteninitialisierer implementieren

Sie definieren jeden Komponenteninitialisierer, indem Sie eine Klasse erstellen, die den Initializer<T>-Schnittstelle. Diese Schnittstelle definiert zwei wichtige Methoden:

  • Die Methode create(), die alle erforderlichen Vorgänge zum Ausführen Initialisieren der Komponente und gibt eine Instanz von T zurück.
  • Die Methode dependencies(), die eine Liste der anderen Initializer<T>-Objekte, von denen der Initialisierer abhängig ist. Sie können diese um die Reihenfolge zu steuern, in der die App die Initialisierer beim Start ausführt.

Angenommen, Ihre App ist abhängig von WorkManager und muss beim Start zu initialisieren. Definieren Sie eine WorkManagerInitializer-Klasse, die implementiert 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();
    }

}

Die Methode dependencies() gibt eine leere Liste zurück, da WorkManager dies nicht von anderen Bibliotheken abhängen.

Angenommen, Ihre App ist auch von einer Bibliothek namens ExampleLogger abhängig, die in ist von WorkManager abhängig. Diese Abhängigkeit bedeutet, dass Sie sicherstellen müssen, dass App Startup zuerst WorkManager initialisiert. Definieren Sie ein ExampleLoggerInitializer-Klasse, die Initializer<ExampleLogger> implementiert:

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

Da Sie WorkManagerInitializer in die Methode dependencies() aufnehmen, wird in der App Beim Start wird WorkManager vor dem ExampleLogger initialisiert.

Manifesteinträge einrichten

Das App-Start-up umfasst einen speziellen Contentanbieter namens InitializationProvider die zum Erkennen und Aufrufen Ihrer Komponenteninitialisierer verwendet wird. App-Start erkennt Komponenteninitialisierer, indem zuerst nach einem <meta-data>-Eintrag gesucht wird unter dem Manifesteintrag InitializationProvider. Anschließend ruft App-Start die dependencies()-Methoden für alle Initialisierer, die bereits erkannt wurden.

Damit ein Komponenteninitialisierer von einer App erkannt werden kann, Beim Start muss eine der folgenden Bedingungen erfüllt sein:

  • Der Komponenteninitialisierer hat einen entsprechenden <meta-data>-Eintrag unter der InitializationProvider-Manifesteintrag.
  • Der Komponenteninitialisierer wird in der Methode dependencies() aus einer Initialisierer, der bereits sichtbar ist.

Sehen wir uns noch einmal das Beispiel mit WorkManagerInitializer und ExampleLoggerInitializer. Damit App-Start-ups diese Apps erkennen können Initialisieren, fügen Sie der Manifestdatei Folgendes hinzu:

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

Sie müssen keinen <meta-data>-Eintrag für WorkManagerInitializer hinzufügen, da WorkManagerInitializer eine Abhängigkeit von ExampleLoggerInitializer ist. Das heißt, wenn ExampleLoggerInitializer sichtbar ist, gilt das auch für die Suche. WorkManagerInitializer.

Das Attribut tools:node="merge" sorgt dafür, dass die Manifestzusammenführung widersprüchliche Einträge ordnungsgemäß beseitigt.

Lint-Prüfungen ausführen

Die Bibliothek für App-Start-ups enthält eine Reihe von Lint-Regeln, mit denen Sie prüfen können, ob Sie Ihre Komponenteninitialisierer richtig definiert haben. Sie können führen Sie ./gradlew :app:lintDebug über die Befehlszeile aus.

Komponenten manuell initialisieren

Wenn Sie „App-Start“ verwenden, verwendet das Objekt InitializationProvider normalerweise einen Entität aufgerufen Von AppInitializer an automatisch beim Start von Anwendungen Komponenteninitialisierer erkennen und ausführen. Sie können aber auch direkt AppInitializer verwenden, um und initialisieren Sie Komponenten, die Ihre App beim Start nicht benötigt. Dies wird als verzögerte Initialisierung und kann dabei helfen, die Startkosten zu minimieren.

Deaktivieren Sie zuerst die automatische Initialisierung für alle Komponenten, manuell zu initialisieren.

Automatische Initialisierung für eine einzelne Komponente deaktivieren

Um die automatische Initialisierung für eine einzelne Komponente zu deaktivieren, entfernen Sie den <meta-data>-Eintrag für den Initialisierer dieser Komponente aus dem Manifest.

Wenn Sie beispielsweise Folgendes zur Manifestdatei hinzufügen, wird die automatische Initialisierung für 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>

Sie verwenden tools:node="remove" im Eintrag, anstatt den Eintrag einfach zu entfernen um sicherzustellen, dass das Zusammenführungstool den Eintrag auch aus allen anderen Manifestdateien zusammengeführt.

Automatische Initialisierung für alle Komponenten deaktivieren

Entfernen Sie den gesamten Eintrag für, um die gesamte automatische Initialisierung zu deaktivieren. InitializationProvider aus dem Manifest:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    tools:node="remove" />

Komponenteninitialisierer manuell aufrufen

Ist die automatische Initialisierung für eine Komponente deaktiviert, können Sie AppInitializer, um diese Komponente und ihre Abhängigkeiten manuell zu initialisieren.

Mit dem folgenden Code wird beispielsweise AppInitializer aufgerufen und manuell initialisiert. ExampleLogger:

Kotlin

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer::class.java)

Java

AppInitializer.getInstance(context)
    .initializeComponent(ExampleLoggerInitializer.class);

Dadurch wird WorkManager auch von App Startup initialisiert, da WorkManager eine Abhängigkeit von ExampleLogger.

Feedback geben

Wir freuen uns über dein Feedback und deine Ideen:

Problemverfolgung
Melde Probleme, damit wir sie beheben können.