Giter VIP home page Giter VIP logo

bye-bye-jetifier's Introduction

Dipien

Bye Bye Jetifier Gradle Plugin

Gradle Plugin to verify if you can keep Android Jetifier disabled

You can read more details about this plugin on this article.

Features

This plugin verifies on each dependency JAR/AAR (and its transitives) if:

  • any class is using a support library import
  • any layout is referencing a support library class
  • the Android Manifest is referencing a support library class

It also verifies if any support library dependency is resolved on the project.

Why should I use this plugin instead of can-i-drop-jetifier?

The can-i-drop-jetifier plugin only checks for legacy support libraries on the dependencies graph. That's not enough to decide if you can drop Jetifier. Lots of libraries don't properly declare on their POMs the legacy support libraries they use as transitive dependencies. So, for those cases, can-i-drop-jetifier says that you can disable Jetifier. But, if you do that, then you are going to have runtime errors when the logic using the legacy support library is executed.

Bye bye Jetifier inspects each JAR/AAR, searching for legacy support libraries usages, so it will find more libraries than can-i-drop-jetifier, and you will avoid those runtime errors.

Setup

Add the following configuration to your root build.gradle, replacing X.Y.Z with the latest version

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("com.dipien:bye-bye-jetifier:X.Y.Z")
    }
}

apply plugin: "com.dipien.byebyejetifier"

Usage

To validate if your project dependencies (and its transitives) have any usage of the legacy android support library, you need to execute the following task:

./gradlew canISayByeByeJetifier -Pandroid.enableJetifier=false

If you have any legacy android support library usage, the task will fail and print a report with all the details. For example:

========================================
Project: app
========================================

Scanning com.squareup.rx.idler:rx2-idler:0.9.1
 Absolute path: ~/.gradle/caches/modules-2/files-2.1/com.squareup.rx.idler/rx2-idler/0.9.1/378e25e3c2f/rx2-idler-0.9.1.aar
 Graphs to this dependency:
 +---com.squareup.rx.idler:rx2-idler:0.9.1
 Issues found:
 * com/squareup/rx2/idler/DelegatingIdlingResourceScheduler.class -> android/support/test/espresso/IdlingResource$ResourceCallback
 * com/squareup/rx2/idler/DelegatingIdlingResourceScheduler.class -> android/support/test/espresso/IdlingResource
 * com/squareup/rx2/idler/IdlingResourceScheduler.class -> android/support/test/espresso/IdlingResource
 * com/squareup/rx2/idler/Rx2Idler$1.class -> android/support/test/espresso/IdlingResource
 * com/squareup/rx2/idler/Rx2Idler$1.class -> android/support/test/espresso/Espresso
 * pom -> com.android.support.test.espresso:espresso-core:2.2.2
 * pom -> com.android.support:support-annotations:25.4.0

Explicit declarations of legacy support dependencies on this project:
 * android.arch.core:common:1.1.1
 * android.arch.lifecycle:common:1.1.0

> Task :canISayByeByeJetifier FAILED

If you don't have any legacy android support library usages, the task will finish successfully, so it's safe to remove the android.enableJetifier flag from your gradle.properties.

Once you have disabled jetifier, you don't want to add a new support-library-dependent library by mistake when adding/upgrading a dependency on your project. To avoid that kind of issues, you can run the canISayByeByeJetifier task on your CI tool as part of the PR checks.

Advanced configuration

You can configure the plugin using the byeByeJetifier extension. These are the default values for each property:

byeByeJetifier {
    legacyGroupIdPrefixes = ["android.arch", "com.android.support"]
    excludedConfigurations = ["lintClassPath"]
    excludedFilesFromScanning = [
        // org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.20
        "org/jetbrains/kotlin/load/java/JvmAnnotationNamesKt",

        // org.jetbrains.kotlin:kotlin-reflect:1.4.20
        "kotlin/reflect/jvm/internal/impl/load/java/JvmAnnotationNamesKt",

        // org.jetbrains.kotlin:kotlin-android-extensions:1.4.20
        "org/jetbrains/kotlin/android/synthetic/AndroidConst",
        "org/jetbrains/kotlin/android/synthetic/codegen/AndroidIrTransformer",
        "org/jetbrains/kotlin/android/synthetic/codegen/ResourcePropertyStackValue",

        // org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.10
        "org/jetbrains/kotlin/com/intellij/codeInsight/NullableNotNullManager",
        
        // com.squareup.leakcanary:shark-android:2.5
        "shark/AndroidReferenceMatchers",

        // com.squareup.leakcanary:leakcanary-object-watcher-android-support-fragments:2.5
        "leakcanary/internal/AndroidSupportFragmentDestroyWatcher",
        
        // com.squareup.leakcanary:leakcanary-android:2.8.1
        "curtains/internal/WindowCallbackWrapper"
    ]
    excludedProjectsFromScanning = [] // Here you can define a list of Gradle project names to be excluded from the scanning analysis
    excludeSupportAnnotations = true
    verbose = false
}

Versioning

This project uses the Semantic Versioning guidelines for transparency into our release cycle.

Sponsor this project

Sponsor this open source project to help us get the funding we need to continue working on it.

Follow us

bye-bye-jetifier's People

Contributors

dipien-ci avatar giacomuzzi avatar maxirosson avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

bye-bye-jetifier's Issues

Recommended configuration when using custom lint checks?

Hello!

We're using this plugin on a project that also includes custom lint checks.

Unfortunately, the plugin is flagging dependencies within the custom lint check project, even though those aren't compiled into the final application (and therefore do not need to be jetified to avoid conflicts with AndroidX dependencies).

Here's a sample app that demonstrates the issue: https://github.com/stkent/ByeByeJetifierSample

