2009-07-22 12 views
6

के साथ obfuscating जब आंतरिक कक्षाओं का पर्दाफाश कर रहा हूँ मैं चींटी कार्य का उपयोग कर ProGuard के साथ एक पुस्तकालय obfuscating हूँ।ProGuard

मैं जब वे एक विशेष टिप्पणी (@ApiAll) है विशेष वर्ग के नाम और उनके विधि के नाम रखने का अनुरोध कर रहा हूँ और मैं कर रहा हूँ कि InnerClasses विशेषता रखा जाना:

<keepattribute name="InnerClasses" /> 
    <keep annotation="com.example.ApiAll"/> 
    <keepclassmembers annotation="com.example.ApiAll"> 
    <constructor access="public protected"/> 
    <field access="public protected"/> 
    <method access="public protected"/> 
    <constructor access="protected"/> 
    </keepclassmembers> 

अगर मैं मानचित्रण उत्पादन की जाँच फ़ाइल मैं देख सकता हूं कि मेरी आंतरिक कक्षा जिसमें एनोटेशन है और उसके सदस्य अपने नामों को बिना किसी परेशानी रखते हैं। हालांकि जब मैं जेनरेट की गई जार फ़ाइल में देखता हूं तो मुझे कक्षा नहीं मिल सकती है।

क्या मुझे कुछ याद आ रही है? मानचित्रण मुझे क्यों बता रहा है कि यह इस कक्षा को तब तक रख रहा है जब यह नहीं है?

उत्तर

20

आपको यह निर्दिष्ट करने की आवश्यकता है कि आप उचित नोटेशन का उपयोग करके आंतरिक कक्षा को रखना चाहते हैं। प्रोजेर्ड पैरालांस में, इसका अर्थ है -keep class my.outer.Class$MyInnerClass। यहां कुंजी डॉलर-चिह्न ($) का उपयोग आंतरिक और बाहरी वर्ग के बीच विभाजक के रूप में कर रही है।

ऐसा करने के लिए, आपको -keepattributes InnerClasses निर्दिष्ट करना होगा, ताकि MyInnerClass नाम obfuscated न हो। इन दो सेटिंग्स को एक साथ आपके आंतरिक वर्गों को बरकरार रखने की अनुमति देनी चाहिए।

+0

धन्यवाद मार्कस। इससे मुझे मेरी समस्या हल करने में मदद मिली – Fenil

+0

yGuard के साथ एक ही समस्या के लिए यह सही उत्तर है – ygesher

0

विकल्प keepclassmembers केवल निर्दिष्ट क्लास सदस्यों (और उनके नाम) को सुरक्षित करता है।

शायद आप अधिक सामान्य विकल्प keep चाहते हैं, जो निर्दिष्ट कक्षा और वर्ग के सदस्यों (और उनके नाम) को संरक्षित करता है।

सीएफआर। ProGuard manual > Usage > Overview of Keep Options

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