Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Null dependency after migrating from Dagger to Hilt #3513

Open
domhys opened this issue Aug 5, 2022 · 15 comments
Open

Null dependency after migrating from Dagger to Hilt #3513

domhys opened this issue Aug 5, 2022 · 15 comments

Comments

@domhys
Copy link

domhys commented Aug 5, 2022

I'm doing a migration from Dagger (with dagger-android) to Hilt. After completing all the steps from the migration guide, I'm getting a Null dependency error during compilation (full stacktrace at the end). At this point I'm not able to obtain any meaningful error message so I've got no idea what to fix.

What I've tried to do:

  • reread dagger to hilt migration guide
  • gone over all modules by hand to see if I missed anything (was able to fix a few obvious mistakes but this error message persists)
  • gone over diff between old dagger code and new hilt code to make sure I didn't leave out any classes
  • tried to introduce new dependencies that cannot be satisfied hoping to get a different error message
  • tried to inject the same class multiple times to get a different error message

My setup: As this is a proprietary software, I'm not able to share the full source code, but my setup is pretty standard:

  • applied hilt-android-gradle-plugin and kapt in every module that uses DI
  • implementation "com.google.dagger:hilt-android:2.43.1"
    kapt "com.google.dagger:hilt-compiler:2.43.1" in all modules (tried different versions as well - 2.40.5 and 2.42)
  • sourceCompatibility and targetCompatibility to Java 1.8
  • Android entry points: many activities and fragments + 1 broadcast receiver + 1 service for FCM messages. No view injections
  • No custom entry points (content provides etc)
    As I don't have any idea what causes this issue, I don't know which parts of my code can be useful to track down this bug (but I'm happy to answer any questions relating to my setup).

I'm aware that this is a hard bug to track down without any source code, but I'm posting for two reasons:

  • maybe someone has an idea how to extract a meaningful error from Hilt
  • maybe error handling in Hilt can be improved after I've tracked down the issue
error: [Hilt]
  Null dependency: java.lang.NullPointerException: Null dependency
  	at dagger.hilt.processor.internal.aggregateddeps.AutoValue_AggregatedDepsMetadata.<init>(AutoValue_AggregatedDepsMetadata.java:46)
  	at dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsMetadata.create(AggregatedDepsMetadata.java:130)
  	at dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsMetadata.lambda$from$0(AggregatedDepsMetadata.java:82)
  	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
  	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
  	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
  	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
  	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
  	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
  	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
  	at dagger.hilt.processor.internal.aggregateddeps.AggregatedDepsMetadata.from(AggregatedDepsMetadata.java:83)
  	at dagger.hilt.processor.internal.root.ComponentTreeDepsProcessor.processComponentTreeDeps(ComponentTreeDepsProcessor.java:122)
  	at dagger.hilt.processor.internal.root.ComponentTreeDepsProcessor.postRoundProcess(ComponentTreeDepsProcessor.java:84)
  	at dagger.hilt.processor.internal.BaseProcessor.process(BaseProcessor.java:210)
  	at org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.process(DelegatingProcessor.java:62)
  	at org.gradle.api.internal.tasks.compile.processing.IsolatingProcessor.process(IsolatingProcessor.java:50)
  	at org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.process(DelegatingProcessor.java:62)
  	at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.access$401(TimeTrackingProcessor.java:37)
  	at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$5.create(TimeTrackingProcessor.java:99)
  	at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$5.create(TimeTrackingProcessor.java:96)
  	at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.track(TimeTrackingProcessor.java:117)
  	at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.process(TimeTrackingProcessor.java:96)
  	at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:980)
  	at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:896)
  	at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1222)
  	at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1335)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1258)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:936)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.handleExceptions(JavacTaskImpl.java:147)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100)
  	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94)
  	at org.gradle.internal.compiler.java.IncrementalCompileTask.call(IncrementalCompileTask.java:89)
  	at org.gradle.api.internal.tasks.compile.AnnotationProcessingCompileTask.call(AnnotationProcessingCompileTask.java:94)
  	at org.gradle.api.internal.tasks.compile.ResourceCleaningCompilationTask.call(ResourceCleaningCompilationTask.java:57)
  	at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:54)
  	at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:39)
  	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:97)
  	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:51)
  	at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:37)
  	at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:51)
  	at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:37)
  	at org.gradle.api.internal.tasks.compile.ModuleApplicationNameWritingCompiler.execute(ModuleApplicationNameWritingCompiler.java:46)
  	at org.gradle.api.internal.tasks.compile.ModuleApplicationNameWritingCompiler.execute(ModuleApplicationNameWritingCompiler.java:36)
  	at org.gradle.jvm.toolchain.internal.DefaultToolchainJavaCompiler.execute(DefaultToolchainJavaCompiler.java:57)
  	at org.gradle.api.tasks.compile.JavaCompile.lambda$createToolchainCompiler$1(JavaCompile.java:232)
  	at org.gradle.api.internal.tasks.compile.CleaningJavaCompiler.execute(CleaningJavaCompiler.java:53)
  	at org.gradle.api.internal.tasks.compile.incremental.IncrementalCompilerFactory.lambda$createRebuildAllCompiler$0(IncrementalCompilerFactory.java:52)
  	at org.gradle.api.internal.tasks.compile.incremental.SelectiveCompiler.execute(SelectiveCompiler.java:67)
  	at org.gradle.api.internal.tasks.compile.incremental.SelectiveCompiler.execute(SelectiveCompiler.java:41)
  	at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:66)
  	at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:52)
  	at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:59)
  	at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:51)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
  	at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler.execute(CompileJavaBuildOperationReportingCompiler.java:51)
  	at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:279)
  	at org.gradle.api.tasks.compile.JavaCompile.performIncrementalCompilation(JavaCompile.java:165)
  	at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:146)
  	at jdk.internal.reflect.GeneratedMethodAccessor797.invoke(Unknown Source)
  	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
  	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
  	at org.gradle.api.internal.project.taskfactory.IncrementalInputsTaskAction.doExecute(IncrementalInputsTaskAction.java:32)
  	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
  	at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)
  	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
  	at org.gradle.api.internal.tasks.execution.TaskExecution$2.run(TaskExecution.java:239)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
  	at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:224)
  	at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:207)
  	at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:190)
  	at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:168)
  	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89)
  	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40)
  	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53)
  	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
  	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50)
  	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40)
  	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
  	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
  	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
  	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
  	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
  	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
  	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
  	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
  	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
  	at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:61)
  	at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:42)
  	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60)
  	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27)
  	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:188)
  	at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
  	at org.gradle.internal.Either$Right.fold(Either.java:175)
  	at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
  	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
  	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
  	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:38)
  	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:27)
  	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
  	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
  	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:109)
  	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:56)
  	at java.base/java.util.Optional.orElseGet(Optional.java:369)
  	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:56)
  	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
  	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:73)
  	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44)
  	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
  	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
  	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:89)
  	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50)
  	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:114)
  	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57)
  	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:76)
  	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:50)
  	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:93)
  	at java.base/java.util.Optional.orElseGet(Optional.java:369)
  	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:93)
  	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
  	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
  	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:43)
  	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:31)
  	at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
  	at org.gradle.api.internal.tasks.execution.TaskExecution$3.withWorkspace(TaskExecution.java:284)
  	at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
  	at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
  	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
  	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
  	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)
  	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33)
  	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
  	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:142)
  	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:131)
  	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
  	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
  	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
  	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
  	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
  	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
  	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
  	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
  	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
  	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
  	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
  	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:402)
  	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:389)
  	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:382)
  	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:368)
  	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
  	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
  	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
  	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
  	at org.gradle.execution.plan.DefaultPlanExecutor.process(DefaultPlanExecutor.java:72)
  	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.executeWithServices(DefaultTaskExecutionGraph.java:187)
  	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.execute(DefaultTaskExecutionGraph.java:180)
  	at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:39)
  	at org.gradle.execution.DefaultBuildWorkExecutor.execute(DefaultBuildWorkExecutor.java:44)
  	at org.gradle.execution.DefaultBuildWorkExecutor.access$000(DefaultBuildWorkExecutor.java:26)
  	at org.gradle.execution.DefaultBuildWorkExecutor$1.proceed(DefaultBuildWorkExecutor.java:52)
  	at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:49)
  	at org.gradle.execution.DefaultBuildWorkExecutor.execute(DefaultBuildWorkExecutor.java:44)
  	at org.gradle.execution.DefaultBuildWorkExecutor.execute(DefaultBuildWorkExecutor.java:36)
  	at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:51)
  	at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor$ExecuteTasks.call(BuildOperationFiringBuildWorkerExecutor.java:42)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
  	at org.gradle.execution.BuildOperationFiringBuildWorkerExecutor.execute(BuildOperationFiringBuildWorkerExecutor.java:39)
  	at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$executeTasks$3(DefaultBuildLifecycleController.java:136)
  	at org.gradle.internal.build.StateTransitionController.doTransition(StateTransitionController.java:243)
  	at org.gradle.internal.build.StateTransitionController.tryTransition(StateTransitionController.java:158)
  	at org.gradle.internal.build.DefaultBuildLifecycleController.executeTasks(DefaultBuildLifecycleController.java:136)
  	at org.gradle.internal.buildtree.DefaultBuildTreeWorkExecutor.execute(DefaultBuildTreeWorkExecutor.java:35)
  	at org.gradle.internal.buildtree.BuildOperationFiringBuildTreeWorkExecutor$1.call(BuildOperationFiringBuildTreeWorkExecutor.java:40)
  	at org.gradle.internal.buildtree.BuildOperationFiringBuildTreeWorkExecutor$1.call(BuildOperationFiringBuildTreeWorkExecutor.java:37)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
  	at org.gradle.internal.buildtree.BuildOperationFiringBuildTreeWorkExecutor.execute(BuildOperationFiringBuildTreeWorkExecutor.java:37)
  	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$doScheduleAndRunTasks$2(DefaultBuildTreeLifecycleController.java:87)
  	at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph.withNewTaskGraph(DefaultIncludedBuildTaskGraph.java:94)
  	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.doScheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:85)
  	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$4(DefaultBuildTreeLifecycleController.java:103)
  	at org.gradle.internal.build.StateTransitionController.lambda$transition$0(StateTransitionController.java:145)
  	at org.gradle.internal.build.StateTransitionController.doTransition(StateTransitionController.java:243)
  	at org.gradle.internal.build.StateTransitionController.transition(StateTransitionController.java:145)
  	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:100)
  	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:66)
  	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:53)
  	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
  	at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49)
  	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:69)
  	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:114)
  	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
  	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:40)
  	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:155)
  	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:40)
  	at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40)
  	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:65)
  	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
  	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:65)
  	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:61)
  	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:57)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
  	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
  	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
  	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:57)
  	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:38)
  	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:211)
  	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:38)
  	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:103)
  	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64)
  	at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46)
  	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:100)
  	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:88)
  	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:69)
  	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:62)
  	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:41)
  	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
  	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
  	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:63)
  	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
  	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:58)
  	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:42)
  	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
  	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
  	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
  	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
  	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
  	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
  	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
  	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
  	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
  	at org.gradle.util.internal.Swapper.swap(Swapper.java:38)
  	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
  	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
  	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
  	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
  	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
  	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
  	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
  	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
  	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
  	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
  	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
  	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
  	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
  	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:61)
  	at java.base/java.lang.Thread.run(Thread.java:829)
  
  [Hilt] Processing did not complete. See error above for details.
