2013-10-31 6 views
5

http://developer.android.com/google/play/billing/billing_best_practices.htmlआपको vending.billing के लिए ProGuard क्यों अक्षम करना चाहिए?

नोट: यदि आप अपने कोड अंधेरा करना Proguard का उपयोग करते हैं, तो आप अपने Proguard विन्यास फाइल में निम्नलिखित पंक्ति जोड़ना होगा:

-keep class com.android.vending.billing.** 

सवाल यह है: क्यों ?!

उत्तर

1

मुख्य कारण/कठिनाइयों कोड प्रतिबिंब का उपयोग करता है मुश्किल होता है जब ProGuard उपयोग कर रहा है के लिए है कि लाइन को जोड़ने के लिए है।

उदाहरण के लिए जब आप नाम से कक्षा को तत्काल करते हैं, जैसे वेब सेवाएं, और कुछ एक्सएमएल पार्सर करते हैं, तो यह अब और काम नहीं करता है।

एक अन्य कारण जहां कहानियो को अनुमति दी है नहीं, लेकिन शायद प्रश्न से संबंधित नहीं:
जीपीएल की तरह लाइसेंस शर्तों lib के एक अद्यतन संस्करण द्वारा अंतिम उपयोगकर्ता द्वारा lib के प्रतिस्थापन की संभावना मांग करती है।
इस तरह के एक lib को obfuscated होने की अनुमति नहीं है (प्रोगार्ड के पास सिच लाइब्रेरी जार के लिए एक विकल्प है)

0

प्रोगुआर्ड न केवल अनुप्रयोगों को रोकता है बल्कि उन्हें अनुकूलित भी करता है। ऑप्टिमाइज़ करते समय इसे बिना संदर्भित कक्षाओं को हटा दिया जाता है।

वेंडिंग की कक्षाओं को हटाने को रोकने के लिए आप अपने proguard.cfg

2

यह वास्तव में एक अच्छा सवाल है। हम जानते हैं कि क्यों कुछ कक्षाओं के लिए obfuscation अक्षम किया जाना चाहिए, लेकिन यह सवाल का जवाब नहीं देता है कि इसे InAppBillingService के लिए क्यों अक्षम किया जाना चाहिए। यदि आप चेकआउट InAppBillingService.class उत्पन्न करते हैं, तो आपको पता चलेगा कि कोई भी प्रतिबिंब कॉल नहीं है, साथ ही कोई भी getClass().getName() कॉल नहीं है। इसका मतलब है कि प्रतिबिंब का उपयोग नहीं किया जाता है। आईएबी कार्यान्वयन संदर्भ सीधे नाम से कक्षा उत्पन्न करते हैं, जिसका अर्थ है कि obfuscator अनुकूलन चरण पर वेंडिंग कैल्स को हटा नहीं देगा। इस प्रकार, अभी भी है "यह क्यों जरूरी है?" सवाल।

My app अस्पष्ट बिलिंग पैकेज के साथ आधे साल पहले से ही से अधिक आईएपी वी 3 का उपयोग किया गया और वहाँ कोई बिल्कुल आईएबी के साथ एक एकल मुद्दा है। एकमात्र संभावित समस्या यह है कि अगर एंड्रॉइड एड्स इंटरफेस के लिए जावा क्लास उत्पन्न करता है तो एंड्रॉइड बदलता है। यह प्रतिबिंब का उपयोग शुरू होता है, तो मुझे इस तरह के वर्गों को obfuscated से रखने की आवश्यकता होगी। लेकिन ऐसा होने की संभावना नहीं है क्योंकि यह सहायक सहायता का उपयोग करके कई अन्य ऐप्स में भी कोडिंग तोड़ देगा।

+0

क्या आपके पास @ एलेक्सवियन द्वारा इंगित एक्सएमएल deserialization के साथ कुछ करने के लिए हो सकता है? मुझे सच में लगता है कि Google को इसके बारे में अधिक जानकारी प्रदान करनी चाहिए। यदि आप इन-ऐप बिलिंग रनटाइम त्रुटि के साथ समाप्त होते हैं तो obfuscation से जुड़े संभावित कारणों के बारे में जानना अच्छा होता है। – l33t

+0

एंड्रॉइड एआईडीएल serialization और deserialization के लिए 'android.os.Bundle' वर्ग का उपयोग करता है। Obfuscated कोड में इसका उपयोग सुरक्षित है। जब आप AndroidManifest.xml में कोई सेवा पंजीकृत करते हैं और इसे खराब करते हैं तो एकमात्र एक्सएमएल से संबंधित समस्या मुझे पता है। इस मामले में सेवा का नाम भी obfuscated हो जाता है, और सिस्टम अब पुराने नाम के तहत नहीं मिल सकता है। यह वास्तव में अजीब है कि उन्हें obfuscate क्यों जरूरत है। शायद बस मामले में;) –

+0

परानिया मोड: "हो सकता है क्योंकि Google जासूस इंजन बिलिंग वर्गों के लिए सभी एसेस ट्रैक करना चाहते हैं ;-)", पार्नोआ मोड बंद। – AlexWien

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