เครื่องมือวิเคราะห์การกำหนดค่า R8 ออกแบบมาเพื่อช่วยให้คุณได้รับประโยชน์ด้านประสิทธิภาพสูงสุดจาก R8 โดยการให้ข้อมูลเชิงลึกโดยละเอียดเกี่ยวกับคุณภาพการกำหนดค่าของแอป ซึ่งช่วยให้คุณติดตามและปรับปรุงการเพิ่มประสิทธิภาพ R8 ได้โดยการตรวจสอบเมตริกที่สำคัญ ได้แก่ คะแนนการลดขนาด การเพิ่มประสิทธิภาพ และการปรับให้ยากต่อการอ่าน (Obfuscation) ซึ่งบ่งบอกถึงเปอร์เซ็นต์ของโค้ดเบสที่พร้อมสำหรับการเพิ่มประสิทธิภาพ การระบุกฎการเก็บรักษาที่กว้างหรือที่ไม่จำเป็น ซึ่งรวมถึงกฎที่ไลบรารีของบุคคลที่สามนำมาใช้ ตัววิเคราะห์จะช่วยคุณปรับแต่งการกำหนดค่าเพื่อให้ R8 เพิ่มประสิทธิภาพคลาส ฟิลด์ และเมธอดให้ได้มากที่สุดอย่างมีประสิทธิภาพ
สร้างรายงาน
เมื่อใช้ AGP 9.3.0 ขึ้นไป คุณจะสร้างรายงานเครื่องมือวิเคราะห์การกำหนดค่า R8 ได้โดยใช้ Gradle Task แบบสแตนด์อโลนโดยเฉพาะ หรือโดยอัตโนมัติในระหว่างการสร้าง R8
เรียกใช้งาน Gradle แบบสแตนด์อโลน (แนะนำสำหรับการใช้งานในเครื่อง)
เมื่อทำการวนซ้ำกฎการเก็บอย่างต่อเนื่อง ให้ใช้ Gradle Task แบบสแตนด์อโลนเพื่อประเมินผลกระทบของการเปลี่ยนแปลงอย่างรวดเร็วโดยไม่ต้องสร้าง APK หรือ Bundle ทั้งหมด
./gradlew :app:analyzeReleaseR8Config
เนื่องจากงานนี้ข้ามการสร้าง APK หรือ 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 และเวอร์ชันก่อนหน้า ให้ตั้งค่าพร็อพเพอร์ตี้ระบบ
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 สามารถเพิ่มประสิทธิภาพโค้ดเบสของคุณได้มากน้อยเพียงใด
คะแนนการลดขนาด
เมื่อ R8 ลดขนาดแอป จะช่วยลดขนาดโดยรวมของแอปด้วยการระบุ และกำจัดโค้ดและทรัพยากรที่ไม่ได้ใช้ เพื่อให้มั่นใจว่าบิลด์สุดท้ายของคุณ มีขนาดเล็กที่สุด คะแนนการลดขนาดจะติดตามเปอร์เซ็นต์ของคลาส ฟิลด์ และเมธอดที่ขึ้นอยู่กับการลดขนาด ตัวอย่างเช่น คะแนนการลดขนาดที่ 66% หมายความว่า R8 สามารถลดขนาดในโค้ดเบสได้ 66%
คะแนนการเพิ่มประสิทธิภาพ
R8 จะทำการเพิ่มประสิทธิภาพ เช่น การแทรกเมธอดและการผสานคลาส ซึ่ง ส่งผลให้แอปมีการเริ่มต้นและการใช้หน่วยความจำที่ดีขึ้น คะแนนการเพิ่มประสิทธิภาพ จะติดตามเปอร์เซ็นต์ของคลาส ฟิลด์ และเมธอดที่ขึ้นอยู่กับการเพิ่มประสิทธิภาพของ R8 เช่น หากคะแนนการเพิ่มประสิทธิภาพอยู่ที่ 66% หมายความว่า R8 จะเพิ่มประสิทธิภาพได้เฉพาะในโค้ดเบส 66%
คะแนนการปรับให้ยากต่อการอ่าน (Obfuscation)
การสร้างความสับสนให้กับคลาส ฟิลด์ และเมธอดให้มีชื่อที่สั้นลงจะช่วยให้ R8 ลดร่องรอยข้อมูลเมตาของแอปเพื่อประหยัดหน่วยความจำ คะแนนการปกปิดโค้ดจะวัด เปอร์เซ็นต์ของโค้ดที่พร้อมสำหรับการปกปิดโค้ดภายในฐานของโค้ด
ปรับแต่งกฎการเก็บ
หากต้องการปรับปรุงคะแนนและปลดล็อกการเพิ่มประสิทธิภาพ R8 ที่ดียิ่งขึ้น คุณควร ปรับแต่งกฎการเก็บรักษาเพื่อไม่ให้ R8 ถูกป้องกันไม่ให้ เพิ่มประสิทธิภาพแอปโดยไม่จำเป็น คุณควรเก็บรักษาเฉพาะคลาส เมธอด หรือฟิลด์ที่ เข้าถึงโดยใช้การสะท้อน
หากต้องการทำเช่นนี้ ให้ใช้การวิเคราะห์กฎการเก็บรักษา
หากต้องการดูการวิเคราะห์โดยละเอียดของกฎ ให้คลิกกฎเพื่อเปิดหน้าจอรายละเอียด
วิธีปรับแต่งกฎการเก็บรักษา
หากต้องการปรับแต่งกฎการเก็บรักษาและปลดล็อกศักยภาพสูงสุดของการเพิ่มประสิทธิภาพ R8 สำหรับ แอปของคุณ ให้ทำดังนี้
- สำหรับกฎการเก็บแต่ละรายการ ให้ดูเปอร์เซ็นต์ของคลาส ฟิลด์ และเมธอดที่ R8 เพิ่มประสิทธิภาพไม่ได้ในเครื่องมือวิเคราะห์การกำหนดค่า ใช้เพื่อระบุกฎการเก็บรักษาที่ป้องกันการเพิ่มประสิทธิภาพในคลาส ฟิลด์ หรือเมธอดจำนวนมาก ระบบจะแสดงพร็อพเพอร์ตี้การเพิ่มประสิทธิภาพที่กฎการเก็บแต่ละรายการป้องกันไว้ด้วย
- หากเห็นกฎการเก็บที่ป้องกันการเพิ่มประสิทธิภาพของคลาสจำนวนมาก คุณควรตรวจสอบว่าคลาส ฟิลด์ และเมธอดใดบ้างที่กฎการเก็บป้องกันไม่ให้เพิ่มประสิทธิภาพ เพื่อดูว่ากฎนี้เก็บรายการที่ไม่ได้เรียกใช้แบบไดนามิกโดยใช้การสะท้อนหรือไม่
- ลดการเพิ่มประสิทธิภาพที่ถูกบล็อกโดยกฎการเก็บรักษาด้วยการกำหนดเป้าหมายเฉพาะคลาส ฟิลด์ หรือเมธอดที่จำเป็นโดยเลือกตัวเลือกการเก็บรักษาที่เหมาะสมและทำตามแนวทางปฏิบัติแนะนำ
- ตรวจสอบและเรียกใช้การทดสอบที่ครอบคลุมคลาส ฟิลด์ และ เมธอดที่ได้รับผลกระทบของกฎการเก็บรักษา และปรับแต่งกฎการเก็บรักษา
ตรวจสอบการเพิ่มประสิทธิภาพไลบรารี
เมื่อผสานรวมไลบรารีของบุคคลที่สาม ไลบรารีเหล่านั้นมักจะมีกฎการเก็บรักษาของผู้ใช้ของตนเองเพื่อทำงานร่วมกับ 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
เพิ่มประสิทธิภาพกฎที่รวมไว้
- ค้นหากฎการเก็บที่ครอบคลุมโดยใช้เครื่องมือวิเคราะห์การกำหนดค่า R8
- ระบุคลาส ฟิลด์ หรือเมธอดที่แน่นอนในโค้ดเบสที่ ใช้การสะท้อนจริง ซึ่งต้องเก็บไว้โดยใช้กฎการเก็บ การทราบข้อมูลนี้จะช่วยให้คุณปรับแต่งกฎการเก็บรักษาได้
- ใช้เครื่องมือวิเคราะห์การกำหนดค่าเพื่อเปรียบเทียบผลกระทบของแต่ละกฎที่
กำหนดเป้าหมายไปยังคลาส ฟิลด์ หรือเมธอดเดียวกัน คุณสามารถใช้เปอร์เซ็นต์การเพิ่มประสิทธิภาพที่ป้องกันโดยกฎการเก็บรักษาแต่ละรายการเพื่อระบุว่ากฎใดเป็นกฎการเก็บรักษาที่กว้างกว่าและกฎใดเป็นกฎการเก็บรักษาที่แคบ
- หากเขียนกฎที่จำกัดไว้อย่างแม่นยำ โดยเก็บเฉพาะสมาชิกหรือคลาสที่เข้าถึงแบบสะท้อนได้เท่านั้น ให้นำกฎที่กว้างกว่าออก ซึ่งจะปลดล็อกการเพิ่มประสิทธิภาพ R8 สำหรับแพ็กเกจที่เหลือได้อย่างปลอดภัย
- หากกฎแบบกว้างกำหนดเป้าหมายไปยังคลาสที่ถูกต้อง ให้เก็บกฎแบบกว้างไว้ และลบกฎแบบแคบ กฎที่แคบเกินไปเป็นเพียงความรกที่ซ้ำซ้อน โปรดปรับแต่งกฎแบบกว้างเพื่อกำหนดเป้าหมายเฉพาะคลาส ฟิลด์ หรือ เมธอดที่คุณระบุ
ยืนยันและทดสอบการเปลี่ยนแปลง: เรียกใช้เครื่องมือวิเคราะห์การกำหนดค่าอีกครั้งเพื่อให้แน่ใจว่า แก้ไขความขัดแย้งแล้ว จากนั้นคอมไพล์บิลด์รุ่นที่เผยแพร่และทดสอบ การเปลี่ยนแปลงเพื่อให้มั่นใจว่าโค้ดเบสทำงานได้ตามที่คาดไว้
นำกฎที่ไม่จำเป็นออก
การใช้เครื่องมือวิเคราะห์การกำหนดค่าช่วยให้คุณตรวจสอบโค้ดเบสได้อย่างเป็นระบบเพื่อ ระบุและลบกฎการเก็บรักษาที่ล้าสมัยซึ่งทำให้การกำหนดค่ารก เครื่องมือวิเคราะห์การกำหนดค่า R8 จะไฮไลต์แหล่งที่มาหลัก 2 แหล่งของกฎที่ไม่จำเป็นโดยเฉพาะ ดังนี้
- กฎที่ไม่ได้ใช้: กฎที่ตรงกับคลาส เมธอด หรือฟิลด์ 0 รายการในบิลด์ปัจจุบัน โดยมักจะยังคงอยู่หลังจากการปรับโครงสร้างโค้ด การนำการอ้างอิงออก หรือจากการกำหนดค่าแบบคัดลอกและวางที่ไม่มีความเกี่ยวข้องอีกต่อไป ซึ่งเป็นการเพิ่มความซับซ้อนในการกำหนดค่าที่ไม่จำเป็น
- กฎที่เหมือนกัน: กฎการเก็บรักษาที่เหมือนกันหมายถึงกฎที่กำหนดเป้าหมายไปยังคลาส ฟิลด์ และเมธอดเดียวกัน หรือการประกาศกฎการเก็บรักษาที่ซ้ำกันในไฟล์กฎการเก็บรักษาเดียวกันหรือในไฟล์กฎการเก็บรักษาต่างๆ
กฎทั้ง 2 ประเภทจะเพิ่มความซับซ้อนให้กับการกำหนดค่า ทำให้ดูแลรักษาและแก้ไขข้อบกพร่องได้ยากขึ้น การระบุรายการเหล่านี้จะช่วยให้คุณล้างการกำหนดค่าได้