ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานช่วยให้สร้างและดูแลรักษาโปรไฟล์พื้นฐานได้ง่ายขึ้น ซึ่งจะช่วยให้คุณดำเนินการต่อไปนี้ได้
- สร้างโปรไฟล์พื้นฐานใหม่สําหรับแอป
- สร้างโปรไฟล์พื้นฐานใหม่สำหรับคลัง
- ปรับแต่งการสร้างโปรไฟล์พื้นฐาน
หน้านี้จะอธิบายวิธีใช้ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานเพื่อปรับแต่งการสร้างโปรไฟล์พื้นฐาน
ข้อกำหนดของปลั๊กอิน
- AGP 8.0 ขึ้นไป
- การใช้ปลั๊กอิน Gradle เวอร์ชันล่าสุด
ใช้อุปกรณ์ที่มีการจัดการของ Gradle เพื่อสร้างโปรไฟล์พื้นฐาน
หากต้องการใช้ Gradle Managed Device (GMD) เพื่อสร้างโปรไฟล์พื้นฐาน ให้เพิ่มในการกำหนดค่า build.gradle.kts
ของโมดูลที่สร้างโปรไฟล์ ซึ่งอาจเป็นโมดูลทดสอบ :baselineprofile
ตามที่แสดงในตัวอย่างต่อไปนี้
Kotlin
android { testOptions.managedDevices.devices { create<com.android.build.api.dsl.ManagedVirtualDevice>("pixel6Api31") { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } }
Groovy
android { testOptions.managedDevices.devices { pixel6Api31(ManagedVirtualDevice) { device 'Pixel 6' apiLevel = 31 systemImageSource 'aosp' } } }
ใช้ GMD เพื่อสร้างโปรไฟล์พื้นฐานโดยการเพิ่มลงในการกำหนดค่าปลั๊กอิน Gradle ของโปรไฟล์พื้นฐาน ดังนี้ ใน build.gradle.kts
ของข้อบังคับการทดสอบ :baselineprofile
Kotlin
baselineProfile { managedDevices += "pixel6Api31" }
Groovy
baselineProfile { managedDevices = ['pixel6Api31'] }
เมื่อใช้ GMD เพื่อสร้างโปรไฟล์พื้นฐาน ให้ตั้งค่า useConnectedDevices
เป็น false
ในข้อบังคับการทดสอบ :baselineprofile
Kotlin
baselineProfile { ... useConnectedDevices = false }
Groovy
baselineProfile { ... useConnectedDevices false }
สร้างโปรไฟล์พื้นฐานสําหรับตัวแปรต่างๆ
คุณสามารถสร้างโปรไฟล์พื้นฐานต่อตัวแปร ต่อรุ่น หรือเป็นไฟล์เดียวเพื่อใช้กับตัวแปรทั้งหมด ควบคุมลักษณะการทำงานนี้ผ่านการตั้งค่าการผสาน ดังที่แสดงในตัวอย่างต่อไปนี้ใน build.gradle.kts
ของโมดูลแอปพลิเคชันหรือไลบรารี
Kotlin
baselineProfile { mergeIntoMain = true }
Groovy
baselineProfile { mergeIntoMain true }
หากต้องการผสานโปรไฟล์ที่สร้างขึ้นสําหรับตัวแปรทั้งหมดเข้าเป็นโปรไฟล์เดียว ให้ตั้งค่า mergeIntoMain
เป็น true
ระบบจะสร้างโปรไฟล์พื้นฐานตามตัวแปรไม่ได้เมื่อการตั้งค่านี้เป็น true
ดังนั้นจึงมีงาน Gradle รายการเดียวที่ชื่อ generateBaselineProfile
ระบบจะแสดงผลโปรไฟล์ที่
src/main/generated/baselineProfiles
หากต้องการปิดใช้การผสานและมีโปรไฟล์ 1 รายการต่อตัวแปร ให้ตั้งค่า mergeIntoMain
เป็น
false
ในกรณีนี้ จะมีงาน Gradle สำหรับตัวแปรหลายรายการ ตัวอย่างเช่น เมื่อมีแฟลเวอร์ 2 รายการ เช่น ฟรีและแบบชำระเงิน และบิลด์รุ่น 1 ประเภท งานต่างๆ มีดังนี้
* `generateFreeReleaseBaselineProfile`
* `generatePaidReleaseBaselineProfile`
* `generateReleaseBaselineProfile`
หากต้องการระบุลักษณะการผสานต่อตัวแปร ให้ใช้โค้ดต่อไปนี้
Kotlin
baselineProfile { variants { freeRelease { mergeIntoMain = true } } }
Groovy
baselineProfile { variants { freeRelease { mergeIntoMain true } } }
ในตัวอย่างก่อนหน้านี้ ระบบจะผสานตัวแปรทั้งหมดที่มีการตั้งค่า Flag เป็น true
ไว้ใน src/main/generated/baselineProfiles
ส่วนโปรไฟล์ของตัวแปรที่มีการตั้งค่า Flag เป็น false
จะเก็บไว้ในโฟลเดอร์ src/<variant>/generated/baselineProfiles
โดยค่าเริ่มต้น mergeIntoMain
จะตั้งค่าเป็น true
สำหรับคลัง และ false
สำหรับแอป
สร้างโปรไฟล์พื้นฐานโดยอัตโนมัติเมื่อประกอบรุ่นใหม่
คุณสามารถกําหนดค่าโปรไฟล์พื้นฐานให้สร้างขึ้นโดยอัตโนมัติพร้อมกับบิลด์การเผยแพร่ทุกรุ่น แทนที่จะใช้งาน generateBaselineProfile
ด้วยตนเอง เมื่อใช้การสร้างอัตโนมัติ โปรไฟล์ที่อัปเดตล่าสุดจะรวมอยู่ในบิลด์รุ่น
หากต้องการเปิดใช้การสร้างอัตโนมัติสําหรับบิลด์รุ่น ให้ใช้ Flag automaticGenerationDuringBuild
ดังนี้
Kotlin
baselineProfile { automaticGenerationDuringBuild = true }
Groovy
baselineProfile { automaticGenerationDuringBuild true }
การตั้งค่า Flag automaticGenerationDuringBuild
เป็น true
จะทริกเกอร์การสร้างโปรไฟล์พื้นฐานใหม่สําหรับแต่ละแอสเซมบลีรุ่น ซึ่งหมายความว่าการเรียกใช้งานบิลด์รุ่นที่ประกอบ เช่น ./gradlew:app:assembleRelease
จะทริกเกอร์ :app:generateReleaseBaselineProfile
ด้วย รวมถึงเริ่มการทดสอบเครื่องมือวัดผลของโปรไฟล์พื้นฐาน และสร้างบิลด์โปรไฟล์พื้นฐานที่ใช้เรียกใช้
แม้ว่าการสร้างอัตโนมัติจะช่วยให้ผู้ใช้ได้รับประโยชน์ด้านประสิทธิภาพที่ดีที่สุด แต่ก็จะทำให้เวลาในการสร้างนานขึ้นด้วยเนื่องจากมีการสร้างและการทดสอบเครื่องมือวัดผล 2 ครั้ง
นอกจากนี้ คุณยังระบุลักษณะการทํางานนี้ต่อตัวแปรแต่ละรายการได้ด้วย ดังตัวอย่างต่อไปนี้
Kotlin
baselineProfile { variants { freeRelease { automaticGenerationDuringBuild = true } } }
Groovy
baselineProfile { variants { freeRelease { automaticGenerationDuringBuild true } } }
ในตัวอย่างก่อนหน้านี้ งาน generateFreeReleaseBaselineProfile
จะทำงานเมื่อเริ่ม assembleFreeRelease
ซึ่งจะมีประโยชน์เมื่อผู้ใช้ต้องการมี release
สำหรับบิลด์การจัดจำหน่ายที่สร้างโปรไฟล์ทุกครั้งเมื่อสร้าง และบิลด์ releaseWithoutProfile
สำหรับการทดสอบภายใน
จัดเก็บโปรไฟล์พื้นฐานไว้ในแหล่งที่มา
คุณสามารถจัดเก็บโปรไฟล์พื้นฐานในไดเรกทอรีต้นทางผ่าน Flag saveInSrc
ใน build.gradle.kts
ของโมดูลแอปพลิเคชันหรือไลบรารี ดังนี้
true
: โปรไฟล์พื้นฐานจะจัดเก็บไว้ในsrc/<variant>/generated/baselineProfiles
ซึ่งจะช่วยให้คุณส่งโปรไฟล์ที่สร้างขึ้นล่าสุดไปยังแหล่งที่มาได้false
: โปรไฟล์พื้นฐานจะจัดเก็บไว้ในไฟล์กลางในไดเรกทอรีบิลด์ วิธีนี้ช่วยให้คุณไม่ต้องบันทึกโปรไฟล์ที่สร้างขึ้นล่าสุดเมื่อคอมมิตโค้ด
Kotlin
baselineProfile { saveInSrc = true }
Groovy
baselineProfile { saveInSrc true }
นอกจากนี้ คุณยังระบุลักษณะการทำงานนี้ตามตัวแปรได้ด้วย
Kotlin
baselineProfile { variants { freeRelease { saveInSrc = true } } }
Groovy
baselineProfile { variants { freeRelease { saveInSrc true } } }
ปิดใช้คำเตือน
โดยค่าเริ่มต้น ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานจะเตือนคุณเกี่ยวกับสถานการณ์ที่อาจก่อให้เกิดปัญหา หากต้องการปิดใช้คำเตือน ให้ตั้งค่าตัวเลือกที่เกี่ยวข้องเป็น false
ในไฟล์ build.gradle.kts
ตัวเลือกคำเตือนมีดังนี้
baselineProfile {
warnings {
/**
* Warn when the Android Gradle Plugin version is higher than the max
* tested one.
*/
maxAgpVersion = true
/**
* Warn when a benchmark or baseline profile variant has been disabled.
*/
disabledVariants = true
/**
* Warn that running `generateBaselineProfile` with AGP 8.0 doesn't
* support running instrumentation tests for multiple build types at
* once.
*/
multipleBuildTypesWithAgp80 = true
/**
* Warn when no baseline profiles are generated after running the
* generate baseline profile command.
*/
noBaselineProfileRulesGenerated = true
/**
* Warn when no startup profiles are generated after running the generate
* baseline profile command.
*/
noStartupProfileRulesGenerated = true
}
}
กรองกฎโปรไฟล์
ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานช่วยให้คุณกรองกฎของโปรไฟล์พื้นฐานที่สร้างขึ้นได้ ซึ่งจะเป็นประโยชน์อย่างยิ่งสำหรับไลบรารี หากต้องการยกเว้นกฎโปรไฟล์สำหรับคลาสและเมธอดที่เป็นส่วนหนึ่งของการพึ่งพาอื่นๆ ของแอปตัวอย่างหรือไลบรารีเอง ตัวกรองสามารถรวมและยกเว้นแพ็กเกจและคลาสที่เฉพาะเจาะจงได้ เมื่อคุณระบุเฉพาะการยกเว้น ระบบจะยกเว้นเฉพาะกฎของโปรไฟล์พื้นฐานที่ตรงกัน และรวมทุกอย่างไว้
ข้อกําหนดของตัวกรองอาจเป็นค่าใดค่าหนึ่งต่อไปนี้
- ชื่อแพ็กเกจที่ลงท้ายด้วยไวลด์การ์ดคู่เพื่อให้ตรงกับแพ็กเกจที่ระบุและแพ็กเกจย่อยทั้งหมด เช่น
com.example.**
ตรงกับcom.example.method
และcom.example.method.bar
- ชื่อแพ็กเกจที่ลงท้ายด้วยไวลด์การ์ดเพื่อจับคู่กับแพ็กเกจที่ระบุเท่านั้น เช่น
com.example.*
ตรงกับcom.example.method
แต่ไม่ตรงกับcom.example.method.bar
- ชื่อคลาสเพื่อจับคู่กับคลาสที่เฉพาะเจาะจง เช่น
com.example.MyClass
ตัวอย่างต่อไปนี้แสดงวิธีรวมและยกเว้นแพ็กเกจที่เฉพาะเจาะจง
Kotlin
baselineProfile { filter { include("com.somelibrary.widget.grid.**") exclude("com.somelibrary.widget.grid.debug.**") include("com.somelibrary.widget.list.**") exclude("com.somelibrary.widget.list.debug.**") include("com.somelibrary.widget.text.**") exclude("com.somelibrary.widget.text.debug.**") } }
Groovy
baselineProfile { filter { include 'com.somelibrary.widget.grid.**' exclude 'com.somelibrary.widget.grid.debug.**' include 'com.somelibrary.widget.list.**' exclude 'com.somelibrary.widget.list.debug.**' include 'com.somelibrary.widget.text.**' exclude 'com.somelibrary.widget.text.debug.**' } }
ปรับแต่งกฎตัวกรองสําหรับตัวแปรต่างๆ ดังนี้
Kotlin
// Non-specific filters applied to all the variants. baselineProfile { filter { include("com.myapp.**") } } // Flavor-specific filters. baselineProfile { variants { free { filter { include("com.myapp.free.**") } } paid { filter { include("com.myapp.paid.**") } } } } // Build-type-specific filters. baselineProfile { variants { release { filter { include("com.myapp.**") } } } } // Variant-specific filters. baselineProfile { variants { freeRelease { filter { include("com.myapp.**") } } } }
Groovy
// Non-specific filters applied to all the variants. baselineProfile { filter { include 'com.myapp.**' } } // Flavor-specific filters. baselineProfile { variants { free { filter { include 'com.myapp.free.**' } } paid { filter { include 'com.myapp.paid.**' } } } } // Build-type specific filters. baselineProfile { variants { release { filter { include 'com.myapp.**' } } } } // Variant-specific filters. baselineProfile { variants { freeRelease { filter { include 'com.myapp.**' } } } }
นอกจากนี้ คุณยังกรองกฎได้โดยใช้อาร์กิวเมนต์ filterPredicate
ใน BaselineProfileRule.collect()
แต่เราขอแนะนำให้ใช้ปลั๊กอิน Gradle เพื่อกรอง เนื่องจากเป็นวิธีที่ง่ายกว่าในการกรองแพ็กเกจย่อยและที่เดียวในการกำหนดค่าทั้งโมดูล
ปรับแต่งประเภทบิลด์ของการเปรียบเทียบและโปรไฟล์พื้นฐาน
ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานจะสร้างประเภทบิลด์เพิ่มเติมเพื่อสร้างโปรไฟล์และเรียกใช้การเปรียบเทียบ ประเภทบิลด์เหล่านี้จะมีคำนำหน้าเป็น benchmark
และ nonMinified
เช่น สําหรับประเภทบิลด์ release
ปลั๊กอินจะสร้างประเภทบิลด์ benchmarkRelease
และ nonMinifiedRelease
ระบบจะกําหนดค่าประเภทบิลด์เหล่านี้โดยอัตโนมัติสําหรับ Use Case ที่เฉพาะเจาะจง และโดยทั่วไปไม่จําเป็นต้องปรับแต่ง แต่ก็มีบางกรณีที่การใช้ตัวเลือกที่กำหนดเองอาจยังคงมีประโยชน์ เช่น การใช้การกำหนดค่าการรับรองที่แตกต่างกัน
คุณปรับแต่งประเภทบิลด์ที่สร้างขึ้นโดยอัตโนมัติได้โดยใช้พร็อพเพอร์ตี้ประเภทบิลด์ชุดย่อย ระบบจะลบล้างพร็อพเพอร์ตี้ที่ใช้งานไม่ได้ ตัวอย่างต่อไปนี้แสดงวิธีปรับแต่งประเภทการสร้างเพิ่มเติมและพร็อพเพอร์ตี้ที่จะลบล้าง
Kotlin
android { buildTypes { release { ... } create("benchmarkRelease") { // Customize properties for the `benchmarkRelease` build type here. // For example, you can change the signing config (by default // it's the same as for the `release` build type). signingConfig = signingConfigs.getByName("benchmarkRelease") } create("nonMinifiedRelease") { // Customize properties for the `nonMinifiedRelease` build type here. signingConfig = signingConfigs.getByName("nonMinifiedRelease") // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't // customize the following properties, which are always overridden to // avoid breaking Baseline Profile generation: // // isJniDebuggable = false // isDebuggable = false // isMinifyEnabled = false // isShrinkResources = false // isProfileable = true // enableAndroidTestCoverage = false // enableUnitTestCoverage = false } } }
Groovy
android { buildTypes { release { ... } benchmarkRelease { // Customize properties for the `benchmarkRelease` build type here. // For example, you can change the signing config (by default it's the // same as for the `release` build type.) signingConfig = signingConfigs.benchmarkRelease } nonMinifiedRelease { // Customize properties for the `nonMinifiedRelease` build type here. signingConfig = signingConfigs.nonMinifiedRelease // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't use // the following properties, which are always overridden to avoid breaking // Baseline Profile generation: // // isJniDebuggable = false // isDebuggable = false // isMinifyEnabled = false // isShrinkResources = false // isProfileable = true // enableAndroidTestCoverage = false // enableUnitTestCoverage = false } } }
หมายเหตุเพิ่มเติม
สิ่งที่ควรทราบเพิ่มเติมเมื่อสร้างโปรไฟล์พื้นฐานมีดังนี้
โปรไฟล์พื้นฐานที่คอมไพล์แล้วต้องมีขนาดเล็กกว่า 1.5 MB การดำเนินการนี้ไม่ส่งผลต่อรูปแบบข้อความในไฟล์ต้นทาง ซึ่งโดยทั่วไปจะมีขนาดใหญ่กว่ามากก่อนการคอมไพล์ ยืนยันขนาดของโปรไฟล์พื้นฐานแบบไบนารีโดยค้นหาในอาร์ติแฟกต์เอาต์พุตในส่วน
assets/dexopt/baseline.prof
สำหรับ APK หรือBUNDLE-METADATA/com.android.tools.build.profiles/baseline.prof
สำหรับ AABกฎทั่วไปที่คอมไพล์แอปพลิเคชันมากเกินไปอาจทำให้การเริ่มต้นทำงานช้าลงเนื่องจากการเข้าถึงดิสก์ที่เพิ่มขึ้น ไม่ต้องกังวลเกี่ยวกับเรื่องนี้หากคุณเพิ่งเริ่มใช้โปรไฟล์พื้นฐาน อย่างไรก็ตาม การเพิ่มเส้นทางจำนวนมากอาจส่งผลให้ประสิทธิภาพไม่เป็นไปตามที่ต้องการ ทั้งนี้ขึ้นอยู่กับแอปของคุณ รวมถึงขนาดและจํานวนเส้นทาง ทดสอบประสิทธิภาพของแอปโดยลองใช้โปรไฟล์ต่างๆ และตรวจสอบว่าประสิทธิภาพไม่ได้ลดลงหลังจากการเพิ่ม