1 error

FAILURE: Build failed with an exception.
@danysantiago
Copy link
Member

This is very strange, its as if Hilt produced a bad metadata class and thus fails to read it at the root, if we can find the which metadata class was wrongly produced we might be able to better understand the issue.

Ideally creating a sample repro would be amazing, but I can see that being hard, and since sharing your project is not possible my other suggestion to you would be to attach a debugger to Hilt to try and figure out the issue. This comment has some instructions but I'll try to add to them.

  • First, you indeed need to have the sources available, one easy way to do that is to depend on Hilt compiler for the main classpath (additional to the kapt one): compileOnly 'com.google.dagger:hilt-compiler:2.43.1' The sources you should up in the IDE in the 'External Libraries' section.
  • Now you might want to put a breakpoint in AggregatedDepsMetadata#create, which if stopped on, the variables in scopes will likely contain the metadata with the issue which then points to a @Module or @EntryPoint that might be the cause. It might be possible the compiler stops there a lot, if that's the case it might be worth changing the breakpoint to not stop but just log the TypeElement element parameter, so that the last item logged before the crash will point you somewhere. You have to get a bit detective here and gather as much info as possible.
  • Next you have to run Gradle and KAPT in debug mode to be able to attach a debugger, just use this command:
    ./gradlew clean app:hiltJavaCompileDebug --no-daemon -Dorg.gradle.debug=true, note that you might need to update the task, I used app:hiltJavaCompileDebug there but yours might be different. Usually using the failing task would be good enough.
  • Once Gradle is started in debug mode you need to attach a debugger, for this part, take a look at the the comment linked above. Specifically the part about creating the 'Remote Template'.

