Startup Aplikasi Bagian dari Android Jetpack.

Library App Startup menyediakan cara yang sederhana dan berperforma tinggi untuk menginisialisasi komponen saat aplikasi dimulai. Developer library dan developer aplikasi dapat menggunakan App Startup untuk menyederhanakan urutan startup dan secara eksplisit menetapkan urutan inisialisasi.

Daripada menentukan penyedia konten terpisah untuk setiap komponen yang perlu diinisialisasi, App Startup memungkinkan Anda menentukan penginisialisasi komponen yang menggunakan satu penyedia konten yang sama. Hal ini dapat meningkatkan waktu startup aplikasi secara signifikan.

Penyiapan

Untuk menggunakan Jetpack Startup di library atau aplikasi Anda, tambahkan kode berikut ke file Gradle Anda:

Groovy

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

Kotlin

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

Menginisialisasi komponen saat aplikasi dimulai

Aplikasi dan library sering kali mengandalkan komponen yang segera diinisialisasi saat aplikasi dimulai. Anda dapat memenuhi kebutuhan ini dengan menggunakan penyedia konten untuk menginisialisasi setiap dependensi, tetapi penyedia konten membutuhkan biaya yang mahal untuk dibuat instance-nya dan dapat memperlambat urutan startup jika tidak perlu. Selain itu, Android menginisialisasi penyedia konten dalam urutan yang tidak ditentukan. Startup Aplikasi menyediakan cara yang lebih berperforma tinggi untuk menginisialisasi komponen saat aplikasi dimulai dan secara eksplisit menentukan dependensinya.

Agar dapat menggunakan Startup Aplikasi untuk melakukan inisialisasi komponen secara otomatis saat startup, Anda harus menentukan penginisialisasi komponen untuk setiap komponen yang perlu diinisialisasi oleh aplikasi.

Mengimplementasikan penginisialisasi komponen

Anda menentukan setiap penginisialisasi komponen dengan membuat class yang mengimplementasikan antarmuka Initializer<T>. Antarmuka ini menetapkan dua metode penting:

  • Metode create(), yang berisi semua operasi yang diperlukan untuk menginisialisasi komponen dan menampilkan instance T.
  • Metode dependencies(), yang menampilkan daftar objek Initializer<T> lain yang menjadi dependensi penginisialisasi. Anda dapat menggunakan metode ini untuk mengontrol urutan aplikasi menjalankan penginisialisasi saat startup.

Misalnya, aplikasi Anda bergantung pada WorkManager dan perlu menginisialisasinya saat startup. Tentukan class WorkManagerInitializer yang mengimplementasikan 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();
    }

}

Metode dependencies() menampilkan daftar kosong karena WorkManager tidak bergantung pada library lain.

Misalkan aplikasi Anda juga bergantung pada library bernama ExampleLogger, yang selanjutnya bergantung pada WorkManager. Dependensi ini berarti Anda perlu memastikan bahwa Startup Aplikasi melakukan inisialisasi WorkManager terlebih dahulu. Tentukan class ExampleLoggerInitializer yang mengimplementasikan 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);
    }
}

Karena Anda menyertakan WorkManagerInitializer dalam metode dependencies(), App Startup akan melakukan inisialisasi WorkManager sebelum ExampleLogger.

Menyiapkan entri manifes

Startup Aplikasi menyertakan penyedia konten khusus bernama InitializationProvider yang digunakan untuk menemukan dan memanggil penginisialisasi komponen Anda. Startup Aplikasi menemukan penginisialisasi komponen dengan memeriksa entri <meta-data> terlebih dahulu pada entri manifes InitializationProvider. Kemudian, App Startup akan memanggil metode dependencies() untuk setiap penginisialisasi yang telah ditemukannya.

Ini berarti bahwa agar penginisialisasi komponen dapat ditemukan oleh App Startup, salah satu kondisi berikut harus dipenuhi:

  • Penginisialisasi komponen memiliki entri <meta-data> yang sesuai pada entri manifes InitializationProvider.
  • Penginisialisasi komponen tercantum dalam metode dependencies() dari penginisialisasi yang sudah dapat ditemukan.

Pertimbangkan lagi contoh dengan WorkManagerInitializer dan ExampleLoggerInitializer. Untuk memastikan Startup Aplikasi dapat menemukan penginisialisasi ini, tambahkan kode berikut ke file manifes:

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

Anda tidak perlu menambahkan entri <meta-data> untuk WorkManagerInitializer, karena WorkManagerInitializer adalah dependensi dari ExampleLoggerInitializer. Ini berarti bahwa jika ExampleLoggerInitializer dapat ditemukan, maka WorkManagerInitializer juga dapat ditemukan.

Atribut tools:node="merge" memastikan bahwa alat penggabung manifes menyelesaikan setiap entri yang berkonflik dengan benar.

Menjalankan pemeriksaan lint

Library App Startup menyertakan sekumpulan aturan lint yang dapat digunakan untuk memeriksa apakah Anda telah menentukan penginisialisasi komponen dengan benar. Anda dapat menjalankan pemeriksaan lint ini dengan menjalankan ./gradlew :app:lintDebug dari command line.

Melakukan inisialisasi komponen secara manual

Biasanya, saat Anda menggunakan Startup Aplikasi, objek InitializationProvider akan menggunakan entity yang disebut AppInitializer untuk menemukan dan menjalankan penginisialisasi komponen secara otomatis saat aplikasi dimulai. Namun, Anda juga dapat menggunakan AppInitializer secara langsung untuk menginisialisasi komponen yang tidak diperlukan aplikasi saat startup secara manual. Ini disebut inisialisasi lambat, dan dapat membantu meminimalkan biaya startup.

Anda harus menonaktifkan inisialisasi otomatis terlebih dahulu untuk setiap komponen yang ingin diinisialisasi secara manual.

Menonaktifkan inisialisasi otomatis untuk setiap komponen

Guna menonaktifkan inisialisasi otomatis untuk satu komponen, hapus entri <meta-data> untuk penginisialisasi komponen tersebut dari manifes.

Misalnya, menambahkan kode berikut ke file manifes akan menonaktifkan inisialisasi otomatis untuk 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>

Gunakan tools:node="remove" dalam entri, bukan hanya menghapus entri tersebut untuk memastikan bahwa alat penggabung juga menghapus entri dari semua file manifes gabungan lainnya.

Menonaktifkan inisialisasi otomatis untuk semua komponen

Untuk menonaktifkan semua inisialisasi otomatis, hapus seluruh entri untuk InitializationProvider dari manifes:

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

Memanggil penginisialisasi komponen secara manual

Jika inisialisasi otomatis dinonaktifkan untuk suatu komponen, Anda dapat menggunakan AppInitializer untuk melakukan inisialisasi komponen tersebut dan dependensinya secara manual.

Misalnya, kode berikut memanggil AppInitializer dan melakukan inisialisasi ExampleLogger secara manual:

Kotlin

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

Java

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

Akibatnya, Startup Aplikasi juga melakukan inisialisasi WorkManager karena WorkManager adalah dependensi dari ExampleLogger.

Berikan masukan

Sampaikan masukan dan ide Anda kepada kami melalui resource berikut:

Issue tracker
Laporkan masalah agar kami dapat memperbaiki bug.