2012-12-27 23 views
38

रखें मेरे एंड्रॉइड प्रोग्राम में class A है, जिसमें दो static inner class हैं। उन्हें प्रोजेक्ट लागू करने के बाद .dex से अलग किया जाता है।एंड्रॉइड प्रोग्रार्ड, आंतरिक कक्षा

public class A{ 

    ... 
    static class B{ 
    ... 
    } 

    static class C{ 
    ... 
    } 
} 

मैंने निम्नलिखित लाइनों को proguard.flags में रखा है, लेकिन कोई भाग्य नहीं लगता है।

-keep class com.xxx.A 
-keep class com.xxx.A$* 

कोई संकेत?

+0

मेरे लिए में लाइनों को जोड़ सकते हैं समझ से परे होने के लिए नहीं करना चाहते हैं, यह क्या हो रहा था क्योंकि मेरे भीतर के वर्ग एक को लागू किया गया था इंटरफेस जो एपीआई 16+ में पेश किया गया था। जैसे ही मैंने 'कार्यान्वयन' से उस इंटरफ़ेस को हटा दिया, मेरी आंतरिक कक्षा प्री-एपीआई 16 में ठीक काम करना शुरू कर दिया। – Sufian

उत्तर

44

रखरखाव गुणों के लिए InnerClasses जोड़ने का प्रयास करें। उदाहरण के लिए:

-keepattributes Exceptions, InnerClasses, ... 

इसके अलावा, एक तारक के साथ फोन तो जैसे "रखना" के लिए एक शरीर जोड़ने का प्रयास करें:

-keep class com.xxx.A$* { 
    *; 
} 
+1

मैं पहले से ही इन पंक्तियों को जोड़ता हूं, लेकिन अभी भी काम नहीं कर रहा हूं ... –

+0

क्या आप अपनी अधिक proguard.flags फ़ाइल पोस्ट कर सकते हैं, फिर? मैं अनुमान लगा नहीं रखना चाहता कि पहले से क्या है :) –

+0

हाय, मैं एंड्रॉइड फ्रेमवर्क को संशोधित कर रहा हूं, इसलिए यह https://github.com/dzo/build/blob/master/core/proguard.flags जैसा ही है , प्लस-रखरखाव और मेरे उपरोक्त संशोधन। –

3

आपका कॉन्फ़िगरेशन सही लग रहा है। आपको दोबारा जांच करनी चाहिए कि आपने कक्षा के नामों की गलत वर्तनी नहीं की है। यदि वर्तनी गलत है, तो ProGuard को इसके बारे में एक नोट प्रिंट करना चाहिए। आप -printseeds seeds.txt भी निर्दिष्ट कर सकते हैं, और देख सकते हैं कि आपकी कक्षाएं परिणामी फ़ाइल में सूचीबद्ध हैं या नहीं। यदि वे सूचीबद्ध हैं, तो कक्षाएं संसाधित कोड में भी हैं।

जैसा कि अलेक्जेंडर लुकास ने उल्लेख किया है, आप इन वर्गों के खेतों और विधियों को भी रखना चाहते हैं - जो आपकी आवश्यकताओं पर निर्भर करता है।

+0

इसका मतलब क्या है यदि मेरी आंतरिक कक्षा बीज.txt फ़ाइल में नहीं है? http://stackoverflow.com/questions/19368053/proper-proguard-configuration-to-keep-static-inner-class-fields – TacB0sS

29

यह मैं

-keep class com.xxx.A { *; } 
-keep class com.xxx.A$B { *; } 
-keep class com.xxx.A$C { *; } 
+0

यह मेरे लिए काम करता है। मेरे पास लगभग इस समाधान का था, लेकिन उन्हें 'सार्वजनिक' शब्द को कथन से हटा देना पड़ा, भले ही बाहरी और आंतरिक दोनों कक्षाएं सार्वजनिक हों। अजीब और भ्रमित। – Gi0rgi0s

5

इस के लिए मुझे

-keepattributes InnerClasses 
-keep class com.yourpackage.YourClass** 
-keepclassmembers class com.yourpackage.YourClass** { 
    *; 
} 

चाल किया था मेरी config के लिए क्या करने के लिए यह वाइल्डकार्ड के साथ एक सा overkill हो सकता था, लेकिन मुझे यकीन है कि बनाना चाहते थे क्या है मैं कुछ भी याद नहीं आया। मुख्य बात यह है कि आपको इनर क्लास की कक्षा में रखने और वर्ग पर रख-रखाव रखने वाले गुणों की आवश्यकता होती है।

+1

यह लाइन "-keepclassmembers com.yourpackage.YourClass **" को इस "-keepclassmembers क्लास com.yourpackage.YourClass **" –

+1

में बदला जाना चाहिए, आप अंतिम दो पंक्तियों को विलय कर सकते हैं।keepclassmembers केवल सार्थक है यदि आप वर्ग को खुद को एक प्रविष्टि बिंदु के रूप में भी नहीं रखते हैं – Matthias

5

आप सभी आंतरिक वर्ग और कुछ पैकेज में सदस्यों को आप proguard-rules.pro

-keep class com.xxx.task.*$* { 
     *; 
    } 
संबंधित मुद्दे