2016-07-25 15 views
5

Tôi có một nhóm các lớp (hơn 50) có chứa một vài phương thức tĩnh gọi là parse() trả về một thể hiện của lớp đó. Đây là một ví dụ về một trong những lớp học:Cách cấu hình Proguard để giữ các phương thức tĩnh với thời gian trả về khác nhau

class SomeType { 

    // Parse methods 
    public static SomeType parse(String text) { ... } 
    public static SomeType parse(Object obj) { ... } 
    ... 

    // Other methods 
    public void static somethingStatic(...) { ... } 
    public void somethingNotStatic(...) { ... } 
    ... 
} 

Tôi đang cố gắng để cấu hình ProGuard để xáo trộn các lớp này và tất cả các phương pháp và các lĩnh vực trừ các parse(...) phương pháp của họ. Về cơ bản, tôi muốn làm xáo trộn tên lớp, tất cả các phương thức tĩnh và không tĩnh, cộng với các trường lớp.

Tôi đã cố gắng sử dụng:

-keepclassmembers class SomeType { 
    public static SomeType parse(***); 
} 

và làm việc tốt cho SomeType, nhưng tôi không muốn phải viết quy tắc này cho mỗi người trong số 50 lớp học của tôi ... vậy làm thế nào tôi có thể khái quát hóa nó?

tôi đã cố gắng:

-keepclassmembers class ** { 
    public static * parse(***); 
} 

nhưng ProGuard phàn nàn về cú pháp của kiểu trả về ...

Trả lời

8

Quy tắc của bạn đã gần đúng, chỉ cần sử dụng *** như kiểu trả về, trong đó sẽ phù hợp bất kỳ loại:

-keepclassmembers class ** { 
    public static *** parse(***); 
} 

Ngoài ra -keepclassmembers được ưu tiên hơn -keepclasseswithmembers vì nó sẽ chỉ giữ các phương pháp bạn chỉ định và không phải là chính lớp đó (có thể không cần thiết trong trường hợp của bạn khi bạn mô tả).

Nếu bạn có nhiều hơn một đối số cho phương pháp phân tích cú pháp, bạn nên sử dụng:

-keepclassmembers class ** { 
    public static *** parse(...); 
} 

Các ... sẽ phù hợp với bất kỳ số lập luận của bất kỳ loại.

2
-keepclasseswithmembers class * { 
    public static *** parse(***); 
} 
Các vấn đề liên quan