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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  4. หากต้องการสร้าง Baseline Profile ให้เรียกใช้ :app:generateBaselineProfile หรือ :app:generateVariantBaselineProfile งาน Gradle ใน เทอร์มินัล

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

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

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

เราขอแนะนำให้สร้าง Baseline Profile โดยใช้ Android Studio เทมเพลตโมดูล Baseline Profile (แนะนำ) หรือเทมเพลต Macrobenchmark แต่คุณก็ ใช้ปลั๊กอิน Gradle ของ Baseline Profile ด้วยตัวเองได้เช่นกัน ดูข้อมูลเพิ่มเติมเกี่ยวกับปลั๊กอิน 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
    }

    Groovy

    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 baselineRule = BaselineProfileRule()
    
        @Test
        fun startupBaselineProfile() {
            baselineRule.collect("com.myapp") {
                startActivityAndWait()
            }
        }
    }

    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"))
    }

    Groovy

    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. เมื่อสิ้นสุดงานการสร้าง ระบบจะคัดลอก Baseline Profile ไปยัง app/src/variant/generated/baselineProfiles

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

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

หากต้องการสร้าง 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. เพิ่มการอ้างอิงไปยังไลบรารี ProfileInstaller ในไฟล์ build.gradle.kts ของแอปเพื่อเปิดใช้การคอมไพล์ Baseline Profile ในเครื่อง ในกรณีที่ไม่มี Cloud Profiles นี่เป็น วิธีเดียวในการโหลดโปรไฟล์พื้นฐานจากแหล่งที่ไม่รู้จักในเครื่อง

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

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

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

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

เมื่อเรียกใช้ภายใน Android Studio เอาต์พุตการสร้างจะมีรายละเอียดเกี่ยวกับการปรับปรุงความเร็วที่ Baseline Profile มอบให้ ดังนี้

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 ไปถึง สถานะที่วาดเสร็จสมบูรณ์แล้วจะไม่รวมอยู่ใน Baseline Profile

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

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

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