Peluncuran Aplikasi Bagian dari Android Jetpack.

Library App Startup menyediakan cara yang mudah dan berperforma tinggi untuk menginisialisasi komponen saat memulai aplikasi. Developer library dan developer aplikasi dapat menggunakan Startup Aplikasi untuk menyederhanakan urutan pengaktifan dan menetapkan urutan secara eksplisit dari inisialisasi.

Daripada menetapkan penyedia konten terpisah untuk setiap komponen, Anda harus Anda, App Startup memungkinkan Anda menentukan penginisialisasi komponen yang berbagi penyedia konten tunggal. Hal ini dapat meningkatkan waktu startup aplikasi secara signifikan.

Penyiapan

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

Groovy

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

Kotlin

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

Melakukan inisialisasi komponen saat aplikasi dimulai

Aplikasi dan library sering kali mengandalkan komponen yang segera diinisialisasi saat aplikasi dijalankan. Anda dapat memenuhi kebutuhan ini dengan menggunakan penyedia konten untuk menginisialisasi setiap dependensi, tetapi penyedia konten mahal untuk membuat instance dan dapat memperlambat urutan pengaktifan secara 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 menginisialisasi komponen secara otomatis saat startup, Anda harus menentukan penginisialisasi komponen untuk setiap komponen yang perlu dilakukan aplikasi melakukan inisialisasi.

Mengimplementasikan penginisialisasi komponen

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

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

Misalnya, anggaplah aplikasi Anda bergantung pada WorkManager dan perlu melakukan inisialisasi pada 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 lainnya.

Misalkan aplikasi Anda juga bergantung pada library yang disebut ExampleLogger, yang di belokan bergantung pada WorkManager. Ketergantungan ini berarti Anda perlu memastikan Startup Aplikasi tersebut 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(), Aplikasi Startup melakukan inisialisasi WorkManager sebelum ExampleLogger.

Menyiapkan entri manifes

Startup Aplikasi menyertakan penyedia konten khusus yang disebut InitializationProvider yang digunakannya untuk menemukan dan memanggil penginisialisasi komponen. Peluncuran Aplikasi menemukan penginisialisasi komponen dengan memeriksa entri <meta-data> terlebih dahulu di bawah entri manifes InitializationProvider. Kemudian, App Startup memanggil Metode dependencies() untuk setiap penginisialisasi yang telah ditemukan.

Ini berarti, agar penginisialisasi komponen dapat ditemukan oleh Aplikasi Saat startup, salah satu kondisi berikut harus dipenuhi:

  • Penginisialisasi komponen memiliki entri <meta-data> yang sesuai di bagian InitializationProvider entri manifes.
  • 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, tambahkan baris 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 merupakan dependensi dari ExampleLoggerInitializer. Ini berarti jika ExampleLoggerInitializer dapat ditemukan, begitu juga WorkManagerInitializer.

Atribut tools:node="merge" memastikan bahwa penggabungan manifes secara tepat menyelesaikan setiap entri yang berkonflik.

Menjalankan pemeriksaan lint

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

Melakukan inisialisasi komponen secara manual

Biasanya, saat Anda menggunakan Startup Aplikasi, objek InitializationProvider menggunakan entitas yang disebut AppInitializer ke menemukan dan menjalankan penginisialisasi komponen secara otomatis saat memulai aplikasi. Namun, Anda juga dapat menggunakan AppInitializer secara langsung untuk menginisialisasi komponen yang tidak diperlukan aplikasi Anda saat startup. Hal ini disebut inisialisasi lambat, dan dapat membantu meminimalkan biaya startup.

Anda harus menonaktifkan inisialisasi otomatis terlebih dahulu untuk setiap komponen yang diinginkan untuk melakukan inisialisasi secara manual.

Menonaktifkan inisialisasi otomatis untuk masing-masing komponen

Untuk menonaktifkan inisialisasi otomatis untuk satu komponen, hapus metode Entri <meta-data> untuk penginisialisasi komponen dari manifes.

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

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

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 sebuah komponen, Anda dapat menggunakan AppInitializer untuk melakukan inisialisasi secara manual pada komponen tersebut dan dependensinya.

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

Kotlin

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

Java

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

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

Berikan masukan

Sampaikan masukan dan ide Anda kepada kami melalui resource berikut:

Issue tracker
Laporkan masalah agar kami dapat memperbaiki bug.