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

สร้างโปรไฟล์สําหรับการเปิดตัวแอปทุกครั้งโดยอัตโนมัติโดยใช้ไลบรารี 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 (AGP) 8.2 เป็นต้นไป

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

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

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

  1. เลือก File > New > New Module
  2. เลือกเทมเพลตเครื่องมือสร้างโปรไฟล์พื้นฐานในแผงเทมเพลต แล้วกำหนดค่าดังนี้
    รูปที่ 1 เทมเพลตโมดูลเครื่องมือสร้างโปรไฟล์พื้นฐาน

    ช่องในเทมเพลตมีดังนี้

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

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

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

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

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

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

การกำหนดค่าการเรียกใช้ Generate Baseline Profile
รูปที่ 2 การเรียกใช้การกำหนดค่านี้จะสร้าง 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 เนื่องจากคุณต้องมีสิทธิ์เข้าถึงระดับรูท สำหรับเครื่องมือสร้างโปรไฟล์พื้นฐาน

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

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

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

วิธีสร้างโปรไฟล์พื้นฐานโดยใช้ปลั๊กอิน 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โมดูลทดสอบ ตัวอย่างต่อไปนี้เป็นการทดสอบที่สร้างโปรไฟล์พื้นฐานสำหรับการเริ่มต้นแอป

    Kotlin

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

    Java

    public class BaselineProfileGenerator {
    
        @Rule
        Public BaselineProfileRule baselineRule = new BaselineProfileRule();
    
        @Test
        Public void startupBaselineProfile() {
            baselineRule.collect(
                "com.myapp",
                (scope -> {
                    scope.startActivityAndWait();
                    Return Unit.INSTANCE;
                })
            )
        }
    }
  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

สร้าง Baseline Profile ใหม่ด้วย AGP 7.3-7.4

คุณสร้างโปรไฟล์พื้นฐานด้วย AGP 7.3-7.4 ได้ แต่เราขอแนะนำอย่างยิ่งให้อัปเกรดเป็น AGP 8.1 เป็นอย่างน้อยเพื่อให้คุณใช้ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานและฟีเจอร์ล่าสุดได้

หากต้องการสร้าง Baseline Profile ด้วย AGP 7.3-7.4 ขั้นตอนจะเหมือนกับขั้นตอนสำหรับ AGP 8.1 โดยมีข้อยกเว้นดังนี้

ใช้กฎที่สร้างขึ้นด้วยตนเอง

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

  1. ค้นหาไฟล์ HRF ในโฟลเดอร์บิลด์ของโมดูลที่คุณสร้างโปรไฟล์ใน [module]/build/outputs/managed_device_android_test_additional_output/[device]

    โปรไฟล์จะเป็นไปตามรูปแบบการตั้งชื่อ [class name]-[test method name]-baseline-prof.txt ซึ่งมีลักษณะดังนี้ BaselineProfileGenerator-startup-baseline-prof.txt

  2. คัดลอกโปรไฟล์ที่สร้างขึ้นไปยัง src/main/ และเปลี่ยนชื่อไฟล์เป็น baseline-prof.txt

  3. เพิ่มทรัพยากร Dependency ลงในไลบรารี ProfileInstaller ในไฟล์ build.gradle.kts ของแอปเพื่อเปิดใช้การคอมไพล์โปรไฟล์พื้นฐานในเครื่อง ในกรณีที่ไม่มี Cloud Profiles นี่เป็น วิธีเดียวในการโหลดโปรไฟล์พื้นฐานจากแหล่งที่ไม่รู้จักในเครื่อง

    dependencies {
         implementation("androidx.profileinstaller:profileinstaller:1.4.1")
    }
    
  4. สร้างแอปเวอร์ชันที่ใช้งานจริงในขณะที่ระบบคอมไพล์กฎ HRF ที่ใช้เป็นรูปแบบไบนารีและรวมไว้ใน APK หรือ AAB จากนั้นเผยแพร่ แอปตามปกติ

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

หากต้องการเปรียบเทียบโปรไฟล์พื้นฐาน ให้สร้างการกำหนดค่าการเรียกใช้การทดสอบที่มีการวัดประสิทธิภาพของ Android ใหม่ จากการดำเนินการใน Gutter ซึ่งจะเรียกใช้การเปรียบเทียบที่กำหนดไว้ในไฟล์ StartupBenchmarks.kt หรือ StartupBencharks.java ดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบเปรียบเทียบได้ที่สร้างคลาส 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 รายการสำหรับการวัดเวลาเริ่มต้นของแอปมีดังนี้

เวลาที่ใช้ในการเริ่มแสดงผล (TTID)
เวลาที่ใช้ในการแสดงเฟรมแรกของ UI แอปพลิเคชัน
เวลาที่ใช้ในการแสดงผลครบถ้วน (TTFD)
TTID บวกกับเวลาในการแสดงเนื้อหาที่โหลดแบบอะซิงโครนัสหลังจากที่แสดงเฟรมแรก

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

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

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

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