หากพบปัญหาด้านประสิทธิภาพที่เกิดจากการประกอบใหม่ที่ไม่จำเป็นหรือมากเกินไป คุณควรแก้ไขข้อบกพร่องของความเสถียรของแอป คู่มือนี้จะอธิบายวิธีการต่างๆ ในการดำเนินการดังกล่าว
เครื่องมือตรวจสอบเลย์เอาต์
เครื่องมือตรวจสอบเลย์เอาต์ใน Android Studio ช่วยให้คุณดูได้ว่า Composable ใดที่ กำลังทำการประกอบใหม่ในแอป โดยจะแสดงจำนวนครั้งที่ Compose ทำการ ประกอบใหม่หรือข้ามคอมโพเนนต์
เขียนรายงานคอมไพเลอร์
คอมไพเลอร์ Compose สามารถแสดงผลลัพธ์ของการอนุมานความเสถียรเพื่อ การตรวจสอบได้ เอาต์พุตนี้ช่วยให้คุณระบุได้ว่า Composable ใดที่ ข้ามได้ และ Composable ใดที่ข้ามไม่ได้ ส่วนย่อยต่อไปนี้จะสรุปวิธีใช้รายงานเหล่านี้ แต่หากต้องการข้อมูลโดยละเอียดเพิ่มเติม โปรดดูเอกสารประกอบทางเทคนิค
ตั้งค่า
ระบบไม่ได้เปิดใช้รายงานคอมไพเลอร์ Compose โดยค่าเริ่มต้น คุณเปิดใช้งานได้ด้วย
แฟล็กคอมไพเลอร์ การตั้งค่าที่แน่นอนจะแตกต่างกันไปตามโปรเจ็กต์ แต่สำหรับโปรเจ็กต์ที่ใช้ปลั๊กอิน Gradle ของคอมไพเลอร์ Compose คุณสามารถเพิ่มสิ่งต่อไปนี้ในไฟล์ build.gradle
ของแต่ละโมดูล
android { ... }
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
ตอนนี้ระบบจะสร้างรายงานคอมไพเลอร์ Compose เมื่อสร้างโปรเจ็กต์
ตัวอย่างเอาต์พุต
reportsDestination
จะแสดงผล 3 ไฟล์ เอาต์พุตตัวอย่างจาก JetSnack มีดังนี้
<modulename>-classes.txt
: รายงานเกี่ยวกับความเสถียรของคลาสในโมดูลนี้ ตัวอย่าง<modulename>-composables.txt
: รายงานเกี่ยวกับความสามารถในการรีสตาร์ทและข้ามได้ของ Composable ในโมดูล ตัวอย่าง<modulename>-composables.csv
: รายงานที่เขียนได้ของCSV
ที่คุณนำเข้าลงในสเปรดชีตหรือประมวลผลโดยใช้สคริปต์ได้ ตัวอย่าง
รายงาน Composables
composables.txt
รายละเอียดไฟล์แต่ละฟังก์ชันที่ใช้ร่วมกันได้สำหรับโมดูลที่กำหนด
รวมถึงความเสถียรของพารามิเตอร์ และระบุว่าฟังก์ชันนั้น
เริ่มใหม่ได้หรือข้ามได้ ต่อไปนี้เป็นตัวอย่างสมมติจาก
JetSnack
restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun SnackCollection(
stable snackCollection: SnackCollection
stable onSnackClick: Function1<Long, Unit>
stable modifier: Modifier? = @static Companion
stable index: Int = @static 0
stable highlight: Boolean = @static true
)
SnackCollection
Composable นี้สามารถรีสตาร์ท ข้าม และ
เสถียรได้อย่างสมบูรณ์ โดยทั่วไปแล้วเราขอแนะนำให้ทำเช่นนี้ แต่ก็ไม่ได้บังคับ
ในทางกลับกัน มาดูอีกตัวอย่างหนึ่งกัน
restartable scheme("[androidx.compose.ui.UiComposable]") fun HighlightedSnacks(
stable index: Int
unstable snacks: List<Snack>
stable onSnackClick: Function1<Long, Unit>
stable modifier: Modifier? = @static Companion
)
HighlightedSnacks
ที่ใช้ร่วมกันจะข้ามไม่ได้ Compose จะไม่ข้ามการดำเนินการนี้
ในระหว่างการจัดองค์ประกอบใหม่ ซึ่งจะเกิดขึ้นแม้ว่าจะไม่มีการเปลี่ยนแปลงพารามิเตอร์ใดๆ ก็ตาม
สาเหตุของปัญหานี้คือพารามิเตอร์ unstable
snacks
รายงานชั้นเรียน
ไฟล์ classes.txt
มีรายงานที่คล้ายกันเกี่ยวกับคลาสในโมดูลที่ระบุ
ข้อมูลโค้ดต่อไปนี้คือเอาต์พุตสำหรับคลาส Snack
unstable class Snack {
stable val id: Long
stable val name: String
stable val imageUrl: String
stable val price: Long
stable val tagline: String
unstable val tags: Set<String>
<runtime stability> = Unstable
}
เพื่อเป็นข้อมูลอ้างอิง คำจำกัดความของ Snack
มีดังนี้
data class Snack(
val id: Long,
val name: String,
val imageUrl: String,
val price: Long,
val tagline: String = "",
val tags: Set<String> = emptySet()
)
คอมไพเลอร์ Compose ได้ทำเครื่องหมาย Snack
ว่าไม่เสถียร เนื่องจากประเภทของพารามิเตอร์ tags
คือ Set<String>
เนื่องจากไม่ใช่ MutableSet
จึงเป็นประเภทที่แก้ไขไม่ได้ อย่างไรก็ตาม คลาสคอลเล็กชันมาตรฐาน เช่น Set
,
List
และ Map
เป็นอินเทอร์เฟซในท้ายที่สุด ดังนั้น การใช้งานพื้นฐานอาจยังคงเปลี่ยนแปลงได้
เช่น คุณอาจเขียนว่า val set: Set<String> = mutableSetOf("foo")
ตัวแปรเป็นค่าคงที่และประเภทที่ประกาศไม่สามารถเปลี่ยนแปลงได้ แต่ยังเปลี่ยนแปลงการใช้งานได้ คอมไพเลอร์ Compose ไม่สามารถยืนยันได้ว่าคลาสนี้
เปลี่ยนแปลงไม่ได้ เนื่องจากเห็นเฉพาะประเภทที่ประกาศไว้ จึงทำเครื่องหมาย tags
ว่าไม่เสถียร