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
では機能します。
あなたは得ています
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)
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'
}
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
あなたのプロジェクト。お役に立てれば 。
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");
}
この問題を解決するには、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
}
お役に立てれば幸いです。
プロガードを有効にしているようです。アプリケーションでプロガードが必要ない場合は、build.gradle(app)でプロガードを無効にすることができます
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
アプリケーションでプロガードが必要な場合は、これに従ってください link ジェイクウォートン氏が解決しました。