एकता विधि 64K की सीमा से अधिक है


20

मुझे अभी एकता में 64k विधि से संबंधित एक मुद्दा मिला है, इसलिए मैं अपनी परियोजना बनाने में असमर्थ हूं। यह दर्शाता है कि विधि सीमा 64k विधि गणना की सीमा से अधिक है। तो क्या यहाँ कोई मेरी मदद कर सकता है इस मुद्दे को हल करने के लिए?

जवाबों:


22

यह उत्तर एंड्रॉइड के आधिकारिक प्रलेखन (उद्धृत भागों, विशेष रूप से) पर बहुत निर्भर करता है ।


एकता परियोजना के लिए मल्टीडेक्स समर्थन कैसे सेटअप करें

मल्टीडेक्स क्या है:

एंड्रॉइड एप्लिकेशन (एपीके) फाइलों में डाल्विक एक्सेसेबल (डीईएक्स) फाइलों के रूप में निष्पादन योग्य बायटेकोड फाइलें होती हैं, जिसमें आपके ऐप को चलाने के लिए उपयोग किए गए संकलित कोड होते हैं। Dalvik निष्पादन योग्य विनिर्देश उन तरीकों की कुल संख्या को सीमित करता है, जिन्हें किसी एकल DEX फ़ाइल के भीतर 65,536 में संदर्भित किया जा सकता है, जिसमें Android फ्रेमवर्क विधियाँ, लाइब्रेरी विधियाँ, और आपके अपने कोड में विधियाँ शामिल हैं। इस सीमा को पार करने के लिए आवश्यक है कि आप एक बहु डेक्स कॉन्फ़िगरेशन के रूप में ज्ञात एक से अधिक डीएक्स फ़ाइल बनाने के लिए अपनी एप्लिकेशन बिल्ड प्रक्रिया को कॉन्फ़िगर करें।

जब हम मल्टीडेक्स का उपयोग करते हैं:

जब हम किसी एकल DEX फ़ाइल में 65,536 तक संदर्भित तरीकों की कुल संख्या को पार कर सकते हैं- जिसमें आपके अपने कोड में एंड्रॉइड फ्रेमवर्क विधियाँ, लाइब्रेरी विधियाँ और विधियाँ शामिल हैं।

64K की सीमा से बचें

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

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

ProGuard के साथ अप्रयुक्त कोड को हटा दें - अपनी रिलीज़ बिल्ड के लिए ProGuard चलाने के लिए कोड सिकुड़ सक्षम करें । सिकुड़ते सक्षम करना सुनिश्चित करता है कि आप अपने APK के साथ अप्रयुक्त कोड को शिपिंग नहीं कर रहे हैं।

