web-dev-qa-db-ja.com

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.<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モバイル4.4で発生しますが、エミュレータとmoto g 5.0では機能します。

11
Venkat

あなたは得ています

       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'に電話する

OkHttpは、ネットワークに問題が発生しても耐えます。一般的な接続の問題から静かに回復します。サービスに複数のIPアドレスがある場合、最初の接続が失敗すると、OkHttpは代替アドレスを試みます。これは、IPv4 + IPv6および冗長データセンターでホストされるサービスに必要です。

最新バージョンを呼び出すことができます

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

次に

Clean and Re-Build & Syncあなたのプロジェクト。お役に立てれば 。

3
IntelliJ Amiya

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");
}
15
Benn Sandoval

この問題を解決するには、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]

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以上で問題なく動作します。

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 trueを追加して、次のようにbuild.gradleファイルを更新する必要があります。

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

お役に立てれば幸いです。

0
sunil sunny

プロガードを有効にしているようです。アプリケーションでプロガードが必要ない場合は、build.gradle(app)でプロガードを無効にすることができます

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

アプリケーションでプロガードが必要な場合は、これに従ってください link ジェイクウォートン氏が解決しました。

0
Zohair