Hilt integration crashes application MainActivity_GeneratedInjector - android

Trying to integrate hilt using android Api Documentation but app crashed with following exception. https://developer.android.com/training/dependency-injection/hilt-android
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.package.application/com.package.application.MainActivity}:
java.lang.ClassCastException: com.package.application.DaggerAppApplication_HiltComponents_ApplicationC$ActivityRetainedCImpl$ActivityCImpl
cannot be cast to com.package.application.MainActivity_GeneratedInjector

What worked for me:
Removed the #AndroidEntryPoint annotation from the activity.
Ran the code and of course, it failed.
Had a fragment inside the activity. So, I deleted the fragment code as well.
Ran the code, it failed.
Added the #AndroidEntryPoint annotation to the activity again.
Ran the code. It ran and the error disappeared.

For me, as a dependency declaration inside my app build.gradle, i had to use api instead of implementation:
api project(':features:feedModule')
Learn more here: https://github.com/google/dagger/issues/2064
Update:
Dagger team released classpath aggregation feature which can resolve this issue. You can learn more here:
https://dagger.dev/hilt/gradle-setup#classpath-aggregation
Basically, in your app module build.gradle, you need to add:
hilt {
enableExperimentalClasspathAggregation = true
}
If your Android Gradle plugin version used in the project is less than 7.0, make sure to also add this to you build.gradle file:
android {
...
lintOptions {
checkReleaseBuilds false
}

In my case, I was getting a similar ClassCastException because the module where my #HiltAndroidApp app class was didn't have access to the module where my #AndroidEntryPoint activity was. Moving my App class to the app module (that has access to all the other Gradle modules) solved the problem.
From the docs:
Because Hilt's code generation needs access to all of the Gradle modules that use Hilt, the Gradle module that compiles your Application class also needs to have all of your Hilt modules and constructor-injected classes in its transitive dependencies.

Solved it by adding missing dependency for androidx hilt.
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
Other dependencies that I have in my gradle file.
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02"
implementation 'com.google.dagger:hilt-android:2.28-alpha'
kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'
implementation "androidx.fragment:fragment-ktx:1.2.5"
Plus fragment and its activity who are injecting viewmodel using hilt both are annotated as
#AndroidEntryPoint

I spent a couple of hours fixing this exact issue but solved it by doing Invalidate cache/restart + Rebuilding of all modules.
This is related to this issue from Hilt:
Hilt: More meaningful error messages

Dagger sometimes doesn't work well, even if the code is correct.
One possible solution is to rename the class to something else("Class2"), rerun the app, and check if it works. If it works, rename the class back to its original.

This is solved by invalidate cache and restart

I had the same problem and here are the steps I followed:
appModule starts with internal
In your app level build.gradle inside android section add the following line:
enableExperimentalClasspathAggregation = true
}
My dependencies are in this order:
classpath "com.google.dagger:hilt-android-gradle-plugin:2.40.5"
app-level build.gradle:
top plugin section
plugin{
...........
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
}
dependencies section
//dagger-hilt
implementation 'com.google.dagger:hilt-android:2.40.5'
kapt 'com.google.dagger:hilt-android-compiler:2.40.5'```

It is really silly solution but just comment out the injection annotation and injected fields, run the app then uncomment them and run again

It's also happened to me when I'm importing an .aar with "implementation".
(an .aar which includes hilt)
Like Sher Sanginov said instead of using "api" who increase compilation time, you can add the following lines in your build.gradle(app)
hilt {
enableAggregatingTask = true
}
enableExperimentalClasspathAggregation is now deprecated,
see https://dagger.dev/hilt/gradle-setup#aggregating-task

I was having the same java.lang.ClassCastException after adding Hilt.
Steps to fix the problem:
1. Build -> Clean Project
2. Build -> Rebuild Project
Also kapt doesn't work any more. Just add one plugin:
id 'dagger.hilt.android.plugin'
Then, add Hilt dependencies:
implementation "com.google.dagger:hilt-android:2.38.1"
annotationProcessor "com.google.dagger:hilt-compiler:2.38.1"

Steps need to perform:
Remove .gradle file in app's directory
Invalidate cache and restart android studio
Hopefully it will resolve your problem.

For me it was that I forgot to add #AndroidEntryPoint to a parent activity that was calling a second activity and this one calling the fragment. Obviously everyone of them need to have an #AndroidEntryPoint

You can delete you app's build folder as well as delete the gradle build cache on your system.
rm -rf app/build
rm -rf ~/.gradle/caches/build-cache-1
Deleting just the build cache is better than removing all the Android Studio cache.

In my case file does not contain the package, so hilt is not able to map the file and generate it in the generated folder. For that reason, hilt is not able to resolve the file.
I added the package in the fragment, and it resolve my issue

Related

In a multi module (library), when trying to import, Android studio gives error: "Add library: 'Gradle com.package.name:4.x.x #aar' to Classpath

I had a usecase so I have added retrofit library to use it locally in libs folder
You can see the package structure and error in the image below when trying to import Timber android libary.
In the app/build.gradle file, I have added dependency:
implementation 'com.jakewharton.timber:timber:4.7.1'
In the libs/retrofit/build.gradle file, there also I added dependency:
// I also tried using api instead of implementation
implementation 'com.jakewharton.timber:timber:4.7.1'
Now, I synced, did invalidate cache and restart, clean, rebuild project.
Then tried to use Timber.d("some log") call in one of the files in libs/retrofit directory.
It resulted in error:
Add library: 'Gradle com.jakewharton.timber:timber:4.7.1#aar' to Classpath
Note, the Timber.d("other log") works fine in one of the files in app directory, example app/MainActivity.kt
What I am doing wrong?
Also, to note Retrofit code works perfectly fine in app module. The issue is using a Timber logging library is not working in any of the modules in libs
In my opinion, the answer lies in the question asked in this thread itself.
What happened, is that when I went through this situation myself, I saw this thread in the Google Search results.
After adding the dependency, for example:-
implementation 'com.jakewharton.timber:timber:4.7.1'
and thereafter syncing, I saw that it was merely a page refresh issue.
That is I switched to another source file which was opened in another tab and came back to this in which the following code was issued (the place of the aforesaid error):-
Timber.tag(...).e(...)
Timber usage.
Timber is packaged as an AAR file, that means it can only be used in android modules of your project.
The solution would be to convert your kotlin module to an android module by applying the plugins below in your build.gradle file of that module
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'

Hilt (Android): cannot find symbol return DaggerApp_HiltComponents_ApplicationC.builder()

I tried to replace Koin with Hilt (bad idea) for DI and now I'm stuck with this error:
Hilt_App.java:21: error: cannot find symbol
return DaggerApp_HiltComponents_ApplicationC.builder()
^
symbol: variable DaggerApp_HiltComponents_ApplicationC
What is it? How to fix it?
I got the same error message.
My problem was that I had an old/deprecated gradle dependency.
Make sure to remove following dpenedency from your gradle file:
/* DELETE this dependency */
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
If you are working on a modular project, take care of dependencies!
For example, if you have a retrofit dependency in your data module, even your data module implemented in the app module, you must add retrofit dependency as well or make them transactive with the api to be accessible to the app module.
For those who had the same error but did not miss any dependencies. I had this problem, because I forgot to annotate one class with "#Inject constructor". After I did that, everything worked again.
as answered in the guestion comments. The problem was that when using Jetpack integrations as explained here for the ViewModels https://developer.android.com/training/dependency-injection/hilt-jetpack and you have to add those dependencies also in the main app module (not only in the modules where you actually use ViewModels).
for example , if you have the following in the feature module's build.gradle file:
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:$hilt_lifecycle"
kapt "androidx.hilt:hilt-compiler:1.0.0-alpha02"
make sure you add them to the app's build.gradle file as well
I've met the issue and work with these dependencies:
implementation "com.google.dagger:hilt-android:$hiltVersion"
kapt "com.google.dagger:hilt-android-compiler:$hiltVersion"
kapt "androidx.hilt:hilt-compiler:$hiltAndroidXVersion"
https://medium.com/gradeup/dependency-injection-dagger-hilt-vs-koin-ab2f7f85e6c6

Duplicate class kotlin classes kotlin version 1.3.70

Error while adding MoshiPack Library in Kotlin latest version 1.3.70 to gradle.build application
Moshi pack
implementation 'com.daveanthonythomas.moshipack:moshipack:1.0.1'
Error Message
Duplicate class kotlin.reflect.KClasses found in modules jetified-kotlin-reflect-1.1.1.jar (org.jetbrains.kotlin:kotlin-reflect:1.1.1) and jetified-kotlin-stdlib-1.3.70.jar (org.jetbrains.kotlin:kotlin-stdlib:1.3.70)
Any suggestions how to solve this issue or any other library I can use in Kotlin so I can use Message Pack.
Thanks in advance
Try to add this to your dependencies:
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
and make sure you specified your Android NDK location under File>Project Structure...>SDK Location
Starting Kotlin 1.3.70 some basic useful members on KClass included in Kotlin standard library (they were in a kotlin-reflect before).
See "Working with KClass" in https://blog.jetbrains.com/kotlin/2020/03/kotlin-1-3-70-released/
In your case MoshiPack adds a kotlin-reflect library that conflicts with standard library.
You should exclude transitive dependency to resolve the conflict.
If you use KotlinDSL, in build.gradle.kts:
implementation ("com.daveanthonythomas.moshipack:moshipack:1.0.1") {
exclude(group = "org.jetbrains.kotlin", module = "kotlin-reflect")
}
If you use Groovy, in build.gradle:
implementation ('com.daveanthonythomas.moshipack:moshipack:1.0.1') {
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-reflect'
}
I tried this and it worked
implementation "org.jetbrains.kotlin:kotlin-reflect:1.4.10"
i think the only way to solve it , to go back to kotlin version 1.3.61 , so remove 1.3.70 and use 1.3.61
So I finally figured it out and here's how :-
So the main problem is you have injected 2 dependency of same class. Here he used 2 dependency for Kotlin which conflict in runtime to fix that you have to check which dependency is duplicated. (It is most case scenario. It can be with any other dependency i.e. Hilt)
Go to File > Project structure > Dependencies
Check which dependency are repeating. In this case it will have (androidx.core:core:1.8.0) and (androidx.core:core:+)
as you can see there are 2 dependency with same classes version 1.8.0 will have all the class which core:+ will have and this is causing a error.
Now delete (androidx.core:core:+) and hit Apply and sync project.
Now you should be good to go. here is structure after changing dependency.
Note:- This method will show all the android dependency which you might be not included but you will see all the dependency which any app has. Please remove the dependency who are you familiar with do not remove any dependency without any proper knowledge.

Unable to resolve DaggerAppComponent

I have gone through various stackoverflow link some of the link are :
LInk 1
Link 2
but no one solve this below are the gradle file and my application :
// dependency injection
implementation 'com.google.dagger:dagger-android:2.14.1'
implementation 'com.google.dagger:dagger-android-support:2.14.1'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.14.1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'
And the MyApplication file is :
DaggerAppComponent.builder()
.application(this)
.build()
.inject(this);
AppLogger.init();
You have to build the project after setting up dagger and then start typing Dagger and Android Studio will show the class it built for dagger component
There is many methods to solve it,
Below methods are worldwide problem solver
Click on Invalidate/cache restart in android studio
Close android studio, Go > androidStudio installed folder and delete cache folder manualy and start again.
Rename dagger component and again clean/rebuild your project.
These 3 methods can solve your problem.
When I applied the plugin 'kotlin-kapt' in the gradle file, it caused the DaggerAppComponent to not be found. Disabled it and the DaggerAppComponent was found again and I am using Dagger 2.28.1.
So the issue could be linked to specific changes with the plugins.

ERROR : error.NonExistentClass Kotlin In multi module Dagger project

I'm using Dagger 2 and Kotlin for Android development.
My project is also a multi-module project.
My settings.gradle file is like this:
include :app
include :lib
I'm also maintaining the lib module.
In the Dagger Files (for example in the component), I try to get the item from other module. For example:
#Component
interface AppComponent{
fun getPresenter() : Presenter
}
The Presenter object is defined in lib module. I was working in linux environment and I'm using Android Studio 3 preview canary 5. The code is working well and I am able to generate APK.
But my company wanted to generate the APK using stable version of Android Studio. I'm using Android Studio 2.3.3.
When compiling the Android Project, I encountered this error:
error: error.NonExistentClass
The error appears when
:app:kaptDebugKotlin
is performed and caused by the dagger class cannot found, the class is defined in the other project. What can be the possible workaround for this? Sorry for my bad English.
Just add this to build gradle file to avoid the issues related NonExistentClass
kapt {
correctErrorTypes true
}
https://kotlinlang.org/docs/reference/kapt.html#non-existent-type-correction
The Root Cause
Basically, there's not much that can be done to fix this when using kapt. To quote this link that tackles the same problem in another library that uses pre-processors (OrmaDatabase):
Because Kotlin makes its stubs before Java Annotation Processing runs,
Kotlin knows just nothing about OrmaDatabase, and the name of the
declaration in stubs will be error.NonExistentClass. This breaks the
Annotation Processing tool. It's a kind of kapt limitation
How to fix it (the workaround)
Just use plain apt or annotationProcessor for running Dagger compiler. As soon as I changed:
kapt libs.daggerCompiler
to
annotationProcessor libs.daggerCompiler
in my module level build.gradle file, I was able to get the errors. After you've fixed the errors, you gotta revert the line back to kapt because otherwise dagger classes wouldn't be generated since they're defined in Kotlin.
I had a very similar situation with a NonExistentClass error in a multi-module project using Dagger and turns out I forgot to add the kotlin library dependency. So, just adding it in the sub-module solved my problem:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$rootProject.kotlinVersion"
tldr: Change kapt to annotationProcessor in build.gradle and you will see the real problem.
I got the same error, and it turned out that I just commented out a class that I was using in my AppComponent. Unfortunately the kapt tool didn't give me the proper error message. If you change the kapt to annotationProcessor at your library's compiler, and try to build, it won't succeed neither, but you will get a more detailed error message.
In my case, I had #Nullable annotation from support-annotations while I had removed it in order to migrate to AndroidX.
When building, because the annotation was not imported correctly, it was detected as invalid.
What I did was to check the code and fix all imports.
After removing the outdated library
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha03'
I got this error:
incompatible types: NonExistentClass cannot be converted to Annotation
Looking at https://dagger.dev/hilt/view-model.html I changed in a ViewModel:
class MainViewModel #ViewModelInject constructor(
...
) : ViewModel() {
to
#HiltViewModel
class MainViewModel #Inject constructor(
...
) : ViewModel() {
I've found if you're using
kapt {
generateStubs = true
}
changing to false will then present the actual error, you will probably have issues building the Dagger Graph once it's compilation issues have been corrected, but simply change back to true, and you should be good
It seems, there is a bug with kapt, project cleaning should help.
./gradlew clean
I got this error when I had moved by mistake a test class into my main sourceset. Moving it back to the test sourceset got rid of the error.
I received this error, when there was a compilation error in my Injected class. Please ensure that there aren't any compilation errors.
For all those arriving like me on this topic with a similar error.
Check your annotation imports.
For me the problem was I had the #MicronautTest annotation same as another test just the wrong one. Somehow intellij seems to think the import is fine while it really is not.
I had
import io.micronaut.test.extensions.junit5.annotation.MicronautTest
yet needed the kotest one.
import io.micronaut.test.extensions.kotest.annotation.MicronautTest
The kapt error is, while technically correct, quite uninformative.
So just check the imports and if they are all correct.
ERROR : error.NonExistentClass
This means there is a problem with providing dependencies( and not the dependency itself!).
Sometimes annotation processor(in this case Dagger) is unable to build dependency graph on the first build iteration due to a provider absence.
For instance: You are passing GlideApp as a parameter in your provider while GlideApp class is not generated yet! So, watch out for your providers for NonExistentClass errors.
I had the same issue recently. As I sometimes commit through the Android Studio (3.4.c6) I use the "Optimize imports" option to remove unused imports. For some reason, it removed the import for the Parcelize annotation.
It appeared the errors after I upgraded the .gradle version.
Upgraded the version for mockito from 2.7.21 to 2.+ fixed the issue for me.
- androidTestCompile "org.mockito:mockito-android:2.7.21" // remove this
+ androidTestCompile "org.mockito:mockito-android:2.+" // add this
If you come across this problem after Android X migration and start loosing your mind here is one thing you can try.
My Case:
Our project had few modules in it, lets call one of them myModuleProject.
After migration to Android X it was compiling and running fine if I run it from android studio, but when code moved to cloud and CI starts build, it was failing with ':myModuleProject:kaptDebugKotlin' and with long list of errors such as
e: /home/circleci/code/myModuleProject/build/tmp/kapt3/stubs/debug/package_name_here/reporter/bindingadapter/SomeBindingAdapterKt.java:14: error: incompatible types: NonExistentClass cannot be converted to Annotation
#error.NonExistentClass()
After two days of nightmare I found that not only root project gradle.properties but also module projects should include following!
android.databinding.enableV2=true
android.useAndroidX=true
android.enableJetifier=true
It seems kapt cannot find the class, or cannot determine which class to use. e.g.
import foo.* // class foo.Abc
import bar.* // annotation bar.Abc
#Abc
class Xyz { ... }
I had a project with Dagger injecting something into Presenters
At one moment I got a persistent
"NonExistentClass.java:3: error: error.NonExistentClass must be INTERFACE" error
The root cause was trivial: a rogue copy of the valid #Inject annotated file with unsatisfied dependencies somehow slipped into the project. How can we find it? The project in Android Studio looks OK.
Look at the error message, it looks like:
/home/alex/AndroidProvects/TopProject/app/build/tmp/kapt3/stubs/onlineDebug/error/NonExistentClass.java:3: error: error.NonExistentClass must be INTERFACE
public final class NonExistentClass {
Search at the compiled by kapt build files in
/home/alex/AndroidProvects/TopProject/app/build/tmp/kapt3/stubs/onlineDebug/app for "NonExistentClass" string
You will find the exact file with the exact unsatisfied Dagger dependency (in my case it was a rogue orphan file in the place where it shouldn't exist)
I had similar issues with dagger. Adding the following helped solve it :
// dagger
implementation dep('com.google.dagger:dagger')
implementation dep('com.google.dagger:dagger-android-support')
implementation dep('com.spotify.dagger.android:dagger')
kapt dep('com.google.dagger:dagger-android-processor')
kapt dep('com.google.dagger:dagger-compiler')

Categories

Resources