ใช้กฎเพื่อแก้ปัญหาการเพิ่มประสิทธิภาพ

นอกเหนือจากกฎการเก็บรักษาทั่วไป กฎการเก็บรักษาประเภทอื่นๆ และ ตัวเลือกส่วนกลางแล้ว คุณยังใช้กฎบางอย่างเพื่อแก้ปัญหาการเพิ่มประสิทธิภาพได้ด้วย

-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