2011-06-08 15 views
17

नहीं रखेंगे मैं एक जावा पुस्तकालय के रूप में वितरित एक पुस्तकालय पर काम कर रहा हूं, और मैं इस तरह से प्रोजेगार्ड चला रहा हूं ताकि केवल आवश्यक इंटरफेस को उजागर किया जा सके। मेरे पास एक सदस्य वर्ग चर के साथ एक विन्यास वर्ग है और कुछ enum परिभाषित करता है। मेरी प्रोजेवार्ड स्क्रिप्ट सदस्य चर को ठीक से संरक्षित करती है, हालांकि, enum परिभाषाओं को obfuscated किया जा रहा है। मैंने इन आंतरिक रूप से परिभाषित और सार्वजनिक enums को बनाए रखने के लिए प्रोजेवार्ड को मजबूर करने के बारे में सोचने की हर चीज की कोशिश की है, लेकिन मैं इसे काम नहीं कर सकता।प्रोगार्ड क्लास सदस्य के enums

अभी मैं उपयोग कर रहा हूँ:

-keep public class com.stuff.MyConfigObject { 
    public *; 
} 

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

अगर मैं कोशिश:

-keep public enum com.stuff.MyConfigObject.MyEnum 

मैं एक अस्पष्ट त्रुटि मिलती है: "ध्यान दें: विन्यास अज्ञात वर्ग 'com.stuff को संदर्भित करता है .MyConfigObject.MyEnum ''

सहायता के लिए धन्यवाद!

उत्तर

31

इसके बजाय com.stuff.MyConfigObject$MyEnum आज़माएं। प्रोगार्ड class specification$ को आंतरिक कक्षाओं के विभाजक के रूप में उम्मीद करता है।

असल में, आप क्या चाहते हैं के लिए सबसे अच्छा विकल्प हो सकता है कुछ इस तरह है:

-keep public enum com.stuff.MyConfigObject$** { 
    **[] $VALUES; 
    public *; 
} 

यह MyConfigObject भीतर नेस्ट सभी enum रों के लिए केवल आवश्यक सदस्यों रखेंगे - आवश्यक सदस्यों $VALUES[] सरणी जा रहा है (देखें स्पष्टीकरण के लिए this question) और एनम के सदस्यों के public सदस्य। कोई अन्य सदस्य (जैसे निजी फ़ील्ड विधियों) को नहीं रखा जाएगा।


टिप्पणी में जेसी और अपने आप से बताया गया है - आप एक पुस्तकालय कार्रवाई कर रहे हैं के बाद से, आप भी -keepAttributes विकल्प को जोड़ना होगा। संदर्भ मार्गदर्शिका से:

For example, you should at least keep the Exceptions, InnerClasses, and Signature attributes when processing a library.

+0

धन्यवाद कि मुझे बहुत करीब मिल गया है! हालांकि, परिणामस्वरूप .jar थोड़ा अजीब है। Enums के लिए कक्षा फाइलें हैं, और सबकुछ ठीक दिखता है, लेकिन ग्रहण में, किसी भी सदस्य का उपयोग नहीं किया जा सकता है। कोड पूर्णता उन्हें सही ढंग से दिखाती है, लेकिन संकलन विफल रहता है "MyEnum को हल नहीं किया जा सकता है या कोई फ़ील्ड नहीं है।" मैं प्रोगार्ड 4.4 का उपयोग कर रहा हूँ। – Jesse

+2

मैंने पाया कि क्या आप '-keepAttributes **' जोड़ते हैं, यह काम करेगा। सुनिश्चित नहीं है कि कौन सी विशेष विशेषताएं रखी जानी चाहिए, लेकिन [प्रोगार्ड संदर्भ] (http://proguard.sourceforge.net/manual/usage.html#keepattributes) के साथ और कुछ प्रयोग मैं शर्त लगाता हूं कि आप इसे समझ सकते हैं। –

+0

धन्यवाद @ केविन के, आप एक जीवन बचतकर्ता हैं। एक जादू की तरह काम करता है! – Jesse

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