Running ./gradlew canISayByeByeJetifier -Pandroid.enableJetifier=false in the root of that repository leads to a failure.

What's the recommended configuration here? Is there a way to ignore the entire lintchecks project? Or do we need to suppress using excludedFilesFromScanning (which is a globally-scoped ignore list)?

Why are android tools being scanned

Scanning com.android.tools:common:30.1.0
Absolute path: /.gradle/caches/modules-2/files-2.1/com.android.tools/common/30.1.0/b26b9573400cb8813a414134ce27f4f131872fca/common-30.1.0.jar
Graphs to this dependency:
+---com.android.tools.utp:android-device-provider-ddmlib:30.1.0
+---com.android.tools:common:30.1.0
+---com.android.tools.utp:android-device-provider-ddmlib:30.1.0

It is unclear from the output why they are failing the build.

False report of issue with com.microsoft.appcenter:espresso-test-extension:1.4

Describe the bug

A false report of an issue that doesn't actually exist is given by bye bye jetifier:

Scanning com.microsoft.appcenter:espresso-test-extension:1.4
 Absolute path: /Users/P2956789/.gradle/caches/modules-2/files-2.1/com.microsoft.appcenter/espresso-test-extension/1.4/d95d919a5195d439334f79834fc5c6bc1dada78a/espresso-test-extension-1.4.aar
 Graphs to this dependency:
 +---com.microsoft.appcenter:espresso-test-extension:1.4
 Issues found:
 * com/microsoft/appcenter/espresso/Factory.class -> android.support.test.InstrumentationRegistry

To Reproduce
Steps to reproduce the behavior:

  1. Have com.microsoft.appcenter:espresso-test-extension:1.4 as a dependency
  2. Use bye bye jetifier
  3. See false report of an issue with it

Expected behavior
I shouldn't see a report of an issue with appcenter.

Additional context

If you look at the open source code, https://github.com/microsoft/AppCenter-Test-Espresso-Extensions/blob/master/src/main/java/com/microsoft/appcenter/espresso/Factory.java, you can see that android.support is used in a string literal but it is not actually used as an import or dependency anywhere. So this appcenter stuff does not block you from disabling Jetifier.

The file 'com/android/SdkConstants.class' contains a string literal with a package reference 'android.support.design.widget'.

Hi, I'm in middle of migrating and I see one strange warning and not sure if should I ignore it or there is something to do.

I created question on stack, but now I have apprehensions about possible bug.

I checked also checkJetifiier (./gradlew checkJetifier --no-configuration-cache) and there is no warning (Build Successful) and for react-native-reanimated I see just this:

> Configure project :react-native-reanimated
No AAR for react-native-reanimated found. Attempting to build from source.
Android gradle plugin: 7.3.1
Gradle: 7.5.1
WARNING:Software Components will not be created automatically for Maven publishing from Android Gradle Plugin 8.0. To opt-in to the future behavior, set the Gradle property android.disableAutomaticComponentCreation=true in the `gradle.properties` file or use the new publishing DSL.

Thanks for any help,
Regards Darek

Fix Windows support

Describe the bug
Using byeByeJetifier 1.1.0 with default configuration, the exclusion rule in the default configuration provided with the version doesn't seem to be picked up when running byeByeJetifier

To Reproduce
Steps to reproduce the behavior:

  1. Add implementation 'com.facebook.android:facebook-android-sdk:9.0.0' as a dependency
  2. Run gradle :canISayByeByeJetifier -Pandroid.enableJetifier=false
  3. See False positive:
 Issues found:
 * com\facebook\appevents\codeless\internal\ViewHierarchy.class -> android.support.v4.view.NestedScrollingChild

Expected behavior
Above issue not showing

Gradle Configuration Cache compatibility

Describe the bug
Plugin is not compatible with Gradle Configuraiton Cache

To Reproduce
Steps to reproduce the behavior:

  1. Apply the plugin
  2. Run ./gradlew canISayByeByeJetifier -Pandroid.enableJetifier=false --configuration-cache

Expected behavior
I expect the build to pass

Screenshots
If applicable, add screenshots to help explain your problem.

Additional context
›exception stack trace 📋

org.gradle.api.InvalidUserCodeException: Invocation of 'Task.project' by task ':app:canISayByeByeJetifier' at execution time is unsupported.
	at org.gradle.configurationcache.initialization.DefaultConfigurationCacheProblemsListener.onTaskExecutionAccessProblem(ConfigurationCacheProblemsListener.kt:75)
	at org.gradle.configurationcache.initialization.DefaultConfigurationCacheProblemsListener.onProjectAccess(ConfigurationCacheProblemsListener.kt:55)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	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.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.event.DefaultListenerManager$ListenerDetails.dispatch(DefaultListenerManager.java:464)
	at org.gradle.internal.event.DefaultListenerManager$ListenerDetails.dispatch(DefaultListenerManager.java:446)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:61)
	at org.gradle.internal.event.DefaultListenerManager$EventBroadcast$ListenerDispatch.dispatch(DefaultListenerManager.java:434)
	at org.gradle.internal.event.DefaultListenerManager$EventBroadcast.dispatch(DefaultListenerManager.java:221)
	at org.gradle.internal.event.DefaultListenerManager$EventBroadcast.dispatch(DefaultListenerManager.java:192)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy314.onProjectAccess(Unknown Source)
	at org.gradle.api.internal.AbstractTask.notifyProjectAccess(AbstractTask.java:1000)
	at org.gradle.api.internal.AbstractTask.getProject(AbstractTask.java:223)
	at org.gradle.api.DefaultTask.getProject(DefaultTask.java:57)
	at com.dipien.byebyejetifier.task.CanISayByeByeJetifierTask.onExecute(CanISayByeByeJetifierTask.kt:55)
	at com.dipien.byebyejetifier.common.AbstractTask.doExecute(AbstractTask.kt:21)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	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.StandardTaskAction.doExecute(StandardTaskAction.java:58)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:506)
	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$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:74)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:74)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:491)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:474)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:106)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:271)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:249)
	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:83)
	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:37)
	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:47)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:37)
	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:50)
	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:54)
	at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:35)
	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:174)
	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:74)
	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:45)
	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:40)
	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:29)
	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:99)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:92)
	at java.base/java.util.Optional.map(Optional.java:265)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:85)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:42)
	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:91)
	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:106)
	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:51)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:72)
	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:46)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:86)
	at java.base/java.util.Optional.orElseGet(Optional.java:369)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:86)
	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:32)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:43)
	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:31)
	at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution$2.withWorkspace(ExecuteActionsTaskExecuter.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:185)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:174)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
	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:200)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79)
	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:408)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:395)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:388)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:374)
	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.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:56)
	at java.base/java.lang.Thread.run(Thread.java:829)

