OkHttpClient的NoClassDefFoundError

时间:2016-02-23 12:53:04

标签: android facebook classnotfoundexception

在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上运行。

4 个答案:

答案 0 :(得分:15)

最新版本的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");
}

答案 1 :(得分:3)

您正在

       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)

OkHttpClient的NoClassDefFoundError

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

  2. 致电implementation'com.android.support:multidex:1.0.2'

  3.   

    OkHttp坚持网络很麻烦:它会默默无闻   从常见的连接问题中恢复。如果您的服务有多个   IP地址如果是第一个,OkHttp将尝试备用地址   连接失败。这对于IPv4 + IPv6和托管的服务是必需的   在冗余数据中心。

    您可以拨打最新版本

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

    ,然后

    Clean and Re-Build & Sync 您的项目。希望这会有所帮助。

答案 2 :(得分:0)

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

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

  

Android 5.0及更高版本本身使用名为ART的运行时   支持从应用程序APK文件加载多个dex文件。艺术   在扫描的应用程序安装时执行预编译   classes(.. 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文件及其包含的代码。

尝试添加此

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>

替代方案,如果您的应用程序扩展了Application类,您可以覆盖attachBaseContext()方法并调用MultiDex.install(this)来启用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  
    }  

我希望它会帮助你。

答案 3 :(得分:0)

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

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

如果你的应用程序需要proguard,那么按照杰弗沃顿先生解决这个问题的link