โปรไฟล์พื้นฐานมีความสำคัญอย่างยิ่งต่อการเพิ่มประสิทธิภาพของ Jetpack Compose ให้สูงสุด การคอมไพล์ล่วงหน้าสำหรับเส้นทางของผู้ใช้ที่สำคัญจะช่วยให้มั่นใจว่า UI ของ Compose จะแสดงผลได้อย่างราบรื่น
สร้างโปรไฟล์สำหรับแอปทุกเวอร์ชันที่เผยแพร่โดยอัตโนมัติโดยใช้ไลบรารี Jetpack
Macrobenchmark และ BaselineProfileRule เราขอแนะนำให้ใช้ com.android.tools.build:gradle:8.0.0 ขึ้นไปเพื่อใช้ประโยชน์จากการปรับปรุงการบิลด์เมื่อใช้โปรไฟล์พื้นฐาน
ขั้นตอนทั่วไปในการสร้างโปรไฟล์พื้นฐานใหม่มีดังนี้
- ตั้งค่าโมดูลโปรไฟล์พื้นฐาน
- กำหนดการทดสอบ JUnit ที่ช่วยสร้างโปรไฟล์พื้นฐาน
- เพิ่มเส้นทางของผู้ใช้ที่สำคัญ (CUJ) ที่ต้องการเพิ่มประสิทธิภาพ
- สร้างโปรไฟล์พื้นฐาน
หลังจากสร้างโปรไฟล์พื้นฐานแล้ว ให้เปรียบเทียบประสิทธิภาพโดยใช้โปรไฟล์ดังกล่าวกับอุปกรณ์จริงเพื่อวัดการปรับปรุงความเร็ว
สร้างโปรไฟล์พื้นฐานใหม่ด้วย AGP 8.2 ขึ้นไป
วิธีที่ง่ายที่สุดในการสร้างโปรไฟล์พื้นฐานใหม่คือการใช้เทมเพลตโมดูลโปรไฟล์พื้นฐาน ซึ่งพร้อมใช้งานตั้งแต่ Android Studio Iguana และ Android Gradle Plugin (AGP) 8.2 เป็นต้นไป
เทมเพลตโมดูลตัวสร้างโปรไฟล์พื้นฐานของ Android Studio จะสร้าง โมดูลใหม่โดยอัตโนมัติเพื่อสร้างและ เปรียบเทียบประสิทธิภาพ ของโปรไฟล์พื้นฐาน การเรียกใช้เทมเพลตจะสร้างการกำหนดค่าการบิลด์ทั่วไปส่วนใหญ่ รวมถึงโค้ดการสร้างและการยืนยันโปรไฟล์พื้นฐาน เทมเพลตจะสร้างโค้ดเพื่อสร้างและเปรียบเทียบประสิทธิภาพของโปรไฟล์พื้นฐานเพื่อวัดการเริ่มต้นแอป
ตั้งค่าโมดูลโปรไฟล์พื้นฐาน
หากต้องการเรียกใช้เทมเพลตโมดูลโปรไฟล์พื้นฐาน ให้ทำตามขั้นตอนต่อไปนี้
- เลือกไฟล์ > ใหม่ > โมดูลใหม่
- เลือกเทมเพลตตัวสร้างโปรไฟล์พื้นฐาน ในแผงเทมเพลต
แล้วกำหนดค่าดังนี้:
ช่องในเทมเพลตมีดังนี้
รูปที่ 1 เทมเพลตโมดูลตัวสร้างโปรไฟล์พื้นฐาน - แอปพลิเคชันเป้าหมาย: แอปที่จะสร้างโปรไฟล์พื้นฐานให้ เมื่อมีโมดูลแอปเพียงโมดูลเดียวในโปรเจ็กต์ รายการนี้จะมีเพียงรายการเดียว
- ชื่อโมดูล: ชื่อที่ต้องการตั้งให้โมดูลโปรไฟล์พื้นฐานที่จะ สร้าง
- ชื่อแพ็กเกจ: ชื่อแพ็กเกจที่ต้องการตั้งให้โมดูลโปรไฟล์พื้นฐาน
- ภาษา: ภาษาที่ต้องการให้โค้ดที่สร้างเป็น Kotlin หรือ Java
- ภาษาการกำหนดค่าบิลด์: ภาษาที่ต้องการใช้สำหรับสคริปต์การกำหนดค่าบิลด์ ไม่ว่าจะเป็น Kotlin Script (KTS) หรือ Groovy
- ใช้อุปกรณ์ที่มีการจัดการจาก Gradle: คุณกำลังใช้อุปกรณ์ที่มีการจัดการจาก Gradle เพื่อทดสอบแอปหรือไม่
- คลิกเสร็จสิ้น เพื่อสร้างโมดูลใหม่ หากใช้ระบบควบคุมเวอร์ชัน คุณอาจได้รับข้อความแจ้งให้เพิ่มไฟล์โมดูลที่สร้างขึ้นใหม่ลงในระบบควบคุมเวอร์ชัน
กำหนดตัวสร้างโปรไฟล์พื้นฐาน
โมดูลที่สร้างขึ้นใหม่จะมีทั้งการทดสอบเพื่อสร้างและเปรียบเทียบประสิทธิภาพของโปรไฟล์พื้นฐาน รวมถึงการทดสอบการเริ่มต้นแอปพื้นฐานเท่านั้น เราขอแนะนำให้คุณเพิ่มการทดสอบเหล่านี้เพื่อรวม CUJ และเวิร์กโฟลว์การเริ่มต้นขั้นสูง ตรวจสอบว่าการทดสอบที่เกี่ยวข้องกับการเริ่มต้นแอปอยู่ในบล็อก rule โดยตั้งค่า includeInStartupProfile เป็น true ในทางกลับกัน เพื่อประสิทธิภาพสูงสุด ให้ตรวจสอบว่าการทดสอบที่ไม่เกี่ยวข้องกับการเริ่มต้นแอปไม่ได้รวมอยู่ในโปรไฟล์การเริ่มต้น การเพิ่มประสิทธิภาพการเริ่มต้นแอป
ใช้เพื่อกำหนดส่วนพิเศษของโปรไฟล์พื้นฐานที่เรียกว่า
โปรไฟล์การเริ่มต้น
การแยก CUJ เหล่านี้ออกจากโค้ดโปรไฟล์พื้นฐานและโค้ดการเปรียบเทียบประสิทธิภาพที่สร้างขึ้นจะช่วยให้ดูแลรักษาได้ง่ายขึ้น เนื่องจากสามารถใช้ได้ทั้ง 2 อย่าง ซึ่งหมายความว่าระบบจะใช้การเปลี่ยนแปลง CUJ ของคุณอย่างสม่ำเสมอ
สร้างและติดตั้งโปรไฟล์พื้นฐาน
เทมเพลตโมดูลโปรไฟล์พื้นฐานจะเพิ่มการกำหนดค่าการเรียกใช้ใหม่เพื่อสร้างโปรไฟล์พื้นฐาน หากใช้ Product Flavor, Android Studio จะสร้างการกำหนดค่าการเรียกใช้หลายรายการเพื่อให้คุณสร้างโปรไฟล์พื้นฐานแยกต่างหากสำหรับแต่ละ Flavor ได้
เมื่อการกำหนดค่าการเรียกใช้สร้างโปรไฟล์พื้นฐาน เสร็จสมบูรณ์ ระบบจะคัดลอก
โปรไฟล์พื้นฐานที่สร้างขึ้นไปยัง
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 มีดังนี้
- ตั้งค่าโมดูล 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) ปลั๊กอินนี้จะช่วยให้สร้างและดูแลรักษาโปรไฟล์พื้นฐานได้ง่ายขึ้นในอนาคตหากต้องการสร้างโปรไฟล์พื้นฐาน ให้เรียกใช้ทาสก์ 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 โดยตรงมีดังนี้
- สร้างโมดูล
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' }
- ใช้ปลั๊กอิน
สร้างโปรไฟล์โดยเรียกใช้ทาสก์ Gradle
:app:generateBaselineProfileหรือ:app:generateVariantBaselineProfileเมื่อทาสก์การสร้างเสร็จสมบูรณ์ ระบบจะคัดลอกโปรไฟล์พื้นฐานไปยัง
app/src/variant/generated/baselineProfiles
เปรียบเทียบประสิทธิภาพของโปรไฟล์พื้นฐาน
หากต้องการเปรียบเทียบประสิทธิภาพของโปรไฟล์พื้นฐาน ให้สร้างการกำหนดค่าการเรียกใช้การทดสอบแบบมีเครื่องมือของ Android ใหม่จากการดำเนินการใน Gutter ที่เรียกใช้การเปรียบเทียบประสิทธิภาพที่กำหนดไว้ในไฟล์ 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
มีรายการแบบ Lazy แบบไดนามิก งานเบื้องหลัง
อาจป้อนข้อมูลลงในรายการหลังจากที่วาดรายการครั้งแรกและหลังจากที่ระบบทำเครื่องหมายว่า UI
วาดเสร็จสมบูรณ์แล้ว ในกรณีเช่นนี้ โค้ดที่ทำงานหลังจาก UI อยู่ในสถานะวาดเสร็จสมบูรณ์แล้วจะไม่รวมอยู่ในโปรไฟล์พื้นฐาน
หากต้องการรวมการป้อนข้อมูลลงในรายการเป็นส่วนหนึ่งของโปรไฟล์พื้นฐาน ให้รับ
FullyDrawnReporter โดยใช้ getFullyDrawnReporter แล้วเพิ่ม Reporter
ลงใน Reporter ในโค้ดแอป ปล่อย Reporter เมื่อทาสก์เบื้องหลังป้อนข้อมูลลงในรายการเสร็จสมบูรณ์ FullyDrawnReporter จะไม่เรียกใช้เมธอด reportFullyDrawn จนกว่าจะปล่อย Reporter ทั้งหมด การดำเนินการนี้จะทำให้โปรไฟล์พื้นฐานมีเส้นทางโค้ดที่จำเป็นในการป้อนข้อมูลลงในรายการ ซึ่งจะไม่เปลี่ยนลักษณะการทำงานของแอปสำหรับผู้ใช้ แต่จะช่วยให้โปรไฟล์พื้นฐานมีเส้นทางโค้ดที่จำเป็นทั้งหมด
หากต้องการระบุสถานะวาดเสร็จสมบูรณ์ ให้ใช้ API ของ Compose ต่อไปนี้
ReportDrawnระบุว่า Composables พร้อมสำหรับการโต้ตอบทันทีReportDrawnWhenใช้เพรดิเคต เช่นlist.count > 0เพื่อ ระบุเวลาที่ Composables พร้อมสำหรับการโต้ตอบReportDrawnAfterใช้เมธอดระงับที่เมื่อเสร็จสมบูรณ์แล้วจะระบุว่า Composables พร้อมสำหรับการโต้ตอบ
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- บันทึกเมตริก Macrobenchmark
- เขียน Macrobenchmark
- ไลบรารี JankStats