R8 มีตัวเลือกส่วนกลางที่แก้ไขการเพิ่มประสิทธิภาพของ R8 ทั่วทั้งแอปหรือส่งผลต่อกฎการเก็บทุกรายการ ตัวเลือกเหล่านี้จะได้รับการเก็บไว้ในไฟล์
proguard-rules.pro พร้อมกับกฎการเก็บรักษา ตัวเลือกส่วนกลางเหล่านี้บางตัวเลือกจะกำหนดค่าการเพิ่มประสิทธิภาพเพิ่มเติม บางตัวเลือกจะปิดการเพิ่มประสิทธิภาพบางด้าน
ตัวเลือกส่วนกลางสำหรับการเพิ่มประสิทธิภาพเพิ่มเติม
ตัวเลือกส่วนกลางต่อไปนี้ช่วยให้เพิ่มประสิทธิภาพได้เพิ่มเติม
-repackageclasses [<optional-package-name>]: จัดแพ็กเกจคลาสใหม่เป็นแพ็กเกจเดียวเพื่อลดขนาดแอป หากไม่ได้ระบุชื่อแพ็กเกจที่ไม่บังคับ ระบบจะย้ายคลาสไปยังแพ็กเกจเริ่มต้นที่ไม่มีชื่อ นี่คือ การตั้งค่าที่แนะนำสำหรับแอปเนื่องจากจะทำให้ไฟล์ DEX มีขนาดเล็กลงโดย ละเว้นคำนำหน้าแพ็กเกจจากชื่อคลาส-allowaccessmodification: อนุญาตให้ R8 เปลี่ยน (โดยปกติคือขยาย) ระดับการเข้าถึงของคลาส ฟิลด์ และเมธอดเพื่อทำการเพิ่มประสิทธิภาพที่ครอบคลุมมากขึ้น เปิดใช้เมื่อใช้proguard-android-optimize.txtตั้งแต่ปลั๊กอิน Android Gradle (AGP) 8.2 เป็นต้นมา การกำหนดค่านี้จะเป็นค่าเริ่มต้นหากคุณเปิดใช้การเพิ่มประสิทธิภาพ แบบเต็มด้วย R8
ต่อไปนี้เป็นตัวอย่างการกำหนดค่าที่เปิดใช้การเพิ่มประสิทธิภาพเพิ่มเติม
-repackageclasses
-allowaccessmodification
ตัวเลือกส่วนกลางในการจำกัดการเพิ่มประสิทธิภาพ
ตัวเลือกส่วนกลางต่อไปนี้ช่วยให้คุณปิดใช้การเพิ่มประสิทธิภาพแอปบางด้าน และมีประโยชน์เมื่อคุณปรับแต่งกฎการเก็บรักษาหรือเปิดใช้ R8 เป็นครั้งแรก
-dontoptimize: ป้องกันการเพิ่มประสิทธิภาพโค้ด เช่น การแทรกเมธอด ตัวเลือกนี้ใช้ได้ในระหว่างการพัฒนา แต่ไม่ควรใช้ในบิลด์เวอร์ชันที่ใช้งานจริง-dontshrink: ป้องกันการนำโค้ดที่ไม่ได้อ้างอิงออกและการเพิ่มประสิทธิภาพโค้ด ตัวเลือกนี้ใช้ได้ในระหว่างการพัฒนา แต่ไม่ควรใช้ในบิลด์เวอร์ชันที่ใช้งานจริง-dontobfuscate: ป้องกันการย่อชื่อคลาสและเมธอด ซึ่งจะเป็นประโยชน์อย่างยิ่งในการปิดการปกปิดโค้ดระหว่างการแก้ไขข้อบกพร่องเพื่อให้อ่านสแต็กเทรซได้ง่ายขึ้น ตัวเลือกนี้ใช้ได้ในระหว่างการพัฒนา แต่ไม่ควรใช้ในบิลด์เวอร์ชันที่ใช้งานจริง-keepattributes <attributes>: รับรายการแอตทริบิวต์ที่คั่นด้วยคอมมา ซึ่งควรเก็บไว้ หากไม่ได้ใช้proguard-android-optimize.txtที่เป็นค่าเริ่มต้น R8 จะลบแอตทริบิวต์ทั้งหมด รวมถึงRuntimeVisibleAnnotationsและSignatureแต่การเก็บรักษาแอตทริบิวต์เหล่านี้อาจเป็นประโยชน์หากจำเป็นในกรณีต่างๆ เช่น การทำ Reflection สำหรับรายการแอตทริบิวต์ที่คุณสามารถระบุ โปรดดูที่แอตทริบิวต์ที่ต้องเก็บ
แอตทริบิวต์ที่ต้องเก็บ
แอตทริบิวต์คือข้อมูลเพิ่มเติมที่แนบมากับส่วนต่างๆ ของโค้ด แอตทริบิวต์จะจัดเก็บข้อมูล เช่น คำอธิบายประกอบและลายเซ็นทั่วไปจากโค้ดของคุณ
การทำ Reflection บางอย่างต้องเก็บบางแอตทริบิวต์ไว้เพื่อให้ดำเนินการได้สำเร็จ เช่น
- เมื่อเข้าถึงโครงสร้างคลาสภายในหรือภายนอกโดยใช้
getEnclosingMethod()หรือgetDeclaredClasses()คุณจะต้องมีแอตทริบิวต์EnclosingMethodและInnerClasses - เมื่อเข้าถึงลายเซ็นทั่วไปโดยใช้
getTypeParameters()คุณจะต้องระบุแอตทริบิวต์Signature เมื่อเข้าถึงคำอธิบายประกอบโดยใช้
getAnnotation()คุณจะต้องมีแอตทริบิวต์RuntimeVisibleAnnotations
แอตทริบิวต์ที่ต้องระบุโดยทั่วไป
เมื่อใช้ไฟล์ Proguard เริ่มต้น (proguard-android-optimize.txt หรือ
proguard-android.txt) ปลั๊กอิน Android Gradle (AGP) จะเก็บแอตทริบิวต์ต่อไปนี้ไว้
โปรดทราบว่าแอตทริบิวต์บางรายการเหล่านี้ต้องใช้ AGP เวอร์ชันใหม่กว่า
| แอตทริบิวต์ | คำอธิบาย |
|---|---|
AnnotationDefault |
แอตทริบิวต์นี้อยู่ในประเภทคำอธิบายประกอบเองและจัดเก็บค่าเริ่มต้นสำหรับองค์ประกอบคำอธิบายประกอบ หมายเหตุ: แอตทริบิวต์นี้จะเก็บอยู่โดยค่าเริ่มต้นตั้งแต่ AGP 7.1 และจำเป็นต้องเก็บอย่างชัดเจนในแอปที่ใช้ AGP เวอร์ชันก่อนหน้าเท่านั้น |
EnclosingMethod |
แอตทริบิวต์นี้อยู่ในคลาสภายในที่ไม่ใช่คลาสโลคัลหรือคลาสที่ไม่ระบุชื่อ โดยจะระบุเมธอดหรือตัวกำหนดค่าเริ่มต้นที่มีคลาสนี้อยู่โดยตรง |
InnerClasses |
แอตทริบิวต์นี้จะบันทึกข้อมูลเกี่ยวกับคลาสที่ซ้อนกัน (คลาสภายใน คลาสที่ซ้อนกันแบบคงที่ คลาสโลคัล และคลาสที่ไม่ระบุชื่อ) ที่กำหนดไว้ภายในคลาสอื่น |
LineNumberTable |
แอตทริบิวต์นี้จะเชื่อมโยงคำสั่งไบต์โค้ดกับหมายเลขบรรทัดที่เกี่ยวข้องในไฟล์ต้นฉบับ หมายเหตุ: ระบบจะเก็บแอตทริบิวต์นี้ไว้โดยค่าเริ่มต้นตั้งแต่ปลั๊กอิน Android Gradle (AGP) 8.6 เป็นต้นไป และจะต้องเก็บไว้อย่างชัดเจนในแอปที่ใช้ AGP เวอร์ชันก่อนหน้าเท่านั้น |
RuntimeVisibleAnnotations |
แอตทริบิวต์นี้จัดเก็บคำอธิบายประกอบที่มองเห็นได้ในขณะรันไทม์โดยการทำ Reflection โดยปกติแล้ว หากใช้คำอธิบายประกอบในรันไทม์ แอปและกฎสำหรับผู้ใช้ไลบรารีจะต้องการคำอธิบายประกอบนี้เท่านั้นจากแอตทริบิวต์ *Annotation |
RuntimeVisibleParameterAnnotations |
แอตทริบิวต์นี้จัดเก็บคำอธิบายประกอบที่มองเห็นได้ในขณะรันไทม์โดยการทำ Reflection บนพารามิเตอร์ของเมธอด |
RuntimeVisibleTypeAnnotations |
แอตทริบิวต์นี้จัดเก็บคำอธิบายประกอบที่ใช้กับการใช้งานประเภทต่างๆ แทนที่จะเป็นเพียงการประกาศ แอตทริบิวต์นี้จะปรากฏขณะรันไทม์ |
Signature |
แอตทริบิวต์นี้จัดเก็บลายเซ็นประเภททั่วไปเพิ่มเติมสำหรับคลาส เมธอด และฟิลด์ โดยเฉพาะเมื่อใช้ Generics (เช่น List<String>) |
SourceFile |
แอตทริบิวต์นี้จะจัดเก็บชื่อของไฟล์ต้นฉบับ (ไฟล์ .kt หรือ .java) ที่ใช้คอมไพล์คลาส โดยโปรแกรมแก้ไขข้อบกพร่องจะใช้ไฟล์นี้เป็นหลักเพื่อแสดงบรรทัดซอร์สโค้ดเดิมเมื่อดีบักโค้ด Java ที่คอมไพล์แล้ว ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์ติดตามการดำเนินการกลับไปยังโค้ดที่เขียนไว้ได้ หมายเหตุ: แอตทริบิวต์นี้จะเก็บอยู่โดยค่าเริ่มต้นตั้งแต่ AGP 8.2 เป็นต้นไป และจะต้องเก็บไว้อย่างชัดเจนในแอปที่ใช้ AGP เวอร์ชันก่อนหน้าเท่านั้น |
สำหรับแอปที่ใช้ proguard-android-optimize.txt กฎการเก็บรักษาที่กำหนดโดย AGP
จะเพียงพอในสถานการณ์ส่วนใหญ่ อย่างไรก็ตาม หากคุณเขียนโค้ดสำหรับไลบรารี
คุณควรระบุแอตทริบิวต์ทั้งหมดที่ไลบรารีต้องการในกฎการเก็บรักษาสำหรับผู้ใช้ แม้ว่าจะมีการกำหนดไว้ในรายการนี้ก็ตาม ซึ่งจะช่วยให้ไลบรารีของคุณมีความเสถียรแม้ในกรณีที่นักพัฒนาแอปตัดสินใจไม่รวม proguard-android-optimize.txt ไว้
แอตทริบิวต์ที่ต้องเก็บเพิ่มเติม
คุณระบุแอตทริบิวต์เพิ่มเติมที่จะเก็บไว้ได้ แต่ไม่จำเป็นสำหรับสถานการณ์การเข้าถึงผ่าน reflection หรือ JNI ส่วนใหญ่ อย่างไรก็ตาม คุณอาจยังคงใช้บางส่วนของ รายการเหล่านี้บ่อยครั้งขณะเพิ่มประสิทธิภาพไลบรารี
| แอตทริบิวต์ | คำอธิบาย |
|---|---|
MethodParameters |
แอตทริบิวต์นี้ให้ข้อมูลเกี่ยวกับพารามิเตอร์ของเมธอด โดยเฉพาะชื่อและแฟล็กการเข้าถึง |
Exceptions |
แอตทริบิวต์นี้แสดงข้อยกเว้นที่ตรวจสอบแล้วซึ่งมีการประกาศเมธอดให้ส่ง โดยปกติแล้วแอตทริบิวต์นี้ไม่ได้ใช้กับแอป สำหรับผู้เขียนไลบรารี โดยทั่วไปแล้วจะไม่ใช้ในกฎการเก็บรักษาของผู้ใช้ แต่โดยทั่วไปจะใช้เมื่อสร้างไลบรารี ดูรายละเอียดเกี่ยวกับการเพิ่มประสิทธิภาพไลบรารีได้ที่การเพิ่มประสิทธิภาพสำหรับผู้เขียนไลบรารี |
RuntimeInvisibleAnnotations |
แอตทริบิวต์นี้จะจัดเก็บคำอธิบายประกอบที่มองไม่เห็นด้วยการสะท้อนขณะรันไทม์ในคลาส ฟิลด์ หรือเมธอด นักพัฒนาแอปไม่ควรเก็บแอตทริบิวต์นี้ไว้ สำหรับผู้เขียนไลบรารี แอตทริบิวต์นี้ไม่เกี่ยวข้องในกฎการเก็บรักษาของผู้ใช้ แต่โดยทั่วไปจะใช้เมื่อสร้างไลบรารี ดูรายละเอียดเกี่ยวกับการเพิ่มประสิทธิภาพไลบรารีได้ที่การเพิ่มประสิทธิภาพสำหรับผู้เขียนไลบรารี |
RuntimeInvisibleParameterAnnotations |
แอตทริบิวต์นี้จะจัดเก็บคำอธิบายประกอบที่มองไม่เห็นด้วยการทำ Reflection ขณะรันไทม์ในพารามิเตอร์ของเมธอด นักพัฒนาแอปไม่ควรเก็บแอตทริบิวต์นี้ไว้ สำหรับผู้เขียนไลบรารี แอตทริบิวต์นี้ไม่เกี่ยวข้องในกฎการเก็บรักษาของผู้ใช้ แต่โดยทั่วไปจะใช้เมื่อสร้างไลบรารี ดูรายละเอียดเกี่ยวกับการเพิ่มประสิทธิภาพไลบรารีได้ที่การเพิ่มประสิทธิภาพสำหรับผู้เขียนไลบรารี |
RuntimeInvisibleTypeAnnotations |
แอตทริบิวต์นี้จัดเก็บคำอธิบายประกอบที่ใช้กับการใช้งานประเภทต่างๆ แทนที่จะเป็นเพียงการประกาศ แอตทริบิวต์นี้จะไม่ปรากฏขณะรันไทม์ นักพัฒนาแอปไม่ควรเก็บแอตทริบิวต์นี้ไว้ สำหรับผู้เขียนไลบรารี แอตทริบิวต์นี้ไม่เกี่ยวข้องในกฎการเก็บรักษาของผู้ใช้ แต่โดยทั่วไปจะใช้เมื่อสร้างไลบรารี ดูรายละเอียดเกี่ยวกับการเพิ่มประสิทธิภาพไลบรารีได้ที่การเพิ่มประสิทธิภาพสำหรับผู้เขียนไลบรารี |