Baseline Profile มีความสำคัญต่อการเพิ่มประสิทธิภาพ Jetpack Compose ให้สูงสุด การคอมไพล์เส้นทางของผู้ใช้ที่สำคัญล่วงหน้าจะช่วยให้มั่นใจได้ว่า Compose UI จะแสดงผลได้อย่างราบรื่น
สร้างโปรไฟล์โดยอัตโนมัติสำหรับแอปทุกรุ่นโดยใช้ไลบรารี Jetpack Macrobenchmark และ BaselineProfileRule เราขอแนะนำให้คุณใช้ com.android.tools.build:gradle:8.0.0 ขึ้นไปเพื่อใช้ประโยชน์จากการปรับปรุงบิลด์เมื่อใช้โปรไฟล์พื้นฐาน
ขั้นตอนทั่วไปในการสร้าง Baseline Profile ใหม่มีดังนี้
- ตั้งค่าโมดูลโปรไฟล์พื้นฐาน
- กำหนดการทดสอบ JUnit ที่ช่วยสร้างโปรไฟล์พื้นฐาน
- เพิ่มเส้นทางของผู้ใช้ที่สำคัญ (CUJ) ที่คุณต้องการเพิ่มประสิทธิภาพ
- สร้างโปรไฟล์พื้นฐาน
หลังจากสร้างโปรไฟล์พื้นฐานแล้ว ให้เปรียบเทียบโดยใช้อุปกรณ์จริงเพื่อวัดการปรับปรุงความเร็ว
สร้าง Baseline Profile ใหม่ด้วย AGP 8.2 ขึ้นไป
วิธีที่ง่ายที่สุดในการสร้าง Baseline Profile ใหม่คือการใช้เทมเพลตโมดูล Baseline Profile ซึ่งพร้อมใช้งานตั้งแต่ Android Studio Iguana และ Android Gradle Plugin (AGP) 8.2 เป็นต้นไป
เทมเพลตโมดูล Baseline Profile Generator ของ Android Studio จะสร้างโมดูลใหม่โดยอัตโนมัติเพื่อสร้างและเปรียบเทียบ Baseline Profile การเรียกใช้เทมเพลตจะสร้างการกำหนดค่าบิลด์ทั่วไป การสร้างโปรไฟล์พื้นฐาน และโค้ดการยืนยันส่วนใหญ่ เทมเพลตจะสร้างโค้ดเพื่อสร้างและเปรียบเทียบโปรไฟล์ Baseline เพื่อวัดการเริ่มต้นแอป
ตั้งค่าโมดูลโปรไฟล์พื้นฐาน
หากต้องการเรียกใช้เทมเพลตโมดูลโปรไฟล์พื้นฐาน ให้ทำตามขั้นตอนต่อไปนี้
- เลือก File > New > New Module
- เลือกเทมเพลต Baseline Profile Generator ในแผงเทมเพลต แล้วกำหนดค่าดังนี้
ช่องในเทมเพลตมีดังนี้
รูปที่ 1 เทมเพลตโมดูล Baseline Profile Generator - แอปพลิเคชันเป้าหมาย: แอปที่สร้างโปรไฟล์พื้นฐานขึ้นมา เมื่อคุณมีโมดูลแอปเพียงโมดูลเดียวในโปรเจ็กต์ รายการนี้จะมีเพียงรายการเดียว
- ชื่อโมดูล: ชื่อที่ต้องการสำหรับโมดูล Baseline Profile ที่กำลังสร้าง
- ชื่อแพ็กเกจ: ชื่อแพ็กเกจที่ต้องการสำหรับโมดูลโปรไฟล์พื้นฐาน
- ภาษา: เลือกว่าต้องการให้โค้ดที่สร้างขึ้นเป็น Kotlin หรือ Java
- ภาษาการกำหนดค่าบิลด์: คุณต้องการใช้ Kotlin Script (KTS) หรือ Groovy สำหรับสคริปต์การกำหนดค่าบิลด์หรือไม่
- ใช้อุปกรณ์ที่มีการจัดการจาก Gradle: คุณใช้อุปกรณ์ที่มีการจัดการจาก Gradle เพื่อทดสอบแอปหรือไม่
- คลิกเสร็จสิ้น ระบบจะสร้างโมดูลใหม่ หากใช้การควบคุมแหล่งที่มา ระบบอาจแจ้งให้คุณเพิ่มไฟล์โมดูลที่สร้างใหม่ลงในการควบคุมแหล่งที่มา
กำหนดเครื่องมือสร้างโปรไฟล์พื้นฐาน
โมดูลที่สร้างขึ้นใหม่ประกอบด้วยการทดสอบเพื่อสร้างและเปรียบเทียบ Baseline Profile และทดสอบเฉพาะการเริ่มต้นแอปพื้นฐาน เราขอแนะนำให้คุณเพิ่มข้อมูลเหล่านี้เพื่อรวม CUJ และเวิร์กโฟลว์การเริ่มต้นขั้นสูง ตรวจสอบว่าการทดสอบที่เกี่ยวข้องกับการเริ่มต้นแอปอยู่ในบล็อก rule โดยตั้งค่า includeInStartupProfile เป็น true ในทางกลับกัน เพื่อประสิทธิภาพสูงสุด ให้ตรวจสอบว่าการทดสอบที่ไม่เกี่ยวข้องกับการเริ่มต้นแอปไม่ได้รวมอยู่ในโปรไฟล์การเริ่มต้นระบบ การเพิ่มประสิทธิภาพการเริ่มต้นแอปใช้เพื่อกำหนดส่วนพิเศษของโปรไฟล์พื้นฐานที่เรียกว่าโปรไฟล์การเริ่มต้น
การแยก CUJ เหล่านี้ออกจากโค้ดโปรไฟล์พื้นฐานและโค้ดการเปรียบเทียบที่สร้างขึ้นจะช่วยให้ดูแลรักษาได้ง่ายขึ้น เพื่อให้ใช้กับทั้ง 2 อย่างได้ ซึ่งหมายความว่าระบบจะใช้การเปลี่ยนแปลงใน CUJ อย่างสอดคล้องกัน
สร้างและติดตั้งโปรไฟล์พื้นฐาน
เทมเพลตโมดูลโปรไฟล์พื้นฐานจะเพิ่มการกำหนดค่าการเรียกใช้ใหม่เพื่อสร้างโปรไฟล์พื้นฐาน หากคุณใช้เวอร์ชันผลิตภัณฑ์ Android Studio จะสร้างการกำหนดค่าการเรียกใช้หลายรายการเพื่อให้คุณสร้างโปรไฟล์พื้นฐานแยกต่างหากสำหรับแต่ละเวอร์ชันได้
เมื่อการกำหนดค่าการเรียกใช้สร้างโปรไฟล์พื้นฐานเสร็จสมบูรณ์ ระบบจะคัดลอกโปรไฟล์พื้นฐานที่สร้างขึ้นไปยังไฟล์ src/variant/generated/baselineProfiles/baseline-prof.txt ในโมดูลที่กำลังสร้างโปรไฟล์ ตัวเลือกสินค้าย่อยคือประเภทบิลด์ที่เผยแพร่หรือตัวแปรบิลด์ที่เกี่ยวข้องกับประเภทบิลด์ที่เผยแพร่
Baseline Profile ที่สร้างขึ้นจะสร้างขึ้นใน build/outputs ตั้งแต่แรก เส้นทางแบบเต็มจะกำหนดโดยตัวแปรหรือเวอร์ชันของแอปที่กำลังทำโปรไฟล์ และขึ้นอยู่กับว่าคุณใช้อุปกรณ์ที่มีการจัดการจาก Gradle หรืออุปกรณ์ที่เชื่อมต่อสำหรับการทำโปรไฟล์ หากคุณใช้ชื่อที่ใช้โดยโค้ดและการกำหนดค่าบิลด์ที่สร้างขึ้นโดยเทมเพลต ระบบจะสร้างโปรไฟล์พื้นฐานในไฟล์ build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt คุณอาจไม่ต้องโต้ตอบกับ Baseline Profile เวอร์ชันที่สร้างขึ้นนี้โดยตรง เว้นแต่คุณจะคัดลอกไปยังโมดูลเป้าหมายด้วยตนเอง (ไม่แนะนำ)
สร้างโปรไฟล์พื้นฐานใหม่ด้วย AGP 8.1
หากใช้เทมเพลตโมดูลโปรไฟล์พื้นฐานไม่ได้ ให้ใช้เทมเพลตโมดูล Macrobenchmark และปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานเพื่อสร้างโปรไฟล์พื้นฐานใหม่ เราขอแนะนำให้ใช้เครื่องมือเหล่านี้โดยเริ่มจาก Android Studio Giraffe และ AGP 8.1
ขั้นตอนในการสร้างโปรไฟล์พื้นฐานใหม่โดยใช้เทมเพลตโมดูล Macrobenchmark และปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานมีดังนี้
- ตั้งค่าโมดูล Macrobenchmark ในโปรเจ็กต์ Gradle
กำหนดคลาสใหม่ชื่อ
BaselineProfileGenerator:class BaselineProfileGenerator { @get:Rule val baselineProfileRule = BaselineProfileRule() @Test fun startup() = baselineProfileRule.collect( packageName = "com.example.app", profileBlock = { startActivityAndWait() } ) }เครื่องมือสร้างอาจมีการโต้ตอบกับแอปของคุณนอกเหนือจากการเริ่มต้นแอป ซึ่งจะช่วยให้คุณเพิ่มประสิทธิภาพรันไทม์ของแอปได้ เช่น การเลื่อนรายการ การเรียกใช้ภาพเคลื่อนไหว และการไปยังส่วนต่างๆ ภายใน
Activityดูตัวอย่างอื่นๆ ของการทดสอบที่ใช้@BaselineProfileRuleเพื่อปรับปรุงเส้นทางของผู้ใช้ที่สำคัญเพิ่มปลั๊กอิน Baseline Profile Gradle (
libs.plugins.androidx.baselineprofile) ปลั๊กอินนี้ช่วยให้สร้าง Baseline Profile และดูแลรักษาในอนาคตได้ง่ายขึ้นหากต้องการสร้างโปรไฟล์พื้นฐาน ให้เรียกใช้งาน Gradle
:app:generateBaselineProfileหรือ:app:generateVariantBaselineProfileในเทอร์มินัลเรียกใช้โปรแกรมสร้างเป็นการทดสอบการวัดคุมในอุปกรณ์จริงที่รูทแล้ว โปรแกรมจำลอง หรืออุปกรณ์ที่มีการจัดการจาก Gradle หากคุณใช้อุปกรณ์ที่มีการจัดการจาก Gradle ให้ตั้งค่า
aospเป็นsystemImageSourceเนื่องจากคุณต้องมีสิทธิ์เข้าถึงระดับรูทสำหรับเครื่องมือสร้างโปรไฟล์พื้นฐานเมื่อสิ้นสุดงานการสร้าง ระบบจะคัดลอกโปรไฟล์พื้นฐานไปยัง
app/src//generated/baselineProfiles
สร้าง Baseline Profile ใหม่โดยไม่มีเทมเพลต
เราขอแนะนำให้สร้างโปรไฟล์พื้นฐานโดยใช้เทมเพลตโมดูลโปรไฟล์พื้นฐาน (แนะนำ) หรือเทมเพลต Macrobenchmark ของ Android Studio แต่คุณจะใช้ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานเพียงอย่างเดียวก็ได้ อ่านข้อมูลเพิ่มเติมเกี่ยวกับปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานได้ที่กำหนดค่าการสร้างโปรไฟล์พื้นฐาน
วิธีสร้างโปรไฟล์พื้นฐานโดยใช้ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานโดยตรงมีดังนี้
- สร้างโมดูล
com.android.testใหม่ เช่น:baseline-profile กำหนดค่าไฟล์
build.gradle.ktsสำหรับ:baseline-profileดังนี้- ใช้ปลั๊กอิน
androidx.baselineprofile - ตรวจสอบว่า
targetProjectPathชี้ไปยังโมดูล:app - เพิ่มอุปกรณ์ที่มีการจัดการจาก Gradle (GMD) (ไม่บังคับ) ในตัวอย่างต่อไปนี้คือ
pixel6Api31หากไม่ได้ระบุ ปลั๊กอินจะใช้อุปกรณ์ที่เชื่อมต่อ ไม่ว่าจะเป็นอุปกรณ์จำลองหรืออุปกรณ์จริง - ใช้การกำหนดค่าที่ต้องการตามที่แสดงในตัวอย่างต่อไปนี้
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 }
- ใช้ปลั๊กอิน
สร้างการทดสอบโปรไฟล์พื้นฐานในโมดูลทดสอบ
:baseline-profileตัวอย่างต่อไปนี้เป็นการทดสอบที่สร้างโปรไฟล์พื้นฐานสำหรับการเริ่มต้นแอปclass BaselineProfileGenerator { @get:Rule val baselineProfileRule = BaselineProfileRule() @Test fun startup() = baselineProfileRule.collect( packageName = "com.example.app", profileBlock = { uiAutomator { startApp(PACKAGE_NAME) } } ) }อัปเดตไฟล์
build.gradle.ktsในโมดูลแอป เช่น:app- ใช้ปลั๊กอิน
androidx.baselineprofile - เพิ่มทรัพยากร 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' }
- ใช้ปลั๊กอิน
สร้างโปรไฟล์โดยเรียกใช้
:app:generateBaselineProfileหรืองาน Gradle:app:generateVariantBaselineProfileเมื่อสิ้นสุดงานการสร้าง ระบบจะคัดลอกโปรไฟล์พื้นฐานไปยัง
app/src/variant/generated/baselineProfiles
เปรียบเทียบโปรไฟล์พื้นฐาน
หากต้องการเปรียบเทียบ Baseline Profile ให้สร้างการกำหนดค่าการเรียกใช้การทดสอบ Android ที่ใช้เครื่องมือวัดใหม่จากการดำเนินการในแถบด้านข้างที่เรียกใช้การเปรียบเทียบที่กำหนดไว้ในไฟล์ StartupBenchmarks.kt ดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบการเปรียบเทียบได้ที่หัวข้อสร้างคลาส Macrobenchmark และเปรียบเทียบ Baseline Profile กับไลบรารี Macrobenchmark
เมื่อเรียกใช้ภายใน 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 มีรายการแบบ Lazy แบบไดนามิก รายการอาจสร้างขึ้นโดยงานเบื้องหลังที่เสร็จสมบูรณ์หลังจากวาดรายการเป็นครั้งแรก และหลังจากที่ UI ได้รับการทำเครื่องหมายว่าวาดเสร็จสมบูรณ์แล้ว ในกรณีเช่นนี้ โค้ดที่ทำงานหลังจาก UI เข้าสู่สถานะวาดเสร็จสมบูรณ์จะไม่รวมอยู่ในโปรไฟล์พื้นฐาน
หากต้องการรวมการสร้างรายการเป็นส่วนหนึ่งของโปรไฟล์พื้นฐาน ให้รับ FullyDrawnReporter โดยใช้ getFullyDrawnReporter และเพิ่ม Reporter ลงในโค้ดแอป ปล่อย Reporter เมื่อพื้นหลังทำงานเสร็จสิ้น
สร้างรายการ FullyDrawnReporter จะไม่เรียกใช้เมธอด reportFullyDrawn จนกว่าจะมีการปล่อย Reporter ทั้งหมด การทำเช่นนี้จะทำให้ Baseline Profile มีเส้นทางโค้ดที่จำเป็นในการสร้างรายการ การดำเนินการนี้จะไม่เปลี่ยนลักษณะการทำงานของแอปสำหรับผู้ใช้ แต่จะช่วยให้ Baseline Profile รวมเส้นทางโค้ดที่จำเป็นทั้งหมด
หากต้องการระบุสถานะที่วาดเสร็จสมบูรณ์ ให้ใช้ Compose API ต่อไปนี้
ReportDrawnบ่งบอกว่า Composable พร้อมสำหรับการโต้ตอบทันทีReportDrawnWhenใช้เพรดิเคต เช่นlist.count > 0เพื่อระบุว่า Composable พร้อมสำหรับการโต้ตอบเมื่อใดReportDrawnAfterใช้เมธอดการระงับซึ่งเมื่อเสร็จสมบูรณ์แล้วจะบ่งบอกว่า Composable พร้อมสำหรับการโต้ตอบแล้ว
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- บันทึกเมตริก Macrobenchmark
- เขียน Macrobenchmark
- ไลบรารี JankStats