6

का कारण बनता है मैं अपने प्रोजेक्ट में Multidex समर्थन सक्षम है और यह Android 5.0 और इसके बाद के संस्करण पर ठीक काम कर रहा था, लेकिन जब मैं एंड्रॉयड 4.3 के साथ और यह मेरे TwitterConfig के लिए NoClassDefFoundError देना शुरू नीचे मेरी ऐप का परीक्षण शुरू कर दिया।ट्विटर कपड़ा + MultiDex NoClassDefFoundError

मैं अपना Multidex समर्थन अक्षम नहीं कर सकता। मुझे नहीं मिल रहा है कि मुझे यह मुद्दा क्यों मिल रहा है। नेट पर समाधान खोजने का प्रयास किया लेकिन मदद नहीं की।

यहां अपवाद है जो मुझे मिल रहा है।

java.lang.NoClassDefFoundError: com.twitter.sdk.android.core.TwitterAuthConfig$1 
     at com.twitter.sdk.android.core.TwitterAuthConfig.<clinit>(TwitterAuthConfig.java:39) 
     at MyApplication.onCreate(MyApplication.java:46) 
     at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024) 
     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4702) 
     at android.app.ActivityThread.access$1400(ActivityThread.java:168) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1389) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:5493) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:525) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025) 
     at dalvik.system.NativeStart.main(Native Method) 

यहाँ मेरी app.gradle

buildscript { 
    repositories { 
     maven { url 'https://maven.fabric.io/public' } 
    } 

    dependencies { 
     classpath 'io.fabric.tools:gradle:1.+' 
    } 
} 

    apply plugin: 'com.android.application' 
    apply plugin: 'io.fabric' 

    repositories { 
    maven { url 'https://maven.fabric.io/public' } 
    mavenCentral() 

    } 

    android { 
    packagingOptions { 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/LICENSE.txt' 
    } 
    compileSdkVersion 22 
    buildToolsVersion "23.0.0 rc3" 

    defaultConfig {    
     minSdkVersion 16 
     targetSdkVersion 22 
     versionCode 1 
     versionName "1.0" 
     multiDexEnabled true 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    dexOptions { 
     javaMaxHeapSize "2g" 
    } 

} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:22.2.1'  
    compile 'com.android.support:multidex:1.0.1' 
    compile 'com.android.support:design:22.2.1' 
    compile 'com.android.support:recyclerview-v7:22.2.1' 
    compile 'com.android.support:cardview-v7:22.2.1' 
    compile 'com.android.support:support-v4:22.2.1' 
    compile project(':MPChartLib') 
    compile 'com.facebook.android:facebook-android-sdk:4.6.0' 
    compile('com.crashlytics.sdk.android:crashlytics:[email protected]') { 
     transitive = true; 
    } 
    compile('com.twitter.sdk.android:twitter:[email protected]') { 
     transitive = true; 
    } 
} 

यहाँ MyApplication कक्षा में मेरी ट्विटर संहिता है।

@Override 
public void onCreate() { 
    super.onCreate(); 

    //Configure twitter using Twitter key and Secret Key 
    TwitterAuthConfig authConfig = 
      new TwitterAuthConfig(TWITTER_KEY, 
        TWITTER_SECRET); 

    // add functionalities which we are using with Fabric 
    Fabric.with(this, new Crashlytics(), new Twitter(authConfig)); 

    FacebookSdk.sdkInitialize(getApplicationContext()); 
    // Initialize the SDK before executing any other operations, 
    // especially, if you're using Facebook UI elements. 

} 

यहां तक ​​कि मैंने this समाधान भी कोशिश की लेकिन मदद नहीं की।

किसी भी संकेत या संदर्भ की सराहना की। Android 5.0 के लिए

उत्तर

14

Multidex समर्थन और उच्च

