2011-07-01 19 views
6

Chcę zachować tylko klasy, które zawierają metody opisane w @Keep i te metody. Te metody (i posiadanie klas) powinny być przechowywane, nawet jeśli nie są używane.Jak prowadzić zajęcia z określonymi członkami?

Co napisać w aktach .pro jest:

-keepclassmembers class * { 
    @Keep *; 
} 

-keepclasseswithmembers class * { 
    @Keep *; 
} 

Ale to kurczy się zajęcia z metod @Keep jeśli są nieużywane.

Potem spróbuj tego:

-keep class * { 
    @Keep *; 
} 

to właśnie zachowuje wszystkie klasy.

Co powinienem napisać w pliku .pro?

Aktualizacja 1: przykład Dzięki za odpowiedź. Ale już używam w pełni kwalifikowanych nazw adnotacji i dołączam do nich JAR-y z adnotacjami, ale nie robię tego, co chcę. Przygotowałem próbkę.

mam 2 dzbanków:

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 *; 
} 

nazwy See, pakietów są prawidłowe, a wszystkie słoiki są włączone.

Wynikające map-file:

example.lib.Keep -> example.lib.Keep: 

Więc A.class zostanie usunięty. Co ja robię źle?

Odpowiedz

15

Podobnie jak w przykładach/adnotacjach/lib/adnotations.pro w dystrybucji ProGuard, należy podać pełne nazwy. Ponadto -keepclasseswithmembers opcja nie dobrze łączą się z „*” zamiennika - użyć „<metod>” wieloznaczny Zamiast:

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

też nie należy zapominać, aby przeczytać słoik zawierający adnotację klasy:

-libraryjars annotations.jar 
+0

Właśnie zaktualizowałem temat próbką.Robię to samo, co sugerujesz, i nadal nie działa: "( – Andy

+0

I określenie JAR z adnotacji jako biblioteki (-libraryjars) nie pomaga. – Andy

+0

Zaktualizował rozwiązanie, aby użyć właściwego wieloznacznika. teraz –

Powiązane problemy