สร้างโปรไฟล์พื้นฐาน

โปรไฟล์ Baseline มีความสําคัญต่อการเพิ่มประสิทธิภาพของ Jetpack Compose ให้ได้สูงสุด การคอมไพล์เส้นทางของผู้ใช้ที่สำคัญล่วงหน้าจะช่วยให้มั่นใจได้ว่า UI ของ Compose จะแสดงผลได้อย่างราบรื่น

สร้างโปรไฟล์สำหรับการเปิดตัวแอปทุกครั้งโดยอัตโนมัติโดยใช้ไลบรารี Jetpack Macrobenchmark และ BaselineProfileRule เราขอแนะนำให้คุณ ใช้ com.android.tools.build:gradle:8.0.0 ขึ้นไปเพื่อใช้ประโยชน์จากการปรับปรุงบิลด์ เมื่อใช้ Baseline Profiles

ขั้นตอนทั่วไปในการสร้างโปรไฟล์พื้นฐานใหม่มีดังนี้

  1. ตั้งค่าโมดูลโปรไฟล์พื้นฐาน
  2. กำหนดการทดสอบ JUnit ที่ช่วยสร้างโปรไฟล์พื้นฐาน
  3. เพิ่มเส้นทางของผู้ใช้ที่สำคัญ (CUJ) ที่ต้องการเพิ่มประสิทธิภาพ
  4. สร้างโปรไฟล์พื้นฐาน

หลังจากสร้างโปรไฟล์พื้นฐานแล้ว ให้เปรียบเทียบโดยใช้อุปกรณ์จริงเพื่อวัดการปรับปรุงความเร็ว

สร้างโปรไฟล์พื้นฐานใหม่ด้วย AGP 8.2 ขึ้นไป

วิธีที่ง่ายที่สุดในการสร้างโปรไฟล์พื้นฐานใหม่คือการใช้เทมเพลตโมดูลโปรไฟล์พื้นฐาน ซึ่งพร้อมใช้งานตั้งแต่ Android Studio Iguana และปลั๊กอิน Android Gradle (AGP) 8.2 เป็นต้นไป

เทมเพลตโมดูลเครื่องมือสร้าง Baseline Profile ของ Android Studio จะช่วยสร้างโมดูลใหม่โดยอัตโนมัติเพื่อสร้างและเปรียบเทียบ Baseline Profile การเรียกใช้เทมเพลตจะสร้างการกำหนดค่าการบิลด์ทั่วไปส่วนใหญ่ การสร้างโปรไฟล์พื้นฐาน และรหัสยืนยัน เทมเพลต สร้างโค้ดเพื่อสร้างและเปรียบเทียบโปรไฟล์ Baseline เพื่อวัดการเริ่มต้นแอป

ตั้งค่าโมดูลโปรไฟล์พื้นฐาน

หากต้องการเรียกใช้เทมเพลตโมดูลโปรไฟล์พื้นฐาน ให้ทำตามขั้นตอนต่อไปนี้

  1. เลือก File > New > New Module
  2. เลือกเทมเพลตเครื่องมือสร้างโปรไฟล์พื้นฐานในแผงเทมเพลต แล้วกำหนดค่าดังนี้
    รูปที่ 1 เทมเพลตโมดูลเครื่องมือสร้างโปรไฟล์พื้นฐาน
    ฟิลด์ในเทมเพลตมีดังนี้
    • แอปพลิเคชันเป้าหมาย: แอปที่สร้างโปรไฟล์พื้นฐาน เมื่อมีโมดูลแอปเพียงโมดูลเดียวในโปรเจ็กต์ จะมีรายการเดียวในรายการนี้
    • ชื่อโมดูล: ชื่อที่คุณต้องการใช้สำหรับโมดูลโปรไฟล์พื้นฐานที่กำลังสร้าง
    • ชื่อแพ็กเกจ: ชื่อแพ็กเกจที่คุณต้องการสำหรับโมดูลโปรไฟล์พื้นฐาน
    • ภาษา: คุณต้องการให้โค้ดที่สร้างเป็น Kotlin หรือ Java
    • ภาษาการกำหนดค่าบิลด์: เลือกว่าต้องการใช้ Kotlin Script (KTS) หรือ Groovy สำหรับสคริปต์การกำหนดค่าบิลด์
    • ใช้อุปกรณ์ที่มีการจัดการจาก Gradle: ไม่ว่าคุณจะใช้อุปกรณ์ที่มีการจัดการจาก Gradle เพื่อทดสอบแอปหรือไม่
  3. คลิกเสร็จสิ้น ระบบจะสร้างโมดูลใหม่ หากคุณใช้การควบคุมแหล่งที่มา คุณอาจได้รับแจ้งให้เพิ่มไฟล์โมดูลที่สร้างขึ้นใหม่ลงในการควบคุมแหล่งที่มา

