java.lang.NoClassDefFoundError retrofit2.Utils
Ich bin mit der Nachrüstung zu handhaben Serverside Daten aus Mobile. Nach der Umsetzung retrofit, ich erhalte die unten Ausnahme.
Was mache ich falsch?
com.name.App_idea W/System.Fehler: java.lang.NoClassDefFoundError:
retrofit2.Utils
bei retrofit2.Retrofit - $ - Generator.baseUrl ("Retrofit".java:434)
bei com.name.App_idea.utils.Idee.onCreate(Idee.java:103)
an android.app.Instrumentierung.callApplicationOnCreate(Instrumentation.java:1007)
an android.app.ActivityThread.handleBindApplication(ActivityThread.java:4541)
an android.app.ActivityThread.Zugriff auf$1500(ActivityThread.java:151)
an android.app.ActivityThread$H. handleMessage(ActivityThread.java:1381)
an android.os.Handler.dispatchMessage(Handler.java:110)
an android.os.Looper.Loops(Looper.java:193)
an android.app.ActivityThread.main(ActivityThread.java:5292)
bei java.lang.reflektieren.Methode.invokeNative(Native-Methode)
bei java.lang.reflektieren.Methode.invoke(Method.java:515)
bei com.android.intern.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
bei com.android.intern.os.ZygoteInit.main(ZygoteInit.java:640)
bei dalvik.system.NativeStart.main(Native-Methode)
Retrofit Init
mRetrofit = new Retrofit.Builder()
.baseUrl(AppConstance.APP_URL)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(getOkHttpClient())
.build();
Gradle-Datei
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'
}
Application-Klasse
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);
}
}
}
- Bitte fügen Sie Ihre URL richtig in der Utils-Klasse, und verwenden Sie die verketteten Teil in der interfce wie ich habe in mein code.@Muthu Pandiyan
- Sind Sie mit proguard?
- keine iam nicht mit
- Bitte versuchen Sie es zu entfernen
.client(getOkHttpClient())
line - immer noch dasselbe Problem mRetrofit = new Nachrüsten.Generator() .baseUrl(AppConstance.APP_URL) .build();
- Ok, versuchen Sie ein neues Projekt erstellen, nur mit Inhalt wie in deiner Frage, dann führen Sie die Anwendung.
- NoClassDefFoundError bedeutet, dass die Klasse vorhanden war, zur compile-Zeit, aber konnte nicht gefunden werden zur Laufzeit durch die JVM. Beobachtet man dieses Verhalten in einer Application-Klasse enthält nur die retrofit-code? Ich denke, ein Duplikat der Klasse aufgerufen DatabaseHelper definiert werden könnten, eine Ihrer Abhängigkeiten.
- Haben Sie versucht, multidex, wie ich vorgeschlagen, in einer meiner Antwort?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist Gradle bulid konfigurieren Problem habe ich auch gleiche Problem Einige Male
In Gradle Ihr mit
Enire Google Playservice Lib können Sie ändern, in die die lib ' s verwenden in Ihrem Projekt
Beispiel
Finden Sie Diese URl https://developers.google.com/android/guides/setup#add_google_play_services_to_your_project
Diese Fehler kommen, weil der MultiDexApplication .Ich habe Gesicht, diese Art von Problem mit einigen anderen Bibliothek nicht dieselbe Bibliothek, aber einige andere Bibliothek.Es werden Fehler des retrofit-Bibliothek, weil der Initialisierung der app-start-up, wo dex(in dem Ihr retrofit-Bibliothek-code umgewandelt, dex) - Datei ist nicht zu setzen(installieren).
Zu beheben, die Sie benötigen, um Mehrere Dex-Datei. mit Hilfe der Anwendung
build.gradle
& Application-Klasseunten änderungen, die erforderlich ist
build.gradle
Dateigesamte
build.gradle
Wenn Ihr die app nutzt, erweitert die Applicationclass, können Sie überschreiben die
attachBaseContext()
Methode, und rufenMultiDex.install(this)
zu aktivieren multidex. Installieren multipledex Datei Zusammenhang mit Zur Klasse, die sollten erweitert[MultiDexApplication][2]
Vorschlag
Selektiv APIs kompilieren in die ausführbare
Nicht verwenden, gesamten google-play-Dienst verwenden Sie nur die benötigte library nach.Ab version 6.5 können Sie stattdessen gezielt kompilieren Google Play-service-APIs in Ihre app. Zum Beispiel, um nur das Google Fit und Android Wear-APIs, ersetzen Sie die folgende Zeile in deinem build.gradle-Datei:
mit diesen Zeilen:
Mit dem Verweis auf meine Antwort
https://stackoverflow.com/a/34948154/1140237
War ich vor diesem Fehler unter lollipop-Geräte.
War ich mit multiDexEnabled wahr.
Nach dem hinzufügen dieses Codes an die Klasse, die sich Anwendungsklasse mein Problem gelöst.
Referenz:
https://stackoverflow.com/a/39968486/4777524
Haben, fügen Sie die folgenden proguard Regeln?
Dokumentation: http://square.github.io/retrofit/
Sollten Sie die Utils-Klasse wie folgt aus:
Erstellen Sie eine Benutzeroberfläche für die http-Methoden:
In Ihrer Tätigkeit, wo Sie den Aufruf der webservices,bitte gehen Sie wie folgt vor:
UMSCHREIBEN
Mit diesen viele library-Sättel, es muss exceded die berüchtigten 64k Methode beschränken, müssen Sie Ihre app für multidex. Hier ist, wie Sie es tun. https://developer.android.com/tools/building/multidex.html
Versuchen Sie es mit der gleichen lib version für die Basis-retrofit-lib und den Wandler.
Ich lief in ähnliche Probleme, wie diese, ist es wahrscheinlich ein Abhängigkeitsproblem
bereits enthalten, okhttp, wie hier gesehen https://github.com/square/retrofit/blob/d04f3a50e41ca01d22f370ac4f332f6ddf4ba9fe/pom.xml, daher entfernen Sie die okhttp aus der Abhängigkeit Liste dann synchronisieren Sie Sie und versuchen Sie es erneut.
Begegnete ich mit diesem Fehler. Und nach vielen suchen gefunden, die ich vergessen habe hinzuzufügen, Internet-Berechtigung zu manifestieren.
Nachdem Sie diese Erlaubnis, mein Fehler, behoben.