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

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

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

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