webentwicklung-frage-antwort-db.com.de

NoClassDefFoundError für OkHttpClient

Nachdem ich die Facebook-Abhängigkeit in gradle hinzugefügt habe, erhalte ich diesen Laufzeitfehler:

     compile 'com.facebook.Android:facebook-Android-sdk:4.6.0'

Bitte beachten Sie, dass ich auch okhttp verwende: 

    compile 'com.squareup.okhttp:okhttp:2.5.0'

und Fehlerprotokoll ist:

 E/AndroidRuntime: FATAL EXCEPTION: Thread-109754
     Process: com.venkat.project, PID: 4453
            Java.lang.NoClassDefFoundError: com.squareup.okhttp.internal.Util
            at com.squareup.okhttp.OkHttpClient.<clinit>(OkHttpClient.Java:57)
            at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.Java:127)
            at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.Java:61)
            at Java.lang.Thread.run(Thread.Java:841)
02-23 18:11:02.729 4453-4573/com.venkat.project I/dalvikvm: Rejecting re-init on previously-failed class Lcom/squareup/okhttp/OkHttpClient; v=0x0

Hinweis: Ich bekomme diesen Fehler auf Samsung Mobile 4.4, aber auf dem Emulator und auf moto g 5.0 funktioniert es.

11
Venkat

Sie bekommen

       Java.lang.NoClassDefFoundError: com.squareup.okhttp.internal.Util
        at com.squareup.okhttp.OkHttpClient.<clinit>(OkHttpClient.Java:57)
        at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.Java:127)
        at com.venkat.project.http.MyHTTPThread.run(MyHTTPThread.Java:61)

NoClassDefFoundError für OkHttpClient

public class NoClassDefFoundError extends LinkageError

Wird ausgelöst, wenn die Java Virtual Machine oder eine ClassLoader-Instanz versucht, load in der Definition einer Klasse (als Teil eines normalen Methodenaufrufs oder beim Erstellen einer neuen Instanz mit dem neuen Ausdruck) und Nr Definition der Klasse konnte gefunden werden.

Zitat aus NoClassDefFoundError

Du solltest benutzen 

compile 'com.facebook.Android:facebook-Android-sdk:4.10.0'

Danach können Sie diesen Fehler erhalten beendet mit Nicht-Null-Exit-Wert 2

Dann 

defaultConfig {
    ...
    minSdkVersion 14 //lower than 14 doesn't support multidex
    targetSdkVersion //Yours

    // Enabling multidex support.
    multiDexEnabled true
}

dependencies {
 implementation 'com.Android.support:multidex:1.0.0'
}
  1. Hinzufügen von multiDexEnabled true

  2. Aufruf implementation'com.Android.support:multidex:1.0.2' 

OkHttp bleibt bestehen, wenn das Netzwerk Probleme bereitet: Es wird still Erholen Sie sich von den üblichen Verbindungsproblemen. Wenn Ihr Dienst mehrere .__ hat. IP-Adressen OkHttp versucht alternative Adressen, wenn die erste Verbindung schlägt fehl Dies ist für IPv4 + IPv6 und für gehostete Dienste erforderlich in redundanten Rechenzentren.

Sie können die neueste Version aufrufen 

implementation'com.squareup.okhttp3:okhttp:3.2.0'

Dann

Clean and Re-Build & Sync Ihr Projekt. Hoffe das hilft .

3
IntelliJ Amiya

Die neueste Version von Piccasso verwendet eine ältere Version von Okhttp. Sie müssen eine neue Abhängigkeit verwenden 

compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.picasso:picasso:2.5.2'    
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.0.2'

Beispiel:

File httpCacheDirectory = new File(getCacheDir(), "picasso-cache");
Cache cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);

OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().cache(cache);
Picasso.Builder picassoBuilder = new Picasso.Builder(getApplicationContext());
picassoBuilder.downloader(new OkHttp3Downloader(clientBuilder.build()));
Picasso picasso = picassoBuilder.build();
try {
   Picasso.setSingletonInstance(picasso);
} catch (IllegalStateException ignored) {
  Log.e(LOG_TAG, "Picasso instance already used");
}
15
Benn Sandoval

Sie sollten multidex aktivieren, um dieses Problem zu beheben.

In build.gradle

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 23
    buildToolsVersion '23.0.2'
    dexOptions {
        incremental true
        javaMaxHeapSize "4g"
    }

defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 17
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        // Enabling multidex support.
        multiDexEnabled true
    }

    buildTypes {
        debug {
            shrinkResources true
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {

    // Enabling multidex support.
    compile 'com.Android.support:multidex:1.0.1'
    //Other Libraries
}

In Ihrem Projekt Application Class

public class SampleApp extends Application {
    @Override
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            MultiDex.install(base);
        }
}

Hier ist der offizielle Link [ http://developer.Android.com/tools/building/multidex.html]

https://developer.Android.com/tools/building/multidex.html

Multidex-Unterstützung für Android 5.0 und höher

Android 5.0 und höher verwendet eine Laufzeitumgebung namens ART, die nativ unterstützt das Laden mehrerer Dex-Dateien aus Anwendungs-APK-Dateien. KUNST führt die Kompilierung zum Zeitpunkt der Anwendungsinstallation durch, wobei nach .__ gesucht wird. classes (.. N) .dex-Dateien und kompiliert sie in eine einzige OAT-Datei für Ausführung durch das Android-Gerät. Weitere Informationen zu Android 5.0 Laufzeit, siehe Einführung in ART. Das bedeutet, dass Ihre App auf API-Ebene 21 oder höher gut funktionieren würde.

Multidex-Unterstützung vor Android 5.0

Versionen der Plattform vor Android 5.0 verwenden die Dalvik-Laufzeitumgebung zum Ausführen von App-Code. Standardmäßig beschränkt Dalvik Apps auf ein einzelnes classes.dex-Bytecode-Datei pro APK. Um dies zu umgehen Einschränkung können Sie die Multidex-Unterstützungsbibliothek verwenden, die zu .__ wird. Teil der primären DEX-Datei Ihrer App und verwaltet dann den Zugriff auf die zusätzlichen DEX-Dateien und den darin enthaltenen Code.

Versuchen Sie, dies hinzuzufügen

dependencies {
  compile 'com.Android.support:multidex:1.0.0'
}

Fügen Sie in Ihrem Manifest die MultiDexApplication-Klasse aus der Multidex-Unterstützungsbibliothek zum Anwendungselement hinzu.

<?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>

Alternativ dazu: Wenn Ihre App die Application-Klasse erweitert, können Sie die Methode attachBaseContext () überschreiben und MultiDex.install (this) aufrufen, um Multidex zu aktivieren.

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

Schließlich müssen Sie die Datei build.gradle wie folgt aktualisieren, indem Sie multiDexEnabled true hinzufügen:

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

Ich hoffe es wird dir helfen.

0
sunil sunny

Sie haben den Eindruck, dass Sie proguard aktiviert haben. Wenn Sie in Ihrer Anwendung keinen proguard benötigen, können Sie ihn in Ihrem build.gradle (app) deaktivieren. 

debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }

Und wenn Sie in Ihrer Anwendung Proguard benötigen, folgen Sie diesem Link wo Mr. Jake Wharton das Problem gelöst hat. 

0
Zohair