2015-01-04 5 views
13

में आपके पास कितनी विधियां हैं, यह जांचता है कि मैं 65K, की डीएक्स सीमा के साथ छेड़छाड़ कर रहा हूं, अगर मैं कुछ नई विधियों को लिखता हूं तो मेरे पास एक डीएक्स त्रुटि है, अगर मैं कुछ पुरानी चीजें हटा देता हूं, तो यह चला गया है।एंड्रॉइड स्टूडियो

क्या एंड्रॉइड स्टूडियो में इस समय आप कितनी विधियों का उपयोग कर रहे हैं यह जांचने का कोई तरीका है?

+0

आप अपने प्रोजेक्ट में एंड्रॉइड स्टूडियो प्लगइन में प्रयुक्त प्रत्येक निर्भरता की विधि गणना की जांच कर सकते हैं, कृपया उत्तर दें http://stackoverflow.com/questions/30648172/gradle-library-duplicates-in-dependencies/36056607#36056607 – darwin

+0

अच्छी तरह से निर्भरता की विधि को समझने का कोई तरीका है? – CoDe

उत्तर

7

मुझे ऐसा करने का एक नाजुक तरीका मिल सकता है, जो शायद किसी भी तरह से बेहतर नहीं है। कॉपी करके अपने मॉड्यूल के build.gradle फ़ाइल के नीचे करने के लिए निम्न पेस्ट, अपने Android SDK स्थापना का पथ और BUILD_TOOLS_VERSION अपने android ब्लॉक के buildToolsVersion कल्पना में निर्दिष्ट एक ही संस्करण के साथ साथ ANDROID_HOME की जगह:

buildscript { 
    dependencies { 
     classpath files("/Users/sbarta/sdk/build-tools/21.0.2/lib/dx.jar") 
    } 
} 

android.applicationVariants.all { variant -> 
    variant.outputs.each { output -> 
     variant.assemble.doLast { 
      // Show the dex count after the assemble task is finished 
      showDexCount(
        [filename: output.outputFile], 
      ) 
     } 
    } 
} 

def showDexCount(Map... files) { 
    def maxReferences = (int) Math.pow(2, 16); 
    def buffer = 5000 // that's for safety, because you can't burn maxReferences 

    println "\n\n***********************************************************************************" 
    println "* DEX COUNTS                  *" 
    println "***********************************************************************************" 
    files.each { 
     def dex = new com.android.dex.Dex(it.filename) 
     def count = dex.tableOfContents.methodIds.size 
     if ((maxReferences - count - buffer) >= 0) 
      println String.format('* %1$5d     (there are still %2$5d references to burn...)    *', 
        count, maxReferences - count - buffer) 
     else 
      println String.format('* %1$5d !!!WARNING!!! Too many references, please decrease by %2$4d!    *', 
        count, -(maxReferences - count - buffer)) 
    } 
    println "***********************************************************************************\n" 
} 

यह डीईएक्स फाइलों का मूल्यांकन करने के लिए डीईएक्स कोड को लोड करता है और विधियों की संख्या गिनता है; यह बिल्ड स्क्रिप्ट में assemble कार्य के अंत में अपना काम जोड़ता है, इसलिए आप इसे कमांड लाइन बिल्ड में देखेंगे या यदि आप इसे वास्तव में एंड्रॉइड स्टूडियो से चलाते हैं (जहां यह ग्रैडल कंसोल में दिखाई देगा)।

मैंने इसे अधिक लचीला बनाने और पथ को हार्डकोड करने की आवश्यकता के बजाय एंड्रॉइड_एचओएमई पर्यावरण चर का उपयोग करने की कोशिश की, लेकिन एंड्रॉइड स्टूडियो से निर्माण करते समय पर्यावरण चर का उपयोग करना समस्याग्रस्त है (हालांकि यह कमांड लाइन से काम करता है)। इसी तरह, मैंने निर्माण स्क्रिप्ट में दूसरी जगह से बिल्ड टूल्स संस्करण को खींचने की कोशिश की जहां इसे संदर्भित किया जा रहा है, और मैंने वैश्विक स्थिरता को परिभाषित करने का भी प्रयास किया, लेकिन निष्पादन कार्य को स्कॉइंग और ऑर्डर नहीं कर सका। अगर कोई इस पर सुधार कर सकता है, तो कृपया उत्तर टिप्पणी या संपादित करें।

