web-dev-qa-db-ja.com

java.lang.NoClassDefFoundError:okhttp3.OkHttpClient $ Builder

私のプロジェクトでは、ネットワークリクエストライブラリとしてOkHttp(バージョン2.5.0)を使用しました。しかし、数日前、アプリのネットワークリクエストライブラリの一部としてRetrofit2を試しました。ご存知のように、新しいRetrofit2ライブラリはOkHttp(バージョン3.2.0)に依存しています。したがって、アプリをAndroid Android 5.0のAndroidバージョンが常にクラッシュを引き起こす電話(大きいバージョンはうまく機能し、クラッシュは発生しません)、クラッシュスタック情報は次のように表示されます。

04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err: Java.lang.NoClassDefFoundError: okhttp3.OkHttpClient$Builder
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at com.comingx.athit.client.ServiceGenerator.<clinit>(ServiceGenerator.Java:22)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at com.comingx.athit.ui.fragments.CircleNativeFragment.onViewCreated(CircleNativeFragment.Java:105)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1086)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1252)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Android.support.v4.app.BackStackRecord.run(BackStackRecord.Java:742)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1617)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.Java:517)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Android.os.Handler.handleCallback(Handler.Java:808)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Android.os.Handler.dispatchMessage(Handler.Java:103)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Android.os.Looper.loop(Looper.Java:193)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Android.app.ActivityThread.main(ActivityThread.Java:5348)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Java.lang.reflect.Method.invokeNative(Native Method)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Java.lang.reflect.Method.invoke(Method.Java:515)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:829)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:645)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at dalvik.system.NativeStart.main(Native Method)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err: Java.lang.NoClassDefFoundError: okhttp3.OkHttpClient$Builder
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at com.comingx.athit.client.ServiceGenerator.<clinit>(ServiceGenerator.Java:22)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at com.comingx.athit.ui.fragments.CircleNativeFragment.onViewCreated(CircleNativeFragment.Java:105)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1086)
04-15 21:28:51.185 17238-17238/com.comingx.athit W/System.err:     at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1252)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at Android.support.v4.app.BackStackRecord.run(BackStackRecord.Java:742)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:1617)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at Android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.Java:517)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at Android.os.Handler.handleCallback(Handler.Java:808)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at Android.os.Handler.dispatchMessage(Handler.Java:103)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at Android.os.Looper.loop(Looper.Java:193)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at Android.app.ActivityThread.main(ActivityThread.Java:5348)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at Java.lang.reflect.Method.invokeNative(Native Method)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at Java.lang.reflect.Method.invoke(Method.Java:515)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:829)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:645)
04-15 21:28:51.186 17238-17238/com.comingx.athit W/System.err:     at dalvik.system.NativeStart.main(Native Method)

スタックトレースから、OkHttp(バージョン3.2.0)はOkHttp(バージョン2.5.0)といくつかの競合があると思います。以下に、外部ライブラリの構成を示します。

compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.0.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.1'

問題を知っている人が私に恩恵を与えることができることを願っています!まことにありがとうございます!

更新1:これが私のServiceGenerator.Java

package com.comingx.athit.client;

import com.comingx.athit.model.Constants;
import com.comingx.athit.model.modelmanager.ModelManagerSingleton;

import Java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ServiceGenerator {
    private static OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(
            new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request()
                            .newBuilder().addHeader("Cookie", ModelManagerSingleton.getNative_cookie()).build();
                    return chain.proceed(request);
                }
            }
    ).build();
    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(Constants.V3.API_PREFIX)
                    .addConverterFactory(GsonConverterFactory.create());

    public static <T> T createService(Class<T> serviceClass) {
        Retrofit retrofit = builder.client(httpClient).build();
        return retrofit.create(serviceClass);
    }
}
6
wizChen

はい、最終的に問題を見つけて解決します。同様の問題 ここ を見て、おそらく64Kメソッドが問題を引き起こす可能性があることがわかったので、 公式サイト にアクセスして64Kを超えるメソッドを使用したアプリの構築を表示しました。次に、build.gradleファイルでmultidexライブラリをコンパイルする必要があります。

compile 'com.Android.support:multidex:1.0.1'

そして、defaultConfigを設定することを忘れないでください:

Android {
  defaultConfig {
    multiDexEnabled true
  }
}

そして最後に、BaseApplicationApplicationに拡張し、上書きしてattachBaseContext(Context base)メソッドは次のとおりです。

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

これをAndroidManifest.xmlファイルに追加することを忘れないでください。

<application
        Android:name=".BaseApplication"
        Android:allowBackup="true">
</application>
12
wizChen