web-dev-qa-db-ja.com

java.lang.NoClassDefFoundError retrofit2.Utils

私はRetrofitを使用してモバイルからのサーバーサイドデータを処理しています。改造を実装した後、私は以下の例外を取得しています。

私は何が間違っているのですか?

com.name.App_idea W/System.err:Java.lang.NoClassDefFoundError:retrofit2.Utils at retrofit2.Retrofit $ Builder.baseUrl(Retrofit.Java:434)at com.name.App_idea.utils.Idea.onCreate(Idea。 Java:103)at Android.app.Instrumentation.callApplicationOnCreate(Instrumentation.Java:1007)at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4541)at Android.app.ActivityThread.access $ 1500(ActivityThread.Java:151) Android.app.ActivityThread $ H.handleMessage(ActivityThread.Java:1381)、Android.os.Handler.dispatchMessage(Handler.Java:110)、Android.os.Looper.loop(Looper.Java:193)、Android。 app.ActivityThread.main(ActivityThread.Java:5292)at Java.lang.reflect.Method.invokeNative(Native Method)at Java.lang.reflect.Method.invoke(Method.Java:515)atcom.Android.internal。 os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.Java:824)at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:640)at dalvik.system.NativeStart.main(ネイティブメソッド)

Retrofit Init

mRetrofit = new Retrofit.Builder()
                    .baseUrl(AppConstance.APP_URL)
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(getOkHttpClient())
                    .build();

Gradleファイル

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 23
    buildToolsVersion '23.0.3'

    defaultConfig {
        applicationId "com.name.App_idea"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "9"
        multiDexEnabled true


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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.Android.support:appcompat-v7:23.3.0'
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0'
    compile 'com.jakewharton:butterknife:7.0.1'
    compile 'com.Android.support:design:23.3.0'
    compile 'com.Android.support:cardview-v7:23.3.0'
    compile 'com.google.Android.gms:play-services:8.4.0'
    compile 'com.squareup.okhttp3:okhttp:3.2.0'
    compile 'com.squareup.okhttp3:okhttp-urlconnection:3.2.0'
    compile 'com.Android.support:support-v4:23.3.0'
}

アプリケーションクラス

import Android.app.Application;
import Android.content.Context;
import Android.content.Intent;
import Android.database.sqlite.SQLiteDatabase;
import Android.database.sqlite.SQLiteOpenHelper;
import Android.os.Environment;
import Android.support.multidex.MultiDex;
import Android.util.Log;

import Java.io.File;
import Java.security.cert.CertificateException;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
import retrofit2.converter.gson.GsonConverterFactory;


public class Idea extends Application {
    public static Retrofit mRetrofit;
    public static IdeaService Iservice;


    public static LoginResponceModel loinResponce;
    public static SettingsModel settingModel;

    public static LocationModel location = new LocationModel();

    private static SQLiteDatabase dbase;
    private static String FILE_PATH;

    public static SQLiteDatabase getDataBase() {
        return dbase;
    }

    public static String getFilePath() {
        return FILE_PATH;
    }

    private static class DatabaseHelper extends SQLiteOpenHelper {
        DatabaseHelper(Context context) {
            super(context, "App", null, 1);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(AppConstance.DbConstans.tblLogin);
            Log.i("DB", "Created");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            onCreate(db);
        }
    }

    public static void deleteAllTables() {
        getDataBase().execSQL("DELETE FROM login");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        try {
            mRetrofit = new Retrofit.Builder()
                    .baseUrl(AppConstance.APP_URL)
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(getOkHttpClient())
                    .build();
            Iservice = mRetrofit.create(IdeaService.class);
            MultiDex.install(this);
            DatabaseHelper dbHelper = new DatabaseHelper(this);
            dbase = dbHelper.getWritableDatabase();

            AppDataService appDataService = new AppDataService();
            loinResponce = appDataService.getLoginDetails();
            settingModel = appDataService.getSettings();

            FILE_PATH = getAppFilePath();
            startService(new Intent(Idea.this, LocationTracker.class));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String combineFilePath(String path1, String path2) {
        File file1 = new File(path1);
        File file2 = new File(file1, path2);
        return file2.getPath();
    }

    public String getAppFilePath() {

        String dsPath;
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED))
            dsPath = combineFilePath(Environment
                            .getExternalStorageDirectory().getAbsolutePath(),
                    "Android/data/Idea/");
        else
            dsPath = this.getDir(
                    this.getPackageName(), 0).getAbsolutePath();

        new File(dsPath).mkdirs();
        return dsPath;
    }

