OkHttpClient的NoClassDefFoundError

在gradle中添加facebook依赖项后,我收到此运行时错误:

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.(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 

注意:我在三星手机4.4上遇到此错误,但在模拟器和moto g 5.0它可以正常工作。

你来了

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

OkHttpClient的NoClassDefFoundError

 public class NoClassDefFoundError extends LinkageError 

如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为普通方法调用的一部分或作为使用新expression式创建新实例的一部分),则抛出该类,并且无法find该类的定义。

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' } 
  1. 添加multiDexEnabled为true

  2. 调用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 } 

在您的项目Application类中

 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%5D

看起来你已经启用了proguard。 如果您的应用程序中不需要proguard,那么可以在build.gradle(app)中禁用它

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

如果您在申请中需要proguard,请按照Jake Wharton先生解决此问题的链接 。

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

适用于Android 5.0及更高版本的Multidex支持

Android 5.0及更高版本使用称为ART的运行时,它本身支持从应用程序APK文件加载多个dex文件。 ART在应用程序安装时执行预编译,扫描类(.. N).dex文件并将它们编译为单个.oat文件,以供Android设备执行。 有关Android 5.0运行时的更多信息,请参阅ART简介。 这意味着您的应用程序可以在API级别21或更高级别上正常运行。

Android 5.0之前的Multidex支持

Android 5.0之前的平台版本使用Dalvik运行时来执行应用程序代码。 默认情况下,Dalvik将应用程序限制为每个APK的单个classes.dex字节码文件。 为了解决这个限制,您可以使用multidex支持库,它将成为应用程序主要DEX文件的一部分,然后管理对其他DEX文件及其包含的代码的访问。

尝试添加此function

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

在清单中,将Multidex支持库中的MultiDexApplication类添加到application元素中。

 < ?xml version="1.0" encoding="utf-8"?>   ...   

替代方案,如果您的应用程序扩展了Application类,您可以覆盖attachBaseContext()方法并调用MultiDex.install(this)来启用multidex。

 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 } 

我希望它会帮助你。