แก้ไขปัญหาการเพิ่มประสิทธิภาพ

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

ขณะแก้ปัญหา ให้มุ่งเน้นไปที่สถานการณ์ต่อไปนี้

  • การเพิ่มประสิทธิภาพมากเกินไปจนทำให้แอปขัดข้อง: แอปขัดข้องเนื่องจาก R8 เพิ่มประสิทธิภาพโค้ดมากเกินไป
  • การเพิ่มประสิทธิภาพไม่ชัดเจนหรือไม่เพียงพอ: R8 ไม่ได้เพิ่มประสิทธิภาพแอปมากเท่าที่คุณคาดไว้ หรือคุณต้องการคำอธิบายเพิ่มเติมเกี่ยวกับการเพิ่มประสิทธิภาพ

การขัดข้องของแอป

หากแอปขัดข้องหลังจากเพิ่มประสิทธิภาพด้วย R8 โดยปกติแล้วจะเป็นเพราะการสะท้อนที่เสียหาย ใช้หลักเกณฑ์ต่อไปนี้เพื่อระบุการสะท้อนที่เสียหาย

  • คุณพบข้อยกเว้นที่หมายความว่ามีการใช้คลาส เมธอด หรือฟิลด์ที่ระบุผ่านการสะท้อน โดยปกติแล้วข้อยกเว้นเหล่านี้จะเป็นหนึ่งในข้อยกเว้นต่อไปนี้ ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, NoClassDefFoundError, NoSuchMethodError, NoSuchFieldError
  • คุณเห็นโค้ดที่อ้างอิงการสะท้อนด้วย import kotlin.reflect.* หรือ import java.lang.reflect.*
  • คุณเห็นการใช้ตัวสร้างคลาสในรูปแบบต่อไปนี้ Something::class.constructors
  • คุณเห็น Class.forName(...)

วิธีแก้ไข: เพิ่มกฎ Keep

หากโค้ดของคุณเองทำการสะท้อน คุณสามารถใส่คำอธิบายประกอบโค้ดนั้นด้วย คำอธิบายประกอบ Jetpack Keep แทนการเพิ่มกฎ Keep การตรวจสอบ Lint ของ Jetpack Keep ยังตั้งค่าสถานะการเรียกแบบสะท้อนอื่นๆ ที่ไม่ได้ใส่คำอธิบายประกอบ ซึ่งจะช่วยป้องกันไม่ให้เกิดข้อขัดข้องที่คล้ายกัน

การเพิ่มประสิทธิภาพไม่ชัดเจนหรือไม่เพียงพอ

เนื่องจากระบบจะใช้กฎจากแอปและจากไลบรารีที่รวมไว้ คุณอาจต้องมีความชัดเจนเพิ่มเติมเกี่ยวกับกฎที่ใช้ หรือต้องการคำอธิบายว่าเหตุใด R8 จึงเก็บส่วนของโค้ดบางส่วนไว้ซึ่งคุณคาดว่าจะมีการเพิ่มประสิทธิภาพ

  • ความคลุมเครือเกี่ยวกับกฎที่ใช้: เนื่องจากกฎจากไลบรารีที่รวมไว้ จะมีผลกับแอปของคุณด้วย และตัวเลือกส่วนกลางจากไลบรารีเหล่านี้จะ แพร่ไปยังแอปของคุณด้วย คุณจึงอาจไม่แน่ใจว่ากฎใดที่ใช้

    วิธีแก้ไข: ตรวจสอบกฎที่ใช้โดยดูรายงานกฎทั้งหมดที่ R8 ใช้เมื่อสร้างโปรเจ็กต์ คุณดูรายงานนี้ได้ที่ ./app/build/outputs/mapping/configuration.txt รายงานนี้มีกฎที่ผสานทั้งหมดจากทุกไลบรารีและโมดูลที่ใช้ในการกำหนดค่า R8 และสามารถใช้เพื่อระบุกฎที่ไม่มีประสิทธิภาพ

  • การเก็บโค้ดไว้มากเกินไป: การเพิ่มประสิทธิภาพของ R8 อาจเก็บโค้ดที่คุณ คาดว่าจะนำออก

    วิธีแก้ไข: ใช้ตัวเลือกการกำหนดค่า -whyareyoukeeping เพื่อช่วย ให้เข้าใจว่าเหตุใดจึงเก็บโค้ดไว้ เอาต์พุตจะมีเส้นทางจากโค้ดที่เก็บไว้ไปยังจุดแรกเข้าของแอป ดูข้อมูลเพิ่มเติมได้ที่ -whyareyoukeeping

  • ความยากในการทำความเข้าใจสแต็กเทรซเดิม: R8 เปลี่ยนโค้ดในรูปแบบต่างๆ ซึ่งทำให้สแต็กเทรซไม่ได้อ้างอิงโค้ดเดิมอีกต่อไป เช่น หมายเลขบรรทัด รวมถึงชื่อคลาสและเมธอดอาจมีการเปลี่ยนแปลง

    วิธีแก้ไข: ตั้งแต่ Android Studio Otter 3 Feature Drop และ AGP 9.0 เป็นต้นไป Logcat จะยกเลิกการปกปิดสแต็กเทรซโดยอัตโนมัติ อย่างไรก็ตาม หากคุณใช้ Android Studio เวอร์ชันก่อนหน้า คุณจะต้องกู้คืนสแต็กเทรซเดิมด้วยตนเอง หากต้องการกู้คืนสแต็กเทรซเดิม ให้ใช้เครื่องมือบรรทัดคำสั่ง retrace ซึ่งรวมอยู่ในแพ็กเกจ เครื่องมือบรรทัดคำสั่ง

    หากต้องการใช้ retrace ให้ระบุเส้นทางไปยังไฟล์การแมปและไฟล์สแต็กเทรซพร้อมกับคำสั่ง ระบบจะรวมไฟล์การแมปที่ชื่อ mapping.txt ไว้กับ Android App Bundle (AAB) โดยอัตโนมัติ ดูรายละเอียดเพิ่มเติมได้ในเอกสารประกอบ retrace และบทความในศูนย์ช่วยเหลือของ Play Console เกี่ยวกับ วิธียกเลิกการปกปิด Stack Trace ของข้อขัดข้อง เมื่อใช้ Play และ Firebase Crashlytics ให้ใช้ไฟล์ mapping.txt กับข้อขัดข้องที่บริการรวบรวมจากผู้ใช้แอป คำสั่งต่อไปนี้แสดงวิธีเรียกใช้ retrace จากรูทของโปรเจ็กต์

    $ANDROID_HOME/cmdline-tools/latest/bin/retrace app/build/outputs/mapping/$releaseVariant/mapping.txt trace.txt
    

รายงานข้อบกพร่อง

หากแก้ปัญหาเกี่ยวกับ R8 ไม่ได้ ให้ยื่นรายงานข้อบกพร่อง