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

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

สร้างรายงาน

ตั้งแต่ AGP 9.3.0-alpha05 ขึ้นไป ระบบจะสร้างรายงานโดยอัตโนมัติใน build/outputs/mapping/release/configanalyzer.html เมื่อเรียกใช้บิลด์ R8 หากต้องการปิดใช้การสร้างเอาต์พุตโดยอัตโนมัติ ให้ตั้งค่าพร็อพเพอร์ตี้ Gradle ต่อไปนี้

android.experimental.r8.enableR8ConfigurationAnalyzer=false

สำหรับ 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 จะทำการเพิ่มประสิทธิภาพ เช่น การแทรกเมธอดและการผสานคลาส ซึ่งส่งผลให้แอปมีการเริ่มต้นและการใช้หน่วยความจำที่ดีขึ้น คะแนนการเพิ่มประสิทธิภาพจะติดตามเปอร์เซ็นต์ของคลาส ฟิลด์ และเมธอดที่ขึ้นอยู่กับการเพิ่มประสิทธิภาพของ R8 เช่น หากคะแนนการเพิ่มประสิทธิภาพอยู่ที่ 66% หมายความว่า R8 จะเพิ่มประสิทธิภาพได้เฉพาะในฐานของโค้ด 66% ของคุณ

คะแนนการปกปิด

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

กฎที่รวมไว้

ในบางกรณี กฎการเก็บรักษาหลายข้ออาจทับซ้อนกัน และกฎข้อใดข้อหนึ่งอาจป้องกันการเพิ่มประสิทธิภาพมากกว่าที่จำเป็น หากมีกฎ keep 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

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

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

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

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

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

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

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

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

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