ใช้การเพิ่มประสิทธิภาพทีละส่วน

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

จำกัดการเพิ่มประสิทธิภาพ

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

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

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

เปิดใช้เฉพาะ Tree Shaking

การลดขนาดโค้ด หรือที่เรียกว่า 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

เปิดใช้การเพิ่มประสิทธิภาพที่เหลือ

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับการถอดรหัสสแต็กเทรซได้ที่ กู้คืนสแต็กเทรซเดิม

จำกัดขอบเขตการเพิ่มประสิทธิภาพ

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

ใช้กฎการเก็บระดับแพ็กเกจ

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

ตัวอย่างเช่น หากแอปบางส่วนใช้ Gson อย่างหนักและทำให้เกิดปัญหาเกี่ยวกับ การเพิ่มประสิทธิภาพ วิธีแก้ปัญหาที่เหมาะสมคือการเพิ่ม กฎการเก็บที่ตรงเป้าหมายมากขึ้นหรือเปลี่ยนไปใช้โซลูชันการสร้างโค้ด แต่หากต้องการยกเลิกการบล็อกการเพิ่มประสิทธิภาพส่วนที่เหลือของแอป คุณสามารถวางโค้ดที่กำหนดประเภท Gson ไว้ในแพ็กเกจย่อยเฉพาะ และเพิ่มกฎต่อไปนี้ลงในไฟล์ proguard-rules.pro

-keep class com.myapp.json.** { *; }

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

-keep class com.somelibrary.** { *; }

นำกฎการเก็บระดับแพ็กเกจออก

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

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

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