ใช้เครื่องมือวิเคราะห์การกำหนดค่า R8

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

สร้างรายงาน

เมื่อใช้ AGP 9.3.0 ขึ้นไป คุณจะสร้างรายงานเครื่องมือวิเคราะห์การกำหนดค่า R8 ได้โดยใช้ Gradle Task แบบสแตนด์อโลนโดยเฉพาะ หรือสร้างโดยอัตโนมัติระหว่างการสร้าง R8

เรียกใช้ Gradle Task แบบสแตนด์อโลน (แนะนำให้ใช้ในเครื่อง)

เมื่อมีการทำซ้ำกฎการเก็บอย่างต่อเนื่อง ให้ใช้ Gradle Task แบบสแตนด์อโลนเพื่อประเมินผลกระทบของการเปลี่ยนแปลงอย่างรวดเร็วโดยไม่ต้องสร้าง APK หรือ App Bundle อย่างเต็มรูปแบบ

./gradlew :app:analyzeReleaseR8Config

เนื่องจาก Task นี้จะข้ามการสร้าง APK หรือ App Bundle จึงทำให้วงจรความคิดเห็นสั้นลงมาก ซึ่งจะช่วยให้คุณวิเคราะห์ได้อย่างรวดเร็วว่ากฎการเก็บส่งผลต่อคะแนนการลดขนาด การเพิ่มประสิทธิภาพ และการปรับให้ยากต่อการอ่าน (Obfuscation) อย่างไร และปรับแต่งกฎเหล่านั้นได้ทันที ระบบจะสร้างรายงาน HTML ที่ app/build/reports/r8/r8-config-analyzer-release.html

สร้างโดยอัตโนมัติระหว่างการสร้างปกติ

เมื่อเรียกใช้บิลด์ที่เผยแพร่ R8 เวอร์ชันเต็ม (เช่น assembleRelease) ระบบจะสร้างรายงานโดยอัตโนมัติที่ build/outputs/mapping/release/configanalyzer.html หากต้องการปิดใช้การสร้างเอาต์พุตโดยอัตโนมัติระหว่างการสร้างปกติ ให้ตั้งค่าพร็อพเพอร์ตี้ Gradle ต่อไปนี้

android.experimental.r8.enableR8ConfigurationAnalyzer=false

สำหรับ AGP 9.2 และเวอร์ชันก่อนหน้า

สำหรับ AGP 9.2 และเวอร์ชันก่อนหน้า ให้ตั้งค่า com.android.tools.r8.dumpkeepradiushtmltodirectoryพร็อพเพอร์ตี้ระบบเมื่อ เรียกใช้ Gradle Task ที่มีการสร้างที่เปิดใช้ R8

./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>

ตัวอย่างเช่น ใช้คำสั่งต่อไปนี้เพื่อสร้างรายงาน HTML ในไดเรกทอรี /tmp/r8analysis

# To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis

# To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
    -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis

ทำความเข้าใจเกี่ยวกับรายงาน

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

ตัวอย่างส่วนสรุปรายงาน
รูปที่ 1 ตัวอย่างส่วนข้อมูลสรุปของรายงาน

คะแนนการลดขนาด

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

คะแนนการเพิ่มประสิทธิภาพ

R8 จะเพิ่มประสิทธิภาพ เช่น การแทนที่การเรียกเมธอดด้วยเนื้อหาของเมธอด (Method Inlining) และการผสานคลาส ซึ่งจะช่วยปรับปรุงการเริ่มต้นและการใช้หน่วยความจำของแอป คะแนนการเพิ่มประสิทธิภาพจะติดตามเปอร์เซ็นต์ของคลาส ฟิลด์ และเมธอดที่อาจมีการเพิ่มประสิทธิภาพ R8 ตัวอย่างเช่น หากคะแนนการเพิ่มประสิทธิภาพอยู่ที่ 66% หมายความว่า R8 สามารถเพิ่มประสิทธิภาพฐานของโค้ดได้เพียง 66%

