2015-05-22 6 views
9

प्रोजेवार्ड एक अमूर्त वर्ग में अप्रयुक्त विधियों को अप्रयुक्त के रूप में हटा रहा है, भले ही वे मूल वर्ग में उपयोग किए जाते हैं। यहाँ एक संदर्भ व्यवहार दिखाप्रोगुअर्ड अमूर्त वर्ग में अप्रयुक्त विधियों को अप्रयुक्त

public abstract class Animal { 
    Animal() { 
     born(); 
    } 

    abstract void born(); 
} 

public abstract class Human extends Animal { 
    @Override 
    void born() { 
     System.out.println("Human is born."); 
    } 
} 

गुण रखने के कार्यान्वयन है परिभाषित कर रहे हैं के रूप में:

-keep public class test.Human { 
    public *; 
} 

Proguard अप्रयुक्त के रूप में मानव कक्षा में अधिरोहित born() तरीकों निकाल देता है, भले ही यह निर्माता से प्रयोग किया जाता है पशु वर्ग के। जिसके परिणामस्वरूप मैपिंग फ़ाइल

test.Animal -> test.a: 
    void born() -> a 
test.Human -> test.Human: 

यह समस्या है मौजूद नहीं है, तो वर्ग Human सार नहीं है। यदि वर्ग Human गैर सार है, जिसके परिणामस्वरूप मैपिंग फ़ाइल

test.Animal -> test.a: 
    void born() -> a 
test.Human -> test.Human: 
    void born() -> a 

है हम देख सकते हैं, विधि born() इस मामले में बनाए रखा है।

क्या यह प्रोजेगार्ड में एक बग है? या क्या कोई अनुकूलन सेटिंग है जो वांछित व्यवहार प्रदान कर सकती है?

मैं एंड्रॉइड स्टूडियो के साथ प्रोगार्ड का उपयोग कर रहा हूं।

+0

क्या कोई ठोस वर्ग है जो मानव को फैलाता है? यदि ऐसा नहीं है, तो यह हो सकता है कि यह घट रहा है कि 'मानव.बर्न' को कभी भी निष्पादित नहीं किया जा सकता है। –

+0

@Devon_C_Miller लाइब्रेरी का हिस्सा होने के बाद से कोई ठोस वर्ग नहीं है। वही समस्या मौजूद है यदि रचनाकारों को किसी अन्य विधि द्वारा प्रतिस्थापित किया जाता है जिसे मैपिंग में रखा जाता है और दिखाया जाता है। – adwiv

उत्तर

1

और के बाद से समस्या केवल प्रकट होता है जब इन कक्षाओं में एक पुस्तकालय का हिस्सा हैं (कोई ठोस कार्यान्वयन के बिना:

आप उनके लिए तरीकों रखना लेकिन कहानियो को अभी भी अनुमति देना चाहते हैं, तो आप कुछ इस तरह उपयोग कर सकते हैं लाइब्रेरी के भीतर), मैंने आसान तरीका निकाला और -dontshrink को सभी कक्षाओं और विधियों को बनाए रखने के लिए (obfuscation के साथ) जोड़ा।

ज्यादातर मामलों में; लाइब्रेरी जारी करते समय कक्षा और विधि घटाने की आवश्यकता नहीं है।

फिर भी मुझे विश्वास है कि यह ओवरराइड विधि कार्यान्वयन को अनदेखा करने के लिए उपयोग ग्राफ में एक बग है। मैंने प्रोजेगार्ड बग ट्रैकर में एक बग दायर किया है। https://sourceforge.net/p/proguard/bugs/574/

2

आप सार्वजनिक विधियों को रखने के लिए ProGuard कॉन्फ़िगर करते हैं, जबकि born() पैकेज निजी है। आपकी कॉन्फ़िगरेशन इस तरह की होनी चाहिए।

-keep public class test.Human { 
    <methods>; 
} 

यह मानव पैकेज के सभी पैकेज निजी (डिफ़ॉल्ट) विधियों को रखेगा।

-keep, allowobfuscation public class test.Human { 
    <methods>; 
} 
+0

यहां समस्या 'रखरखाव विधियों' के बारे में नहीं है, लेकिन प्रोजेवार्ड के बारे में ओवरराइड विधि को पहचानने और उन्हें कम करने के लिए अपूर्ण विधि को पहचानने के बारे में नहीं है। यह तब होता है जब मैं लाइब्रेरी बना रहा हूं क्योंकि समस्या केवल एक अमूर्त वर्ग में प्रकट होती है। आपका सुझाव काम करता है लेकिन काफी पसंद है - नोश्रिंक जिसे मैं उपयोग नहीं करना चाहता हूं। – adwiv

+0

हालांकि आपका सुझाव मुझे लाइब्रेरी में एक अमूर्त वर्ग के सभी ओवरराइड तरीकों को रोकना है जो समझ में आता है। इसके लिए हमें क्या उपयोग करना चाहिए? – adwiv

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