खोज…


परिचय

DEX का अर्थ है एंड्रॉइड ऐप की (एपीके) एक्ज़ीक्यूटेबल बाईटेकोड फाइलें, Dalvik Executable (DEX) फ़ाइलों के रूप में, जिसमें आपके ऐप को चलाने के लिए उपयोग किए गए संकलित कोड होते हैं।

Dalvik निष्पादन योग्य विनिर्देश उन विधियों की कुल संख्या को सीमित करता है, जिन्हें किसी एकल DEX फ़ाइल के भीतर 65,536 (64K) में निर्दिष्ट किया जा सकता है - अपने स्वयं के कोड में एंड्रॉइड फ्रेमवर्क विधियों, लाइब्रेरी विधियों और विधियों को छोड़कर।

इस सीमा को पार करने के लिए एक मल्टीडेक्स के रूप में जानी जाने वाली एक से अधिक डीएक्स फ़ाइल बनाने के लिए अपनी ऐप बिल्ड प्रक्रिया को कॉन्फ़िगर करना होगा।

टिप्पणियों

डेक्स क्या है?

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

Dex स्मार्टफोन के जीवन काल के संदर्भ में एक बहुत पुराना फ़ाइल प्रारूप है, और उन उपकरणों के लिए डिज़ाइन किया गया था जिनकी मुख्य मेमोरी को दसियों मेगाबाइट में मापा गया था। उन दिनों की डिज़ाइन सीमाएँ आज भी हमारे साथ बनी हुई हैं।

समस्या:

dex फ़ाइल प्रारूप उन विधियों की संख्या की एक सीमा को एन्कोड करता है जिन्हें एकल बाइनरी में संदर्भित किया जा सकता है। क्योंकि फ़ाइल स्वरूप का वह भाग जो संदर्भों की संख्या को संग्रहीत करता है, दो बाइट्स लंबा होता है, विधि संदर्भों की अधिकतम संख्या 0xFFFF , या 65535 होती है। यदि किसी अनुप्रयोग में विधि संदर्भों की संख्या से अधिक है, तो वह संकलन करने में विफल होगा।

इसके बारे में क्या करना है:

Google ने इस समस्या के आसपास एक रास्ता प्रदान किया है, जिसे मल्टीडेक्स कहा जाता है। इसमें संकलन-समय और रन-टाइम घटक हैं। जैसा कि इसका नाम है, संकलन-समय पर यह एक या अधिक dex फाइलों के बीच कोड को विभाजित करेगा। रनटाइम के दौरान, यह डिफ़ॉल्ट ClassLoader को ClassLoader कि इन फ़ाइलों से कक्षाएं कैसे देखें।

यह दृष्टिकोण नए उपकरणों पर अच्छा काम करता है, लेकिन इसमें कुछ कमियां हैं। यह नाटकीय रूप से एप्लिकेशन स्टार्टअप समय बढ़ा सकता है, और पुराने उपकरणों पर Application Not Responding विफल होने का कारण बन सकता है।

मल्टीडेक्स, जबकि प्रभावी, यदि संभव हो तो बचा जाना चाहिए।

सीमा से कैसे बचें:

64K या अधिक विधि संदर्भों के उपयोग को सक्षम करने के लिए अपने एप्लिकेशन को कॉन्फ़िगर करने से पहले, आपको अपने ऐप कोड द्वारा बताए गए तरीकों सहित कुल संदर्भों को कम करने के लिए कदम उठाने चाहिए, जिसमें आपके ऐप कोड द्वारा परिभाषित विधियों या लाइब्रेरी शामिल हैं। निम्नलिखित रणनीतियाँ आपको डेक्स संदर्भ सीमा को टालने में मदद कर सकती हैं:

  • अपने ऐप के प्रत्यक्ष और सकर्मक निर्भरता की समीक्षा करें - अपने ऐप में शामिल किसी भी बड़े पुस्तकालय निर्भरता को सुनिश्चित करें कि इस तरह से उपयोग किया जाता है कि एप्लिकेशन में जोड़े जाने वाले कोड की मात्रा से आगे निकल जाए। एक सामान्य एंटी-पैटर्न एक बहुत बड़ी लाइब्रेरी को शामिल करना है क्योंकि कुछ उपयोगिता विधियां उपयोगी थीं। अपने ऐप कोड निर्भरता को कम करने से आप अक्सर डेक्स संदर्भ सीमा से बचने में मदद कर सकते हैं।
  • ProGuard के साथ अप्रयुक्त कोड निकालें - ProGuard को चलाने के लिए अपने ऐप के लिए ProGuard सेटिंग्स कॉन्फ़िगर करें और सुनिश्चित करें कि आपने रिलीज़ बिल्ड के लिए सिकुड़ सक्षम किया है। सिकुड़ती सक्षम करना सुनिश्चित करता है कि आप अपने APK के साथ अप्रयुक्त कोड को शिपिंग नहीं कर रहे हैं।

पहले बिंदु को डेवलपर की ओर से परिश्रम और अनुशासन की आवश्यकता होती है। तीसरे पक्ष के पुस्तकालयों को शामिल करते समय, किसी को पुस्तकालय के आकार पर विचार करना चाहिए। उदाहरण के लिए, दो लोकप्रिय JSON लाइब्रेरी जैक्सन और Gson हैं। कार्यात्मक रूप से वे काफी समान हैं, लेकिन Gson Android में अधिक से अधिक उपयोग देखने के लिए जाता है। एक कारण यह है कि जैक्सन का वजन लगभग 9,000 तरीकों से है, जबकि ग्सन 1,900 का योगदान देता है।

डेवलपर्स को अपने एप्लिकेशन के आकार पर नज़र रखने में मदद करने के लिए कई उपकरण उपलब्ध हैं:

  • dexcount-gradle-plugin प्रत्येक बिल्ड पर आपके एपीके या AAR में विधि संदर्भों की संख्या की रिपोर्ट करता है
  • डेक्स-मेथड-काउंट एक कमांडलाइन टूल है जो एपीके में मेथड रेफरेंस की संख्या को गिनाता है
  • www.methodscount.com एक वेब सेवा है जो आपके द्वारा अपलोड किए जाने वाले किसी भी एपीके में विधि संदर्भों की गणना करेगी।

मल्टीडेक्सएप्लिकेशन का सीधे उपयोग करके मल्टीडेक्स

यदि आपको Application उपवर्ग की आवश्यकता नहीं है, तो इस विकल्प का उपयोग करें।

यह सबसे आसान विकल्प है, लेकिन इस तरह से आप अपना खुद का Application उपवर्ग नहीं दे सकते। यदि एक Application उपवर्ग की आवश्यकता है, तो आपको ऐसा करने के लिए अन्य विकल्पों में से एक पर स्विच करना होगा।

इस विकल्प के लिए, बस android.support.multidex.MultiDexApplication लिए पूरी तरह से योग्य वर्ग नाम android.support.multidex.MultiDexApplication निर्दिष्ट करें: AndroidManifest.xml में application टैग का android:name गुण:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

अनुप्रयोग का विस्तार करके मल्टीडेक्स

यदि आपकी परियोजना को Application उपवर्ग की आवश्यकता है तो इस विकल्प का उपयोग करें।

android:name का उपयोग करके इस Application उपवर्ग निर्दिष्ट करें android:name application टैग के अंदर प्रकट फ़ाइल में android:name गुण।

Application उपवर्ग में, attachBaseContext() विधि ओवरराइड जोड़ें, और उस विधि में MultiDex.install() कॉल करें:

package com.example;

import android.app.Application;
import android.content.Context;

/**
 * Extended application that support multidex 
 */
public class MyApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

सुनिश्चित करें कि Application उपवर्ग आपके AndroidManifest.xml के application टैग में निर्दिष्ट है:

<application
    android:name="com.example.MyApplication"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">
</application>

Multidex को सक्षम करना

एक बहु-स्तरीय कॉन्फ़िगरेशन को सक्षम करने के लिए आपको निम्न की आवश्यकता होती है:

  • अपने ग्रेडल बिल्ड कॉन्फ़िगरेशन को बदलने के लिए
  • एक MultiDexApplication का उपयोग करें या अपने Application वर्ग में MultiDex को सक्षम करें

ग्रेड विन्यास

app/build.gradle इन भागों को जोड़ें:

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.1"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 24
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

अपने एप्लिकेशन में मल्टीडेक्स को सक्षम करें

फिर तीन विकल्पों में से एक के साथ आगे बढ़ें:

जब इन कॉन्फ़िगरेशन सेटिंग्स को एक ऐप में जोड़ा जाता है, तो एंड्रॉइड बिल्ड टूल आवश्यकतानुसार एक प्राथमिक डेक्स (classes.dex) और समर्थन (classes2.dex, classes3.dex) का निर्माण करते हैं।
निर्माण प्रणाली फिर उन्हें वितरण के लिए एक एपीके फ़ाइल में पैकेज करेगी।

हर बिल्ड पर गिना विधि संदर्भ (Dexcount ग्रेडल प्लगिन)

एक सफल निर्माण के बाद dexcount प्लगइन तरीकों और वर्ग संसाधन गणना को गिनता है।

app/build.gradle में प्लगइन जोड़ें:

apply plugin: 'com.android.application'

buildscript {
    repositories {
        mavenCentral() // or jcenter()
    }

    dependencies {
        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.5.5'
    }
}

app/build.gradle फ़ाइल में प्लगइन लागू करें:

apply plugin: 'com.getkeepsafe.dexcount'

प्लगइन द्वारा उत्पन्न आउटपुट डेटा के लिए देखें:

../app/build/outputs/dexcount

विशेष रूप से उपयोगी .html चार्ट इन है:

../app/build/outputs/dexcount/debugChart/index.html

मल्टीडेक्स एपिलेशन को बढ़ाकर मल्टीडेक्स

यह एक Application उपवर्ग का उपयोग करने और attachBaseContext() को attachBaseContext() विधि को ओवरराइड करने के attachBaseContext()

हालाँकि, इस पद्धति का उपयोग करते हुए, आपको attachBaseContext() जरूरत नहीं है क्योंकि यह MultiDexApplication में पहले से ही किया गया है।

Application बजाय MultiDexApplication बढ़ाएँ:

package com.example;

import android.support.multidex.MultiDexApplication;
import android.content.Context;

/**
 * Extended MultiDexApplication 
 */
public class MyApplication extends MultiDexApplication {

     // No need to override attachBaseContext()

     //..........
}

इस वर्ग को अपने AndroidManifest.xml में ठीक वैसे ही जोड़ें जैसे कि आप आवेदन का विस्तार कर रहे थे:

<application
    android:name="com.example.MyApplication"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">
</application>


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow