2013-12-16 9 views
7

मैंने अपने एंड्रॉइड एप्लिकेशन में ProGuard लागू किया है।प्रोजेगार्ड एंड्रॉइड में गतिविधि कक्षा क्यों रखता है?

मैं

android-studio/sdk/tools/proguard/proguard-android.txt 

उपयोग कर रहा हूँ एक विन्यास फाइल के रूप में, कुछ भी नहीं बदल रहा है।

We want to keep methods in Activity that could be used in the XML attribute onClick 
-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

यह से कि क्रियाएँ वर्ग के नाम को ProGuard द्वारा obfusctated रहे हैं, जबकि कुछ तरीकों संरक्षित कर रहे हैं के रूप में वे इस प्रकार हैं:

इस फाइल में मैं केवल गतिविधि के बारे में बयान देख सकते हैं। यह समझ में आता है।

हालांकि, अपने आवेदन में मैं तो एक गतिविधि कक्षा एक स्ट्रिंग का उपयोग

Class.forName("my.app.MyActivity") 

तो मैं इस गतिविधि शुरू से बना सकते हैं और यह ठीक शुरू होता है।

लेकिन इसका मतलब है कि गतिविधि-व्युत्पन्न कक्षाएं obfuscated नहीं हैं ??। क्योंकि ProGuard Activity के लिए -keep class निर्देश नहीं है यह विफल रहे हैं चाहिए, यह केवल -keepclassmembers.

है सकते हैं किसी को, कृपया, समझाने, अगर मैं व्यवहार मैं निरीक्षण पर भरोसा कर सकते? या क्या मैं -keepclassmembers निर्देश को गलत समझता हूं?

+0

आपको पूरी फाइल पोस्ट करनी चाहिए, क्योंकि अकेली पंक्ति यह समझाने के लिए पर्याप्त नहीं है कि यह गतिविधि का नाम क्यों रखती है – Raffaele

उत्तर

9

क्योंकि गतिविधियां मैनिफेस्ट में सूचीबद्ध हैं और संदर्भित कक्षाएं स्वचालित रूप से रखी जाती हैं। इसकी आवश्यकता है क्योंकि एंड्रॉइड फ्रेमवर्क इन ऐप एंट्री पॉइंट्स को प्रतिबिंब के माध्यम से एक्सेस करता है।

here से:

निर्माण प्रक्रिया को स्वचालित रूप से विन्यास फाइल bin/proguard.txt, पर AndroidManifest.xml और अन्य xml फ़ाइलें आधारित बनाने के लिए उपकरण aapt चलाता है। निर्माण प्रक्रिया तब कॉन्फ़िगरेशन फ़ाइल को ProGuard में पास करती है। तो ProGuard खुद वास्तव में AndroidManifest.xml पर विचार नहीं करता है, लेकिन एप + प्रोगार्ड करते हैं।

3
ProGuard FAQ से

:

करता ProGuard संभाल Class.forName कॉल?

हां। ProGuard स्वचालित रूप से Class.forName ("SomeClass") और SomeClass.class जैसे संरचनाओं को संभालता है। संदर्भित वर्गों को संकुचित चरण में संरक्षित किया जाता है, और स्ट्रिंग तर्कों को ठीक से obfuscation चरण में बदल दिया जाता है। चर स्ट्रिंग तर्क के साथ, आमतौर पर उनके संभावित मान निर्धारित करना संभव नहीं है। उदाहरण के लिए, उन्हें कॉन्फ़िगरेशन फ़ाइल से पढ़ा जा सकता है। हालांकि, ProGuard कई संरचनाओं को नोट करेगा जैसे "(SomeClass) Class.forName (variable)। NewInstance()"। ये एक संकेत हो सकता है कि कक्षा या इंटरफ़ेस SomeClass और/या इसके कार्यान्वयन को संरक्षित करने की आवश्यकता हो सकती है। डेवलपर तदनुसार अपनी कॉन्फ़िगरेशन अनुकूलित कर सकता है।

तो, प्रोगार्ड आपके अपेक्षा से अधिक चालाक है: यह forName() के उपयोग के सामान्य मामलों को स्वचालित रूप से पहचान और संभाल लेगा। यहां तक ​​कि यदि एंड्रॉइड मेनिफेस्ट फ़ाइल में क्लास का संदर्भ नहीं दिया गया है, तो ProGuard पर आपके कॉल में कक्षा और दोनों में क्लास नाम को खराब कर देगा।

क्रियाकलापों के लिए, यह मुझे आश्चर्य नहीं करेगा यदि आप इस व्यवहार से दोगुनी रूप से कवर हैं और एंड्रॉइड-विशिष्ट इनपुट द्वारा प्रोगार्ड में जो बिल्ड प्रक्रिया का हिस्सा है, जैसे @laalto ने अपने उत्तर में उल्लेख किया है।

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