That's it for now! Hopefully this will help you discover which metadata file is causing the crash. Note that once you find the type element you can further inspect the source and the originating @Module or @EntryPoint by looking at the generate metadata classes in their folders in build/generated/source/kapt or build/generated/hilt. Please do report back with as much info as you can gather to help us debug this.

@domhys
Copy link
Author

domhys commented Aug 8, 2022

@danysantiago I was able to attach a debugger over the weekend. The findings are very strange to me:

  • first null came from a hilt module (in SingletonComponent) that's located in a separate android module. I tried moving the module between folders, removing methods, but nothing worked - it would still produce null even for an empty module. Then I moved this hilt module to the app (main) android module and it worked. Dependency was no longer null. I did the same thing for every hilt module that was located in a separate android module (not app) (all of them were returning null before moving). Still have no idea why it wasn't working when hilt modules were outside of the app module (they are included in the build.gradle file using implementation(module))
  • then the real confusion came. Compiler started processing a hilt module located in the app module and it was throwing a null pointer (even when the module was empty). Had no idea why so I moved contents of this module to another module that was previously processed correctly. After removing this module, the compiler was able to move forward.
  • Application class was processed correctly from the beginning - no changes necessary
  • Then it started processing a first activity class and it produced a null. Had no idea why because this activity was injecting only a viewmodel and one extra dependency - nothing fancy and everything was inside the app module. I didn't know how to fix it so went back to investigating the module that I had to remove. I created an additional empty TestModule located next to the deleted module. It returned null as well. So I moved it to the folder with correctly-processed modules and it also worked correctly. Nothing inside the class changed. The only real change was a file path. So I moved the previously deleted module to the same location where TestModule worked and it worked as well. So I moved the activity to the same folder and it worked as well (the same as two next activities and fragments that were failing at the beginning).

