วินิจฉัยปัญหาด้านความเสถียร

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

เครื่องมือตรวจสอบเลย์เอาต์

เครื่องมือตรวจสอบเลย์เอาต์ใน 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 ว่าไม่เสถียร