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

pluginManagement {
    repositories {
        google()
        mavenCentral()
    }
    buildscript {
        dependencies {
            // Update to a more recent R8 version.
            classpath("com.android.tools:r8:9.4.14")
        }
    }
}

ซึ่งจะใช้ R8 เวอร์ชันล่าสุด รวมถึงเครื่องมือวิเคราะห์การกำหนดค่าเวอร์ชันล่าสุด และสามารถทำได้ชั่วคราวเมื่อวิเคราะห์การกำหนดค่า R8

ตอนนี้คุณสามารถตั้งค่าพร็อพเพอร์ตี้ระบบ 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%

คะแนนการสร้างความสับสน

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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