That's where I'm now. I don't want to move every class that's failing - it'd take too long. Even more bizarre are two things:

  1. Hilt modules can be one folder deeper than fragments/activities and still work. Limit for activities is 4 folders (e.g. com.example.myapp.app.Activity) and for modules is 5 folders (e.g. com.example.myapp.app.di.Module)
  2. I have a separate project where I was trying to rebuild the original project one activity at a time, compile and see where are the errors. The only difference is that I wasn't creating android modules and caring about the project structure - every class was in the same folder. And using this project I'm not able to recreate this issue. I created a hilt module and buried it deep (in a package com.example.myapplication.di.testpackage.anothertest.moretest.xx.dd.ee.yy.hh.dd) and it still compiled correctly.

I tried debugging to find the difference between when the activity returns null and when it gives a correct result. It seems that it comes down to com.sun.tools.javac.model.JavacElements#nameToSymbol
image
When it's not working, Object sym = "symbol not found error" and nameStr = "packageName.Activity_GeneratedInjector", and when it does Object sym = "dagger.hilt.android.components.ActivityComponent" and nameStr = "dagger.hilt.android.components.ActivityComponent".

Please let me know if you have any ideas what can be causing this issue. If you have any additional questions or need me to debug/change something more, I'm happy to help.

@danysantiago
Copy link
Member

I have a few more questions:

  1. What version of Kotlin are you using?

  2. What version of the Android Gradle Plugin are you using?

  3. Are you developing in a Windows, Mac or Linux host?

  4. Which JDK are you using (version and distribution)?

  5. What happens if you turn off aggregation via the task:

hilt {
    enableAggregatingTask = false
}
  1. Do you have flavors and variants in your project?

The issue is definitely due to some cross-module classpath issue, i.e. while compiling :app for some reason some classes in another module, say :library are not being found, even if :app depends on :library. This might happen too if its a 2nd level dependency, say :app -> :data -> :network, so it makes sense that moving the @Module from a dependency Gradle module to the Application Gradle module might fix the issue. Note that moving packages / folders within the same Gradle module will likely have no effect, which it seems to be what you were trying a bit, and this makes sense since everything under a Gradle module regardless of folder structure is compiled together, where as different Gradle modules are compiled separately.

@domhys
Copy link
Author

domhys commented Aug 9, 2022

  1. Kotlin 1.5.21
  2. AGP 7.2.1 / Gradle 7.3.3
  3. Mac
  4. JDK 11.0.12
  5. Yes, I do (3 flavour dimensions and a variant, so quite a lot)