Input contains unmappable characters: javaslang/?.class

Describe the bug
I implemented the plugin like this

dependencies {
    classpath("com.dipien:bye-bye-jetifier:1.2.0")
}

subprojects {
    apply plugin: "com.dipien.byebyejetifier"

    byeByeJetifier {
        excludedFilesFromScanning = [
                "org/mockito/android/internal/creation/AndroidTempFileLocator.class"
        ]
    }
}

and locally it runs and works properly, but when I add it to my GitLab CI/CD pipeline it fails with the following error

Execution failed for task ':myLib:canISayByeByeJetifier'.
> Malformed input or input contains unmappable characters: javaslang/?.class

To Reproduce
GitLab CI/CD fails at the following (first) step

check-jetifier:
  stage: check-jetifier
  image: $ECR_REPOSITORY/$CI_PROJECT_PATH:build-$CI_COMMIT_SHA
  script:
    - ./gradlew canISayByeByeJetifier -Pandroid.enableJetifier=false

FileNotFoundException

Describe the bug
When running bye bye jetifier on application modules, I receive a FileNotFoundException, similar to #38

With verbose mode on, here is the output:

./gradlew :home:app:canISayByeByeJetifier -Pandroid.enableJetifier=false --no-configuration-cache                        
Configuration on demand is an incubating feature.
Type-safe dependency accessors is an incubating feature.

> Configure project :home:app
Build Number: null
Job Name: null
version code: 9999999
Version Name: 1.0 - Dev
WARNING:: Using flatDir should be avoided because it doesn't support any meta-data formats.
WARNING:: Configuration 'testCompile' is obsolete and has been replaced with 'testImplementation'.
It will be removed in version 7.0 of the Android Gradle plugin.
For more information, see http://d.android.com/r/tools/update-dependency-configurations.html.

> Task :home:app:canISayByeByeJetifier
excludedConfigurations: [ktlint, lintClassPath, debugUnitTestImplementationDependenciesMetadata, debugImplementationDependenciesMetadata, implementationDependenciesMetadata, releaseImplementationDependenciesMetadata, releaseUnitTestImplementationDependenciesMetadata, testImplementationDependenciesMetadata]
excludedFilesFromScanning: [org/jetbrains/kotlin/load/java/JvmAnnotationNamesKt, kotlin/reflect/jvm/internal/impl/load/java/JvmAnnotationNamesKt, org/jetbrains/kotlin/android/synthetic/AndroidConst, org/jetbrains/kotlin/android/synthetic/codegen/AndroidIrTransformer, org/jetbrains/kotlin/android/synthetic/codegen/ResourcePropertyStackValue, org/jetbrains/kotlin/com/intellij/codeInsight/NullableNotNullManager, com/facebook/appevents/codeless/internal/ViewHierarchy, shark/AndroidReferenceMatchers, leakcanary/internal/AndroidSupportFragmentDestroyWatcher, curtains/internal/WindowCallbackWrapper]
excludedProjectsFromScanning: []
excludeSupportAnnotations: true
Parsing config file

