Tôi muốn chỉ giữ các lớp, có chứa các phương pháp được chú thích với @Keep
và các phương pháp này. Những phương pháp này (và sở hữu các lớp học) nên được lưu giữ ngay cả khi chúng không được sử dụng.Làm cách nào để giữ các lớp học có chứa các thành viên cụ thể?
Những gì tôi viết trong .pro-file là:
-keepclassmembers class * {
@Keep *;
}
-keepclasseswithmembers class * {
@Keep *;
}
Nhưng nó co ra các lớp học với phương pháp @Keep nếu họ không sử dụng.
Sau đó, tôi cố gắng này:
-keep class * {
@Keep *;
}
nó chỉ giữ tất cả các lớp học.
Vì vậy, tôi nên viết gì trong tệp .pro?
Cập nhật 1: ví dụ Cảm ơn câu trả lời của bạn. Nhưng tôi đã sử dụng tên chú thích đủ điều kiện và bao gồm JAR với chú thích, nhưng nó không làm những gì tôi muốn. Vì vậy, tôi đã chuẩn bị một mẫu.
tôi có 2 lọ:
example.jar/
example/
code/
more/
A.class
lib.jar/
example/
lib/
Keep.class
A.java:
package example.code.more;
import example.lib.*;
public class A {
@Keep
void foo() {}
}
Keep.java:
package example.lib;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface Keep {
}
Proguard config, example.pro:
-injars example.jar
-injars lib.jar
-outjars obfuscated.jar
-libraryjars <java.home>/lib/rt.jar
-printmapping rt.map
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-printseeds
-overloadaggressively
-dontoptimize
-keeppackagenames example.lib.**
-keepattributes *Annotation*
-keepclassmembers class * extends java.lang.Enum {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class example.lib.* { *; }
-keep class * extends java.lang.annotation.Annotation { *; }
-keepclassmembers class * {
@example.lib.Keep *;
}
-keepclasseswithmembers class * {
@example.lib.Keep *;
}
tên See, gói là chính xác và tất cả các lọ được bao gồm.
Kết quả bản đồ file:
example.lib.Keep -> example.lib.Keep:
Vì vậy, A.class bị loại bỏ. Tôi đang làm gì sai?
Tôi vừa cập nhật chủ đề bằng một mẫu.Tôi làm điều tương tự như bạn đề nghị, và nó vẫn không hoạt động: '( – Andy
Và chỉ định JAR với chú thích như một thư viện (-libraryjars) không giúp đỡ. – Andy
Cập nhật giải pháp để sử dụng ký tự đại diện phù hợp. –