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
это работает.
5 ответов
вы получаете
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 {
implementation 'com.android.support:multidex:1.0.0'
}
добавить multiDexEnabled true
вызов
implementation'com.android.support:multidex:1.0.2'
OkHttp переносит, когда сеть хлопотна: она будет молчаливо восстановление от общих проблем подключения. Если ваша служба имеет несколько IP-адреса OkHttp будет пытаться альтернативные адреса, если первый сбой подключения. Это необходимо для IPv4+IPv6 и для размещенных служб в избыточных центрах обработки данных.
вы можете вызвать последнюю версию
implementation'com.squareup.okhttp3:okhttp:3.2.0'
затем
Clean and Re-Build & Sync
Ваш Проект . Надеюсь, это поможет .
последняя версия 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");
}
вы должны включить 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].
Похоже, вы включили proguard. Если вам не нужен proguard в вашем приложении, вы можете отключить его в своей сборке.gradle (app)
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
и если вам нужен proguard в вашем приложении, следуйте этому ссылке где мистер Джейк Уортон решил это.
https://developer.android.com/tools/building/multidex.html
поддержка Multidex для Android 5.0 и выше
Android 5.0 и выше использует среду выполнения под названием ART, которая изначально поддержка загрузки нескольких файлов dex из файлов APK приложения. ИСКУССТВО выполняет предварительную компиляцию во время установки приложения, которое сканирует учебные занятия.(.Северный.)DeX файлы и компилирует их в один .файл овса для исполнение Android устройство. Для получения дополнительной информации о Android 5.0 runtime, см. введение ART. Это означает, что ваше приложение будет работать нормально на уровне API 21 или выше.
поддержка Multidex до Android 5.0
версии платформы до Android 5.0 используют среду выполнения Dalvik для выполнения кода приложения. По умолчанию Dalvik ограничивает приложения одним занятия.файл байт-кода dex на APK. Чтобы обойти это ограничение, вы можете использовать multidex библиотека поддержки, которая становится часть основного файла DEX вашего приложения, а затем управляет доступом к дополнительные файлы DEX и код, который они содержат.
попробуйте добавить этот
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
в манифесте добавьте класс MultiDexApplication из библиотеки поддержки multidex в элемент application.
<?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>
альтернатива этому, если ваше приложение расширяет класс приложения, вы можете переопределить метод attachBaseContext() и вызвать MultiDex.установите (это), чтобы включить multidex.
public void onCreate(Bundle arguments) {
MultiDex.install(getTargetContext());
super.onCreate(arguments);
...
}
наконец, вам нужно будет обновить свой строить.gradle файл, как показано ниже, добавив multiDexEnabled true:
defaultConfig {
applicationId '{Project Name}'
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
Я надеюсь, что это поможет вам.