นอกเหนือจากกฎการเก็บรักษาทั่วไป กฎการเก็บรักษาประเภทอื่นๆ และ ตัวเลือกส่วนกลางแล้ว คุณยังใช้กฎบางอย่างเพื่อแก้ปัญหาการเพิ่มประสิทธิภาพได้ด้วย
-checkdiscard
กฎ -checkdiscard ช่วยให้คุณตรวจสอบได้ว่า R8 ทิ้งคลาสหรือสมาชิกของคลาสที่คุณคาดว่าจะนำออกได้สำเร็จหรือไม่
หากไม่ได้ทิ้งคลาสหรือสมาชิกที่ระบุไว้ บิลด์จะล้มเหลว
ไวยากรณ์สำหรับ -checkdiscard มีดังนี้
-checkdiscard <class_specification>
ในตัวอย่างต่อไปนี้ การบิลด์จะล้มเหลวหากมีการเก็บฟิลด์ userId หรือเมธอด setLabel()
จากคลาส com.example.models.User ไว้
-checkdiscard class com.example.models.User{
private java.lang.String userId;
public void setLabel(java.lang.String);
}
รหัสของคลาสอาจยังคงอยู่ในแอปหากมีการแทรกเมธอดของคลาส
ลงในคลาสอื่นๆ หากต้องการให้แน่ใจว่าได้นำโค้ดออกทั้งหมดและไม่ได้เพียงแค่แทรกโค้ด ให้เพิ่มกฎที่เกี่ยวข้องซึ่งป้องกันไม่ให้ R8 ทำการเพิ่มประสิทธิภาพในคลาสเป้าหมาย โดยการรวม -checkdiscard เข้ากับกฎ -keep,allowshrinking ซึ่งจะห้ามการเพิ่มประสิทธิภาพ เช่น การรวมคลาสและการแทรกอินไลน์ หากกฎ -checkdiscard ผ่าน แสดงว่าไม่มีเนื้อหาจากชั้นเรียนที่ตรงกันอยู่ในแอปที่เพิ่มประสิทธิภาพแล้ว
ตัวอย่างต่อไปนี้แสดงการใช้งานนี้
# Either keep or remove the class, don't rename or otherwise optimize it
-keep,allowshrinking class com.example.foo { *; }
# Verify that the class and all of its fields and methods are removed.
-checkdiscard class com.example.foo
-whyareyoukeeping
ใช้กฎ -whyareyoukeeping เพื่อพิจารณาว่าเหตุใด R8 จึงเก็บคลาส ฟิลด์ หรือเมธอดที่เฉพาะเจาะจงไว้ในการบิลด์ของแอป ระบบอาจเก็บรายการไว้ด้วยเหตุผลหลายประการ
แต่กฎนี้จะระบุเฉพาะเหตุผลที่อธิบายเส้นทางที่สั้นที่สุดไปยัง
รายการจากรายการที่เก็บไว้ หากนำเส้นทางนี้ออกจากโค้ด คุณอาจยังเห็นรายการที่เก็บไว้แต่ด้วยเหตุผลอื่น
ซึ่งอาจเกิดจากสาเหตุต่อไปนี้
กฎการเก็บ: กฎการเก็บอาจมาจากแอป ไลบรารีที่ใช้ หรือ กฎที่ AAPT (Android Asset Packaging Tool) สร้างขึ้น
การอ้างอิงแบบทรานซิทีฟจากโค้ดหรือทรัพยากรที่เก็บไว้: หาก R8 เก็บโค้ดหรือ XML (เช่น เลย์เอาต์) ไว้ ระบบจะเก็บทุกอย่างที่อ้างอิงแบบคงที่
ไวยากรณ์มีดังนี้
-whyareyoukeeping <class_specification>
เช่น
-whyareyoukeeping class com.example.foo.MainActivity {
private void setLabel(...);
}
ระบบจะพิมพ์เอาต์พุตไปยังคอนโซล
หากไม่มีกฎใดที่เก็บ setLabel() ไว้ ผลลัพธ์จะเป็นดังนี้
com.example.foo.MainActivity
|- is referenced in keep rule:
| /app/build/intermediates/aapt_proguard_file/release/processReleaseResources/aapt_rules.txt:4:1
Nothing is keeping void com.example.foo.MainActivity.setLabel()
หากคุณมีกฎการเก็บที่กำหนดเป้าหมายเป็น setLabel() เอาต์พุตจะคล้ายกับ
ต่อไปนี้
com.example.foo.MainActivity
|- is referenced in keep rule:
| /app/proguard-rules.pro:23:1
void com.example.foo.MainActivity.setLabel()
|- is referenced in keep rule:
| /app/proguard-rules.pro:23:1