หากพบปัญหาด้านประสิทธิภาพที่เกิดจากการจัดองค์ประกอบใหม่ที่ไม่จำเป็นหรือมากเกินไป คุณควรแก้ไขข้อบกพร่องด้านความเสถียรของแอป คู่มือนี้จะอธิบายวิธีการต่างๆ ในการดำเนินการดังกล่าว
เครื่องมือตรวจสอบเลย์เอาต์
เครื่องมือตรวจสอบเลย์เอาต์ใน Android Studio ช่วยให้คุณดูได้ว่า Composable ใดที่ ทำการ Recompose ในแอป โดยจะแสดงจำนวนครั้งที่ Compose ทำการ Recompose หรือข้ามคอมโพเนนต์

เขียนรายงานคอมไพเลอร์
คอมไพเลอร์ 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: รายงานที่เขียนได้ของ Composable เวอร์ชัน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 ว่าไม่เสถียร