As to 5: Turning this option off seems to fix the issue. I was able to receive meaningful errors again and fix them. The whole project compiles now. But I don't understand why it worked. What's more, it works only with all hilt modules in the main app module - when I tried to move hilt modules back to separate android modules, it started giving nulls again. So it seems like turning off this option only fixes activities and fragments.

copybara-service bot pushed a commit that referenced this issue Aug 17, 2022
…t be found.

Issue #3513.

RELNOTES=n/a
PiperOrigin-RevId: 468058866
copybara-service bot pushed a commit that referenced this issue Aug 17, 2022
…t be found.

Issue #3513.

RELNOTES=n/a
PiperOrigin-RevId: 468071610
@Chang-Eric
Copy link
Member

I submitted a change to improve the error message from that NPE to give us more information. Can you try running with Dagger from the head snapshots and try again? https://dagger.dev/dev-guide/versions has info on using the head snapshots.

@domhys
Copy link
Author

domhys commented Aug 30, 2022

@Chang-Eric I tried to do it, but somehow it downloads dagger 2.28.3. Should it work with hilt the same way as in the docs you provided? Gradle Dependencies show

|    +--- com.google.dagger:dagger:HEAD-SNAPSHOT -> 2.28.3 (*)
|    +--- com.google.dagger:dagger-lint-aar:HEAD-SNAPSHOT -> 2.28.3
|    +--- com.google.dagger:hilt-core:HEAD-SNAPSHOT
|    |    +--- com.google.dagger:dagger:HEAD-SNAPSHOT -> 2.28.3 (*)
|    |    +--- com.google.code.findbugs:jsr305:3.0.2
|    |    \--- javax.inject:javax.inject:1

But previously I was able to determine with dependencies were problematic with the help of debugger, so this commit is an improvement for the future, not a solution to my problem at hand - I still don't know why

  1. the code works only with enableAggregatingTask = false and more importantly
  2. the code works only with Hilt modules in the main app package and not in the android modules (the setup I had with dagger).

@danysantiago Any ideas what can be the issue here or how to debug it further? I can try again to rebuild my project from scratch adding classes as I go and waiting for it to finally give me the same error, but it will take a lot of time.

@bcorso
Copy link

bcorso commented Aug 30, 2022

I tried to do it, but somehow it downloads dagger 2.28.3.

@domhys, did you follow the last part of https://dagger.dev/dev-guide/versions:

Finally, due to Gradle’s versioning rules, you’ll also want to add a resolution strategy to ensure the HEAD-SNAPSHOT is not accidentally replaced by a numbered version of Dagger in your transitive dependencies. This setup usually goes in your application-level build.gradle file. For example:

// app-level build.gradle file
configurations.all {
   resolutionStrategy.eachDependency { DependencyResolveDetails details ->
       if (details.requested.group == 'com.google.dagger') {
           details.useVersion "HEAD-SNAPSHOT"
       }
   }
}

@domhys
Copy link
Author

domhys commented Sep 7, 2022

I did, but I must've pasted it in the wrong build.gradle file. It's working correctly now - it prints which module has problems.

error: [Hilt]
  Could not get element for <package>.AnalyticsModule: java.lang.NullPointerException: Could not get element for <package>.AnalyticsModule

But as I said before - it doesn't solve my original problem. I still cannot migrate to Hilt because of these errors that I described in earlier comments. So I have to ask again:

@bcorso @danysantiago Any ideas what can be the issue here or how to debug it further? I can try again to rebuild my project from scratch adding classes as I go and waiting for it to finally give me the same error, but it will take a lot of time.

@bcorso
Copy link

bcorso commented Sep 7, 2022

If <package>.AnalyticsModule is null it indicates that the class was not found in your class path.

One solution you could try is to add that dependency directly to your application. So, first find out which gradle library <package>.AnalyticsModule belongs to, and then add that library as a dependency in your gradle application's build.gradle dependencies.

@domhys
Copy link
Author

domhys commented Sep 7, 2022

@bcorso that's the problem - <package>.AnalyticsModule is my own class. When this class is located in a separate android module, it throws that error. But once I move it to the main app module, it works correctly. So I have a way to make this work, but I want to have my hilt modules inside android modules that they refer to (exactly as I had with dagger). And I don't understand why hilt works like that - there must be some kind of other explanation as to why it's happening.

@bcorso
Copy link

bcorso commented Sep 7, 2022

I want to have my hilt modules inside android modules that they refer to (exactly as I had with dagger)

