7

Prima di eseguire l'aggiornamento ad Android Studio 2.0, potrei utilizzare Dagger 2 senza problemi. Ora sto ricevendo un NoClassDefFoundError Questo mi ha bloccato per più di un giorno e sto cercando aiuto.NoClassDefFoundError quando si utilizza Dagger 2 dopo aver effettuato l'accesso ad Android Studio 2.0

Sembra che Gradle non possa la mia classe AppModule anche se è abbastanza chiaro che è nel mio progetto. Ho persino incluso il set multiDexEnabled true anche se il mio progetto è composto da pochi file.

Tutto quello che posso trovare online dice che è possibile fare clic sulle librerie per essere importate. Android Studio non ha un tale lusso.

Qualsiasi aiuto sarebbe molto apprezzato e tu avrai la mia immortale lealtà.

04-21 17:26:54.006 7875-7875/com.androidtitan.spotscoreapp E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.androidtitan.spotscoreapp, PID: 7875 
java.lang.NoClassDefFoundError: com.androidtitan.spotscoreapp.main.injection.AppModule_ProvidesApplicationFactory 
at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent.initialize(DaggerAppComponent.java:31) 
at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent.<init>(DaggerAppComponent.java:23) 
at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent.<init>(DaggerAppComponent.java:0) 
at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent$Builder.build(DaggerAppComponent.java:66) 
at com.androidtitan.spotscoreapp.App.onCreate(App.java:28) 
at com.android.tools.fd.runtime.BootstrapApplication.onCreate(BootstrapApplication.java:326) 
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1020) 
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5010) 
at android.app.ActivityThread.access$1600(ActivityThread.java:172) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1482) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:5835) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 


package com.androidtitan.spotscoreapp.main.injection; 

import android.app.Application; 
import android.content.Context; 

import javax.inject.Singleton; 

import dagger.Module; 
import dagger.Provides; 

AppModule

@Module 
public class AppModule { 
private static Application application; 

public AppModule(Application application) { 
    this.application = application; 
} 

@Provides @Singleton 
Application providesApplication() { 
    return application; 
} 

@Provides @Singleton 
Context providesApplicationContext() { 
    return application.getBaseContext(); 
} 
} 

AppComponent

package com.androidtitan.spotscoreapp.main.injection; 

import android.app.Application; 
import android.content.Context; 

import com.androidtitan.spotscoreapp.main.ui.activity.LoginActivity; 
import com.androidtitan.spotscoreapp.main.ui.fragment.LoginFragment; 
import com.androidtitan.spotscoreapp.main.ui.fragment.SignUpFragment; 

import javax.inject.Singleton; 

import dagger.Component; 

@Singleton 
@Component(
    modules = { AppModule.class, 
       LoginPresenterModule.class } 
) 
public interface AppComponent { 
Application getApplication(); 
Context getApplicationContext(); 

void inject(LoginFragment activity); 
} 

App estende Application

import android.app.Application; 
import android.support.multidex.MultiDexApplication; 

import com.androidtitan.spotscoreapp.main.injection.AppComponent; 
import com.androidtitan.spotscoreapp.main.injection.AppModule; 
import com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent; 
import com.firebase.client.Firebase; 

import timber.log.Timber; 

public class App extends Application { 

private static AppComponent appComponent; 

@Override 
public void onCreate() { 
    super.onCreate(); 

    Firebase.setAndroidContext(this); 

    appComponent = DaggerAppComponent.builder() 
      .appModule(new AppModule(this)) 
      .build(); 

    if (BuildConfig.DEBUG) { 
     Timber.plant(new Timber.DebugTree()); 
    } 

} 

public static AppComponent getAppComponent(){ 
    return appComponent; 
} 
} 

build.gradle (modulo: App)

012.351.
apply plugin: 'com.android.application' 
apply plugin: 'com.neenbedankt.android-apt' 

android { 
compileSdkVersion 23 
buildToolsVersion "24.0.0 rc1" 

defaultConfig { 
    applicationId "com.androidtitan.spotscoreapp" 
    minSdkVersion 16 
    targetSdkVersion 23 
    versionCode 1 
    versionName "1.0" 
    multiDexEnabled true 


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

packagingOptions { 
    exclude 'META-INF/DEPENDENCIES.txt' 
    exclude 'META-INF/NOTICE' 
    exclude 'META-INF/NOTICE.txt' 
    exclude 'META-INF/LICENSE' 
    exclude 'META-INF/LICENSE.txt' 
} 
} 

dependencies { 
compile fileTree(include: ['*.jar'], dir: 'libs') 
testCompile 'junit:junit:4.12' 
apt 'com.google.dagger:dagger-compiler:2.0' 
compile 'com.android.support:multidex:1.0.0' 

provided 'com.google.dagger:dagger-compiler:2.0' 
provided 'org.glassfish:javax.annotation:10.0-b28' 
compile 'com.android.support:appcompat-v7:23.3.0' 
compile 'com.jakewharton.timber:timber:4.1.2' 
compile 'com.android.support:design:23.3.0' 
compile 'com.jakewharton:butterknife:7.0.1' 
compile 'com.firebase:firebase-client-android:2.3.1' 
} 

build.gradle (Progetto: spotscoreapp)

buildscript { 
repositories { 
    jcenter() 
} 
dependencies { 
    classpath 'com.android.tools.build:gradle:2.0.0' 
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' 

    // NOTE: Do not place your application dependencies here; they belong 
    // in the individual module build.gradle files 
} 
} 

allprojects { 
repositories { 
    jcenter() 
} 
} 

task clean(type: Delete) { 
delete rootProject.buildDir 
} 

AndroidManifest

`

<uses-permission android:name="android.permission.INTERNET" /> 

<application 
    android:name=".App" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".main.ui.activity.LoginActivity" 
     android:label="@string/title_activity_login" 
     android:theme="@style/AppTheme.NoActionBar" /> 
    <activity android:name=".main.ui.activity.MainActivity" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

`

+1

Hai risolto questo problema? –

risposta

9

Ho avuto un problema molto simile e risolto esso facendo cose abbastanza comuni in Android Studio. Che, fondamentalmente necessario

Invalidate Caches and then Clean Project

Sai, Dagger2 genera un sacco di codice in fase di compilazione e, a volte le cose possono rovinare, soprattutto se si utilizza Esegui istantanea, fornita da Android Studio 2.0

5

tuo Application non si estende da MultiDexApplication, né fare

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

E si dovrebbe disabilitare Run immediato.

+0

I dettagli possono essere trovati qui https://developer.android.com/studio/build/multidex.html – thanhbinh84

1

provare ad aggiungere il percorso classe "com.google.dagger: pugnale: 2.4" al build.gradle del progetto principale.

NOTA: mantenere il numero di versione uguale a moudule's build.gradle

Problemi correlati