2012-08-24 21 views
6

मेरे पास मेरी गतिविधि में एक वेब व्यू है, और प्रूफर्ड का उपयोग करने के लिए ओबफुसेशन के लिए मेरा वेबव्यू तोड़ना प्रतीत होता है और मुझे समझ में नहीं आता क्यों।प्रोगार्ड एंड्रॉइड वेबव्यू तोड़ता है, क्यों?

कोड बहुत आसान है, मेरे पास मेरी आरएस/कच्ची निर्देशिका में HTML फ़ाइल है, यहां वह कोड है जो डिबगिंग करते समय इसे ठीक करता है।

WebView mv = (WebView)findViewById(R.id.webView1); 
mv.loadUrl("file:///android_res/raw/wesite.html"); 

जैसे ही मैं रिहाई के लिए apk बनाने के लिए, ProGuard के माध्यम से यह चल रहा है यह काम नहीं करता के रूप में, मैं सिर्फ पृष्ठ को लोड नहीं कर सकते हैं।

मैंने अभी तक प्रोजेवार्ड कॉन्फ़िगरेशन फ़ाइल में कुछ भी नहीं जोड़ा है।

उत्तर

9

Proguard निर्देशिका obfuscates इसलिए यदि आप देख रहे हैं android_res के लिए/कच्चे यह शायद नहीं रह गया है कि कहा जाता है!

आप अपनी परियोजना में proguard.cfg फ़ाइल में नियम जोड़ सकते हैं जो इसे कुछ फ़ाइलों को छोड़ देगा। लेकिन इस मामले में, आपके कच्चे संसाधन को संपत्ति फ़ोल्डर में ले जाना चाल चल जाएगा।

समस्या यह है कि वेबकिट फ़ाइल लोडर प्रतिबिंब का उपयोग करके आपके आर $ ड्रॉइंग क्लास को आजमाएगा और लोड करेगा। यदि आप अपनी proguard.cfg फ़ाइल में कोई भी नियम नहीं जोड़ते हैं, तो कक्षा का नाम बदल दिया जाएगा, इसलिए वेबकिट आपके संसाधन को लोड करने में सक्षम नहीं होगा। (Prevent Proguard to remove specific drawables से लिया गया)।

यही कारण है कि एंड्रॉयड संसाधनों के लिए आर वर्ग नामकरण प्रणाली का उपयोग करता है - एक uniquie देखने आईडी अपने आर वर्ग संदर्भित प्रणाली को दरकिनार कर रहे हैं फ़ोल्डर अपने स्थान

द्वारा फ़ाइलों को संदर्भित संपत्ति में फ़ाइल रखने से के बजाय और सब ठीक काम करना चाहिए। जैसा कि ऊपर दिए गए लिंक पर सुझाव दिया है

mv.loadUrl("file:///android_asset/wesite.html"); 

, यह करने के लिए अपने Proguard.cfg फाइल करने के लिए नीचे दिए गए नियम जोड़ने के लिए संभव हो जाना चाहिए:

आप संपत्ति फ़ोल्डर में अपने website.html फ़ाइल बढ़ना चाहिए और कॉल संसाधनों स्थान रोक बजाय obfucated जा रहा है:

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

-keep class **.R$* 

नंगे को ध्यान में कहानियो को जिस तरह से यह एक कारण के लिए करता है काम करता है!

आशा इस मदद करता है

+1

उपरोक्त Proguard.cnf के लिए काम करता है और वेबसाइट को संपत्ति फ़ोल्डर में ले जाता है। हालांकि कोड होना चाहिए, 'mv.loadUrl ("फ़ाइल: ///android_asset/wesite.html"); '** नोट: **' android_asset' 'android_assets' नहीं होना चाहिए। आपके विवरण के लिए धन्यवाद। – Ne0

+0

आपको सभी आर वर्गों और उनके क्षेत्रों को रखने की आवश्यकता नहीं है, यह कुछ संसाधन नामों को चुनना संभव है जिन्हें आप वास्तव में रखना चाहते हैं और शेष (उदा। लेआउट | xml | मान) को obfuscated किया जाना चाहिए। – TWiStErRob

-1

वेब दृश्य में कच्चे फ़ोल्डर की एक फाइल को लोड करने के लिए:

myWebView.loadUrl("file:///android_assets/myfile.html"); 
+0

वह संपत्ति निर्देशिका से फ़ाइलें लोड करता है, न कि कच्ची निर्देशिका। कृपया पोस्ट पढ़ें। समस्या प्रोग्यूड्स obfuscation के साथ है, कोड के साथ नहीं। – Ne0

1

बस संपत्ति बनाम संपत्ति बहस स्पष्ट करने के लिए। परियोजना निर्देशिका में फ़ोल्डर "संपत्ति" (नीचे देखें) बुलाया जाना चाहिए गूगल डॉक्स के अनुसार आप का उपयोग करना चाहिए, जबकि उन तक पहुँचने के लिए "file: /// android_asset /"

संपत्ति/ यह खाली है। आप इसे कच्चे संपत्ति फ़ाइलों को स्टोर करने के लिए उपयोग कर सकते हैं। आपके द्वारा यहां सहेजी गई फ़ाइलों को एक .apk फ़ाइल में संकलित किया गया है, और मूल फ़ाइल नाम संरक्षित है। आप इस निर्देशिका को यूआरआई का उपयोग करके एक सामान्य फाइल सिस्टम के रूप में उसी तरह नेविगेट कर सकते हैं और एसेटमैनेजर का उपयोग करके बाइट्स की धारा के रूप में फ़ाइलों को पढ़ सकते हैं। उदाहरण के लिए, यह बनावट और गेम डेटा के लिए एक अच्छा स्थान है।

कृपया ध्यान दें कि मैं कोई टिप्पणी नहीं जोड़ सकता, इसलिए मैंने इसे उत्तर के रूप में पोस्ट किया है।

0

एक और हालिया प्रश्न से इस पोस्ट का नेतृत्व करने के बाद बस अपडेट करने के लिए।

एंड्रॉइड स्टूडियो (कम से कम 1.0.1) में रिलीज बिल्ड में प्रदान किए गए obfuscation के डिफ़ॉल्ट स्तर में कोई अंतर नहीं है यदि आप संपत्ति का उपयोग करते हैं या अपने मीडिया के लिए res। android_res/raw या android_asset। और वे दोनों अभी भी कहा जाता था।

मैं android_res/raw का उपयोग करके, android_res/raw का उपयोग करके, नवीनतम द्वारा चौंकाने वाले दोनों बिल्डों पर apktool चला गया। आकार पूरी तरह से मेरे मीडिया के कारण था। ऐप स्टोर पर अन्य एपीक्स के साथ-साथ दोनों शायद ही कभी खराब हो गए थे। संसाधन और एक्सएमएल न तो अवसर पर obfuscated थे। एकमात्र कठिनाई में रिवर्स इंजीनियरिंग होगी, ये बाक्समाली को जावा में परिवर्तित कर रहा है। मैंने अन्य एपीके को बेहतर तरीके से खराब कर दिया है, लेकिन मैंने उन मूल वर्ग नामों को बनाए रखा है जिन्हें मैंने उन्हें दिया था, यद्यपि कई हिस्सों में टूट गया था।

मैं प्रो-गार्ड के लिए नया हूं, सी ++ पसंद करता हूं लेकिन मुझे लगता है कि इसे रिलीज बिल्ड के लिए डिफ़ॉल्ट रूप से लागू किया जाता है।

+0

'minifyEnabled true' सेट करें (necrocomment much) – n00b

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