对NoClassDefFoundError的OkHttpClient对NoClassDefFound

2019-05-12 03:05发布

在加入的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.<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

注:我得到三星移动4.4,但在模拟器上,并在此错误moto g 5.0它的工作原理。

Answer 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实例试图在类的定义中加载(作为通常方法调用的一部分或者作为使用new表达式创建新实例的一部分),没有阶级的定义可以发现抛出。

从报价的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真

  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你的项目。 希望这可以帮助 。



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


Answer 3:

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

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

如果你在你的应用程序需要的ProGuard然后按照这个链接 ,其中杰克沃顿先生已经解决了这一点。



Answer 4:

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

针对Android 5.0及更高版本Multidex支持

Android 5.0以上使用称为ART运行时,其本身支持从应用APK文件加载多个DEX文件。 ART在应用执行预编译安装时,其扫描类(.. N).DEX文件,并将其编译成由Android装置用于执行的单个.oat文件。 对于在Android 5.0运行时的更多信息,请参见介绍ART。 这意味着您的应用程序将在API级别21或以上工作的罚款。

Multidex支持为Android 5.0之前

之前的Android 5.0平台的版本使用的Dalvik运行时,用于执行应用程序的代码。 默认情况下,Dalvik的限制应用到每个APK一个classes.dex字节码文件。 为了绕过这个限制,可以使用multidex支持库,成为您的应用程序的主要DEX文件的一部分,然后设法获得了额外的DEX文件和它们所包含的代码。

尝试添加该

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

在您的清单从multidex支持库添加MultiDexApplication类应用元素。

<?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.install(本),以使multidex。

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

最后,您将需要通过增加multiDexEnabled真如下更新您的build.gradle文件:

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

我希望这将帮助你。



文章来源: NoClassDefFoundError for OkHttpClient