2011-09-11 14 views
20

मेरे पास एक ऐप है जो एक्टिव एंड्रॉइड का उपयोग करता है, डेटाबेस ओआरएम लाइब्रेरी, जो एनोटेशन पर निर्भर करता है।प्रोगुआर्ड बनाम एनोटेशन

@Table(name="test") 
public class DatabaseItem extends ActiveRecordBase<DatabaseItem> { 

    public DatabaseItem(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 

    @Column(name="counter") 
    public int counter; 

} 

मैं Proguard इस के साथ अच्छी तरह से काम कर कैसे मिलता है? वर्तमान में, मुझे प्रोगार्ड का उपयोग करते समय ActiveAndroid द्वारा कॉलम नाम नहीं ढूंढने के बारे में त्रुटियां मिलती हैं। मुझे लगता है कि यह किसी भी तरह एनोटेशन उलझन में है।

मेरे प्रासंगिक Proguard विन्यास:

#ActiveAndroid 
-keep public class com.activeandroid.** 
-keep public class * extends com.activeandroid.ActiveRecordBase 
-keepattributes Column 
-keepattributes Table 

उत्तर

31

Column और Table रखने के लिए किया गया था। आपको कम से कम

-keepattributes *Annotation* 

सीएफआर निर्दिष्ट करना होगा। ProGuard manual

6

समाधान मौजूदा नहीं कर रहे हैं जावा वर्ग फ़ाइल विशेषताओं पुस्तकालय के सभी सदस्यों और डेटाबेस वर्गों

-keep class com.activeandroid.** 
{ 
    *; 
} 
-keep public class my.app.database.** 
{ 
    *; 
} 
-keepattributes Column 
-keepattributes Table 
+1

मैं इस का इस्तेमाल किया है, लेकिन दो पंक्तियों के बजाय "-keepattributes" मैं यह केवल लाइन का इस्तेमाल किया: "-keepattributes \ * एनोटेशन \ *", के रूप में संकेत दिया एरिक लाफोर्ट्यून और साइमन एंड्रे फोर्सबर्ग द्वारा। सब कुछ ठीक काम किया! – PFROLIM

15

मार्च 2013, Proguard version 4.9 was released, फिक्स में से एक में थे:

Fixed overly aggressive shrinking of class annotations. 

तो सुनिश्चित करें कि आपके Proguard संस्करण अप टू डेट है कि बनाने के लिए और फिर एरिक Lafortune के समाधान का उपयोग करें:

-keepattributes *Annotation* 

आप कर सकते हैं इस कॉन्फ़िगरेशन का उपयोग उन सभी वर्ग सदस्यों को स्टोर करने के लिए भी करें जिनके पास एक विशिष्ट एनोटेशन है:

-keepclassmembers class * { 
    @fully.qualified.package.AnnotationType *; 
} 
2

उन केवल Gradle का उपयोग कर के लिए, समाधान बहुत समान है (ध्यान दें एनोटेशन के आसपास एकल उद्धरण):

keep 'public class java.package.** { *; }' 

keepattributes '*Annotation*' 

यह विशेष रूप से उपयोगी है यदि आप एक में JSON क्रमबद्धता एनोटेशन (जैसे, जैक्सन या की तरह) का उपयोग कर रहे वेनिला ग्रैडल परियोजना।

0

यह वही मेरे मामले में काम किया:

-keep class com.activeandroid.** { *; } 
-keep class com.activeandroid.**.** { *; } 
-keep class * extends com.activeandroid.Model 
-keep class * extends com.activeandroid.serializer.TypeSerializer 
-keep public class * extends com.activeandroid.ActiveRecordBase 

-keepattributes Column 
-keepattributes Table 
-keepattributes *Annotation* 
-keepclasseswithmembers class * { @com.activeandroid.annotation.Column <fields>; } 
संबंधित मुद्दे