=========================================
Project: app
=========================================
Configurations to scan: [configuration ':home:app:_classStructurekaptDebugAndroidTestKotlin', configuration ':home:app:_classStructurekaptDebugKotlin', configuration ':home:app:_classStructurekaptDebugUnitTestKotlin', configuration ':home:app:_classStructurekaptReleaseKotlin', configuration ':home:app:_classStructurekaptReleaseUnitTestKotlin', configuration ':home:app:androidApis', configuration ':home:app:androidTestAnnotationProcessor', configuration ':home:app:androidTestApi', configuration ':home:app:androidTestApiDependenciesMetadata', configuration ':home:app:androidTestApk', configuration ':home:app:androidTestCompile', configuration ':home:app:androidTestCompileOnly', configuration ':home:app:androidTestCompileOnlyDependenciesMetadata', configuration ':home:app:androidTestDebugAnnotationProcessor', configuration ':home:app:androidTestDebugApi', configuration ':home:app:androidTestDebugApiDependenciesMetadata', configuration ':home:app:androidTestDebugApk', configuration ':home:app:androidTestDebugCompile', configuration ':home:app:androidTestDebugCompileOnly', configuration ':home:app:androidTestDebugCompileOnlyDependenciesMetadata', configuration ':home:app:androidTestDebugImplementation', configuration ':home:app:androidTestDebugImplementationDependenciesMetadata', configuration ':home:app:androidTestDebugIntransitiveDependenciesMetadata', configuration ':home:app:androidTestDebugProvided', configuration ':home:app:androidTestDebugRuntimeOnly', configuration ':home:app:androidTestDebugRuntimeOnlyDependenciesMetadata', configuration ':home:app:androidTestDebugWearApp', configuration ':home:app:androidTestImplementation', configuration ':home:app:androidTestImplementationDependenciesMetadata', configuration ':home:app:androidTestIntransitiveDependenciesMetadata', configuration ':home:app:androidTestProvided', configuration ':home:app:androidTestReleaseAnnotationProcessor', configuration ':home:app:androidTestReleaseApi', configuration ':home:app:androidTestReleaseApiDependenciesMetadata', configuration ':home:app:androidTestReleaseApk', configuration ':home:app:androidTestReleaseCompile', configuration ':home:app:androidTestReleaseCompileOnly', configuration ':home:app:androidTestReleaseCompileOnlyDependenciesMetadata', configuration ':home:app:androidTestReleaseImplementation', configuration ':home:app:androidTestReleaseImplementationDependenciesMetadata', configuration ':home:app:androidTestReleaseIntransitiveDependenciesMetadata', configuration ':home:app:androidTestReleaseProvided', configuration ':home:app:androidTestReleaseRuntimeOnly', configuration ':home:app:androidTestReleaseRuntimeOnlyDependenciesMetadata', configuration ':home:app:androidTestReleaseWearApp', configuration ':home:app:androidTestRuntimeOnly', configuration ':home:app:androidTestRuntimeOnlyDependenciesMetadata', configuration ':home:app:androidTestUtil', configuration ':home:app:androidTestWearApp', configuration ':home:app:annotationProcessor', configuration ':home:app:api', configuration ':home:app:apiDependenciesMetadata', configuration ':home:app:apk', configuration ':home:app:apolloDebugAndroidTestServiceConsumer', configuration ':home:app:apolloDebugAndroidTestServiceProducer', configuration ':home:app:apolloDebugServiceConsumer', configuration ':home:app:apolloDebugServiceProducer', configuration ':home:app:apolloDebugUnitTestServiceConsumer', configuration ':home:app:apolloDebugUnitTestServiceProducer', configuration ':home:app:apolloMetadata', configuration ':home:app:apolloReleaseServiceConsumer', configuration ':home:app:apolloReleaseServiceProducer', configuration ':home:app:apolloReleaseUnitTestServiceConsumer', configuration ':home:app:apolloReleaseUnitTestServiceProducer', configuration ':home:app:archives', configuration ':home:app:aspectjWeaverAgent', configuration ':home:app:compile', configuration ':home:app:compileOnly', configuration ':home:app:compileOnlyDependenciesMetadata', configuration ':home:app:coreLibraryDesugaring', configuration ':home:app:debugAabPublication', configuration ':home:app:debugAndroidTestAnnotationProcessorClasspath', configuration ':home:app:debugAndroidTestApi', configuration ':home:app:debugAndroidTestApiDependenciesMetadata', configuration ':home:app:debugAndroidTestCompileClasspath', configuration ':home:app:debugAndroidTestCompileOnly', configuration ':home:app:debugAndroidTestCompileOnlyDependenciesMetadata', configuration ':home:app:debugAndroidTestDexGuardConsumerRuleArtifacts', configuration ':home:app:debugAndroidTestDexGuardLibraryjarArtifacts', configuration ':home:app:debugAndroidTestDexGuardUseLibraryArtifacts', configuration ':home:app:debugAndroidTestImplementation', configuration ':home:app:debugAndroidTestImplementationDependenciesMetadata', configuration ':home:app:debugAndroidTestIntransitiveDependenciesMetadata', configuration ':home:app:debugAndroidTestRuntimeClasspath', configuration ':home:app:debugAndroidTestRuntimeOnly', configuration ':home:app:debugAndroidTestRuntimeOnlyDependenciesMetadata', configuration ':home:app:debugAnnotationProcessor', configuration ':home:app:debugAnnotationProcessorClasspath', configuration ':home:app:debugApi', configuration ':home:app:debugApiDependenciesMetadata', configuration ':home:app:debugApiElements', configuration ':home:app:debugApk', configuration ':home:app:debugApkPublication', configuration ':home:app:debugCompile', configuration ':home:app:debugCompileClasspath', configuration ':home:app:debugCompileOnly', configuration ':home:app:debugCompileOnlyDependenciesMetadata', configuration ':home:app:debugDexGuardConsumerRuleArtifacts', configuration ':home:app:debugDexGuardConsumerRulesFiles', configuration ':home:app:debugDexGuardFeatureLibraryjarArtifacts', configuration ':home:app:debugDexGuardLibraryjarArtifacts', configuration ':home:app:debugDexGuardUseLibraryArtifacts', configuration ':home:app:debugImplementation', configuration ':home:app:debugIntransitiveDependenciesMetadata', configuration ':home:app:debugProvided', configuration ':home:app:debugReverseMetadataValues', configuration ':home:app:debugRuntimeClasspath', configuration ':home:app:debugRuntimeElements', configuration ':home:app:debugRuntimeOnly', configuration ':home:app:debugRuntimeOnlyDependenciesMetadata', configuration ':home:app:debugUnitTestAnnotationProcessorClasspath', configuration ':home:app:debugUnitTestApi', configuration ':home:app:debugUnitTestApiDependenciesMetadata', configuration ':home:app:debugUnitTestCompileClasspath', configuration ':home:app:debugUnitTestCompileOnly', configuration ':home:app:debugUnitTestCompileOnlyDependenciesMetadata', configuration ':home:app:debugUnitTestImplementation', configuration ':home:app:debugUnitTestIntransitiveDependenciesMetadata', configuration ':home:app:debugUnitTestRuntimeClasspath', configuration ':home:app:debugUnitTestRuntimeOnly', configuration ':home:app:debugUnitTestRuntimeOnlyDependenciesMetadata', configuration ':home:app:debugWearApp', configuration ':home:app:debugWearBundling', configuration ':home:app:default', configuration ':home:app:implementation', configuration ':home:app:intransitiveDependenciesMetadata', configuration ':home:app:kapt', configuration ':home:app:kaptAndroidTest', configuration ':home:app:kaptAndroidTestDebug', configuration ':home:app:kaptAndroidTestRelease', configuration ':home:app:kaptClasspath_kaptDebugAndroidTestKotlin', configuration ':home:app:kaptClasspath_kaptDebugKotlin', configuration ':home:app:kaptClasspath_kaptDebugUnitTestKotlin', configuration ':home:app:kaptClasspath_kaptReleaseKotlin', configuration ':home:app:kaptClasspath_kaptReleaseUnitTestKotlin', configuration ':home:app:kaptDebug', configuration ':home:app:kaptRelease', configuration ':home:app:kaptTest', configuration ':home:app:kaptTestDebug', configuration ':home:app:kaptTestRelease', configuration ':home:app:kotlinCompilerClasspath', configuration ':home:app:kotlinCompilerPluginClasspath', configuration ':home:app:kotlinCompilerPluginClasspathDebug', configuration ':home:app:kotlinCompilerPluginClasspathDebugAndroidTest', configuration ':home:app:kotlinCompilerPluginClasspathDebugUnitTest', configuration ':home:app:kotlinCompilerPluginClasspathRelease', configuration ':home:app:kotlinCompilerPluginClasspathReleaseUnitTest', configuration ':home:app:kotlinKaptWorkerDependencies', configuration ':home:app:kotlinKlibCommonizerClasspath', configuration ':home:app:kotlinNativeCompilerPluginClasspath', configuration ':home:app:ktlintBaselineReporter', configuration ':home:app:ktlintReporter', configuration ':home:app:ktlintRuleset', configuration ':home:app:lintChecks', configuration ':home:app:lintPublish', configuration ':home:app:provided', configuration ':home:app:releaseAabPublication', configuration ':home:app:releaseAnnotationProcessor', configuration ':home:app:releaseAnnotationProcessorClasspath', configuration ':home:app:releaseApi', configuration ':home:app:releaseApiDependenciesMetadata', configuration ':home:app:releaseApiElements', configuration ':home:app:releaseApk', configuration ':home:app:releaseApkPublication', configuration ':home:app:releaseCompile', configuration ':home:app:releaseCompileClasspath', configuration ':home:app:releaseCompileOnly', configuration ':home:app:releaseCompileOnlyDependenciesMetadata', configuration ':home:app:releaseDexGuardConsumerRuleArtifacts', configuration ':home:app:releaseDexGuardConsumerRulesFiles', configuration ':home:app:releaseDexGuardFeatureLibraryjarArtifacts', configuration ':home:app:releaseDexGuardLibraryjarArtifacts', configuration ':home:app:releaseDexGuardUseLibraryArtifacts', configuration ':home:app:releaseImplementation', configuration ':home:app:releaseIntransitiveDependenciesMetadata', configuration ':home:app:releaseProvided', configuration ':home:app:releaseReverseMetadataValues', configuration ':home:app:releaseRuntimeClasspath', configuration ':home:app:releaseRuntimeElements', configuration ':home:app:releaseRuntimeOnly', configuration ':home:app:releaseRuntimeOnlyDependenciesMetadata', configuration ':home:app:releaseUnitTestAnnotationProcessorClasspath', configuration ':home:app:releaseUnitTestApi', configuration ':home:app:releaseUnitTestApiDependenciesMetadata', configuration ':home:app:releaseUnitTestCompileClasspath', configuration ':home:app:releaseUnitTestCompileOnly', configuration ':home:app:releaseUnitTestCompileOnlyDependenciesMetadata', configuration ':home:app:releaseUnitTestImplementation', configuration ':home:app:releaseUnitTestIntransitiveDependenciesMetadata', configuration ':home:app:releaseUnitTestRuntimeClasspath', configuration ':home:app:releaseUnitTestRuntimeOnly', configuration ':home:app:releaseUnitTestRuntimeOnlyDependenciesMetadata', configuration ':home:app:releaseWearApp', configuration ':home:app:releaseWearBundling', configuration ':home:app:runtimeOnly', configuration ':home:app:runtimeOnlyDependenciesMetadata', configuration ':home:app:testAnnotationProcessor', configuration ':home:app:testApi', configuration ':home:app:testApiDependenciesMetadata', configuration ':home:app:testApk', configuration ':home:app:testCompile', configuration ':home:app:testCompileOnly', configuration ':home:app:testCompileOnlyDependenciesMetadata', configuration ':home:app:testDebugAnnotationProcessor', configuration ':home:app:testDebugApi', configuration ':home:app:testDebugApiDependenciesMetadata', configuration ':home:app:testDebugApk', configuration ':home:app:testDebugCompile', configuration ':home:app:testDebugCompileOnly', configuration ':home:app:testDebugCompileOnlyDependenciesMetadata', configuration ':home:app:testDebugImplementation', configuration ':home:app:testDebugImplementationDependenciesMetadata', configuration ':home:app:testDebugIntransitiveDependenciesMetadata', configuration ':home:app:testDebugProvided', configuration ':home:app:testDebugRuntimeOnly', configuration ':home:app:testDebugRuntimeOnlyDependenciesMetadata', configuration ':home:app:testDebugWearApp', configuration ':home:app:testImplementation', configuration ':home:app:testIntransitiveDependenciesMetadata', configuration ':home:app:testProvided', configuration ':home:app:testReleaseAnnotationProcessor', configuration ':home:app:testReleaseApi', configuration ':home:app:testReleaseApiDependenciesMetadata', configuration ':home:app:testReleaseApk', configuration ':home:app:testReleaseCompile', configuration ':home:app:testReleaseCompileOnly', configuration ':home:app:testReleaseCompileOnlyDependenciesMetadata', configuration ':home:app:testReleaseImplementation', configuration ':home:app:testReleaseImplementationDependenciesMetadata', configuration ':home:app:testReleaseIntransitiveDependenciesMetadata', configuration ':home:app:testReleaseProvided', configuration ':home:app:testReleaseRuntimeOnly', configuration ':home:app:testReleaseRuntimeOnlyDependenciesMetadata', configuration ':home:app:testReleaseWearApp', configuration ':home:app:testRuntimeOnly', configuration ':home:app:testRuntimeOnlyDependenciesMetadata', configuration ':home:app:testWearApp', configuration ':home:app:wearApp']


