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'
}
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 в вашем приложении, то следуйте этой ссылке где г-н Джейк Уортон решил это.