คะแนนการปรับให้ยากต่อการอ่าน (Obfuscation)

R8 จะลดขนาดข้อมูลเมตาของแอปเพื่อประหยัดหน่วยความจำโดยการปรับให้คลาส ฟิลด์ และเมธอดต่างๆ มีชื่อสั้นลง คะแนนการปรับให้ยากต่อการอ่าน (Obfuscation) จะวัดเปอร์เซ็นต์ของโค้ดที่พร้อมสำหรับการปรับให้ยากต่อการอ่าน (Obfuscation) ภายในฐานของโค้ด

ปรับแต่งกฎการเก็บ

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

หากต้องการทำเช่นนี้ ให้ใช้การวิเคราะห์กฎการเก็บ

ตัวอย่างการวิเคราะห์กฎการเก็บรักษา
รูปที่ 2. ตัวอย่างการวิเคราะห์กฎการเก็บ

หากต้องการดูการวิเคราะห์โดยละเอียดของกฎ ให้คลิกกฎเพื่อเปิดหน้าจอรายละเอียด

ตัวอย่างการวิเคราะห์กฎการเก็บรักษา
รูปที่ 3. ตัวอย่างการวิเคราะห์กฎการเก็บ

วิธีปรับแต่งกฎการเก็บ

หากต้องการปรับแต่งกฎการเก็บและปลดล็อกศักยภาพสูงสุดของการเพิ่มประสิทธิภาพ R8 สำหรับแอป ให้ทำดังนี้

  1. สำหรับกฎการเก็บแต่ละรายการ ให้ดูเปอร์เซ็นต์ของคลาส ฟิลด์ และเมธอดที่ R8 เพิ่มประสิทธิภาพไม่ได้ในเครื่องมือวิเคราะห์การกำหนดค่า ใช้ข้อมูลนี้เพื่อระบุกฎการเก็บที่ป้องกันการเพิ่มประสิทธิภาพในคลาส ฟิลด์ หรือเมธอดจำนวนมาก นอกจากนี้ ระบบยังแสดงพร็อพเพอร์ตี้การเพิ่มประสิทธิภาพที่กฎการเก็บแต่ละรายการป้องกันไว้ด้วย
  2. หากเห็นกฎการเก็บที่ป้องกันการเพิ่มประสิทธิภาพคลาสจำนวนมาก คุณควรตรวจสอบคลาส ฟิลด์ และเมธอดที่กฎการเก็บป้องกันไม่ให้เพิ่มประสิทธิภาพ เพื่อดูว่ากฎนี้เก็บรายการที่ไม่ได้เรียกใช้แบบไดนามิกโดยใช้การสะท้อน (Reflection) หรือไม่
  3. ลดการเพิ่มประสิทธิภาพที่กฎการเก็บบล็อกโดยกำหนดเป้าหมายเฉพาะ คลาส ฟิลด์ หรือเมธอดที่จำเป็นด้วยการเลือกตัวเลือกการเก็บที่เหมาะสมและ ทำตามแนวทางปฏิบัติแนะนำ
  4. ตรวจสอบและเรียกใช้การทดสอบที่ครอบคลุมคลาส ฟิลด์ และเมธอดที่ได้รับผลกระทบของกฎการเก็บ แล้วปรับแต่งกฎการเก็บ

ตรวจสอบการเพิ่มประสิทธิภาพไลบรารี

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

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

วิธีเพิ่มประสิทธิภาพไลบรารี

หากต้องการจัดการกฎการเก็บที่ไลบรารีของบุคคลที่สามนำมาใช้ ให้ทำดังนี้

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

กฎที่รวมไว้

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

# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }

# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass

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

ตัวอย่างส่วนสรุปรายงาน
รูปที่ 4. ตัวอย่างกฎที่รวมไว้ในรายงาน

