dagger: Hilt: More meaningful error messages

First of all, Hilt looks like a really promising project, keep up the good work!

One feature I would like to see is more meaningful error messages at run time and compile time. For instance, one error I always seem to get is:

Caused by: java.lang.ClassCastException: com.mypackage.DaggerMainApplication_HiltComponents_ApplicationC$ActivityRetainedCImpl$ActivityCImpl cannot be cast to com.com.mypackage.MyActivity_GeneratedInjector

This runtime exception basically means that there is an error in the dependency graph meaning something can’t be injected, but it would be nice to know what exactly.

Even better, if this problem could be caught and displayed at compile time, then fantastic 😃

kind regards, goldy1992

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Reactions: 3
  • Comments: 21 (5 by maintainers)

Most upvoted comments

@Chang-Eric, is it expected to occur in below scenario?

:ui-component module - ‘com.android.library’ :profile module - ‘com.android.library’

implementation project(':ui-component')

:app module - ‘com.android.application’

implementation project(':ui-component')
implementation project(':profile')

In the above project, I have my Application class in :ui-component module.

@HiltAndroidApp
class CommonApp : Application()

And my Activity is in :profile module.

@AndroidEntryPoint
class ProfileActivity : BaseActivity(R.layout.activity_profile)

But when I run this app, I get below exception at runtime.

Process: com..., PID: 11338
    java.lang.RuntimeException: Unable to start activity ComponentInfo{.../....ProfileActivity}: java.lang.ClassCastException: ....DaggerCommonApp_HiltComponents_ApplicationC$ActivityRetainedCImpl$ActivityCImpl cannot be cast to ...ProfileActivity_GeneratedInjector
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2666)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6123)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
     Caused by: java.lang.ClassCastException: ....DaggerCommonApp_HiltComponents_ApplicationC$ActivityRetainedCImpl$ActivityCImpl cannot be cast to ...ProfileActivity_GeneratedInjector
        at ....Hilt_ProfileActivity.inject(Hilt_ProfileActivity.java:56)
        at ....Hilt_ProfileActivity.onCreate(Hilt_ProfileActivity.java:31)
        at ....ProfileActivity.onCreate(ProfileActivity.kt:25)
        at android.app.Activity.performCreate(Activity.java:6723)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2619)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6123) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 

What could go wrong here? And why it’s a runtime error instead of compile time?

i just got an error and all it said was [Hilt] lol

@Chang-Eric Regarding that error, I should mention that it was very much resolved by manually doing a gradle build before running the application in Android Studio. There was actually a compile time error. This leads me to believe that there is an issue with Android Studio not rebuilding some Hilt (dagger) code that has changed since the last deployment.

Hey, I just add the same issue. In my project, I have an interface Logger used to log stuffs, and its implementation TimberLogger (injected via constructor) TimberLogger is provided using a module:

@Module
@InstallIn(ApplicationComponent::class)
abstract class BoundaryModule {

    @Binds
    abstract fun bindLogger(impl: TimberLogger): Logger
}

When building with Android Studio, the application crashes with at runtime with this stacktrace:

java.lang.NoClassDefFoundError: Failed resolution of: Lexample/core/Logger;
        at example.app.DaggerFooApplication_HiltComponents_ApplicationC.builder(DaggerFooApplication_HiltComponents_ApplicationC.java:84)
        at example.app.Hilt_FooApplication$1.get(Hilt_FooApplication.java:21)
        at dagger.hilt.android.internal.managers.ApplicationComponentManager.generatedComponent(ApplicationComponentManager.java:40)
        at example.app.Hilt_FooApplication.generatedComponent(Hilt_FooApplication.java:33)
        at example.app.Hilt_FooApplication.onCreate(Hilt_FooApplication.java:41)
        at example.app.FooApplication.onCreate(FooApplication.kt:26)
        at example.app.DebugFooApplication.onCreate(DebugFooApplication.kt:12)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1192)

(It’s broken on all latest AS version for each track.)

While building it manually with the gradle wrapper works just fine.

@ChanSek IIUC, it would have to be the opposite. In particular, :ui-component contains the @HiltAndroidApp, so it would have to have a dependency on :profile.