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