ผู้คนจำนวนมากดูเหมือนจะแนะนำให้-keep class com.myapp.customcomponents.** { *; }
เป็นวิธียกเว้นเส้นทางจากการประมวลผล ดูที่นี่:
- ไม่รวมแพ็คเกจจาก proguard
- ทำให้ Proguard ละเว้นแพ็คเกจโดยสิ้นเชิง
- ป้องกันไม่ให้ไดเร็กทอรีจากการสับสนของ proguard
ปัญหาในการแก้ปัญหานี้คือยังคงมีความสับสนบางอย่างเกิดขึ้นซึ่งสามารถทำลายรหัสของคุณได้ คุณสามารถดูการทำแผนที่ในการพิมพ์แผนที่:
java.lang.String toString() -> toString
int getMemoizedSerializedSize() -> getMemoizedSerializedSize
void setMemoizedSerializedSize(int) -> setMemoizedSerializedSize
int getSerializedSize() -> getSerializedSize
boolean equals(java.lang.Object) -> equals
int hashCode() -> hashCode
วิธีแก้ปัญหาที่ฉันเลือกใช้คือกระบวนการสองขั้นตอน ขั้นแรกให้ใช้injars
กับตัวกรองเพื่อเลือกเส้นทางแพ็กเกจที่ฉันต้องการดำเนินการ เป็นไปได้ที่จะเพิ่มแพทเกจอื่น ๆ เป็นไลบรารี
-injars artifacts/in.jar(org/toprocess/**.class)
-outjars out/processed.jar
-libraryjars artifacts/in.jar(org/skipped/**.class)
-libraryjars artifacts/in.jar(org/moreskipped/**.class)
ประการที่สองผสานโถที่ผ่านการประมวลผลกับโถดั้งเดิม แต่มีเพียงเส้นทางที่ข้ามไป
-injars out/processed.jar
-injars artifacts/in.jar(org/skipped/**.class)
-injars artifacts/in.jar(org/moreskipped/**.class)
-outjars out/merged.jar
-dontshrink
-dontoptimize
-dontobfuscate
ผลลัพธ์คือ jar ที่ผสานซึ่งเป็นการรวมกันของพา ธ แพ็กเกจที่ประมวลผลและพา ธ ที่ข้าม แบบฝึกหัดนี้ไม่ถูกต้องหากมีใครสามารถให้วิธีข้ามการประมวลผลของเส้นทางบางอย่างได้โดยสิ้นเชิง (ซึ่งฉันไม่พบ)