> Task :home:app:canISayByeByeJetifier
[WARN] [XmlResourceScanner] No mapping for: android/support/FILE_PROVIDER_PATHS

> Task :home:app:canISayByeByeJetifier FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':home:app:canISayByeByeJetifier'.
> java.io.FileNotFoundException: /Users/kevin.zetterstrom/.gradle/caches/transforms-3/570c2dbe8d6866106ea2b6dfee7ac95b/transformed/junit-4.13.2.jar (No such file or directory)

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

See https://docs.gradle.org/7.3.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 13s
11 actionable tasks: 1 executed, 10 up-to-date

Run fails

Describe the bug
I'm trying to run plugin on our project and I'm getting failure:

Execution failed for task ':canISayByeByeJetifier'.
> Could not resolve all dependencies for configuration ':client:sample:testCompileClasspath'.
   > Could not resolve project :test-utils.

Expected behavior
The build pass.

Additional context
Test utils is module with our common test methods and classes. It is top level module and it is usually used like:

    testImplementation project(':test-utils')

I see that some top level modules has pass analysis. However, for the projects that are nested in the folder it fails. Just observation.

Use unique identifier for output Project name

In a large project (my project is hundreds of gradle modules), project names may not be unique. As an example, consider the following project structure:

/ app1
  /library
  /app
