2016-09-27 6 views
12

मुझे कोई समस्या है कि जब आप अज्ञात वर्ग के भीतर अज्ञात वर्ग घोषित करते हैं तो प्रोगार्ड काम नहीं कर रहा है। यह वही है यह एक बुनियादी उदाहरण की तरह दिखाई देता है:प्रोगार्ड जावा में अज्ञात वर्ग में अज्ञात वर्ग को हटाता है

public class Class1 { 
    public void function1(){ 
    new Class2(){ 
     @Override 
     public void function2(){ 
      new Class3(){ 
      @Override 
      public void function3(){ 
       // do something 
      } 
      } 
     } 
    } 
    } 
} 

एक Gradle निर्माण स्क्रिप्ट ProGuard के दौरान मार डाला जा रहा है। अब मैं निम्नलिखित त्रुटि मिलती है: यदि मैं कोड बदलने

my.package.Class1$2$1: can't find enclosing method 'void function2()' in program class my.package.Class1$2 

करने के लिए सिर्फ 1 गुमनाम वर्गों ProGuard के "स्तर" त्रुटियों के बिना खत्म कर रहा है। यह काम करता है:

public class Class1 { 
    public void function1(){ 
     Class3 class3Instance = new Class3(){ 
      @Override 
      public void function3(){ 
       // do something 
      } 
     } 
     new Class2(){ 
     @Override 
     public void function2(){ 
      //do something with class3Instance 
     } 
    } 
    } 
} 

प्रोजेक्ट एक एंड्रॉइड प्रोजेक्ट है, हालांकि मुझे पता है कि इससे कोई फर्क नहीं पड़ता।

मैंने Class1 के लिए सभी अलग-अलग प्रकार की कोशिश की, लेकिन कुछ भी काम नहीं किया। क्या यह प्रोगुआर्ड द्वारा समर्थित नहीं है या क्या मुझे इसे काम करने के लिए एक नियम जोड़ना है?

अद्यतन 1:

के रूप में संरचना अगर इंटरफ़ेस गुमनाम वर्गों के लिए इस्तेमाल का अनुरोध किया। Class2 के लिए इंटरफेस के रूप में निम्नानुसार परिभाषित किया गया है:

public class Class2IntefaceEnclosingClass { 
    public interface Class2 { 
     void function2(); 
    } 
} 

Class3 के लिए इंटरफ़ेस थोड़ा अलग है:

public interface Class3IntefaceEnclosingInterface { 
    interface Class3 { 
     void function3(); 
    } 
} 

नोट: मैं क्योंकि वे द्वारा प्रदान की जाती इंटरफेस के लेआउट को बदल नहीं सकते एंड्रॉयड।

+1

कक्षा 2 कुछ वर्ग (फू कहें) को विस्तारित करना होगा। आप इस तरह कुछ चीज बना सकते हैं। रखरखाव वर्ग * Foo {सार्वजनिक शून्य कार्य 2;} – kujeensiti

+0

कक्षा 2 एक इंटरफ़ेस लागू करता है। जिसे एक इंटरफ़ेस के आंतरिक इंटरफ़ेस के रूप में परिभाषित किया जाता है (यह एंड्रॉइड से है)। मैंने कोशिश की: 'रखरखाव वर्ग * पैकेज बढ़ाता है। बाहरी इंटरफेस {*; } 'और' रखरखाव वर्ग * पैकेज बढ़ाता है। बाहरी इंटरफेस। इंटर्नइंटरफेस {*; } 'और' रखरखाव वर्ग * पैकेज बढ़ाता है। बाहरी इंटरफेस $ इनर इंटरफेस {*; } '। मैंने '-keepattributes InnerClasses' को भी सक्रिय किया। दुर्भाग्य से कोई भाग्य नहीं। –

+1

क्या आप घोंसले को समझने के लिए इंटरफ़ेस और उसके उपयोग की सटीक संरचना साझा कर सकते हैं। (सटीक योग्यता प्राप्त नामों की अपेक्षा नहीं की जाती है) – kujeensiti

उत्तर

1

आप @Keep फ़ंक्शन 1(), function2() और function3() से ऊपर एनोटेशन का उपयोग करने का प्रयास कर सकते हैं।

public class Class1 { 
    @Keep 
    public void function1(){ 
    new Class2(){ 
     @Keep 
     @Override 
     public void function2(){ 
      new Class3(){ 
      @Keep 
      @Override 
      public void function3(){ 
       // do something 
      } 
      } 
     } 
    } 
    } 
} 
संबंधित मुद्दे