หากพบปัญหาด้านประสิทธิภาพที่เป็นผลมาจากสิ่งที่ไม่จำเป็นหรือ การจัดองค์ประกอบใหม่มากเกินไป คุณควรแก้ไขข้อบกพร่องเรื่องความเสถียรของแอป คู่มือนี้ ได้ระบุวิธีการหลายวิธีในการดำเนินการดังกล่าว
เครื่องมือตรวจสอบเลย์เอาต์
เครื่องมือตรวจสอบเลย์เอาต์ใน Android Studio ช่วยให้คุณเห็นว่า Composable ใด การเขียนใหม่ในแอป โดยจะแสดงจำนวนครั้งที่ Compose เขียนใหม่หรือข้ามคอมโพเนนต์
เขียนรายงานคอมไพเลอร์
คอมไพเลอร์ Compose สามารถแสดงผลลัพธ์ของการอนุมานความเสถียรสำหรับ การตรวจสอบ เมื่อใช้เอาต์พุตนี้ คุณจะระบุได้ว่า Composable รายการใด ข้ามได้ และข้ามไม่ได้ ส่วนย่อยต่อไปนี้จะสรุปวิธีใช้เครื่องมือเหล่านี้ แต่หากต้องการข้อมูลโดยละเอียดเพิ่มเติม โปรดดูเทคนิค เอกสารประกอบ
ตั้งค่า
ไม่ได้เปิดใช้งานการเขียนรายงานคอมไพเลอร์โดยค่าเริ่มต้น คุณสามารถเปิดใช้งานด้วย
ธงคอมไพเลอร์ การตั้งค่าที่แน่นอนจะแตกต่างกันไปตาม
แต่สำหรับโปรเจ็กต์ที่ใช้ปลั๊กอิน Gradle ของคอมไพเลอร์ Compose คุณจะทำสิ่งต่อไปนี้ได้
เพิ่มโค้ดต่อไปนี้ในแต่ละไฟล์ build.gradle
ของโมดูล
android { ... }
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
ในตอนนี้ระบบจะสร้างรายงานคอมไพเลอร์เมื่อสร้างโปรเจ็กต์
ตัวอย่างเอาต์พุต
reportsDestination
มีเอาต์พุต 3 ไฟล์ ต่อไปนี้เป็นตัวอย่างเอาต์พุต
จาก JetSnack
<modulename>-classes.txt
: รายงานเกี่ยวกับความเสถียรของชั้นเรียนใน ตัวอย่าง<modulename>-composables.txt
: รายงานเกี่ยวกับวิธีรีสตาร์ทและ Composable จะอยู่ในโมดูลแบบข้ามได้ ตัวอย่าง<modulename>-composables.csv
:รายงาน Composable เวอร์ชันCSV
ที่คุณสามารถนำเข้าไปยังสเปรดชีตหรือประมวลผลโดยใช้สคริปต์ ตัวอย่าง
รายงาน Composable
ไฟล์ 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
Composable ข้ามไม่ได้ การเขียนไม่เคยข้ามเพลงนั้นไป
ระหว่างการจัดองค์ประกอบใหม่ ซึ่งจะเกิดขึ้นแม้ว่าจะไม่มีการเปลี่ยนแปลงพารามิเตอร์ใดๆ เลย
สาเหตุคือพารามิเตอร์ 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
ไม่เสถียร