/ app2
  /library
  /app

When bye-bye-jetifier runs at the root level, it would output something like

=========================================
Project: library
=========================================
...
=========================================
Project: app
=========================================
...
=========================================
Project: library
=========================================
...
=========================================
Project: app
=========================================
...

This makes it difficult to understand which Project has an issue when project module names collide.

Gradle suggests that Project.name is not unique within a project, and Project.path should be used instead.

It would be good to update project.name to project.path

Support project exclusion

A new excludedProjectsFromScanning property will be added to exclude projects from the scanning. This is useful when a project has subprojects that aren't compiled into the final application, for example, custom lint checks projects

Execution failed

=========================================
Project: app
=========================================
[WARN] [XmlResourceScanner] No mapping for: android/support/PARENT_ACTIVITY

> Task :canISayByeByeJetifier FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':canISayByeByeJetifier'.
> String index out of range: -2

Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -2
        at org.objectweb.asm.signature.SignatureReader.parseType(SignatureReader.java:178)
        at org.objectweb.asm.signature.SignatureReader.acceptType(SignatureReader.java:140)
        at org.objectweb.asm.commons.Remapper.mapSignature(Remapper.java:207)
        at org.objectweb.asm.commons.ClassRemapper.visitField(ClassRemapper.java:171)
        at org.objectweb.asm.ClassReader.readField(ClassReader.java:1104)
        at org.objectweb.asm.ClassReader.accept(ClassReader.java:706)
        at org.objectweb.asm.ClassReader.accept(ClassReader.java:394)
        at com.dipien.byebyejetifier.scanner.bytecode.BytecodeScanner.scan(BytecodeScanner.kt:21)
        at com.dipien.byebyejetifier.scanner.ScannerProcessor.visit(ScannerProcessor.kt:39)
        at com.dipien.byebyejetifier.archive.ArchiveFile.accept(ArchiveFile.kt:26)
        at com.dipien.byebyejetifier.scanner.ScannerProcessor.visit(ScannerProcessor.kt:21)

Indicate the support dependencies declared by a library

Include the declared support dependencies on the Scanning report:

For example

Scanning com.github.JakeWharton:ViewPagerIndicator:2.4.1
~/.gradle/caches/modules-2/files-2.1/com.github.JakeWharton/ViewPagerIndicator/2.4.1/1682541ab751c2696d818e03e117680f43c792b5/ViewPagerIndicator-2.4.1.aar
 * com/viewpagerindicator/CirclePageIndicator.class -> android/support/v4/view/ViewPager$OnPageChangeListener
 * com/viewpagerindicator/CirclePageIndicator.class -> android/support/v4/view/ViewPager
 * com/viewpagerindicator/CirclePageIndicator.class -> android/support/v4/view/ViewConfigurationCompat
 * com/viewpagerindicator/CirclePageIndicator.class -> android/support/v4/view/PagerAdapter
 * pom -> com.google.android:support-v4:23.1.1

After doing this, we don't need any more to display the Legacy support dependencies: section on the output

Don't print what's not necessary

Many modules, multiply this 100 times:

=========================================
Project: :foo

  • No legacy android support usages found

This is basically spam, please don't report when there is nothing to report.

A summary would be enough, so we can focus on actual things printed. If console buffer is full, it will contain this (useless) info and might hide useful info at the beginning.

Add LeakCanary exclusions to default configuration