เพิ่มประสิทธิภาพกฎที่รวมไว้

  1. ค้นหากฎการเก็บที่รวมไว้โดยใช้เครื่องมือวิเคราะห์การกำหนดค่า R8
  2. ระบุคลาส ฟิลด์ หรือเมธอดที่แน่นอนในฐานของโค้ดที่ต้องใช้การสะท้อน (Reflection) จริงๆ ซึ่งต้องเก็บไว้โดยใช้กฎการเก็บ การทราบข้อมูลนี้จะช่วยให้คุณปรับแต่งกฎการเก็บได้
  3. ใช้เครื่องมือวิเคราะห์การกำหนดค่าเพื่อเปรียบเทียบผลกระทบของกฎแต่ละข้อที่กำหนดเป้าหมายคลาส ฟิลด์ หรือเมธอดเดียวกัน คุณสามารถใช้เปอร์เซ็นต์การเพิ่มประสิทธิภาพที่กฎการเก็บแต่ละข้อป้องกันไว้เพื่อระบุว่ากฎข้อใดกว้างกว่าและกฎข้อใดเป็นกฎการเก็บที่แคบ
    1. หากเขียนกฎที่แคบไว้อย่างแม่นยำ โดยเก็บเฉพาะสมาชิกหรือคลาสที่เข้าถึงแบบสะท้อน (Reflectively) เท่านั้น ให้นำกฎการเก็บที่กว้างกว่าออก การดำเนินการนี้จะปลดล็อกการเพิ่มประสิทธิภาพ R8 สำหรับแพ็กเกจที่เหลืออย่างปลอดภัย
    2. หากกฎที่กว้างกำหนดเป้าหมายคลาสที่ถูกต้อง ให้เก็บกฎที่กว้างไว้และลบกฎที่แคบออก กฎที่แคบเป็นเพียงข้อมูลที่ไม่จำเป็น ตรวจสอบว่าได้ปรับแต่งกฎที่กว้างเพื่อกำหนดเป้าหมายเฉพาะคลาส ฟิลด์ หรือเมธอดที่คุณระบุไว้

ยืนยันและทดสอบการเปลี่ยนแปลง: เรียกใช้เครื่องมือวิเคราะห์การกำหนดค่าอีกครั้งเพื่อให้แน่ใจว่า แก้ไขข้อขัดแย้งแล้ว จากนั้นคอมไพล์บิลด์ที่เผยแพร่และทดสอบการ เปลี่ยนแปลงเพื่อให้แน่ใจว่าฐานของโค้ดทำงานได้ตามที่คาดไว้

นำกฎที่ไม่จำเป็นออก

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

  • กฎที่ไม่ได้ใช้: กฎที่ไม่ตรงกับคลาส เมธอด หรือฟิลด์ใดๆ ใน บิลด์ปัจจุบัน กฎเหล่านี้มักจะยังคงอยู่หลังจากการปรับโครงสร้างโค้ด การนำทรัพยากร Dependency ออก หรือจากการกำหนดค่าแบบคัดลอกและวางที่ไม่เกี่ยวข้องอีกต่อไป ซึ่งเพิ่มความซับซ้อนในการกำหนดค่าโดยไม่จำเป็น
  • กฎที่เหมือนกัน: กฎการเก็บที่เหมือนกันหมายถึงกฎที่กำหนดเป้าหมาย คลาส ฟิลด์ และเมธอดเดียวกัน หรือการประกาศกฎการเก็บซ้ำในไฟล์กฎการเก็บเดียวกัน หรือข้ามไฟล์

กฎทั้ง 2 ประเภททำให้การกำหนดค่าซับซ้อนขึ้น ซึ่งทำให้การดูแลรักษาและการแก้ไขข้อบกพร่องทำได้ยากขึ้น การระบุกฎเหล่านี้จะช่วยให้คุณล้างการกำหนดค่าได้