    private OkHttpClient getOkHttpClient() {
        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(Java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public void checkServerTrusted(Java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }

                        @Override
                        public Java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new Java.security.cert.X509Certificate[]{};
                        }
                    }
            };
            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new Java.security.SecureRandom());
            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

            OkHttpClient okHttpClient = builder.build();
            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}
9
Pandiyan Muthu

Gradlebulid構成の問題です私も同じ問題が発生することがあります

Gradleであなたの使用

compile 'com.google.Android.gms:play-services:8.4.0'

Enire Google Playservice Libは、プロジェクトでライブラリが使用しているものに変更できますか

com.google.Android.gms:play-services-gcm:8.4.0 
com.google.Android.gms:play-services-maps:8.4.0
com.google.Android.gms:play-services-auth:8.4.0

このURLを参照してください https://developers.google.com/Android/guides/setup#add_google_play_services_to_your_project

1
Prasanth S

このエラーは MultiDexApplication が原因で発生します。同じライブラリではなく他のライブラリでこの種の問題に直面しました。アプリの初期化がdexで起動するため、レトロフィットライブラリでエラーが発生します。 (retrofitライブラリコードがdexに変換される)ファイルはset(install)ではありません。

これを解決するには、MultipleDexファイルを処理する必要があります。アプリケーション_build.gradle_&アプリケーションクラスの助けを借りて

_build.gradle_ファイルで必要な以下の変更

_dexOptions {
        incremental true
        // here heap size give 4g i got this thing from https://groups.google.com/forum/#!topic/adt-dev/P_TLBTyFWVY

        javaMaxHeapSize "4g"
    }


dependencies {
     compile 'com.Android.support:multidex:1.0.1'
    //    your dependencies which you are using.

}
_

全体_build.gradle_

_Android {
    signingConfigs {
        /*
        releasebuild {
            keyAlias 'hellotest'
            keyPassword 'hellotest'
            storeFile file('path to keystore')
            storePassword 'hellotest'
        }
        */
    }
    compileSdkVersion 'Google Inc.:Google APIs:22'
    buildToolsVersion '23.0.0'
    /* if you got error regarding duplicate file of  META-INF/LICENSE.txt from jar file
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
    */
    dexOptions {
        jumboMode = true
        incremental true
        // here heap size give 4g i got this thing from https://groups.google.com/forum/#!topic/adt-dev/P_TLBTyFWVY

        javaMaxHeapSize "4g"
    }
    defaultConfig {
        multiDexEnabled true
        applicationId "com.myapp.packagenme"
        minSdkVersion 17
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.releasebuild
        }
        debug {
            signingConfig signingConfigs.releasebuild
        }
    }
}

dependencies {
     compile 'com.Android.support:multidex:1.0.1'
    //    your dependencies which you are using.

}
_

アプリがApplicationclassの拡張を使用している場合は、attachBaseContext()メソッドをオーバーライドし、MultiDex.install(this)を呼び出してmultidexを有効にすることができます。 multiplexファイルをインストールするには _[MultiDexApplication][2]_を拡張する必要があるApplicaitonクラスを使用するコンテキスト

_public class MyAppClass extends MultiDexApplication{
@Override
    protected void attachBaseContext(Context newBase) {
        MultiDex.install(newBase);
        super.attachBaseContext(newBase);
    }
}
_

提案

APIを実行可能ファイルに選択的にコンパイルします

必要なライブラリのみを使用してGooglePlay開発者サービス全体を使用しないでください。バージョン6.5から、代わりにGooglePlay開発者サービスAPIをアプリに選択的にコンパイルできます。たとえば、GoogleFitとAndroid Wear APIのみを含めるには、build.gradleファイルの次の行を置き換えます。

_compile 'com.google.Android.gms:play-services:8.4.0'
_

これらの行で:

_compile 'com.google.Android.gms:play-services-fitness:8.4.0'
compile 'com.google.Android.gms:play-services-wearable:8.4.0'
_

私の答えを参考にして https://stackoverflow.com/a/34948154/1140237

12
user1140237

私はロリポップデバイスの下でこのエラーに直面していました。

MultiDexEnabledtrueを使用していました。

このコードをApplicationクラスを拡張するクラスに追加した後、私の問題は解決しました。

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

参照: https://stackoverflow.com/a/39968486/4777524

次のプロガードルールを追加しましたか?

-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

ドキュメント: http://square.github.io/retrofit/

2

Utilsクラスは次のようにする必要があります。

