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

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

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

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