สร้างโปรไฟล์สําหรับการเปิดตัวแอปทุกครั้งโดยอัตโนมัติโดยใช้ไลบรารี Jetpack
Macrobenchmark และ
BaselineProfileRule เราขอแนะนำให้คุณใช้ com.android.tools.build:gradle:8.0.0 ขึ้นไป ซึ่งมาพร้อมกับการปรับปรุงบิลด์เมื่อใช้โปรไฟล์พื้นฐาน
ขั้นตอนทั่วไปในการสร้างโปรไฟล์พื้นฐานใหม่มีดังนี้
- ตั้งค่าโมดูลโปรไฟล์พื้นฐาน
- กำหนดการทดสอบ JUnit ที่ช่วยสร้างโปรไฟล์พื้นฐาน
- เพิ่มเส้นทางของผู้ใช้ที่สําคัญ (CUJ) ที่ต้องการเพิ่มประสิทธิภาพ
- สร้างโปรไฟล์พื้นฐาน
หลังจากสร้างโปรไฟล์พื้นฐานแล้ว ให้เปรียบเทียบโดยใช้อุปกรณ์จริงเพื่อวัดการปรับปรุงความเร็ว
สร้างโปรไฟล์พื้นฐานใหม่ด้วย AGP 8.2 ขึ้นไป
วิธีที่ง่ายที่สุดในการสร้างโปรไฟล์พื้นฐานใหม่คือการใช้เทมเพลตโมดูลโปรไฟล์พื้นฐาน ซึ่งพร้อมใช้งานตั้งแต่ Android Studio Iguana และปลั๊กอิน Android Gradle (AGP) 8.2 เป็นต้นไป
เทมเพลตโมดูลเครื่องมือสร้างโปรไฟล์พื้นฐานของ Android Studio จะสร้างโมดูลใหม่โดยอัตโนมัติเพื่อสร้างและเปรียบเทียบโปรไฟล์พื้นฐาน การเรียกใช้เทมเพลตจะสร้างการกำหนดค่าการบิลด์ทั่วไปส่วนใหญ่ การสร้างโปรไฟล์พื้นฐาน และรหัสยืนยัน เทมเพลต สร้างโค้ดเพื่อสร้างและเปรียบเทียบโปรไฟล์พื้นฐาน เพื่อวัดการเริ่มต้นแอป
ตั้งค่าโมดูลโปรไฟล์พื้นฐาน
หากต้องการเรียกใช้เทมเพลตโมดูลโปรไฟล์พื้นฐาน ให้ทำตามขั้นตอนต่อไปนี้
- เลือก File > New > New Module
- เลือกเทมเพลตเครื่องมือสร้างโปรไฟล์พื้นฐานในแผงเทมเพลต แล้วกำหนดค่าดังนี้
รูปที่ 1 เทมเพลตโมดูลเครื่องมือสร้างโปรไฟล์พื้นฐาน ช่องในเทมเพลตมีดังนี้
- แอปพลิเคชันเป้าหมาย: กำหนดแอปที่จะสร้างโปรไฟล์พื้นฐาน เมื่อมีโมดูลแอปเพียงโมดูลเดียวในโปรเจ็กต์ จะมีรายการเดียวในรายการนี้
- ชื่อโมดูล: ชื่อที่คุณต้องการตั้งให้โมดูลโปรไฟล์พื้นฐาน ที่กำลังสร้าง
- ชื่อแพ็กเกจ: ชื่อแพ็กเกจที่คุณต้องการสำหรับโมดูลโปรไฟล์พื้นฐาน
- ภาษา: คุณต้องการให้โค้ดที่สร้างเป็น Kotlin หรือ Java
- ภาษาการกำหนดค่าบิลด์: เลือกว่าต้องการใช้ Kotlin Script (KTS) หรือ Groovy สำหรับสคริปต์การกำหนดค่าบิลด์
- ใช้อุปกรณ์ที่มีการจัดการจาก Gradle: หากคุณใช้อุปกรณ์ที่มีการจัดการจาก Gradle เพื่อทดสอบแอป
- คลิกเสร็จสิ้น ระบบจะสร้างโมดูลใหม่ หากใช้การควบคุมแหล่งที่มา คุณอาจได้รับแจ้งให้เพิ่มไฟล์โมดูลที่สร้างขึ้นใหม่ลงในการควบคุมแหล่งที่มา
กำหนดเครื่องมือสร้างโปรไฟล์พื้นฐาน
โมดูลที่สร้างขึ้นใหม่มีการทดสอบทั้งเพื่อสร้างและเปรียบเทียบ โปรไฟล์พื้นฐาน และทดสอบการเริ่มต้นแอปขั้นพื้นฐานเท่านั้น เราขอแนะนำให้คุณเพิ่ม
สิ่งเหล่านี้เพื่อรวม CUJ และเวิร์กโฟลว์การเริ่มต้นขั้นสูง ตรวจสอบว่าการทดสอบใดๆ
ที่เกี่ยวข้องกับการเริ่มต้นแอปอยู่ในบล็อก rule ที่ตั้งค่าเป็น includeInStartupProfiletrue ในทางกลับกัน เพื่อประสิทธิภาพสูงสุด ให้ตรวจสอบว่าการทดสอบใดๆ ที่ไม่
เกี่ยวข้องกับการเริ่มต้นแอปไม่ได้รวมอยู่ในโปรไฟล์การเริ่มต้น การเพิ่มประสิทธิภาพการเริ่มต้นแอป ใช้เพื่อกำหนดส่วนพิเศษของโปรไฟล์พื้นฐานที่เรียกว่าStartup Profile
ซึ่งจะช่วยให้ดูแลรักษาได้ง่ายขึ้นหากคุณแยก CUJ เหล่านี้ออกจากโปรไฟล์พื้นฐาน และโค้ดการวัดประสิทธิภาพที่สร้างขึ้น เพื่อให้ใช้ได้กับทั้ง 2 อย่าง ซึ่งหมายความว่าการเปลี่ยนแปลง CUJ จะได้รับการใช้อย่างสม่ำเสมอ
สร้างและติดตั้งโปรไฟล์พื้นฐาน
เทมเพลตโมดูลโปรไฟล์พื้นฐานจะเพิ่มการกำหนดค่าการเรียกใช้ใหม่เพื่อสร้างโปรไฟล์พื้นฐาน หากคุณใช้ Product Flavor Android Studio จะสร้าง การกำหนดค่าการเรียกใช้หลายรายการเพื่อให้คุณสร้าง Baseline Profile แยกต่างหาก สำหรับแต่ละ Flavor ได้
เมื่อการกำหนดค่าการเรียกใช้สร้างโปรไฟล์พื้นฐาน เสร็จสมบูรณ์ ระบบจะคัดลอกโปรไฟล์พื้นฐานที่สร้างขึ้นไปยัง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:generateVariantBaselineProfileงาน Gradle ใน เทอร์มินัลเรียกใช้เครื่องมือสร้างเป็นการทดสอบการวัดคุมในอุปกรณ์จริง โปรแกรมจำลอง หรืออุปกรณ์ที่มีการจัดการจาก Gradle ที่รูทแล้ว หากใช้อุปกรณ์ที่มีการจัดการจาก Gradle ให้ตั้งค่า
aospเป็นsystemImageSourceเนื่องจากคุณต้องมีสิทธิ์เข้าถึงระดับรูท สำหรับเครื่องมือสร้างโปรไฟล์พื้นฐานเมื่อสิ้นสุดงานการสร้าง ระบบจะคัดลอกโปรไฟล์พื้นฐานไปยัง
app/src/variant/generated/baselineProfiles
สร้างโปรไฟล์พื้นฐานใหม่โดยไม่มีเทมเพลต
เราขอแนะนำให้สร้างโปรไฟล์พื้นฐานโดยใช้เทมเพลตโมดูลโปรไฟล์พื้นฐาน (แนะนำ) หรือเทมเพลต 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โมดูลทดสอบ ตัวอย่างต่อไปนี้เป็นการทดสอบที่สร้างโปรไฟล์พื้นฐานสำหรับการเริ่มต้นแอป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; }) ) } }
อัปเดตไฟล์
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
สร้าง 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 โดยมีข้อยกเว้นดังนี้
- อย่าเพิ่มปลั๊กอิน Gradle ของโปรไฟล์พื้นฐาน
- หากต้องการสร้างโปรไฟล์พื้นฐาน ให้เรียกใช้งาน Gradle Task
./gradlew [emulator name][flavor][build type]AndroidTestเช่น./gradlew :benchmark:pixel6Api31BenchmarkAndroidTest - คุณต้องใช้กฎของโปรไฟล์พื้นฐานที่สร้างขึ้นกับโค้ดด้วยตนเอง
ใช้กฎที่สร้างขึ้นด้วยตนเอง
ตัวสร้างโปรไฟล์พื้นฐานจะสร้างไฟล์ข้อความรูปแบบที่มนุษย์อ่านได้ (HRF) ในอุปกรณ์และคัดลอกไปยังเครื่องโฮสต์ หากต้องการใช้โปรไฟล์ที่สร้างขึ้น กับโค้ด ให้ทำตามขั้นตอนต่อไปนี้
ค้นหาไฟล์ HRF ในโฟลเดอร์บิลด์ของโมดูลที่คุณสร้างโปรไฟล์ใน
[module]/build/outputs/managed_device_android_test_additional_output/[device]โปรไฟล์จะเป็นไปตามรูปแบบการตั้งชื่อ
[class name]-[test method name]-baseline-prof.txtซึ่งมีลักษณะดังนี้BaselineProfileGenerator-startup-baseline-prof.txtคัดลอกโปรไฟล์ที่สร้างขึ้นไปยัง
src/main/และเปลี่ยนชื่อไฟล์เป็นbaseline-prof.txtเพิ่มทรัพยากร Dependency ลงในไลบรารี ProfileInstaller ในไฟล์
build.gradle.ktsของแอปเพื่อเปิดใช้การคอมไพล์โปรไฟล์พื้นฐานในเครื่อง ในกรณีที่ไม่มี Cloud Profiles นี่เป็น วิธีเดียวในการโหลดโปรไฟล์พื้นฐานจากแหล่งที่ไม่รู้จักในเครื่องdependencies { implementation("androidx.profileinstaller:profileinstaller:1.4.1") }สร้างแอปเวอร์ชันที่ใช้งานจริงในขณะที่ระบบคอมไพล์กฎ HRF ที่ใช้เป็นรูปแบบไบนารีและรวมไว้ใน APK หรือ AAB จากนั้นเผยแพร่ แอปตามปกติ
เปรียบเทียบโปรไฟล์พื้นฐาน
หากต้องการเปรียบเทียบโปรไฟล์พื้นฐาน ให้สร้างการกำหนดค่าการเรียกใช้การทดสอบที่มีการวัดประสิทธิภาพของ Android ใหม่
จากการดำเนินการใน Gutter ซึ่งจะเรียกใช้การเปรียบเทียบที่กำหนดไว้ในไฟล์ StartupBenchmarks.kt หรือ StartupBencharks.java ดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบเปรียบเทียบได้ที่สร้างคลาส 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 มีรายการแบบไดนามิก เช่น RecyclerView หรือ lazy
list ระบบอาจป้อนข้อมูลในรายการโดยใช้งานในเบื้องหลังซึ่งจะเสร็จสมบูรณ์หลังจากวาดรายการเป็นครั้งแรก และหลังจากที่ทำเครื่องหมาย UI ว่าวาดเสร็จสมบูรณ์แล้ว ในกรณีดังกล่าว โค้ดที่ทํางานหลังจากที่ UI เข้าถึงสถานะที่วาดเสร็จสมบูรณ์จะไม่รวมอยู่ในโปรไฟล์พื้นฐาน
หากต้องการรวมการสร้างรายการเป็นส่วนหนึ่งของโปรไฟล์พื้นฐาน ให้รับ
FullyDrawnReporterโดยใช้
getFullyDrawnReporter()
และเพิ่มผู้รายงานลงในโปรไฟล์ในโค้ดแอป ปล่อยผู้รายงานเมื่อ
งานที่ทำงานเบื้องหลังป้อนข้อมูลในรายการเสร็จแล้ว FullyDrawnReporter จะไม่
เรียกใช้เมธอด reportFullyDrawn() จนกว่าจะปล่อยผู้รายงานทั้งหมด การทำเช่นนี้จะทำให้โปรไฟล์พื้นฐานมีเส้นทางโค้ดที่จำเป็นในการสร้างรายการ
การดำเนินการนี้จะไม่เปลี่ยนลักษณะการทำงานของแอปสำหรับผู้ใช้ แต่จะช่วยให้ Baseline
Profile มีเส้นทางโค้ดที่จำเป็นทั้งหมด
หากแอปใช้ Jetpack Compose ให้ใช้ API ต่อไปนี้เพื่อระบุสถานะที่วาดเสร็จสมบูรณ์
ReportDrawnระบุว่า Composable พร้อมสำหรับการโต้ตอบทันทีReportDrawnWhenต้องมีเพรดิเคต เช่นlist.count > 0เพื่อระบุเวลาที่ Composable พร้อมสำหรับการโต้ตอบReportDrawnAfterใช้วิธีการระงับที่เมื่อเสร็จสิ้นแล้วจะระบุว่า Composable พร้อมสำหรับการโต้ตอบ
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- บันทึกเมตริก Macrobenchmark
- เขียนมาโครเบนช์มาร์ก
- ไลบรารี JankStats