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

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

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

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

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

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

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

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

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

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

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

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

กำหนดตัวสร้างโปรไฟล์พื้นฐาน

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

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

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

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

การกำหนดค่าการเรียกใช้ Generate Baseline Profile
รูปที่ 2 การเรียกใช้การกำหนดค่านี้จะสร้างโปรไฟล์พื้นฐาน โปรไฟล์

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

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

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

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

ขั้นตอนในการสร้างโปรไฟล์พื้นฐานใหม่โดยใช้เทมเพลตโมดูล Macrobenchmark และปลั๊กอิน Baseline Profile 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. เพิ่มปลั๊กอิน Baseline Profile Gradle (libs.plugins.androidx.baselineprofile) ปลั๊กอินนี้จะช่วยให้สร้างและดูแลรักษาโปรไฟล์พื้นฐานได้ง่ายขึ้นในอนาคต

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

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

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

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

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

วิธีสร้างโปรไฟล์พื้นฐานโดยใช้ปลั๊กอิน 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. สร้างโปรไฟล์โดยเรียกใช้ทาสก์ Gradle :app:generateBaselineProfile หรือ :app:generateVariantBaselineProfile

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

เปรียบเทียบประสิทธิภาพของโปรไฟล์พื้นฐาน

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

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

เมื่อเรียกใช้การดำเนินการนี้ภายใน 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 มีรายการแบบ Lazy แบบไดนามิก งานเบื้องหลัง อาจป้อนข้อมูลลงในรายการหลังจากที่วาดรายการครั้งแรกและหลังจากที่ระบบทำเครื่องหมายว่า UI วาดเสร็จสมบูรณ์แล้ว ในกรณีเช่นนี้ โค้ดที่ทำงานหลังจาก UI อยู่ในสถานะวาดเสร็จสมบูรณ์แล้วจะไม่รวมอยู่ในโปรไฟล์พื้นฐาน

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

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

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