2011-07-01 28 views
6

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?

Trả lời

15

Giống như trong ví dụ/chú thích/lib/chú thích.pro trong bản phân phối ProGuard, bạn nên chỉ định tên đủ điều kiện. Hơn nữa, -keepclasseswithmembers tùy chọn không kết hợp tốt với các "*" wildcard - sử dụng "phương pháp < >" ký tự đại diện thay vì:

-keepclasseswithmembers class * { 
    @proguard.annotation.Keep <methods>; 
} 

Bạn cũng không nên quên đọc jar có chứa các chú thích lớp học:

-libraryjars annotations.jar 
+0

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

+0

Và chỉ định JAR với chú thích như một thư viện (-libraryjars) không giúp đỡ. – Andy

+0

Cập nhật giải pháp để sử dụng ký tự đại diện phù hợp. –

Các vấn đề liên quan