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