กำหนดเครื่องมือสร้างโปรไฟล์พื้นฐาน

โมดูลที่สร้างขึ้นใหม่มีการทดสอบทั้งเพื่อสร้างและเปรียบเทียบ โปรไฟล์พื้นฐาน และทดสอบเฉพาะการเริ่มต้นแอปขั้นพื้นฐาน เราขอแนะนำให้คุณเพิ่ม สิ่งเหล่านี้เพื่อรวม CUJ และเวิร์กโฟลว์การเริ่มต้นขั้นสูง ตรวจสอบว่าการทดสอบใดๆ ที่เกี่ยวข้องกับการเริ่มต้นแอปอยู่ในบล็อก rule ที่ตั้งค่า includeInStartupProfile เป็น true ในทางกลับกัน เพื่อประสิทธิภาพสูงสุด ตรวจสอบว่าการทดสอบใดๆ ที่ไม่ เกี่ยวข้องกับการเริ่มต้นแอปไม่ได้รวมอยู่ในโปรไฟล์การเริ่มต้น การเพิ่มประสิทธิภาพการเริ่มต้นแอป ใช้เพื่อกำหนดส่วนพิเศษของโปรไฟล์พื้นฐานที่เรียกว่าStartup Profile

ซึ่งจะช่วยให้ดูแลรักษาได้ง่ายขึ้นหากคุณแยก CUJ เหล่านี้ออกจากโปรไฟล์พื้นฐาน และโค้ดการเปรียบเทียบที่สร้างขึ้น เพื่อให้ใช้ได้ทั้ง 2 อย่าง ซึ่งหมายความว่าการเปลี่ยนแปลง CUJ จะได้รับการใช้อย่างสม่ำเสมอ

สร้างและติดตั้งโปรไฟล์พื้นฐาน

เทมเพลตโมดูลโปรไฟล์พื้นฐานจะเพิ่มการกำหนดค่าการเรียกใช้ใหม่เพื่อสร้าง โปรไฟล์พื้นฐาน หากคุณใช้ Product Flavor Android Studio จะสร้างการกำหนดค่าการเรียกใช้หลายรายการเพื่อให้คุณสร้าง Baseline Profile แยกต่างหากสำหรับแต่ละ Flavor ได้

การกำหนดค่าการเรียกใช้ Generate Baseline Profile
รูปที่ 2 การเรียกใช้การกำหนดค่านี้จะสร้าง Baseline Profile

เมื่อการกำหนดค่าการเรียกใช้ Generate Baseline Profile เสร็จสมบูรณ์ ระบบจะคัดลอก โปรไฟล์พื้นฐาน ที่สร้างขึ้นไปยัง src/variant/generated/baselineProfiles/baseline-prof.txt ในโมดูลที่กำลังสร้างโปรไฟล์ ตัวเลือกตัวแปรคือประเภทบิลด์ที่เผยแพร่หรือตัวแปรบิลด์ที่เกี่ยวข้องกับประเภทบิลด์ที่เผยแพร่

โปรไฟล์พื้นฐานที่สร้างขึ้นมีต้นกำเนิดใน build/outputs เส้นทางแบบเต็มจะกำหนดโดยตัวแปรหรือรสชาติของแอปที่กำลังสร้างโปรไฟล์ และ ไม่ว่าคุณจะใช้อุปกรณ์ที่จัดการโดย Gradle หรืออุปกรณ์ที่เชื่อมต่อเพื่อสร้างโปรไฟล์ หาก คุณใช้ชื่อที่โค้ดใช้และกำหนดค่าบิลด์ที่สร้างโดย เทมเพลต ระบบจะสร้างโปรไฟล์พื้นฐานใน build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt ไฟล์ คุณอาจไม่จำเป็นต้องโต้ตอบกับโปรไฟล์พื้นฐานเวอร์ชันที่สร้างขึ้นนี้โดยตรง เว้นแต่คุณจะคัดลอกไปยังโมดูลเป้าหมายด้วยตนเอง (ไม่แนะนำ)

