Android Academy · Pelajaran

Profil Permulaan dan Asas

Permulaan sejuk yang lebih pantas.

Pelajaran 4 daripada 413 langkah

Profil Permulaan dan Asas ialah pelajaran Android Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Android Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Android Academy merangkumi sejumlah 4 pelajaran.

Tanggapan Pertama: Permulaan Aplikasi

Masa permulaan ialah perkara pertama yang dialami oleh setiap pengguna. Google Play malah memaparkan permulaan yang perlahan sebagai isu kualiti. Permulaan sejuk yang pantas menjadikan aplikasi terasa berkualiti tinggi; permulaan yang perlahan menyebabkan pengguna meninggalkannya.

Dalam pelajaran ini, anda akan mempelajari tiga jenis permulaan, perkara yang menyebabkan permulaan menjadi perlahan, serta alat moden — App Startup dan Baseline Profiles — yang menjadikan permulaan sejuk jauh lebih pantas.

Permulaan Sejuk, Suam dan Panas

Android mentakrifkan tiga senario permulaan, daripada paling perlahan hingga paling pantas:

  • Permulaan sejuk: proses belum wujud. Android menciptanya, menjalankan Application, kemudian memaparkan skrin pertama anda. Ini yang paling perlahan dan paling penting untuk dioptimumkan.
  • Permulaan suam: proses masih hidup tetapi Activity perlu dicipta semula.
  • Permulaan panas: Activity masih dalam memori; bawa sahaja ke hadapan. Hampir serta-merta.

Usaha pengoptimuman tertumpu pada permulaan sejuk kerana itulah yang paling kerap dialami oleh pengguna baharu dan pengguna yang kembali.

Mengukur Masa Permulaan

Anda tidak boleh menambah baik perkara yang tidak diukur. Dua cara mudah:

  • Logcat: sistem mencatat baris Displayed dengan masa sehingga bingkai pertama.
  • Macrobenchmark: StartupTimingMetric memberikan nombor permulaan sejuk yang stabil dan boleh diulang.

Jalankan perintah adb di bawah dan perhatikan baris Displayed.

# Cold-start the app and log time to first frame
adb shell am start -W -S com.example.app/.MainActivity

# Output includes:
#   TotalTime: 412   <- ms to first frame
# Or filter logcat:
adb logcat | grep "Displayed com.example.app"

Pastikan Application.onCreate Ringan

Segala-galanya dalam Application.onCreate() berjalan pada utas utama sebelum bingkai pertama anda. Pemulaan berat di sini melambatkan permulaan secara langsung.

Versi yang tidak baik di bawah memulakan beberapa pustaka secara segera. Tangguhkan atau jalankan di latar belakang apa-apa yang tidak diperlukan untuk skrin pertama.

// SLOW: blocks the first frame with eager init
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        Analytics.init(this)        // network, disk
        ImageLoader.preload(this)   // heavy
        Database.warmUp(this)       // disk I/O
    }
}
// Each of these adds milliseconds before the user sees anything.

Pustaka Jetpack App Startup

Pustaka App Startup menggantikan berbilang pembekal kandungan pustaka (setiap satunya mengambil masa) dengan satu pembekal dikongsi, serta membolehkan anda menyatakan susunan pemulaan dan kebergantungan dengan kemas.

Anda melaksanakan satu Initializer bagi setiap komponen; App Startup menjalankannya sekali mengikut susunan kebergantungan.

class AnalyticsInitializer : Initializer<Analytics> {
    override fun create(context: Context): Analytics {
        return Analytics.init(context.applicationContext)
    }
    // Runs after Logger is ready
    override fun dependencies() = listOf(LoggerInitializer::class.java)
}
// Registered via a single merged provider in the manifest,
// avoiding one ContentProvider per library.

Pemulaan Malas dan Latar Belakang

Lebih baik daripada menyusun kerja segera ialah melakukan kurang kerja semasa permulaan. Dua taktik:

  • Malas: bina objek berat apabila digunakan buat kali pertama dengan by lazy Kotlin.
  • Latar belakang: pindahkan pemulaan bukan UI keluar daripada utas utama.

Dengan itu, bingkai pertama tidak disekat oleh kerja yang belum diperlukan oleh pengguna.

class MyApp : Application() {
    // Built only when first accessed, not during onCreate
    val imageLoader by lazy { ImageLoader.build(this) }

    override fun onCreate() {
        super.onCreate()
        // Push non-critical setup off the main thread
        CoroutineScope(Dispatchers.Default).launch {
            Analytics.init(applicationContext)
        }
    }
}

AOT berbanding JIT: Mengapa Jalankan Kali Pertama Perlahan

Secara lalai, Android menjalankan bytekod aplikasi anda dengan gabungan tafsiran dan kompilasi Just-In-Time (JIT). Apabila kod panas dijalankan buat kali pertama, kod itu ditafsirkan (perlahan); hanya kemudian masa jalan menyusunnya kepada kod asli.

