NoClassDefFoundError для OkHttpClient

После добавления зависимости facebook в gradle я получаю эту ошибку времени выполнения:

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

Обратите внимание, что я также использую okhttp:

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

и журнал ошибок:

 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

Примечание. Я получаю эту ошибку на Samsung mobile 4.4, но на эмуляторе и на moto g 5.0 он работает.

Ответ 1

Вы получаете

       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 для OkHttpClient

public class NoClassDefFoundError extends LinkageError

Брошено, если экземпляр виртуальной машины Java или экземпляр ClassLoader пытается загрузить в определение класса (как часть обычного вызова метода или как часть создания нового экземпляра с использованием нового выражения), и нет определение класса можно найти.

Цитата из NoClassDefFoundError

Вы должны использовать

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

После этого вы можете получить эту ошибку с отличным от нуля значением выхода 2

Затем

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

    // Enabling multidex support.
    multiDexEnabled true
}

dependencies {
 compile 'com.android.support:multidex:1.0.0'
}
  • Добавить multiDexEnabled true

  • Вызов compile 'com.android.support:multidex:1.0.0'//или 1.0.1

OkHttp сохраняется, когда сеть становится хлопотной: она будет молча восстанавливаться из общих проблем с подключением. Если ваша служба имеет несколько IP-адреса OkHttp будет пытаться использовать альтернативные адреса, если первый соединение не выполняется. Это необходимо для IPv4 + IPv6 и для обслуживаемых служб в резервных центрах обработки данных.

Вы можете назвать последнюю версию

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

Наконец

compile 'com.squareup.okhttp3:okhttp:3.0.1'
or // compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.facebook.android:facebook-android-sdk:4.10.0'

Тогда

Clean and Re-Build & Sync Ваш проект. Надеюсь, это поможет.

Ответ 2

В последней версии Piccasso используется более старая версия Okhttp, вам нужно использовать новую зависимость

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'

Пример:

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");
}

Ответ 3

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

Поддержка нескольких приложений для Android 5.0 и выше

Android 5.0 и выше использует время выполнения, называемое ART, которое изначально поддерживает загрузку нескольких файлов dex из файлов APK приложения. ИЗОБРАЗИТЕЛЬНОЕ ИСКУССТВО выполняет предварительную компиляцию во время установки приложения, которая сканирует классов (..N).dex и скомпилирует их в один файл .oat для исполнение на устройстве Android. Для получения дополнительной информации об Android 5.0, см. Введение в ART. Это означает, что ваше приложение будет работать нормально на уровне API 21 или выше.

Поддержка Multidex до Android 5.0

Версии платформы до Android 5.0 используют время работы Dalvik для выполнения кода приложения. По умолчанию Dalvik ограничивает приложения одним classes.dex для каждого APK. Чтобы обойти это ограничение, вы можете использовать библиотеку поддержки multidex, которая становится часть основного файла DEX вашего приложения, а затем управляет доступом к дополнительные файлы DEX и код, который они содержат.

Попробуйте добавить это

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

В манифесте добавьте класс MultiDexApplication из библиотеки поддержки multidex в элемент приложения.

<?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), чтобы включить multidex.

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

Наконец, вам нужно будет обновить файл build.gradle, как показано ниже, добавив multiDexEnabled true:

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

Я надеюсь, что это поможет вам.

Ответ 4

Вы должны включить multidex для решения этой проблемы.

В 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
}

В вашем проекте Класс приложения

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

Вот официальная ссылка [http://developer.android.com/tools/building/multidex.html].

Ответ 5

Похоже, вы включили proguard. Если вам не нужна программа proguard в вашем приложении, вы можете отключить ее в своем файле build.gradle(app)

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

И если вам нужно proguard в вашем приложении, то следуйте этой ссылке где г-н Джейк Уортон решил это.