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