2012-10-16 14 views
29

मैं वर्तमान में पुस्तकालयों की एक श्रृंखला को खराब करने का प्रयास कर रहा हूं। मेरी बेस लाइब्रेरी, जिसमें कई पैरामीटर और विधियां हैं जो टाइप पैरामीटर का उपयोग करती हैं, प्रोग्रार्ड ओबफ्यूसेशन द्वारा टाइप किए गए प्रकार पैरामीटर के कारण अन्य कोड द्वारा अनुपयोगी है। Obfuscation को खत्म करना इन मुद्दों को हटा देता है। मैंने सभी प्रोगार्ड उपयोग दस्तावेज़ों, उदाहरणों और समस्या निवारण के माध्यम से पढ़ा है, लेकिन टाइप पैरामीटर से निपटने के तरीके या प्रोगार्ड के किस पहलू प्रकार पैरामीटर को स्ट्रिप करने के बारे में कोई दस्तावेज नहीं ढूंढ पाए हैं।प्रोजेवार्ड को टाइप पैरामीटर को हटाने से आप कैसे रोकते हैं?

निर्माता प्रकार पैरामीटर मुद्दा:

public abstract class AbstractFactoryFactory<T> 

लाइब्रेरी 2 कई वर्गों है कि ऊपर वर्ग का विस्तार लेकिन निर्माता एक संकलक त्रुटि है कि कहा गया है फेंकता शामिल हैं::

लाइब्रेरी 1 निम्नलिखित वर्ग शामिल

error: type AbstractFactoryFactory does not take parameters 

रिटर्न प्रकार पैरामीटर समस्या:

लाइब्रेरी 1 निम्न विधि के साथ एक फू वर्ग है:

public List<String> doSomething() 

पुस्तकालय 2 DoSomething विधि का उपयोग करने की कोशिश करता है, लेकिन कहानियो के बाद विधि एक untyped सूची है जो निम्न संकलक त्रुटि है कि कहा गया है उत्पन्न रिटर्न:

error: incompatible types Object 

Proguard.cfg

-dontoptimize 

-renamesourcefileattribute SourceFile 
-keepparameternames 
-keepattributes Exceptions,*Annotation*,InnerClasses,SourceFile,LineNumberTable,Deprecated 

-keep public class * { 
    public protected *; 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keepclassmembernames class * { 
    java.lang.Class class$(java.lang.String); 
    java.lang.Class class$(java.lang.String, boolean); 
} 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclassmembers class * implements java.io.Serializable { 
    static final long serialVersionUID; 
    private static final java.io.ObjectStreamField[] serialPersistentFields; 
    private void writeObject(java.io.ObjectOutputStream); 
    private void readObject(java.io.ObjectInputStream); 
    java.lang.Object writeReplace(); 
    java.lang.Object readResolve(); 
} 

उत्तर

55

ProGuard Typical Library usage guide के अनुसार:

"हस्ताक्षर" विशेषता जब JDK 5.0 और इसके बाद में संकलन सामान्य प्रकार के उपयोग करने में सक्षम होने के लिए आवश्यक है।

निम्न पंक्ति जोड़ना लापता प्रकार पैरामीटर के साथ मेरी समस्याओं का हल नहीं:

-keepattributes Signature 
+0

धन्यवाद! नेटटी 4 लाइब्रेरी obfuscation के लिए भी इसकी आवश्यकता है। नेटटी 4 में टाइप पैरामीटर माचर विफल रहा है क्योंकि इसे HttpClientCodec, HttpRequestEncoder या MessageToMessageEncoder, और शायद अन्य वर्गों के निर्माण के लिए आवश्यक है। मैं इस टिप्पणी को अन्य उपयोगकर्ताओं के लिए लिखता हूं जो समान नेटटी obfuscation मुद्दे के साथ सामना करते हैं। –

+9

आप एक विशिष्ट वर्ग/विधि के 'हस्ताक्षर' को कैसे रखते हैं? – Elist

+0

मुझे समस्या की जड़ खोजने के लिए हमेशा के लिए ले लिया, लेकिन एक बार जब मैंने पाया कि यह जवाब सिर्फ Google में पॉप अप हो गया है! – atoMerz

संबंधित मुद्दे