เนื่องจากการเพิ่มประสิทธิภาพของ 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 ไม่ได้ โปรดรายงานข้อบกพร่อง