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