2012-08-24 14 views
10

इनलाइन नहीं करता है, मैं नवीनतम एंड्रॉइड एसडीके (4.1) का उपयोग कर रहा हूं और मैंने प्रोगार्ड सक्षम के साथ एक हस्ताक्षरित जार निर्यात करने का प्रयास किया। हालांकि, अनुकूलित एपीके को अपनाने के बाद, मैंने देखा कि जिन विधियों को मैं रेखांकित करने की अपेक्षा करता हूं वे नहीं थे।एंड्रॉइड प्रोगार्ड

मुझे पता है कि प्रोगुआर्ड भाग गया क्योंकि कोड सही ढंग से खराब हो गया था। तो यह पुष्टि करने के लिए, मैं अपने गतिविधि के लिए इस विधि कहा:

private void testInlining() 
{ 
    mConfig = null; 
} 

यह निजी विधि मेरी गतिविधि में केवल एक बार कहा जाता है, और क्योंकि यह निजी है, यह अनुकूलक है कि यह केवल कहा जाता है करने के लिए बहुत स्पष्ट होना चाहिए एक बार और यह रेखांकित किया जाना चाहिए।

प्रलेखन का कहना है कि सभी अनुकूलन डिफ़ॉल्ट रूप से सक्षम होते हैं, और प्रोगुआर्ड "इनलाइन विधियों को छोटा या केवल एक बार बुलाया जाता है"।

क्या प्रोलुआर्ड को इनलाइनिंग सक्षम करने के लिए मुझे एक विशिष्ट ध्वज देना चाहिए?

संपादित

मेरे ProGuard विन्यास फाइल शामिल

-optimizationpasses 5 
-allowaccessmodification 
-overloadaggressively 
-repackageclasses '' 
-dontskipnonpubliclibraryclasses 

संपादित

इस्तेमाल करने के बाद

मैं कारण है कि विधि inlined नहीं है मिलती है:

[proguard] com.templatecompany.templateappname.EntryPointActivity: void testInlining() (20:21) 
[proguard] is invoked by com.templatecompany.templateappname.EntryPointActivity: com.td.media.ivConnection.IvConfig getIvConfig() (14:15) 
[proguard] implements  com.td.widget.MainActivity: com.td.media.ivConnection.IvConfig getIvConfig() 
[proguard] is invoked by com.td.widget.MainActivity: void onCreate(android.os.Bundle) (140:175) 
[proguard] implements  android.app.Activity: void onCreate(android.os.Bundle) 
[proguard] is a library method. 

लेकिन मैं यह देखने के लिए यकीन नहीं है कि कैसे इस तथ्य है कि विधि testInlining विधि getIvConfig जो किसी अन्य विधि द्वारा इस्तेमाल किया बदले में है में प्रयोग किया जाता है getIvConfig में testInlining पर इनलाइनिंग को रोकता है।

+0

क्या आपने यह कोशिश की है? -optimizationpasses 5 अधिक http://stackoverflow.com/questions/5068251/android-what-are-the-recommended-configurations-for-proguard?rq=1 – user1154664

+0

पर आप वास्तव में ProGuard प्राप्त करने में सक्षम थे किसी भी विधि कॉल इनलाइन बनाने के लिए? प्रोगार्ड-एंड्रॉइड-ऑप्टिमाइज़.txt का उपयोग करना और एक साधारण निजी विधि लिखना जो एक int देता है, मैं इसे काम नहीं देख पा रहा था: http://paste.ofcode.org/hbpzPe4EdAnDGnNqNTE7c3 – brAzzi64

उत्तर

15

यह हाल ही में एंड्रॉयड एसडीके डिफ़ॉल्ट रूप से सभी अनुकूलन अक्षम कर देता है, $ {sdk.dir} /tools/proguard/proguard-android.txt देखें:

-dontoptimize 

विकल्प के अनुकूलन विन्यास केवल कुछ अनुकूलन अक्षम करता है, को देखने के $ {sdk.dir} /tools/proguard/proguard-android-optimize.txt:

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* 

आप project.properties में अपना पसंदीदा विन्यास फाइल निर्दिष्ट कर सकते हैं।

आप सत्यापित कर सकते हैं कि कौन सा पूर्ण कॉन्फ़िगरेशन ProGuard विकल्प -printconfiguration जोड़कर उपयोग कर रहा है।

दलविक वीएम (! कोड/सरलीकरण/अंकगणित, कोड/सरलीकरण/कास्ट) के पुराने संस्करणों में बग से बचने के लिए कुछ अनुकूलन अक्षम कर दिए गए हैं, और कुछ अनुकूलन पुराने संस्करणों में बग से बचने के लिए अक्षम हो सकते हैं ProGuard (! फ़ील्ड/*, वर्ग/विलय/*) के।

ध्यान दें कि -whyareyoukeeping घटते कदम को संदर्भित करता है, जो पूरी तरह से अनावश्यक कक्षाओं/फ़ील्ड/विधियों को हटा देता है। हटाए गए तरीकों को ऑप्टिमाइज़ेशन चरण में रेखांकित किया जा सकता है (जब तक स्पष्ट रूप से अन्यथा -keep के साथ निर्दिष्ट नहीं किया गया हो)।

+0

यह समझ में आता है, मुझे पता नहीं था कि मुझे पता नहीं था डिफ़ॉल्ट रूप से Google अक्षम अनुकूलन। बहुत बहुत धन्यवाद, अगर मैं इसे ठीक करता हूं तो मैं जवाब को अस्वीकार कर दूंगा। –

1

अपने मॉड्यूल के build.gradle फ़ाइल में, तुम देखो पर करना चाहिए:

buildTypes { 
    release { 
     minifyEnabled true 
     shrinkResources true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt') 
     signingConfig signingConfigs.release 
    } 
} 

और proguard-android-optimize.txt, जो -dontoptimize लाइन जबकि Dalvik समस्याओं को दूर रख शामिल नहीं है के साथ proguard-android.txt की जगह (एरिक Lafortune के जवाब देखें) ।

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