【问题标题】:NoClassDefFoundError for OkHttpClientOkHttpClient 的 NoClassDefFoundError
【发布时间】:2016-06-05 07:48:16
【问题描述】:

在 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

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

【问题讨论】:

  • Clean and Build你的项目
  • @MD 没用。得到同样的错误。
  • 尝试打开 apk 并取消索引类。检查 Util 类是否包含在 dexing 中。作为一种临时解决方法,您可以从源中复制该类并将其包含在您的代码中。这样它就会在你的类路径中。 (这里我强调工作“workaround”和“temporary”)
  • @Radovan 如果我删除 gradle 中的 facebook 依赖项,应用程序正在工作......但只要我添加它就会给出错误
  • @Venu 遇到同样的问题了吗?

标签: android facebook classnotfoundexception


【解决方案1】:

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

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

Android 5.0 及更高版本使用一个名为 ART 的运行时,它本机 支持从应用 APK 文件中加载多个 dex 文件。艺术 在应用程序安装时执行预编译,扫描 classes(..N).dex 文件并将它们编译成单个 .oat 文件 由安卓设备执行。有关 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'
}

在您的清单中,将 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);
    ...
}

最后,您需要通过添加 multiDexEnabled true 来更新您的 build.gradle 文件,如下所示:

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

希望对你有所帮助。

【讨论】:

  • 已经为元素“activity”指定了属性“name”
  • @marco 我没明白你的意思吗?你为什么投反对票请赐教。我犯了什么错误。
【解决方案2】:

你得到了

       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 实例尝试 加载类的定义(作为正常方法调用的一部分或 作为使用 new 表达式创建新实例的一部分)并且没有 可以找到类的定义。

引自NoClassDefFoundError

你应该使用

compile 'com.facebook.android:facebook-android-sdk:4.10.0'

之后你会得到这个错误finished with non-zero exit value 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 &amp; Sync 你的项目。希望这会有所帮助。

【讨论】:

    【解决方案3】:

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

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

    如果您在应用程序中需要 proguard,请关注此link,Jake Wharton 先生已解决此问题。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2020-07-08
        • 2014-03-04
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 2018-03-07
        • 2017-03-02
        • 2015-05-17
        相关资源
        最近更新 更多