Before upgrading to Android Studio 2.0 I could use Dagger 2 no problem. Now I am getting a NoClassDefFoundError
This has shut me down for more than a day and I'm reaching out for some help.
It seems as though Gradle cannot my AppModule
class even though it is pretty clear that it is in my project. I have even included set multiDexEnabled true
even though my project is only a few files.
Everything I can find online says that you can click your libraries to be imported. Android Studio has no such luxury.
Any help would be greatly appreciated and you will have my undying loyalty.
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 extends 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(Module:App)
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(Project: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>
`
Your Application
doesn't extend from MultiDexApplication
, nor does it do
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
And you should disable Instant Run.
I had a very similar issue and resolved it by doing pretty usual things in Android Studio. You basically need to
Invalidate Caches and then Clean Project
You know, Dagger2 generates a lot of code at compile time and sometimes things can mess up, especially if you are using Instant Run, provided by Android Studio 2.0
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With