Inilah sebabnya permulaan sejuk dan tatalan pertama terasa lebih perlahan. Baseline Profiles menyelesaikan masalah ini dengan memberitahu peranti supaya menyusun kod penting secara Ahead-Of-Time (AOT) semasa pemasangan.

Maksud Baseline Profile

Baseline Profile ialah senarai kelas dan kaedah yang digunakan sepanjang perjalanan kritikal anda (permulaan, tatalan pertama). Anda menghantarnya bersama aplikasi; semasa pemasangan, peranti menyusun kaedah tersebut secara AOT supaya kaedah itu berjalan pada kelajuan asli sejak pelancaran pertama.

Google melaporkan peningkatan permulaan yang lazimnya sekitar 20–40%, tanpa perubahan kod pada ciri anda — hanya profil tersebut.

// build.gradle.kts
plugins { id("androidx.baselineprofile") }

dependencies {
    baselineProfile(project(":baselineprofile"))
}
// The generated profile ships as
//   assets/dexopt/baseline.prof
// and is applied automatically at install.

Menjana Baseline Profile

Anda menjana profil dengan menulis satu ujian kecil yang menggerakkan laluan kritikal anda pada peranti; alat tersebut merekod kaedah yang dijalankan dan menulis fail profil. Kemudian anda memasukkannya ke dalam repositori dan membina semula aplikasi.

Berikut ialah penjana lazim yang merakam permulaan dan satu tatalan.

@RunWith(AndroidJUnit4::class)
class BaselineProfileGenerator {
    @get:Rule val rule = BaselineProfileRule()

    @Test
    fun generate() = rule.collect(packageName = "com.example.app") {
        pressHome()
        startActivityAndWait()
        // exercise the critical journey
        device.findObject(By.res("feed")).fling(Direction.DOWN)
    }
}
// Run the generateBaselineProfile Gradle task to produce the file.

Mengesahkan Kejayaan

Sentiasa sahkan peningkatan dengan penanda aras, dengan membandingkan permulaan menggunakan dan tanpa profil yang digunakan (CompilationMode.None berbanding Partial dengan profil tersebut).

Jika anda tidak mengukur, anda tidak dapat membuktikan bahawa profil itu membantu — malah profil yang lapuk boleh menjejaskan prestasi. Jana semula profil itu apabila laluan panas anda berubah dengan ketara.

@Test
fun startupWithProfile() = rule.measureRepeated(
    packageName = "com.example.app",
    metrics = listOf(StartupTimingMetric()),
    iterations = 10,
    startupMode = StartupMode.COLD,
    compilationMode = CompilationMode.Partial() // uses the baseline profile
) {
    pressHome()
    startActivityAndWait()
}

Pelan Pengoptimuman Permulaan

Gabungkan semuanya menjadi pelan yang boleh diulang:

  • Ukur permulaan sejuk dengan Macrobenchmark dan adb am start -W.
  • Kurangkan Application.onCreate: tangguhkan dengan by lazy, dan pindahkan kerja keluar daripada utas utama.
  • Gunakan App Startup untuk menggabungkan pembekal kandungan dan menyusun pemulaan.
  • Hantar Baseline Profile untuk penyusunan AOT bagi laluan kritikal.
  • Sahkan dengan penanda aras dan pastikan profil sentiasa terkini.

Hasilnya: bingkai pertama yang pantas dan lancar, yang akan disedari oleh pengguna.

Semakan Pantas

Anda menghantar Baseline Profile bersama aplikasi anda. Apakah fungsi utamanya untuk menambah baik permulaan?

Imbas Kembali: Pantas Sejak Bingkai Pertama

Anda telah mempelajari cara mengoptimumkan permulaan, iaitu metrik prestasi yang paling ketara:

  • Optimumkan permulaan sejuk; ukur dengan Macrobenchmark dan adb am start -W.
  • Pastikan Application.onCreate ringan: pemulaan malas dan kerja bukan UI di latar belakang.
  • Gunakan pustaka App Startup untuk menggabungkan pembekal dan menyusun pemula.
  • Hantar Baseline Profile supaya kod panas disusun secara AOT semasa pemasangan untuk kelajuan asli pada larian pertama.
  • Sentiasa sahkan kejayaan dengan penanda aras dan pastikan profil sentiasa terkini.

Itu melengkapkan Pengoptimuman & Pemprofilan Prestasi: kini anda boleh mengukur, mengawal penggubahan semula, membaiki kebocoran dan memulakan aplikasi dengan pantas.

Percuma untuk bermula

Pelajari Kotlin dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
36
Pelajaran
152

Soalan Lazim

Adakah pelajaran “Profil Permulaan dan Asas” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Android Academy, termasuk “Profil Permulaan dan Asas”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Android Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Profil Permulaan dan Asas”?

Permulaan sejuk yang lebih pantas. Anda berlatih Android Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Android Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Android Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Profil Permulaan dan Asas” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Android Academy ini?

Ya. Setiap pelajaran Android Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengukur Prestasi
  2. Menjinakkan Gubahan Semula
  3. Kebocoran Memori dan Pembetulan
  4. Profil Permulaan dan Asas
← Kembali ke Android Academy