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

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

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

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

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

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

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

วิธีแก้ไข: เพิ่มกฎการเก็บรักษา

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

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

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

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

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

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

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

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

    หากต้องการใช้ retrace ให้ระบุคำสั่งพร้อมเส้นทางไปยังไฟล์การแมปและไฟล์ Stack Trace ระบบจะรวมไฟล์การแมปที่ชื่อ 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 ไม่ได้ โปรดรายงานข้อบกพร่อง