สร้างโปรไฟล์พื้นฐานใหม่ด้วย AGP 8.1

หากใช้เทมเพลตโมดูลโปรไฟล์พื้นฐาน ไม่ได้ ให้ใช้ เทมเพลตโมดูล Macrobenchmark และปลั๊กอิน Gradle โปรไฟล์พื้นฐาน เพื่อสร้าง โปรไฟล์พื้นฐาน ใหม่ เราขอแนะนำให้คุณใช้เครื่องมือเหล่านี้โดยเริ่มจาก Android Studio Giraffe และ AGP 8.1

ขั้นตอนในการสร้างโปรไฟล์พื้นฐานใหม่โดยใช้เทมเพลตโมดูล Macrobenchmark และปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานมีดังนี้

  1. ตั้งค่าโมดูล Macrobenchmark ในโปรเจ็กต์ Gradle
  2. กำหนดคลาสใหม่ชื่อ BaselineProfileGenerator ดังนี้

    class BaselineProfileGenerator {
        @get:Rule
        val baselineProfileRule = BaselineProfileRule()
    
        @Test
        fun startup() = baselineProfileRule.collect(
            packageName = "com.example.app",
            profileBlock = {
                startActivityAndWait()
            }
        )
    }
    

    เครื่องมือสร้างอาจมีการโต้ตอบกับแอปของคุณนอกเหนือจากการเริ่มต้นแอป ซึ่งจะช่วยให้คุณเพิ่มประสิทธิภาพรันไทม์ของแอปได้ เช่น การเลื่อนรายการ การเรียกใช้ภาพเคลื่อนไหว และการไปยังส่วนต่างๆ ภายใน Activity ดูตัวอย่างอื่นๆ ของการทดสอบที่ใช้ @BaselineProfileRule เพื่อปรับปรุง เส้นทางของผู้ใช้ที่สําคัญ

  3. เพิ่มปลั๊กอิน Gradle ของโปรไฟล์พื้นฐาน (libs.plugins.androidx.baselineprofile) ปลั๊กอินนี้จะช่วยให้สร้างโปรไฟล์พื้นฐานและดูแลรักษาได้ง่ายขึ้นในอนาคต

  4. หากต้องการสร้างโปรไฟล์พื้นฐาน ให้เรียกใช้งานงาน :app:generateBaselineProfile หรือ :app:generateVariantBaselineProfile Gradle ใน เทอร์มินัล

    เรียกใช้เครื่องมือสร้างเป็นการทดสอบที่มีการตรวจสอบในอุปกรณ์จริงที่รูทแล้ว โปรแกรมจำลอง หรืออุปกรณ์ที่มีการจัดการจาก Gradle หากใช้อุปกรณ์ที่มีการจัดการ Gradle ให้ตั้งค่า aosp เป็น systemImageSource เนื่องจากคุณต้องมีสิทธิ์เข้าถึงระดับรูทสำหรับ เครื่องมือสร้าง Baseline Profile

    เมื่อสิ้นสุดงานการสร้าง ระบบจะคัดลอกโปรไฟล์พื้นฐานไปยัง app/src//generated/baselineProfiles

สร้างโปรไฟล์พื้นฐานใหม่โดยไม่มีเทมเพลต

เราขอแนะนำให้สร้างโปรไฟล์พื้นฐานโดยใช้เทมเพลตโมดูลโปรไฟล์พื้นฐาน (แนะนำ) หรือเทมเพลต Macrobenchmark ใน Android Studio แต่คุณจะใช้ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานเพียงอย่างเดียวก็ได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับ ปลั๊กอิน Gradle ของ Baseline Profile ได้ที่กำหนดค่าการสร้าง Baseline Profile

