ทำตามแนวทางปฏิบัติแนะนำ

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

รูปแบบที่ดีในกฎการเก็บรักษา

กฎการเก็บรักษาที่กำหนดไว้อย่างดีจะมีความเฉพาะเจาะจงมากที่สุดเท่าที่จะเป็นไปได้และเป็นไปตามรูปแบบต่อไปนี้

  • สำหรับการระบุคลาส ให้ระบุคลาสเฉพาะ คลาสพื้นฐาน หรือคลาสที่มีคำอธิบายประกอบเสมอหากเป็นไปได้ ดังที่แสดงในตัวอย่างต่อไปนี้

    -keepclassmembers class com.example.MyClass {
      void someSpecificMethod();
    }
    
    -keepclassmembers ** extends com.example.MyBaseClass {
      void someSpecificMethod();
    }
    
    -keepclassmembers @com.example.MyAnnotation class ** {
      void someSpecificMethod();
    }
    
  • ใช้คำอธิบายประกอบในซอร์สโค้ดแล้วกำหนดเป้าหมายคำอธิบายประกอบเหล่านั้นโดยตรงในกฎการเก็บรักษาทุกครั้งที่ทำได้ วิธีนี้จะสร้างลิงก์ที่ชัดเจนและชัดแจ้งระหว่างโค้ดกับกฎที่เก็บรักษาโค้ดไว้ ทำให้การกำหนดค่ามีความเสถียรมากขึ้น เข้าใจง่ายขึ้น และมีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยลงเมื่อมีการเปลี่ยนแปลงโค้ด

    ตัวอย่างเช่น ข้อมูลโค้ดต่อไปนี้แสดงวิธีเก็บรักษาคลาส MyClass รวมถึงคลาสอื่นๆ ที่มีคำอธิบายประกอบด้วย @com.example.DisplayComponent

    // In the source code
    @com.example.DisplayComponent
    class MyClass { /* ... */ }
    
    // In the keep rules
    -keep @com.example.DisplayComponent class * {*;}
    

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

  • การระบุสมาชิกควรประกาศและอ้างอิงเฉพาะส่วนของคลาสที่ต้องเก็บรักษาไว้เพื่อให้แอปทำงานได้ทุกครั้งที่ทำได้ เราขอแนะนำว่าอย่าใช้กฎกับทั้งคลาสโดยกำหนดขอบเขตสมาชิกที่ไม่บังคับเป็น { *; } เว้นแต่จะจำเป็นอย่างยิ่ง

    -keepclassmembers com.example.MyClass {
      void someSpecificMethod();
      void @com.example.MyAnnotation *;
    }
    
  • หากคุณใช้ตัวเลือกส่วนกลาง repackageclasses หลีกเลี่ยงการระบุชื่อแพ็กเกจที่ไม่บังคับ วิธีนี้จะทำให้ไฟล์ DEX มีขนาดเล็กลงเนื่องจากระบบจะละเว้นคำนำหน้าแพ็กเกจในชื่อคลาสที่แพ็กเกจใหม่

  • รักษากฎการเก็บรักษาไว้สำหรับรายการทั้งหมดที่เข้าถึงโดยการสะท้อน แม้ว่า R8 จะเก็บรักษารายการดังกล่าวไว้โดยไม่มีกฎการเก็บรักษาที่ชัดเจน แต่การรักษากฎจริงไว้เป็นสิ่งสำคัญเนื่องจากการเปลี่ยนแปลงโค้ดในอนาคตอาจทำให้ R8 ไม่เก็บรักษารายการเหล่านี้อีกต่อไป

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

  • ใช้ -assumenosideeffects หรือ -convertchecknotnull เพื่อเพิ่มประสิทธิภาพการตรวจสอบค่า Null ทุกครั้งที่ทำได้ เนื่องจากวิธีนี้จะช่วยลดขนาด DEX ของแอปได้อย่างมาก ดูข้อมูลเพิ่มเติมได้ที่ ประเภทกฎเพิ่มเติม

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

-keepclassmembers class com.example.pkg.** { *; }

สิ่งที่ควรหลีกเลี่ยง

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

  • อย่าใช้กฎการเก็บรักษาระดับแพ็กเกจ เช่น -keep class com.example.pkg.** { *; } ในระยะยาว คุณสามารถใช้กฎเหล่านี้ชั่วคราวเพื่อหลีกเลี่ยงปัญหาเมื่อกำหนดค่า R8 ดูข้อมูลเพิ่มเติมได้ที่จำกัดขอบเขตการเพิ่มประสิทธิภาพ โดยทั่วไป ให้ระมัดระวังการใช้ไวลด์การ์ดและตรวจสอบว่าคุณเก็บรักษาเฉพาะโค้ดที่จำเป็นเท่านั้น
  • หลีกเลี่ยงไลบรารีที่แนะนำให้คุณคัดลอกและวางกฎการเก็บรักษาเมื่อใช้ไลบรารี โดยเฉพาะกฎการเก็บรักษาระดับแพ็กเกจทุกครั้งที่ทำได้ ไลบรารีที่ออกแบบมาให้ ทำงานได้ดีใน Android ควรหลีกเลี่ยงการสะท้อนทุกครั้งที่ทำได้ และ ฝังกฎการเก็บรักษาของผู้ใช้เมื่อจำเป็น
  • หลีกเลี่ยงการใช้ตัวดำเนินการผกผัน ! ในกฎการเก็บรักษา เนื่องจากคุณอาจใช้กฎกับคลาสเกือบทุกคลาสในแอปพลิเคชันโดยไม่ได้ตั้งใจ

หากคุณไม่สามารถปฏิบัติตามกฎเหล่านี้ได้ คุณอาจใช้การสะท้อนแบบปลายเปิดจำนวนมาก และควรหลีกเลี่ยงการสะท้อนหรือหลีกเลี่ยงไลบรารีที่ใช้ การสะท้อน (ดูกรณีศึกษา Gson)