Android 5.0 और इसके एक क्रम बुलाया एआरटी जो मूल रूप आवेदन APK फ़ाइलों से कई डेक्स फ़ाइलें लोड का समर्थन करता है का उपयोग करता है। एआरटी एप्लिकेशन इंस्टॉल समय पर प्री-संकलन करता है जो कक्षाओं (.. एन)। डीएक्स फाइलों के लिए स्कैन करता है और एंड्रॉइड डिवाइस द्वारा निष्पादन के लिए उन्हें एकल .oat फ़ाइल में संकलित करता है। एंड्रॉइड 5.0 रनटाइम पर अधिक जानकारी के लिए, एआरटी पेश करना देखें।

इसका मतलब है कि आपका ऐप एपीआई स्तर 21 या उससे ऊपर के लिए ठीक काम करेगा।

Multidex समर्थन मंच Android 5.0 अनुप्रयोग कोड को क्रियान्वित करने के लिए Dalvik क्रम का उपयोग पहले से 5,0

संस्करण Android के लिए पहले। डिफ़ॉल्ट रूप से, Dalvik प्रति एपीके एक classes। Dex बाइटकोड फ़ाइल में ऐप्स को सीमित करता है। इस सीमा के आसपास पहुंचने के लिए, आप मल्टीडेक्स समर्थन लाइब्रेरी का उपयोग कर सकते हैं, जो आपके ऐप की प्राथमिक डीईएक्स फ़ाइल का हिस्सा बन जाता है और फिर अतिरिक्त डीईएक्स फाइलों और उनके पास मौजूद कोड तक पहुंच प्रबंधित करता है।

तो, सबसे पहले सुनिश्चित करें कि आप सही निर्भरता, ऐसा लगता है जो आपको यह किया आयात किया है बना रही है।

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

अपने प्रकट में आवेदन तत्व को multidex समर्थन पुस्तकालय से MultiDexApplication वर्ग जोड़ें।

<?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 वर्ग फैली हैं, तो आप attachBaseContext() विधि ओवरराइड और सक्षम करने के लिए MultiDex.install(this) कॉल कर सकते हैं।

public void onCreate(Bundle arguments) { 
    MultiDex.install(getTargetContext()); 
    super.onCreate(arguments); 
    ... 
} 

अंत में, आप multiDexEnabled true जोड़कर नीचे के रूप में अपने build.gradle फ़ाइल को अपडेट करने की आवश्यकता होगी:

defaultConfig { 
     applicationId '{Project Name}' 
     minSdkVersion 15 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
     multiDexEnabled true 
    } 

मुझे आशा है कि यह तुम बाहर में मदद मिलेगी।

+0

धन्यवाद @Bhavesh: इस समाधान की कोशिश करेंगे, लेकिन मैं आप प्रकट में MultiDexApplication जोड़ने की बात नहीं मिला। क्या आप इसे थोड़ा विस्तारित कर सकते हैं? एक बार फिर धन्यवाद। –

+0

देखें, जब आपके एप्लिकेशन में कोई भी कक्षा है जो एप्लिकेशन क्लास को विस्तारित करती है तो आप इसे मेन्यूफाइल फ़ाइल में सेट करने से अनदेखा कर सकते हैं। अब, यदि आपके पास कोई एप्लिकेशन क्लास नहीं है तो आप मेन्यूफ़ेस्ट फ़ाइल से सीधे इसका समर्थन सक्षम कर सकते हैं, तो मल्टीडेक्स –

+1

के समर्थन को सक्षम करने के लिए आप दो तरह के वैकल्पिक तरीकों को मल्टीडेक्स.inस्टॉल (getTargetContext()) नहीं चाहिए; सुपर() कॉल के बाद बनें? – Jalpesh

0

मैंने ग्रेड '1.21.6' संस्करण को कम करने के लिए मैन्युअल रूप से कपड़े ग्रेडल प्लगइन संस्करण सेट करके समस्या हल कर दी है। शायद नवीनतम के साथ कुछ मुद्दा था, जो मेरे मामले में '1.23.0' था। (Fabric plugin version history)

तो मैं सेट

dependencies { 
     classpath 'io.fabric.tools:gradle:1.21.6' 
    } 
बजाय

dependencies { 
     classpath 'io.fabric.tools:gradle:1.+' 
    } 
संबंधित मुद्दे