Sorry, I'm not asking you to take the hilt modules out of the android modules they're currently in. I'm asking if you can try adding the android module as a direct dependency to your main app module by including it in the "dependencies" section of the build.gradle.

@domhys
Copy link
Author

domhys commented Sep 8, 2022

@bcorso It already is included. AnalyticsModule is a part of analytics android module. And in my main app build.gradle file there's

dependencies {
  implementation project(":analytics")
  (...)
}

The modules configuration didn't change at all between dagger and hilt implementations.

@bcorso
Copy link

bcorso commented Sep 8, 2022

Sorry, I don't really have any other ideas without being able to look into it myself. If you could provide a sample project with repro steps that would help a lot (I realize this is difficult, but not really seeing any other option here).

@domhys
Copy link
Author

domhys commented Sep 13, 2022

@bcorso @danysantiago I was able to create a small example that reproduces this issue: https://github.com/domhys/hiltTest
My findings are quite strange and I'm hoping you can help me debug it further.

I started building this app from scratch adding new things waiting for the error message. I noticed that one external library was causing this error:
implementation("com.authenteq.android:flow:1.75.0")
When I commented out that line (even in the main project), Hilt was able to find AnalyticsModule again. However with that library included the error persists (please check the master branch in my repo).

However, that's not all. I experimented with changing package name of the app and found out that when I change the first part, the error also goes away even with the external library included. I've created a package branch in the repo which differs from the master branch only in package name (abc.example.android.app vs be.example.android.app). It seems that only changing the first part from be to something else causes the error to go away (I also tried my.example.android.app and there was no error as well).

  1. Do you have any idea why adding a dependency can create this issue? Or how to debug it? I only found that this library depends on dagger 2.28.3 - can this be the cause?
  2. Any ideas what's going on with the package name issue and why changing the first part helps?

@danysantiago
Copy link
Member

Thanks for the repro project @domhys!

The TL:DR is that your project is running into some sort of JDK or Android Gradle Plugin (AGP) bug and this is not an issue specific to Hilt.

Indeed the library com.authenteq.android:flow:1.75.0 is a bit strange and is causing some sort of conflict when the compiler is trying to find classes in the classpath. Specifically it seems that the library is already obfuscated and it contains root package classes whose name are part of your classes' package which end up confusing the compiler and ultimately causes classes to not be found. I was able to confirm this with a simple processor and by completely removing Hilt.

The following processor simply tries to find your AnalyticsModule:

@AutoService(Processor.class)
public class TheProcessor extends AbstractProcessor {

    @Override
    public Set<String> getSupportedAnnotationTypes() {
        return Set.of("*");
    }

    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latestSupported();
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        TypeElement element = processingEnv.getElementUtils().getTypeElement("be.example.android.app.analytics.di.AnalyticsModule");
        processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, "Got element: " + element);
        assert element != null;
        return false;
    }
}

When configured to run with kapt: kapt(project(":TestProcessor")) you'll notice it is unable to find the AnalyticsModule's type element:

> Task :app:kaptDebugKotlin
warning: Got element: null

When debugging, deep in the JDK sources I see it insteads find a be.class located in .gradle/caches/transforms-3/c287189ebb1c92f5e79e63008b6100f1/transformed/jetified-flow-1.75.0-runtime.jar which is the jetified version of com.authenteq.android:flow:1.75.0. When inspecting the jar it contains a class whose name is exactly the first part of your package:

unzip -l ~/Desktop/jetified-flow-1.75.0-runtime.jar | grep be
     2773  12-31-1969 19:00   com/authenteq/android/flow/dagger/DaggerFlowComponent$be.class
     6054  12-31-1969 19:00   be.class

The API that Hilt uses getTypeElement() fails to find be.example.android.app.analytics.di.AnalyticsModule because when looking for the package be it instead finds a class be.class and it stops searching.

That's as far as I was able to analyze the issue, which means this is an issue with that library, maybe because it is already obfuscated or maybe it's an issue with the jetifier, but it seems the library has not migrated to androidx which means you need the jetifier enabled so I was not able to confirm a workaround, it could also be a JDK bug so maybe trying using a newer JDK other than 11, but you might run into some other trouble...

As for the package names, as you have already discovered if you change your package to not be prefixed with one of the many possible root classes the jar contains then you'll avoid the issue since the compiler won't get confused when finding the type elements.

I don't think there much Hilt can do here (sorry!), I would try to update the project to remove Hilt and just have a simple processor (like the one above) that demonstrates the issue and share it with the AGP team.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants