โดยค่าเริ่มต้น R8 จะเพิ่มประสิทธิภาพหลายอย่างเพื่อปรับปรุงประสิทธิภาพและขนาด แต่การเพิ่มประสิทธิภาพอาจไม่ส่งผลกับแอปของคุณในทันที หากคุณเปิด R8 (หรือเปิดใช้โหมดเต็ม) ในแอปขนาดใหญ่เป็นครั้งแรก ให้ลองใช้การเพิ่มประสิทธิภาพแบบค่อยเป็นค่อยไป โดยปิดการสร้างความสับสนชั่วคราวและเปิดใช้ R8 กับโค้ดบางส่วนในแต่ละครั้งแทนที่จะใช้กับโค้ดทั้งหมดในแอป เราขอแนะนำให้ใช้แนวทางแบบค่อยเป็นค่อยไปนี้ในระหว่างการพัฒนาในเครื่อง แต่คุณก็ใช้แนวทางนี้ในระหว่างการทดสอบ QA ภายในหรือแม้แต่ในเวอร์ชันที่ใช้งานจริงแบบค่อยเป็นค่อยไปก็ได้ ขั้นตอนที่แน่นอนที่คุณต้องทำจะขึ้นอยู่กับลำดับเวลาที่คุณต้องการและความมั่นใจในการครอบคลุมการทดสอบเวอร์ชันทดลอง
จํากัดการเพิ่มประสิทธิภาพ
R8 เพิ่มประสิทธิภาพได้หลายประเภท เช่น การนำโค้ดออก เขียนโค้ดใหม่ และนำทรัพยากรออก คําอธิบายระดับสูงของประเภทการเพิ่มประสิทธิภาพมีดังนี้
- การลดขนาดโค้ด (หรือ Tree Shaking): นำโค้ดที่ไม่ได้อ้างอิงออก
- การสร้างความสับสน (หรือการปรับขนาดตัวระบุให้เล็กลง): ย่อชื่อคลาสและเมธอด
- การเพิ่มประสิทธิภาพ: เขียนโค้ดใหม่ เช่น การฝัง
คุณอาจเริ่มด้วยการเปิดใช้การเพิ่มประสิทธิภาพเพียงบางส่วนเพื่อลดโอกาสที่จะเกิดข้อผิดพลาด
เปิดใช้การสั่นต้นไม้เท่านั้น
การลดขนาดโค้ดหรือที่เรียกว่า Tree Shaking จะนําโค้ดที่ดูเหมือนว่าไม่มีการใช้งานออก เราขอแนะนำให้เริ่มด้วยการสั่นต้นไม้เพียงอย่างเดียว เนื่องจากเป็นวิธีที่ตรงไปตรงมาที่สุด
หากต้องการเปิดใช้ Tree Shaking เท่านั้น ให้เพิ่มข้อมูลต่อไปนี้ลงในไฟล์ proguard-rules.pro
เพื่อปิดการเพิ่มประสิทธิภาพประเภทอื่นๆ การปิดการสร้างความสับสนเป็นสิ่งสำคัญเนื่องจากจะช่วยให้อ่านสแต็กเทรซได้ง่ายขึ้นมาก
-dontobfuscate // Use temporarily to turn off identifier minification
-dontoptimize // Use temporarily to turn off optimization
ท้ายที่สุดแล้ว คุณจะไม่ต้องการเผยแพร่การกําหนดค่านี้ เนื่องจากจะจํากัดความสามารถของ R8 ในการเพิ่มประสิทธิภาพโค้ดอย่างมาก แต่นี่เป็นจุดเริ่มต้นที่ยอดเยี่ยมเมื่อนํา R8 ไปใช้เป็นครั้งแรกในโค้ดเบสขนาดใหญ่ที่มีปัญหาที่ต้องแก้ไข
ใช้โหมดความเข้ากันได้
โดยค่าเริ่มต้น R8 จะทำงานในโหมดเต็มรูปแบบ โหมดเต็มรูปแบบจะปรับปรุงประสิทธิภาพและประหยัดพื้นที่ได้อย่างมาก แต่คุณปิดใช้โหมดนี้ชั่วคราวและใช้โหมดความเข้ากันได้แทนได้เมื่อเปิดใช้การย่อโค้ดเป็นครั้งแรก
หากต้องการใช้โหมดความเข้ากันได้ ให้ใช้การตั้งค่าต่อไปนี้ในไฟล์ gradle.properties
android.enableR8.fullMode = false // Use temporarily to disable full mode
เปิดใช้การเพิ่มประสิทธิภาพที่เหลือ
เมื่อยืนยันว่าการสั่นต้นไม้ทํางานกับแอปของคุณแล้ว คุณสามารถนําการตั้งค่าก่อนหน้าออกเพื่อเปิดใช้การสร้างความสับสน การเพิ่มประสิทธิภาพ และโหมด R8 แบบเต็มอีกครั้ง โปรดทราบว่าการสร้างความสับสนอาจทําให้การแก้ไขข้อบกพร่องยากขึ้น เราจึงแนะนําให้แก้ไขปัญหาการแยกไฟล์ทรีก่อน
ดูข้อมูลเพิ่มเติมเกี่ยวกับการถอดรหัสซอร์สโค้ดที่สร้างความสับสนของสแต็กเทรซได้ที่ส่วนกู้คืนสแต็กเทรซเดิม
จํากัดขอบเขตการเพิ่มประสิทธิภาพ
บิลด์ที่ได้รับการเพิ่มประสิทธิภาพอย่างเต็มรูปแบบจะเพิ่มประสิทธิภาพโค้ดทั้งหมดในไลบรารีและแพ็กเกจทุกรายการ ดังนั้นจึงเป็นเรื่องปกติที่อาจพบปัญหาเกี่ยวกับ R8 เมื่อเปิดใช้งานเป็นครั้งแรก หากพบปัญหาเกี่ยวกับการเพิ่มประสิทธิภาพในส่วนใดส่วนหนึ่งของแอป อย่าปิด R8 ทั้งหมด ไม่เช่นนั้นคุณจะเสียสิทธิ์รับสิทธิประโยชน์ในส่วนอื่นๆ แต่ให้ปิดใช้ R8 ชั่วคราวในส่วนที่แอปของคุณก่อให้เกิดปัญหาเท่านั้น
ใช้กฎการเก็บรักษาทั้งแพ็กเกจ
เราขอแนะนำให้ใช้กฎการคงไว้ทั่วทั้งแพ็กเกจเพื่อปิดใช้ R8 ชั่วคราวในส่วนต่างๆ ของแอป คุณควรกลับมาแก้ไขปัญหาการเพิ่มประสิทธิภาพเหล่านี้ในภายหลังเสมอ เนื่องจากโดยทั่วไปแล้ววิธีนี้เป็นวิธีแก้ปัญหาชั่วคราวเพื่อแก้ปัญหาเฉพาะจุด
เช่น หากส่วนหนึ่งของแอปใช้ Gson อย่างมากและก่อให้เกิดปัญหาในการเพิ่มประสิทธิภาพ วิธีแก้ไขที่เหมาะสมคือเพิ่มกฎการเก็บที่กําหนดเป้าหมายหรือเปลี่ยนไปใช้โซลูชัน codegen แต่หากต้องการปลดล็อกการเพิ่มประสิทธิภาพส่วนที่เหลือของแอป ให้วางโค้ดที่กําหนดประเภท Gson ไว้ในแพ็กเกจย่อยเฉพาะ แล้วเพิ่มกฎต่อไปนี้ลงในไฟล์ proguard-rules.pro
-keep class com.myapp.json.** { *; }
หากไลบรารีบางรายการที่คุณใช้มีการสะท้อนกลับไปยังคอมโพเนนต์ภายใน คุณก็เพิ่มกฎการเก็บรักษาสำหรับทั้งไลบรารีได้เช่นกัน คุณจะต้องตรวจสอบโค้ดหรือ JAR/AAR ของไลบรารีเพื่อหาแพ็กเกจที่เหมาะสมที่จะเก็บไว้ เราขอย้ำว่าไม่แนะนำให้ใช้วิธีนี้ในระยะยาว แต่วิธีนี้จะช่วยเลิกบล็อกการเพิ่มประสิทธิภาพของแอปส่วนที่เหลือได้
-keep class com.somelibrary.** { *; }
นำกฎการเก็บรักษาทั้งแพ็กเกจออก
เมื่อแอปทํางานได้อย่างถูกต้องด้วยกฎการเก็บรักษาทั้งแพ็กเกจแล้ว คุณควรย้อนกลับไปเพิ่มกฎการเก็บรักษาแบบมีเป้าหมาย หรือนําการใช้งานหรือไลบรารีการสะท้อนกลับซึ่งจําเป็นต้องใช้กฎการเก็บรักษาออกตั้งแต่แรก
ตัวอย่างเช่น การเก็บกฎทั้งหมดที่ขยายคลาสหนึ่งๆ เป็นแนวทางปฏิบัติที่พบได้ทั่วไปใน AndroidX เพื่อเก็บเฉพาะคลาสที่เกี่ยวข้อง โดยทั่วไปแล้ว การสะท้อนกลับควรกำหนดเป้าหมายไปยังคลาสหรือเมธอดที่ขยายคลาสนามธรรมบางคลาส ใช้อินเทอร์เฟซบางรายการ หรือไปยังคลาสที่มีคำอธิบายประกอบรันไทม์ที่เฉพาะเจาะจงเท่านั้น แต่ละวิธีเหล่านี้เป็นวิธีที่ใช้กำหนดกฎการเก็บรักษาได้ คุณจึงไม่จำเป็นต้องใช้กฎการเก็บรักษาทั้งแพ็กเกจในแอปเวอร์ชันสุดท้ายที่เพิ่มประสิทธิภาพแล้ว