इन आधिकारिक सुझावों के अलावा, अपनी एकता परियोजना का निर्माण करते समय, इन चरणों का पालन करने से आपको आगे मदद मिलेगी:

  1. अपने एकता संपादक से एक Android परियोजना बनाएँ। सेटप १

  2. अपने Android प्रोजेक्ट को Android Studio में आयात करें। चरण 2

  3. मल्टी डेक्स कॉन्फ़िगरेशन का उपयोग करने के लिए अपने ऐप प्रोजेक्ट की स्थापना के लिए आवश्यक है कि आपका निम्न संशोधन करें।

    यदि आपका minSdkVersion 21 या अधिक पर सेट है, तो आपको बस अपने मॉड्यूल-स्तर build.gradle फ़ाइल में सेट multiDexEnabledकरना होगा true, जैसा कि यहां दिखाया गया है:

    android {
    defaultConfig {
            ...
            minSdkVersion 21 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }

    हालाँकि, यदि आपका minSdkVersionसेट 20 या उससे कम है, तो आपको निम्नानुसार मल्टीडेक्स सपोर्ट लाइब्रेरी का उपयोग करना होगा:

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

    android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }

    3.2। इस पर निर्भर करते हुए कि आप अनुप्रयोग वर्ग को ओवरराइड करते हैं, निम्न में से कोई एक कार्य करें:

    • यदि आप Applicationवर्ग को ओवरराइड नहीं करते हैं , android:nameतो <application>टैग में सेट करने के लिए अपनी मैनिफ़ेस्ट फ़ाइल संपादित करें :
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp">
        <application
                android:name="android.support.multidex.MultiDexApplication" >
            ...
        </application>
    </manifest>
    • यदि आप Applicationवर्ग को ओवरराइड करते हैं, तो इसे मल्टीडेक्सएप्लिकेशन (यदि संभव हो तो) के विस्तार के लिए बदल दें:
    public class MyApplication extends MultiDexApplication { ... }
    • या यदि आप एप्लिकेशन क्लास को ओवरराइड करते हैं, लेकिन बेस क्लास को बदलना संभव नहीं है, तो आप इसके बजाय संलग्नक को बंद कर सकते हैं () विधि और मल्टीडेक्स को सक्षम करने के लिए MultiDex.install (यह) कॉल करें:
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
  4. अन्य प्लगइन्स त्रुटि की जाँच करें और प्रोजेक्ट को साफ़ करें। और फिर से sysc करें।

  5. यदि आपके प्रोजेक्ट में कोई निर्भरता समस्या है, तो इस आदेश को Android टर्मिनल में चलाएं

    % Gradle clean App."App name"
  6. निर्भरता के तहत, अपने आवेदन ग्रेड में इन निर्भरता की प्रतिलिपि बनाएँ:

    compile fileTree(include: ['*.jar'], dir: 'bin')
    compile fileTree(include: ['*.jar'], dir: 'libs')
  7. अपने मुख्य प्रोजेक्ट ग्रैडल में साइनिंग कॉनफिग जोड़ें।

    चरण 8

    या हस्ताक्षर मोड को डिबग मोड में मैन्युअल रूप से सेट करें, फ़ाइल पर जाएं -> प्रोजेक्ट संरचना -> मॉड्यूल के तहत अपनी परियोजना पर क्लिक करें और बिल्ड प्रकार के तहत डीबग का चयन करें -> साइनिंग कॉन्फ़िगरेशन चुनें-> डिबग

    यहां छवि विवरण दर्ज करें

  8. अब अपने ग्रैडल को सिंक करें और प्रोजेक्ट बनाएं।


1
आपकी परियोजना कितनी बड़ी है जिसने इस त्रुटि को जन्म दिया?
Evorlor

1
वास्तव में, मैं Google AdMob मध्यस्थता का उपयोग कर रहा हूं, इसलिए इसके लिए 6-7 विज्ञापन एसडीके जोड़ने के लिए उपयोग किए जाते हैं, इसलिए मेरी अंतिम परियोजनाओं की पद्धति की गणना लगभग 76k थी।
राकेश

0

मैं आपको इस लिंक के माध्यम से जाने की सलाह दूंगा जो आपको एकता के माध्यम से सीधे मल्टीडेक्स सक्षम गेम बनाने में मदद करेगा।

https://medium.com/@abhpatidar/solving-unity-dex-issue-538e134c8809

नोट: यह केवल मल्टीडेक्स को एकता में सक्षम करेगा (और मल्टीडेक्स मुद्दों को ठीक करना चाहिए)। यह संबंधित समस्याओं को ठीक नहीं करेगा।


3
यह वर्तमान में लिंक-ओनली उत्तर है: यद्यपि लिंक प्रश्न का उत्तर देता है , उत्तर नहीं देता है। आप यहां लिंक की गई सामग्री के मूल को शामिल करना चाह सकते हैं (प्रति से लिंक बुरा नहीं है, केवल हैविन केवल लिंक है जो खराब है)।
Vaillancourt

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

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

सही बात। मैं निर्देशों को पूरा करने के लिए अपने उत्तर को बदलूंगा।
अभिषेक पाटीदार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.