วิธีสร้างโปรไฟล์พื้นฐานโดยใช้ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐาน โดยตรงมีดังนี้

  1. สร้างcom.android.testโมดูลใหม่ เช่น :baseline-profile
  2. กำหนดค่าไฟล์ build.gradle.kts สำหรับ :baseline-profile ดังนี้

    1. ใช้ปลั๊กอิน androidx.baselineprofile
    2. ตรวจสอบว่า targetProjectPath ชี้ไปยังโมดูล :app
    3. เพิ่มอุปกรณ์ที่มีการจัดการจาก Gradle (GMD) หากต้องการ ในตัวอย่างต่อไปนี้คือ pixel6Api31 หากไม่ได้ระบุ ปลั๊กอินจะใช้อุปกรณ์ที่เชื่อมต่อ ไม่ว่าจะเป็นอุปกรณ์จำลองหรืออุปกรณ์จริง
    4. ใช้การกำหนดค่าที่ต้องการตามที่แสดงในตัวอย่างต่อไปนี้

    Kotlin

    plugins {
        id("com.android.test")
        id("androidx.baselineprofile")
    }
    
    android {
        defaultConfig {
            ...
        }
    
        // Point to the app module, the module that you're generating the Baseline Profile for.
        targetProjectPath = ":app"
        // Configure a GMD (optional).
        testOptions.managedDevices.devices {
            pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) {
                device = "Pixel 6"
                apiLevel = 31
                systemImageSource = "aosp"
            }
        }
    }
    
    dependencies { ... }
    
    // Baseline Profile Gradle plugin configuration. Everything is optional. This
    // example uses the GMD added earlier and disables connected devices.
    baselineProfile {
        // Specifies the GMDs to run the tests on. The default is none.
        managedDevices += "pixel6Api31"
        // Enables using connected devices to generate profiles. The default is
        // `true`. When using connected devices, they must be rooted or API 33 and
        // higher.
        useConnectedDevices = false
    }

    ดึงดูด

    plugins {
        id 'com.android.test'
        id 'androidx.baselineprofile'
    }
    
    android {
        defaultConfig {
            ...
        }
    
        // Point to the app module, the module that you're generating the Baseline Profile for.
        targetProjectPath ':app'
        // Configure a GMD (optional).
        testOptions.managedDevices.devices {
            pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) {
                device 'Pixel 6'
                apiLevel 31
                systemImageSource 'aosp'
            }
        }
    }
    
    dependencies { ... }
    
    // Baseline Profile Gradle plugin configuration. Everything is optional. This
    // example uses the GMD added earlier and disables connected devices.
    baselineProfile {
        // Specifies the GMDs to run the tests on. The default is none.
        managedDevices ['pixel6Api31']
        // Enables using connected devices to generate profiles. The default is
        // `true`. When using connected devices, they must be rooted or API 33 and
        // higher.
        useConnectedDevices false
    }
  3. สร้างการทดสอบโปรไฟล์พื้นฐานใน:baseline-profileโมดูลการทดสอบ ตัวอย่างต่อไปนี้เป็นการทดสอบที่สร้างโปรไฟล์พื้นฐานสำหรับการเริ่มต้นแอป

        class BaselineProfileGenerator {
        @get:Rule
        val baselineProfileRule = BaselineProfileRule()
    
        @Test
        fun startup() = baselineProfileRule.collect(
            packageName = "com.example.app",
            profileBlock = {
                uiAutomator { startApp(PACKAGE_NAME) }
            }
        )
    }
    
  4. อัปเดตไฟล์ build.gradle.kts ในโมดูลแอป เช่น :app

    1. ใช้ปลั๊กอิน androidx.baselineprofile
    2. เพิ่มทรัพยากร Dependency baselineProfile ลงในโมดูล :baseline-profile

    Kotlin

    plugins {
        id("com.android.application")
        id("androidx.baselineprofile")
    }
    
    android {
        // There are no changes to the `android` block.
        ...
    }
    
    dependencies {
        ...
        // Add a `baselineProfile` dependency on the `:baseline-profile` module.
        baselineProfile(project(":baseline-profile"))
    }

    ดึงดูด

    plugins {
        id 'com.android.application'
        id 'androidx.baselineprofile'
    }
    
    android {
        // No changes to the `android` block.
        ...
    }
    
    dependencies {
        ...
        // Add a `baselineProfile` dependency on the `:baseline-profile` module.
        baselineProfile ':baseline-profile'
    }
  5. สร้างโปรไฟล์โดยเรียกใช้ทาสก์ :app:generateBaselineProfile หรือ :app:generateVariantBaselineProfile Gradle

  6. เมื่อสิ้นสุดงานการสร้าง ระบบจะคัดลอกโปรไฟล์พื้นฐานไปยัง app/src/variant/generated/baselineProfiles

เปรียบเทียบโปรไฟล์พื้นฐาน

หากต้องการเปรียบเทียบโปรไฟล์พื้นฐาน ให้สร้างการกำหนดค่าการเรียกใช้การทดสอบที่มีการวัดประสิทธิภาพของ Android ใหม่จากแถบด้านข้าง ซึ่งจะเรียกใช้การเปรียบเทียบที่กำหนดไว้ในไฟล์ StartupBenchmarks.kt ดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบเปรียบเทียบได้ที่ สร้างคลาส Macrobenchmark และ เปรียบเทียบโปรไฟล์พื้นฐานด้วยไลบรารี Macrobenchmark

รูปที่ 3 เรียกใช้การทดสอบ Android จากการดำเนินการ ที่ขอบ

เมื่อเรียกใช้คำสั่งนี้ภายใน Android Studio เอาต์พุตของบิลด์จะมีรายละเอียดเกี่ยวกับการปรับปรุงความเร็วที่โปรไฟล์พื้นฐานมอบให้ ดังนี้

StartupBenchmarks_startupCompilationBaselineProfiles
timeToInitialDisplayMs   min 161.8,   median 178.9,   max 194.6
StartupBenchmarks_startupCompilationNone
timeToInitialDisplayMs   min 184.7,   median 196.9,   max 202.9

บันทึกเส้นทางโค้ดที่จำเป็นทั้งหมด

เมตริกสำคัญ 2 รายการสำหรับการวัดเวลาเริ่มต้นของแอปมีดังนี้

ระบบจะรายงาน TTFD เมื่อมีการเรียกใช้เมธอด reportFullyDrawn ของ ComponentActivity หากไม่มีการเรียกใช้ reportFullyDrawn ระบบจะรายงาน TTID แทน คุณอาจต้องเลื่อนเวลาเมื่อมีการเรียกใช้ reportFullyDrawn จนกว่าการโหลดแบบไม่พร้อมกันจะเสร็จสมบูรณ์ เช่น หาก UI มีรายการแบบเลซีแบบไดนามิก งานในเบื้องหลังอาจป้อนข้อมูลในรายการหลังจากที่วาดรายการเป็นครั้งแรก และหลังจากที่ทำเครื่องหมาย UI ว่าวาดเสร็จสมบูรณ์แล้ว ในกรณีดังกล่าว โค้ดที่ทำงานหลังจากที่ UI ไปถึงสถานะที่วาดเสร็จสมบูรณ์จะไม่รวมอยู่ในโปรไฟล์พื้นฐาน

หากต้องการรวมการสร้างรายการเป็นส่วนหนึ่งของโปรไฟล์พื้นฐาน ให้รับ FullyDrawnReporter โดยใช้ getFullyDrawnReporter และเพิ่มผู้รายงาน ลงในโค้ดแอป ปล่อยรีพอร์ตเตอร์เมื่องานในเบื้องหลังเสร็จสิ้น การสร้างรายการ FullyDrawnReporter จะไม่เรียกใช้เมธอด reportFullyDrawn จนกว่าจะมีการเผยแพร่ผู้รายงานทั้งหมด การทำเช่นนี้จะทำให้ โปรไฟล์พื้นฐาน มีเส้นทางโค้ดที่จำเป็นในการป้อนข้อมูลรายการ การดำเนินการนี้ ไม่ได้เปลี่ยนลักษณะการทำงานของแอปสำหรับผู้ใช้ แต่จะช่วยให้โปรไฟล์พื้นฐานมีเส้นทางโค้ดที่จำเป็นทั้งหมด

หากต้องการระบุสถานะที่วาดเสร็จสมบูรณ์ ให้ใช้ Compose API ต่อไปนี้

  • ReportDrawn แสดงว่า Composable พร้อมสำหรับการโต้ตอบทันที
  • ReportDrawnWhen ใช้เพรดิเคต เช่น list.count > 0 เพื่อ ระบุเมื่อ Composable พร้อมสำหรับการโต้ตอบ
  • ReportDrawnAfter ใช้เมธอดระงับซึ่งเมื่อเสร็จสมบูรณ์ จะบ่งบอกว่า Composable พร้อมสำหรับการโต้ตอบแล้ว