LeakCanary does not depend on the support library but contains code that only executes if the support library is in the classpath, as well as code to analyze heap dumps that were produced from an app running with the support library. This plugin reports LeakCanary as an offender (square/leakcanary#2020). Since it's a widely used library, I'm afraid this is going to come up repeatedly so wondering if LeakCanary could be added to the default config, e.g.

byeByeJetifier {
    legacyGroupIdPrefixes = ["android.arch", "com.android.support"]
    excludedConfigurations = ["lintClassPath"]
    excludedFilesFromScanning = [
        // com.squareup.leakcanary:leakcanary-object-watcher-android-support-fragments:2.5
        "leakcanary/internal/AndroidSupportFragmentDestroyWatcher$fragmentLifecycleCallbacks$1",
        "leakcanary/internal/AndroidSupportFragmentDestroyWatcher",
        
        // com.squareup.leakcanary:shark-android:2.5
        "shark/AndroidReferenceMatchers$ACTIVITY_CHOOSE_MODEL",

        // org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.20
        "org/jetbrains/kotlin/load/java/JvmAnnotationNamesKt",

        // org.jetbrains.kotlin:kotlin-reflect:1.4.20
        "kotlin/reflect/jvm/internal/impl/load/java/JvmAnnotationNamesKt",

        // org.jetbrains.kotlin:kotlin-android-extensions:1.4.20
        "org/jetbrains/kotlin/android/synthetic/AndroidConst",
        "org/jetbrains/kotlin/android/synthetic/codegen/AndroidIrTransformer",
        "org/jetbrains/kotlin/android/synthetic/codegen/ResourcePropertyStackValue",

        // org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.10
        "org/jetbrains/kotlin/com/intellij/codeInsight/NullableNotNullManager"
    ]
    excludeSupportAnnotations = true
    verbose = false
}

I was also wondering if it's possible to exclude an entire artifact group (i.e. com.squareup.leakcanary) instead of specific class names to simplify this config a bit, but it looks like not?

Indicate the dependencies graph of each scanned library with issues

Include the declared support dependencies on the Scanning report:

For example

Scanning com.github.JakeWharton:ViewPagerIndicator:2.4.1
 Absoulute path: ~/.gradle/caches/modules-2/files-2.1/com.github.JakeWharton/ViewPagerIndicator/2.4.1/1682541ab751c2696d818e03e117680f43c792b5/ViewPagerIndicator-2.4.1.aar
 Graph to this dependency:
  +--- aaa:bbb:1.0.0
          +--- ccc:ddd:2.1.0
                   +--- com.github.JakeWharton:ViewPagerIndicator:2.4.1
 Issues found:
  * com/viewpagerindicator/CirclePageIndicator.class -> android/support/v4/view/ViewPager$OnPageChangeListener
  * com/viewpagerindicator/CirclePageIndicator.class -> android/support/v4/view/ViewPager
  * com/viewpagerindicator/CirclePageIndicator.class -> android/support/v4/view/ViewConfigurationCompat
  * com/viewpagerindicator/CirclePageIndicator.class -> android/support/v4/view/PagerAdapter

For clarity on the report, as part of this issue, also add the Absoulute path: & Issues found: subtitle

Getting java.io.FileNotFoundException on gradle cached files

I'm trying to run the plugin, but constantly getting build failures. After removing the failing lib from dependency tree, I get similar issue on another lib. Also tried to clean the gradle cache, didn't help.

Execution failed for task ':canISayByeByeJetifier'.
> java.io.FileNotFoundException: /Users/xxx/.gradle/caches/transforms-2/files-2.1/ae7679f69ed21973ab1a3b0e7a6a8d48/gson-2.8.6.jar (Is a directory)

Any ideas what can be the issue?

It doesn't check all the aars in the libs folder

Describe the bug
I have some aars with support dependencies that byebyejetifier is not identifying.

To Reproduce
Steps to reproduce the behavior:

For example download swipe-reveal.layout.1.4.1.aar which throws errors if jetifier is not enabled,

If you apply the conversion with jetifier-standalone, then error goes away when running the app.

  1. Use default swipe-reveal.layout lib without jetifier-standalone, in a project with jetifierEnabled = false
  2. Run ./gradlew canISayByeByeJetifier -Pandroid.enableJetifier=false
  3. Build will be successful
  4. Run the app where the swipereveallayout is used, it will throw error regarding support libraries.

Expected behavior
ByebyeJetifier should detect the classes where support libs are used.

Additional context
I have over 20 aar libs in my project, knowing that byebyejetifier is not correctly checking all of them requires me to apply jetifier-standalone to everyone of them to assure no problem will happen.

The following aar also presents problems, probably it is not being detected from the way it is implemented as a module:

image

False negatives (jwtdecode, xzing) that do get found with other tool

Describe the bug
The tool does not find two libs that still use the legacy support libs.

To Reproduce
Steps to reproduce the behavior:

  1. Eliminate legacy android support usages as per bye-bye-jetifier
  2. Tool says it's ok and jetifier can be disabled
  3. Builds fail (duplicate classes, android.support and androidx class paths being there)
  4. Check with other tool https://github.com/plnice/can-i-drop-jetifier and that tool finds the two remaining legacy libraries

Expected behavior
Both libraries should be found:

  • implementation 'me.dm7.barcodescanner:zxing:1.9.13'
  • implementation "com.auth0.android:jwtdecode:1.4.0"

Both are direct dependencies of the single :app module of the project.

Screenshots
See additional context

Additional context

:canISayByeByeJetifier output:

> Task :canISayByeByeJetifier

=========================================
Project: dcs-app-development-android
=========================================
 * No legacy android support usages found

=========================================
Project: app
=========================================
 * No legacy android support usages found

=========================================
Project: appcenter
=========================================
 * No legacy android support usages found

=========================================
Project: libaddressinput
=========================================
 * No legacy android support usages found

=========================================
Project: picasso-2.71828-jetified
=========================================
 * No legacy android support usages found

=====================================================================================
* No dependencies with legacy android support usages! You can say Bye Bye Jetifier. *
=====================================================================================

:canIDropJetifier output:

> Task :canIDropJetifier
========================================
Project app
========================================

Cannot drop Jetifier due to following module dependencies:

* app (module)

Cannot drop Jetifier due to following external dependencies:

* com.auth0.android:jwtdecode:1.4.0

* me.dm7.barcodescanner:zxing:1.9.13

OOM (GC overhead limit exceeded) on large multi-module projects

Describe the bug
I'm working towards disabling jetifier on a large multi-module Android project. The issue I'm seeing with the plugin is of long execution times and eventual crashing of the task with an out of memory error, e.g.

* What went wrong:
Execution failed for task ':app:canISayByeByeJetifier'.
> GC overhead limit exceeded

Increasing the java heap size helps insofar as the task runs for longer before crashing (sometimes identifying support-lib dependencies before it does so 👍 ). However even with org.gradle.jvmargs=-Xmx32768m the task still crashes after ~30 min of execution.

A workaround I've found is to apply the bye-bye-jetifier plugin to individual feature modules in the project rather than the app module. However this can be quite time-consuming depending on the number of modules.

Is there a change to the scanning algorithm that could be made to make it less memory-intensive for multi-module projects?

P.S. thanks for your work on this plugin, despite this issue I've used it to successfully identify and upgrade a number of libraries still depending on the support lib with the workaround above.

Unused Dependencies

A question. The snippet from build output is

Scanning com.jakewharton.rxbinding2:rxbinding-kotlin:2.2.0
 Absolute path: /Users/mac/.gradle/caches/modules-2/files-2.1/com.jakewharton.rxbinding2/rxbinding-kotlin/2.2.0/f0c5b54acdec1fd5c5d77dbd0c905550ce324d80/rxbinding-kotlin-2.2.0.aar
 Graphs to this dependency:
 +---com.github.cloudpayments:CloudPayments-SDK-Android:1.1.2
     +---com.jakewharton.rxbinding2:rxbinding-kotlin:2.2.0
 +---zapis-partner-android.features:promotion:unspecified
     +---com.github.cloudpayments:CloudPayments-SDK-Android:1.1.2
          +---com.jakewharton.rxbinding2:rxbinding-kotlin:2.2.0
 +---zapis-partner-android.features:journal:unspecified
     +---zapis-partner-android.features:promotion:unspecified
          +---com.github.cloudpayments:CloudPayments-SDK-Android:1.1.2
               +---com.jakewharton.rxbinding2:rxbinding-kotlin:2.2.0
 Issues found:
 * pom -> com.android.support:support-annotations:28.0.0

> Task :canISayByeByeJetifier FAILED

Execution failed for task ':canISayByeByeJetifier'.
> You can not say Bye Bye Jetifier

Apparently the CloudPayments library is only declaring the dependency on com.jakewharton.rxbinding2:rxbinding-kotlin:2.2.0 in the build.gradle file, but is not actually using it. What should I add to the excludedFilesFromScanning?

Lots of encoding errors while running canISayByeByeJetifier

Describe the bug
When running the plugin I got a lot of errors like below mentioning different resource files. I use version 1.1.2.

[Fatal Error] :-1:-1: Invalid byte 1 of 1-byte UTF-8 sequence.
[WARN] Received malformed sequence exception when trying to detect the encoding for text_edit_no_paste_window.xml. Defaulting to UTF-8.
[WARN] javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Invalid byte 1 of 1-byte UTF-8 sequence.
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:242)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.<init>(XMLStreamReaderImpl.java:210)
        at java.xml/com.sun.xml.internal.stream.XMLInputFactoryImpl.getXMLStreamReaderImpl(XMLInputFactoryImpl.java:262)
        at java.xml/com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLStreamReader(XMLInputFactoryImpl.java:129)
        at com.dipien.byebyejetifier.scanner.resource.XmlResourceScanner.getCharset(XmlResourceScanner.kt:65)
        at com.dipien.byebyejetifier.scanner.resource.XmlResourceScanner.scan(XmlResourceScanner.kt:56)
        at com.dipien.byebyejetifier.scanner.ScannerProcessor.visit(ScannerProcessor.kt:39)
        at com.dipien.byebyejetifier.archive.ArchiveFile.accept(ArchiveFile.kt:26)
        at com.dipien.byebyejetifier.scanner.ScannerProcessor.visit(ScannerProcessor.kt:21)
        at com.dipien.byebyejetifier.archive.Archive.accept(Archive.kt:33)
        at com.dipien.byebyejetifier.scanner.ScannerProcessor.scanLibrary(ScannerProcessor.kt:15)
        at com.dipien.byebyejetifier.ProjectAnalyzer.analyze(ProjectAnalyzer.kt:60)
        at com.dipien.byebyejetifier.task.CanISayByeByeJetifierTask.onExecute(CanISayByeByeJetifierTask.kt:65)
        at com.dipien.byebyejetifier.common.AbstractTask.doExecute(AbstractTask.kt:21)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        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.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:555)
        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$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:540)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:523)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:271)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:260)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:34)
        at java.base/java.util.Optional.orElseGet(Optional.java:369)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:34)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:42)
        at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
        at java.base/java.util.Optional.map(Optional.java:265)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
        at java.base/java.util.Optional.orElseGet(Optional.java:369)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:187)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:179)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        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:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
        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.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:56)
        at java.base/java.lang.Thread.run(Thread.java:834)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.