public class AppUtil{
public static Retrofit getRetrofitInstance(){
        HttpLoggingInterceptor logging=new HttpLoggingInterceptor();
        if(isEnableLogging)
            logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        else
            logging.setLevel(HttpLoggingInterceptor.Level.NONE);
        Gson gson = new GsonBuilder()
                .setExclusionStrategies(new ExclusionStrategy() {
                    @Override
                    public boolean shouldSkipField(FieldAttributes f) {
                        return f.getDeclaringClass().equals(RealmObject.class);
                    }

                    @Override
                    public boolean shouldSkipClass(Class<?> clazz) {
                        return false;
                    }
                })
                .create();
        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.addInterceptor(logging);

        return new Retrofit.Builder()
                .baseUrl(Constants.URL_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(httpClient.build())
                .build();

    }



}

Httpメソッド用に次のようなインターフェースを作成します。

public interface EndPointInterface{
 @FormUrlEncoded
    @POST(Constants.URL_LOGON)
    Call<Doctor> login(@Field(Constants.EMAIL) String email,
                       @Field(Constants.PASSWORD) String password);
} 

Webサービスを呼び出すアクティビティでは、次のように進めてください。

 @OnClick(R.id.btn_login)
    public void onLoginButtonClick() {
        String emailString = edtEmail.getText().toString().trim();
        String passwordString = edtPassword.getText().toString().trim();

        if (emailString.length() == 0) {
            emailWrapper.setError("Please enter E-Mail ID");
        } else if (!AppUtil.isEmailValid(emailString)) {
            emailWrapper.setError("Please enter valid E-Mail ID");
        } else if (passwordString.length() == 0) {
            passwordWrapper.setError("Please enter password");
        } else if (AppUtil.isNetworkConnectionAvailable(this, true)) {
            login(emailString,passwordString);
        }
    }

 private void login(String email, String pwd) {
        final MaterialDialog dialog = AppUtil.showIndeterminateProgressDialog(this,getString(R.string.please_wait));
        EndPointInterface apiService = AppUtil.getRetrofitInstance().create(EndPointInterface.class);
        Call<Doctor> call = apiService.login(email, pwd);
        call.enqueue(new Callback<Doctor>() {
            @Override
            public void onResponse(Call<Doctor> call, Response<Doctor> response) {
                dialog.dismiss();
                if (response.code() == 200) {
                    Doctor doctor = response.body();
                    if (doctor == null) {
                        AppUtil.showSimpleDialog(LoginActivity.this, getString(R.string.userid_pwd_mismatched),
                                getString(R.string.login_credential_mismatch));
                    } else {
                        SharedPreferences.Editor editor = mAppPreferences.edit();
                        editor.putString(Constants.SETTINGS_OBJ_DOCTOR, new Gson().toJson(doctor));
                        editor.putBoolean(Constants.SETTINGS_IS_LOGGED_IN, true);
                        editor.commit();

                        startActivity(new Intent(LoginActivity.this, PatientSummaryInfoActivity.class));
                        finish();
                    }
                } else {
                    dialog.dismiss();
                    AppUtil.showSimpleDialog(LoginActivity.this, getString(R.string.server_error),
                            getString(R.string.could_not_connect_to_server));
                }

            }

            @Override
            public void onFailure(Call<Doctor> call, Throwable t) {
                dialog.dismiss();
                AppUtil.showSimpleDialog(LoginActivity.this,getString(R.string.server_error), t.getMessage());
            }

        });
    }
1
Lampard
mRetrofit = new Retrofit.Builder()
                    .baseUrl(AppConstance.APP_URL)
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(getOkHttpClient())
                    .build();

に書き換える

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
mRetrofit = new Retrofit.Builder()
                        .baseUrl(AppConstance.APP_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(httpClient)
                        .build();
0
51j0

私はこのような同様の問題に遭遇しました、それはおそらく依存関係の問題です

compile 'com.squareup.retrofit2:retrofit:2.0.2'

ここに表示されているように、すでにokhttpが含まれています https://github.com/square/retrofit/blob/d04f3a50e41ca01d22f370ac4f332f6ddf4ba9fe/pom.xml したがって、依存関係リストからokhttpを削除してから、同期して再試行してください。

0
kareem adel

ベースレトロフィットlibとコンバーターに同じlibバージョンを使用してみてください。

compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-scalars:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
0
SpaceBison

レトロフィットgradleバージョン2.7.0を2.5.0に変更することで、この問題を修正します。

implementation 'com.squareup.retrofit2:retrofit:2.5.0'

implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

implementation 'com.squareup.retrofit2:converter-scalars:2.5.0' 
0
nithin joseph

このエラーが発生しました。そして、何度も検索した結果、マニフェストにインターネット許可を追加するのを忘れていることがわかりました。

この権限を追加した後、私のエラーは解決しました。

0
Tavousi

これらの多くのライブラリサドルが上がったので、悪名高い64kメソッドの制限を超えたに違いありません。アプリでmultidexを有効にする必要があります。これがあなたのやり方です。 https://developer.Android.com/tools/building/multidex.html

0
Ashish Rawat