यह कार्लोस सोब्रिंहो द्वारा लिखित कुछ चीज़ों से अनुकूलित है; मुझे मूल के लिए वेब-सुलभ संदर्भ नहीं मिल रहा है। https://github.com/mihaip/dex-method-counts

यह आप इस तरह सरल डेटा दिखाएगा:

1) कि तरीकों में गिना जाता है और विभिन्न संकुल में तरीकों की राशि से पता चलता सरल उपकरण:

+0

उपयोगी, धन्यवाद।हालांकि इसे पहचानने के लिए बिल्डस्क्रिप्ट क्लासपाथ के लिए स्थानीय रूप से dx.jar फ़ाइल को स्थापित करना था। एक नोट के रूप में, यदि आपको लाइब्रेरी पर इसकी आवश्यकता है, तो एंड्रॉइड.एपप्लिकेशंस को एंड्रॉइड.testVariants में बदलें ताकि यह आपके टेस्ट एपीके के डीईएक्स पर चल सके। – JCricket

+0

मैं इसका उपयोग करने की कोशिश कर रहा हूं लेकिन यह कहता है 'कक्षा com.android.dex.Dex' को हल करने में असमर्थ ... क्या कोई मेरी मदद कर सकता है या मुझे मार्गदर्शन कर सकता है? अग्रिम में धन्यवाद। –

+3

https://plus.google.com/+JahirFiquitivaJDev/posts/8VXJzyLUiYs मुझे यहां जहीर विषय मिला – Phuong

5

मैं तरीकों की संख्या को खोजने के लिए दो अलग-अलग उपकरणों का इस्तेमाल किया:

Read in 65490 method IDs. 
<root>: 65490 
    : 3 
    android: 6837 
     accessibilityservice: 6 
     bluetooth: 2 
     content: 248 
      pm: 22 
      res: 45 
     ... 
    com: 53881 
     adjust: 283 
      sdk: 283 
     codebutler: 65 
      android_websockets: 65 
     ... 
    Overall method count: 65490 

2) और यहाँ एक और उपकरण है कि और प्रयोग में आसान है, तो आप अपने प्रोजेक्ट में कोई निर्भरता को जोड़ने के लिए है और यह आप प्रत्येक निर्माण पर तरीकों दिखाएगा। आप बस इस निर्भरता लाइन जब आप इसे की आवश्यकता होगी, नहीं कर रहे हैं टिप्पणी कर सकते हैं: https://github.com/KeepSafe/dexcount-gradle-plugin

methods fields package/class name 
5037  1103  android.support.v4 
29  1  android.support.v4.accessibilityservice 
57  16  android.support.v4.animation 
0

https://developer.android.com/studio/build/apk-analyzer.html#view_dex_files

APK विश्लेषक के DEX फ़ाइल दर्शक आप में डेक्स फ़ाइल (फ़ाइलें) में अंतर्निहित जानकारी के लिए तत्काल पहुँच देता है आपके एप्लिकेशन। क्लास, पैकेज, कुल संदर्भ और घोषणा गणना दर्शकों के भीतर प्रदान की जाती है, जो यह तय करने में सहायता कर सकती है कि बहु-डीईएक्स का उपयोग करना है या 64k डीईएक्स सीमा से नीचे आने के लिए निर्भरताओं को कैसे हटाया जाए।

चित्रा 4 64k डीईएक्स सीमा के करीब एक मध्यम आकार के ऐप को दर्शाता है।

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