Java.lang.NoClassDefFoundError в Android Studio retrofit2.Utils

Я использую Retrofit для обработки данных Serverside с мобильных устройств. После внедрения модификации я получаю следующее исключение.

Что я делаю не так?

Com.name.App_idea W / System.err: java.lang.NoClassDefFoundError: retrofit2.Utils at retrofit2.Retrofit $ Builder.baseUrl (Retrofit.java:434) в com.name.App_idea.utils.Idea.onCreate (Идея. Java: 103) at android.app.Instrumentation.callApplicationOnCreate (Instrumentation.java:1007) в android.app.ActivityThread.handleBindApplication (ActivityThread.java:4541) в 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) в java.lang.reflect.Method.invokeNative (собственный метод) в java.lang.reflect.Method.invoke (Method.java:515) в com.android.internal. Os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:824) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:640) в dalvik.system.NativeStart.main (собственный метод)

Инициирование дооснащения

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

Gradle file

 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); } } } 

Solutions Collecting From Web of "Java.lang.NoClassDefFoundError в Android Studio retrofit2.Utils"

Эта ошибка возникнет из-за MultiDexApplication. У меня есть такая проблема с какой-то другой библиотекой, но не с той же библиотекой, но с какой-то другой библиотекой. Это ошибка библиотеки-модификатора, потому что ее инициализация приложения запускается там, где dex (в котором код вашей модифицированной библиотеки Преобразуется в dex) файл не устанавливать (устанавливать).

Чтобы решить эту проблему, вам необходимо обработать файл с несколькими Dex. С помощью приложения build.gradle & Application class

Ниже изменений, которые требуются в файле 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. } 

Если ваше приложение использует attachBaseContext() Applicationclass, вы можете переопределить метод attachBaseContext() и вызвать MultiDex.install(this) чтобы включить multidex. Чтобы установить контекст файла multipledex, используя класс Applicaiton, который должен [MultiDexApplication][2]

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

Предложение

Выборочная компиляция API в ваш исполняемый файл

Не используйте всю сервисную службу Google для использования только требуемой библиотеки. Из версии 6.5 вы можете выборочно компилировать API-интерфейс службы Google Play в свое приложение. Например, чтобы включить только API Google Fit и Android Wear, замените следующую строку в файле 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

Я столкнулся с этой ошибкой ниже lollipop устройств.

Я использовал multiDexEnabled true.

После добавления этого кода в класс, расширяющий класс приложения, моя проблема решена.

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

Ссылка: https://stackoverflow.com/a/39968486/4777524

Вы добавили следующие правила proguard?

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

Документация: http://square.github.io/retrofit/

Это проблема с настройкой Gradle bulid. У меня тоже такая же проблема. Несколько раз

В Gradle вы используете

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

Enire Google Playservice Lib вы можете изменить, в какие из них использует 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

Вы должны сделать класс 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); } 

В своей деятельности, когда вы вызываете веб-службы, выполните следующие действия:

  @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()); } }); } 
 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(); 

С этими многочисленными библиотечными седлами он, должно быть, превзошел пресловутый предел метода 64k, вам нужно включить ваше приложение для мультидекса. Вот как вы это делаете. https://developer.android.com/tools/building/multidex.html

Попробуйте использовать одну и ту же версию 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' 

Я столкнулся с подобными проблемами, например, это, вероятно, проблема зависимости

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

Уже включает okhttp, как показано здесь https://github.com/square/retrofit/blob/d04f3a50e41ca01d22f370ac4f332f6ddf4ba9fe/pom.xml , поэтому удалите okhttp из списка зависимостей, затем синхронизируйте и повторите попытку.

Я столкнулся с этой ошибкой. И после многих поисков выяснилось, что я забыл добавить разрешение Интернета на манифест.

После добавления этого разрешения моя ошибка была решена.