1. The purpose of this post
In this article, I would demo how to solve ‘Failed to transform artifact ‘butterknife-compiler.jar exception’ when migrating from android support library to androidx”
2. Environments
the properties in project’s gradle.properties which choose androidx as the support library:
android.enableR8 = true
android.useAndroidX = true
android.enableJetifier = true
butterknife dependents:
implementation "com.jakewharton:butterknife:$rootProject.bufferknifeVersion"
annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.bufferknifeVersion"
butterknife version definition in project’s build.gradle
bufferknifeVersion = "8.8.1"
Build and run the code, we would get these exceptions:
org . gradle . api . tasks . TaskExecutionException : Execution failed for task ' : app: javaPreCompileProCnDebug ' .
at org . gradle . api . internal . tasks . execution . CatchExceptionTaskExecuter . execute ( CatchExceptionTaskExecuter . java : 38 )
at org . gradle . api . internal . tasks . execution . EventFiringTaskExecuter $ 1 . executeTask ( EventFiringTaskExecuter . java : 73 )
at org . gradle . api . internal . tasks . execution . EventFiringTaskExecuter $ 1 . call ( EventFiringTaskExecuter . java : 52 )
at org . gradle . api . internal . tasks . execution . EventFiringTaskExecuter $ 1 . call ( EventFiringTaskExecuter . java : 49 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor $CallableBuildOperationWorker . execute ( DefaultBuildOperationExecutor . java : 416 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor $CallableBuildOperationWorker . execute ( DefaultBuildOperationExecutor . java : 406 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor $ 1 . execute ( DefaultBuildOperationExecutor . java : 165 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor . execute ( DefaultBuildOperationExecutor . java : 250 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor . execute ( DefaultBuildOperationExecutor . java : 158 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor . call ( DefaultBuildOperationExecutor . java : 102 )
at org . gradle . internal . operations . DelegatingBuildOperationExecutor . call ( DelegatingBuildOperationExecutor . java : 36 )
at org . gradle . api . internal . tasks . execution . EventFiringTaskExecuter . execute ( EventFiringTaskExecuter . java : 49 )
at org . gradle . execution . plan . LocalTaskNodeExecutor . execute ( LocalTaskNodeExecutor . java : 43 )
at org . gradle . execution . taskgraph . DefaultTaskExecutionGraph $InvokeNodeExecutorsAction . execute ( DefaultTaskExecutionGraph . java : 355 )
at org . gradle . execution . taskgraph . DefaultTaskExecutionGraph $InvokeNodeExecutorsAction . execute ( DefaultTaskExecutionGraph . java : 343 )
at org . gradle . execution . taskgraph . DefaultTaskExecutionGraph $BuildOperationAwareExecutionAction . execute ( DefaultTaskExecutionGraph . java : 336 )
at org . gradle . execution . taskgraph . DefaultTaskExecutionGraph $BuildOperationAwareExecutionAction . execute ( DefaultTaskExecutionGraph . java : 322 )
at org . gradle . execution . plan . DefaultPlanExecutor $ExecutorWorker $ 1 . execute ( DefaultPlanExecutor . java : 134 )
at org . gradle . execution . plan . DefaultPlanExecutor $ExecutorWorker $ 1 . execute ( DefaultPlanExecutor . java : 129 )
at org . gradle . execution . plan . DefaultPlanExecutor $ExecutorWorker . execute ( DefaultPlanExecutor . java : 202 )
at org . gradle . execution . plan . DefaultPlanExecutor $ExecutorWorker . executeNextNode ( DefaultPlanExecutor . java : 193 )
at org . gradle . execution . plan . DefaultPlanExecutor $ExecutorWorker . run ( DefaultPlanExecutor . java : 129 )
at org . gradle . internal . concurrent . ExecutorPolicy $CatchAndRecordFailures . onExecute ( ExecutorPolicy . java : 63 )
at org . gradle . internal . concurrent . ManagedExecutorImpl $ 1 . run ( ManagedExecutorImpl . java : 46 )
at java . util . concurrent . ThreadPoolExecutor . runWorker ( ThreadPoolExecutor . java : 1149 )
at java . util . concurrent . ThreadPoolExecutor $Worker . run ( ThreadPoolExecutor . java : 624 )
at org . gradle . internal . concurrent . ThreadFactoryImpl $ManagedThreadRunnable . run ( ThreadFactoryImpl . java : 55 )
at java . lang . Thread . run ( Thread . java : 748 )
Caused by: org . gradle . api . internal . artifacts . ivyservice . DefaultLenientConfiguration $ArtifactResolveException : Could not resolve all files for configuration ' : app: proCnDebugAnnotationProcessorClasspath ' .
at org . gradle . api . internal . artifacts . configurations . DefaultConfiguration . rethrowFailure ( DefaultConfiguration . java : 1195 )
at org . gradle . api . internal . artifacts . configurations . DefaultConfiguration . access $ 2100 ( DefaultConfiguration . java : 138 )
at org . gradle . api . internal . artifacts . configurations . DefaultConfiguration $ConfigurationFileCollection . getFiles ( DefaultConfiguration . java : 1170 )
at org . gradle . api . internal . file . AbstractFileCollection . iterator ( AbstractFileCollection . java : 72 )
at org . gradle . internal . snapshot . impl . DefaultFileSystemSnapshotter $FileCollectionLeafVisitorImpl . visitCollection ( DefaultFileSystemSnapshotter . java : 240 )
at org . gradle . api . internal . file . AbstractFileCollection . visitLeafCollections ( AbstractFileCollection . java : 233 )
at org . gradle . api . internal . file . CompositeFileCollection . visitLeafCollections ( CompositeFileCollection . java : 205 )
at org . gradle . internal . snapshot . impl . DefaultFileSystemSnapshotter . snapshot ( DefaultFileSystemSnapshotter . java : 126 )
at org . gradle . internal . fingerprint . impl . AbstractFileCollectionFingerprinter . fingerprint ( AbstractFileCollectionFingerprinter . java : 48 )
at org . gradle . api . internal . tasks . execution . DefaultTaskFingerprinter . fingerprintTaskFiles ( DefaultTaskFingerprinter . java : 46 )
at org . gradle . api . internal . tasks . execution . ResolveBeforeExecutionStateTaskExecuter . createExecutionState ( ResolveBeforeExecutionStateTaskExecuter . java : 93 )
at org . gradle . api . internal . tasks . execution . ResolveBeforeExecutionStateTaskExecuter . execute ( ResolveBeforeExecutionStateTaskExecuter . java : 73 )
at org . gradle . api . internal . tasks . execution . ValidatingTaskExecuter . execute ( ValidatingTaskExecuter . java : 62 )
at org . gradle . api . internal . tasks . execution . SkipEmptySourceFilesTaskExecuter . execute ( SkipEmptySourceFilesTaskExecuter . java : 108 )
at org . gradle . api . internal . tasks . execution . ResolveBeforeExecutionOutputsTaskExecuter . execute ( ResolveBeforeExecutionOutputsTaskExecuter . java : 67 )
at org . gradle . api . internal . tasks . execution . ResolveAfterPreviousExecutionStateTaskExecuter . execute ( ResolveAfterPreviousExecutionStateTaskExecuter . java : 46 )
at org . gradle . api . internal . tasks . execution . CleanupStaleOutputsExecuter . execute ( CleanupStaleOutputsExecuter . java : 94 )
at org . gradle . api . internal . tasks . execution . FinalizePropertiesTaskExecuter . execute ( FinalizePropertiesTaskExecuter . java : 46 )
at org . gradle . api . internal . tasks . execution . ResolveTaskExecutionModeExecuter . execute ( ResolveTaskExecutionModeExecuter . java : 95 )
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 )
... 27 more
Caused by: org . gradle . api . internal . artifacts . transform . TransformException : Failed to transform artifact ' butterknife - compiler . jar ( com . jakewharton : butterknife - compiler: 8.8 . 1 ) ' to match attributes { artifactType = processed - jar , org . gradle . usage = java - runtime - jars }.
at org . gradle . api . internal . artifacts . transform . TransformingArtifactVisitor . lambda $visitArtifact $ 1 ( TransformingArtifactVisitor . java : 61 )
at org . gradle . internal . Try $Failure . ifSuccessfulOrElse ( Try . java : 191 )
at org . gradle . api . internal . artifacts . transform . TransformingArtifactVisitor . visitArtifact ( TransformingArtifactVisitor . java : 50 )
at org . gradle . api . internal . artifacts . ivyservice . resolveengine . artifact . ArtifactBackedResolvedVariant $SingleArtifactSet . visit ( ArtifactBackedResolvedVariant . java : 112 )
at org . gradle . api . internal . artifacts . transform . TransformCompletion . visit ( TransformCompletion . java : 42 )
at org . gradle . api . internal . artifacts . ivyservice . resolveengine . artifact . CompositeResolvedArtifactSet $CompositeResult . visit ( CompositeResolvedArtifactSet . java : 83 )
at org . gradle . api . internal . artifacts . ivyservice . resolveengine . artifact . ParallelResolveArtifactSet $VisitingSet . visit ( ParallelResolveArtifactSet . java : 64 )
at org . gradle . api . internal . artifacts . ivyservice . DefaultLenientConfiguration . visitArtifacts ( DefaultLenientConfiguration . java : 256 )
at org . gradle . api . internal . artifacts . ivyservice . DefaultLenientConfiguration . access $ 500 ( DefaultLenientConfiguration . java : 69 )
at org . gradle . api . internal . artifacts . ivyservice . DefaultLenientConfiguration $ 2 . run ( DefaultLenientConfiguration . java : 231 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor $RunnableBuildOperationWorker . execute ( DefaultBuildOperationExecutor . java : 402 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor $RunnableBuildOperationWorker . execute ( DefaultBuildOperationExecutor . java : 394 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor $ 1 . execute ( DefaultBuildOperationExecutor . java : 165 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor . execute ( DefaultBuildOperationExecutor . java : 250 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor . execute ( DefaultBuildOperationExecutor . java : 158 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor . run ( DefaultBuildOperationExecutor . java : 92 )
at org . gradle . internal . operations . DelegatingBuildOperationExecutor . run ( DelegatingBuildOperationExecutor . java : 31 )
at org . gradle . api . internal . artifacts . ivyservice . DefaultLenientConfiguration . visitArtifactsWithBuildOperation ( DefaultLenientConfiguration . java : 228 )
at org . gradle . api . internal . artifacts . ivyservice . DefaultLenientConfiguration . access $ 200 ( DefaultLenientConfiguration . java : 69 )
at org . gradle . api . internal . artifacts . ivyservice . DefaultLenientConfiguration $ 1 . visitArtifacts ( DefaultLenientConfiguration . java : 133 )
at org . gradle . api . internal . artifacts . configurations . DefaultConfiguration $ConfigurationFileCollection . getFiles ( DefaultConfiguration . java : 1167 )
... 46 more
Caused by: org . gradle . api . internal . artifacts . transform . TransformException : Execution failed for JetifyTransform: / Users / tom /. gradle / caches / modules - 2 / files - 2.1 / com . jakewharton / butterknife - compiler / 8.8 . 1 / b2f4505a1babb7b7c11abbbf8ea4c90b18c3aeac / butterknife - compiler - 8.8 . 1 . jar .
at org . gradle . api . internal . artifacts . transform . DefaultTransformerInvoker . lambda $invoke $ 1 ( DefaultTransformerInvoker . java : 172 )
at org . gradle . internal . Try $Failure . mapFailure ( Try . java : 182 )
at org . gradle . api . internal . artifacts . transform . DefaultTransformerInvoker . lambda $invoke $ 2 ( DefaultTransformerInvoker . java : 172 )
at org . gradle . api . internal . artifacts . transform . DefaultTransformerInvoker . fireTransformListeners ( DefaultTransformerInvoker . java : 219 )
at org . gradle . api . internal . artifacts . transform . DefaultTransformerInvoker . lambda $invoke $ 3 ( DefaultTransformerInvoker . java : 117 )
at org . gradle . api . internal . artifacts . transform . ImmutableTransformationWorkspaceProvider . lambda $withWorkspace $ 0 ( ImmutableTransformationWorkspaceProvider . java : 81 )
at org . gradle . cache . internal . LockOnDemandCrossProcessCacheAccess . withFileLock ( LockOnDemandCrossProcessCacheAccess . java : 90 )
at org . gradle . cache . internal . DefaultCacheAccess . withFileLock ( DefaultCacheAccess . java : 194 )
at org . gradle . cache . internal . DefaultPersistentDirectoryStore . withFileLock ( DefaultPersistentDirectoryStore . java : 170 )
at org . gradle . cache . internal . DefaultCacheFactory $ReferenceTrackingCache . withFileLock ( DefaultCacheFactory . java : 194 )
at org . gradle . api . internal . artifacts . transform . ImmutableTransformationWorkspaceProvider . withWorkspace ( ImmutableTransformationWorkspaceProvider . java : 76 )
at org . gradle . api . internal . artifacts . transform . AbstractCachingTransformationWorkspaceProvider . lambda $withWorkspace $ 0 ( AbstractCachingTransformationWorkspaceProvider . java : 54 )
at com . google . common . cache . LocalCache $LocalManualCache $ 1 . load ( LocalCache . java : 4717 )
at com . google . common . cache . LocalCache $LoadingValueReference . loadFuture ( LocalCache . java : 3444 )
at com . google . common . cache . LocalCache $Segment . loadSync ( LocalCache . java : 2193 )
at com . google . common . cache . LocalCache $Segment . lockedGetOrLoad ( LocalCache . java : 2152 )
at com . google . common . cache . LocalCache $Segment . get ( LocalCache . java : 2042 )
at com . google . common . cache . LocalCache . get ( LocalCache . java : 3850 )
at com . google . common . cache . LocalCache $LocalManualCache . get ( LocalCache . java : 4712 )
at org . gradle . api . internal . artifacts . transform . AbstractCachingTransformationWorkspaceProvider . withWorkspace ( AbstractCachingTransformationWorkspaceProvider . java : 53 )
at org . gradle . api . internal . artifacts . transform . DefaultTransformerInvoker . invoke ( DefaultTransformerInvoker . java : 116 )
at org . gradle . api . internal . artifacts . transform . TransformationStep . lambda $transform $ 0 ( TransformationStep . java : 104 )
at org . gradle . internal . Try $Success . flatMap ( Try . java : 102 )
at org . gradle . api . internal . artifacts . transform . TransformationStep . transform ( TransformationStep . java : 101 )
at org . gradle . api . internal . artifacts . transform . TransformationNode $InitialTransformationNode $ 1 . transform ( TransformationNode . java : 159 )
at org . gradle . api . internal . artifacts . transform . TransformationNode $ArtifactTransformationStepBuildOperation . call ( TransformationNode . java : 229 )
at org . gradle . api . internal . artifacts . transform . TransformationNode $ArtifactTransformationStepBuildOperation . call ( TransformationNode . java : 212 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor $CallableBuildOperationWorker . execute ( DefaultBuildOperationExecutor . java : 416 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor $CallableBuildOperationWorker . execute ( DefaultBuildOperationExecutor . java : 406 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor $ 1 . execute ( DefaultBuildOperationExecutor . java : 165 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor . execute ( DefaultBuildOperationExecutor . java : 250 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor . execute ( DefaultBuildOperationExecutor . java : 158 )
at org . gradle . internal . operations . DefaultBuildOperationExecutor . call ( DefaultBuildOperationExecutor . java : 102 )
at org . gradle . internal . operations . DelegatingBuildOperationExecutor . call ( DelegatingBuildOperationExecutor . java : 36 )
at org . gradle . api . internal . artifacts . transform . TransformationNode $InitialTransformationNode . execute ( TransformationNode . java : 145 )
at org . gradle . api . internal . artifacts . transform . TransformationNodeExecutor . execute ( TransformationNodeExecutor . java : 37 )
... 15 more
Caused by: java . lang . RuntimeException : Failed to transform ' / Users / tom /. gradle / caches / modules - 2 / files - 2.1 / com . jakewharton / butterknife - compiler / 8.8 . 1 / b2f4505a1babb7b7c11abbbf8ea4c90b18c3aeac / butterknife - compiler - 8.8 . 1 . jar ' using Jetifier . Reason: The given artifact contains a string literal with a package reference ' android . support . v4 . content ' that cannot be safely rewritten . Libraries using reflection such as annotation processors need to be updated manually to add support for androidx .. ( Run with -- stacktrace for more details .)
at com . android . build . gradle . internal . dependency . JetifyTransform . transform ( JetifyTransform . kt : 118 )
at org . gradle . api . internal . artifacts . transform . LegacyTransformer . transform ( LegacyTransformer . java : 76 )
at org . gradle . api . internal . artifacts . transform . DefaultTransformerInvoker $TransformerExecution . execute ( DefaultTransformerInvoker . java : 274 )
at org . gradle . internal . execution . steps . ExecuteStep . lambda $execute $ 1 ( ExecuteStep . java : 33 )
at java . util . Optional . orElseGet ( Optional . java : 267 )
at org . gradle . internal . execution . steps . ExecuteStep . execute ( ExecuteStep . java : 33 )
at org . gradle . internal . execution . steps . ExecuteStep . execute ( ExecuteStep . java : 26 )
at org . gradle . internal . execution . steps . CleanupOutputsStep . execute ( CleanupOutputsStep . java : 58 )
at org . gradle . internal . execution . steps . CleanupOutputsStep . execute ( CleanupOutputsStep . java : 35 )
at org . gradle . internal . execution . steps . ResolveInputChangesStep . execute ( ResolveInputChangesStep . java : 48 )
at org . gradle . internal . execution . steps . ResolveInputChangesStep . execute ( ResolveInputChangesStep . java : 33 )
at org . gradle . internal . execution . steps . CancelExecutionStep . execute ( CancelExecutionStep . java : 39 )
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 . CatchExceptionStep . execute ( CatchExceptionStep . java : 35 )
at org . gradle . internal . execution . steps . CreateOutputsStep . execute ( CreateOutputsStep . java : 51 )
at org . gradle . internal . execution . steps . SnapshotOutputsStep . execute ( SnapshotOutputsStep . java : 45 )
at org . gradle . internal . execution . steps . SnapshotOutputsStep . execute ( SnapshotOutputsStep . java : 31 )
at org . gradle . internal . execution . steps . CacheStep . executeWithoutCache ( CacheStep . java : 201 )
at org . gradle . internal . execution . steps . CacheStep . execute ( CacheStep . java : 70 )
at org . gradle . internal . execution . steps . CacheStep . execute ( CacheStep . java : 45 )
at org . gradle . internal . execution . steps . BroadcastChangingOutputsStep . execute ( BroadcastChangingOutputsStep . java : 49 )
at org . gradle . internal . execution . steps . StoreSnapshotsStep . execute ( StoreSnapshotsStep . java : 43 )
at org . gradle . internal . execution . steps . StoreSnapshotsStep . execute ( StoreSnapshotsStep . java : 32 )
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 : 96 )
at org . gradle . internal . execution . steps . SkipUpToDateStep . lambda $execute $ 0 ( SkipUpToDateStep . java : 89 )
at java . util . Optional . map ( Optional . java : 215 )
at org . gradle . internal . execution . steps . SkipUpToDateStep . execute ( SkipUpToDateStep . java : 54 )
at org . gradle . internal . execution . steps . SkipUpToDateStep . execute ( SkipUpToDateStep . java : 38 )
at org . gradle . internal . execution . steps . ResolveChangesStep . execute ( ResolveChangesStep . java : 77 )
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 : 90 )
at org . gradle . internal . execution . steps . ResolveCachingStateStep . execute ( ResolveCachingStateStep . java : 48 )
at org . gradle . internal . execution . impl . DefaultWorkExecutor . execute ( DefaultWorkExecutor . java : 33 )
at org . gradle . api . internal . artifacts . transform . DefaultTransformerInvoker . lambda $invoke $ 2 ( DefaultTransformerInvoker . java : 148 )
... 48 more
Caused by: com . android . tools . build . jetifier . processor . transform . bytecode . AmbiguousStringJetifierException : The given artifact contains a string literal with a package reference ' android . support . v4 . content ' that cannot be safely rewritten . Libraries using reflection such as annotation processors need to be updated manually to add support for androidx .
at com . android . tools . build . jetifier . processor . transform . bytecode . CoreRemapperImpl . rewriteString ( CoreRemapperImpl . kt : 91 )
at com . android . tools . build . jetifier . processor . transform . bytecode . asm . CustomRemapper . mapValue ( CustomRemapper . kt : 75 )
at org . objectweb . asm . commons . MethodRemapper . visitLdcInsn ( MethodRemapper . java : 179 )
at org . objectweb . asm . ClassReader . readCode ( ClassReader . java : 1586 )
at org . objectweb . asm . ClassReader . readMethod ( ClassReader . java : 1126 )
at org . objectweb . asm . ClassReader . accept ( ClassReader . java : 698 )
at org . objectweb . asm . ClassReader . accept ( ClassReader . java : 500 )
at com . android . tools . build . jetifier . processor . transform . bytecode . ByteCodeTransformer . runTransform ( ByteCodeTransformer . kt : 39 )
at com . android . tools . build . jetifier . processor . Processor . visit ( Processor . kt : 443 )
at com . android . tools . build . jetifier . processor . archive . ArchiveFile . accept ( ArchiveFile . kt : 49 )
at com . android . tools . build . jetifier . processor . Processor . visit ( Processor . kt : 425 )
at com . android . tools . build . jetifier . processor . archive . Archive . accept ( Archive . kt : 76 )
at com . android . tools . build . jetifier . processor . Processor . transformLibrary ( Processor . kt : 421 )
at com . android . tools . build . jetifier . processor . Processor . transform ( Processor . kt : 247 )
at com . android . build . gradle . internal . dependency . JetifyTransform . transform ( JetifyTransform . kt : 113 )
... 86 more
3. Solution and commands
It seems that the 8.8.1 butterknife is still using the old android support library, so ,we change it to the new version:
upgrade butterknife in project’s build.gradle
bufferknifeVersion = "10.2.0"
Clean, build and rerun the project, problem solved.