Transformation reflection (#1529) · raphw/byte-buddy@e5491cf (original) (raw)
`@@ -16,13 +16,20 @@
`
16
16
`package net.bytebuddy.build.gradle.android;
`
17
17
``
18
18
`import com.android.build.api.AndroidPluginVersion;
`
``
19
`+
import com.android.build.api.artifact.Artifact;
`
``
20
`+
import com.android.build.api.artifact.Artifacts;
`
``
21
`+
import com.android.build.api.artifact.MultipleArtifact;
`
19
22
`import com.android.build.api.attributes.BuildTypeAttr;
`
20
23
`import com.android.build.api.instrumentation.InstrumentationScope;
`
21
24
`import com.android.build.api.variant.AndroidComponentsExtension;
`
22
25
`import com.android.build.api.variant.Variant;
`
23
26
`import com.android.build.gradle.BaseExtension;
`
24
27
`import com.android.build.gradle.internal.component.ComponentCreationConfig;
`
25
28
`import com.android.build.gradle.internal.publishing.AndroidArtifacts;
`
``
29
`+
import java.lang.reflect.InvocationTargetException;
`
``
30
`+
import java.lang.reflect.Method;
`
``
31
`+
import java.util.concurrent.ConcurrentHashMap;
`
``
32
`+
import java.util.concurrent.ConcurrentMap;
`
26
33
`import kotlin.Unit;
`
27
34
`import kotlin.jvm.functions.Function1;
`
28
35
`import org.gradle.api.Action;
`
`@@ -31,25 +38,21 @@
`
31
38
`import org.gradle.api.Project;
`
32
39
`import org.gradle.api.artifacts.ArtifactView;
`
33
40
`import org.gradle.api.artifacts.Configuration;
`
34
``
`-
import org.gradle.api.artifacts.PublishArtifactSet;
`
35
41
`import org.gradle.api.attributes.Attribute;
`
36
42
`import org.gradle.api.attributes.AttributeCompatibilityRule;
`
37
43
`import org.gradle.api.attributes.AttributeContainer;
`
38
44
`import org.gradle.api.attributes.AttributeMatchingStrategy;
`
39
45
`import org.gradle.api.attributes.Category;
`
40
46
`import org.gradle.api.attributes.CompatibilityCheckDetails;
`
41
47
`import org.gradle.api.attributes.Usage;
`
42
``
`-
import org.gradle.api.component.Artifact;
`
``
48
`+
import org.gradle.api.file.Directory;
`
43
49
`import org.gradle.api.file.FileCollection;
`
``
50
`+
import org.gradle.api.file.RegularFile;
`
``
51
`+
import org.gradle.api.file.RegularFileProperty;
`
``
52
`+
import org.gradle.api.provider.ListProperty;
`
44
53
`import org.gradle.api.provider.Provider;
`
45
54
`import org.gradle.api.tasks.TaskProvider;
`
46
55
``
47
``
`-
import java.lang.reflect.InvocationTargetException;
`
48
``
`-
import java.lang.reflect.Method;
`
49
``
`-
import java.util.concurrent.ConcurrentHashMap;
`
50
``
`-
import java.util.concurrent.ConcurrentMap;
`
51
``
`-
import java.util.concurrent.ExecutionException;
`
52
``
-
53
56
`/**
`
54
57
` * A Byte Buddy plugin-variant to use in combination with Gradle's support for Android.
`
55
58
` */
`
`@@ -77,9 +80,9 @@ public class ByteBuddyAndroidPlugin implements Plugin {
`
77
80
`@SuppressWarnings("unchecked")
`
78
81
`Object project = Enum.valueOf((Class) scope, "PROJECT");
`
79
82
`dispatcher = new TransformationDispatcher.ForApk74CompatibleAndroid(
`
80
``
`-
PublishArtifactSet.class.getMethod("forScope", scope),
`
81
``
`-
project,
`
82
``
`-
(Artifact) Class.forName("com.android.build.api.variant.ScopedArtifacts$CLASSES").getField("INSTANCE").get(null));
`
``
83
`+
Artifacts.class.getMethod("forScope", scope),
`
``
84
`+
project,
`
``
85
`+
(Artifact) Class.forName("com.android.build.api.artifact.ScopedArtifact$CLASSES").getField("INSTANCE").get(null));
`
83
86
` } catch (Throwable ignored) {
`
84
87
`dispatcher = TransformationDispatcher.ForLegacyAndroid.INSTANCE;
`
85
88
` }
`
`@@ -158,7 +161,7 @@ public void execute(Variant variant) {
`
158
161
`configuration,
`
159
162
`byteBuddyAndroidServiceProvider,
`
160
163
`classPath));
`
161
``
`-
TRANSFORMATION_DISPATCHER.accept(variant, configuration, classPath);
`
``
164
`+
TRANSFORMATION_DISPATCHER.accept(project, variant, configuration, classPath);
`
162
165
` }
`
163
166
` }
`
164
167
``
`@@ -444,19 +447,19 @@ enum ForLegacyAndroid implements TransformationDispatcher {
`
444
447
`@Override
`
445
448
`public void accept(Project project, Variant variant, Configuration configuration, FileCollection classPath) {
`
446
449
`TaskProvider provider = project.getTasks().register(variant.getName() + "BytebuddyLocalTransform",
`
447
``
`-
LegacyByteBuddyLocalClassesEnhancerTask.class,
`
448
``
`-
new LegacyByteBuddyLocalClassesEnhancerTask.ConfigurationAction(configuration, project.getExtensions().getByType(BaseExtension.class), classPath));
`
``
450
`+
LegacyByteBuddyLocalClassesEnhancerTask.class,
`
``
451
`+
new LegacyByteBuddyLocalClassesEnhancerTask.ConfigurationAction(configuration, project.getExtensions().getByType(BaseExtension.class), classPath));
`
449
452
`variant.getArtifacts()
`
450
``
`-
.use(provider)
`
451
``
`-
.wiredWith(LegacyByteBuddyLocalClassesEnhancerTask::getLocalClassesDirs, LegacyByteBuddyLocalClassesEnhancerTask::getOutputDir)
`
452
``
`-
.toTransform(MultipleArtifact.ALL_CLASSES_DIRS.INSTANCE);
`
``
453
`+
.use(provider)
`
``
454
`+
.wiredWith(LegacyByteBuddyLocalClassesEnhancerTask::getLocalClassesDirs, LegacyByteBuddyLocalClassesEnhancerTask::getOutputDir)
`
``
455
`+
.toTransform(MultipleArtifact.ALL_CLASSES_DIRS.INSTANCE);
`
453
456
` }
`
454
457
` }
`
455
458
``
456
459
`class ForApk74CompatibleAndroid implements TransformationDispatcher {
`
457
460
``
458
461
`private final Method forScope;
`
459
``
-
``
462
+
460
463
`private final Object scope;
`
461
464
``
462
465
`private final Artifact artifact;
`
`@@ -470,16 +473,28 @@ protected ForApk74CompatibleAndroid(Method forScope, Object scope, Artifact arti
`
470
473
`@Override
`
471
474
`public void accept(Project project, Variant variant, Configuration configuration, FileCollection classPath) {
`
472
475
`TaskProvider provider = project.getTasks().register(variant.getName() + "BytebuddyLocalTransform",
`
473
``
`-
ByteBuddyLocalClassesEnhancerTask.class,
`
474
``
`-
new ByteBuddyLocalClassesEnhancerTask.ConfigurationAction(configuration, project.getExtensions().getByType(BaseExtension.class), classPath));
`
``
476
`+
ByteBuddyLocalClassesEnhancerTask.class,
`
``
477
`+
new ByteBuddyLocalClassesEnhancerTask.ConfigurationAction(configuration, project.getExtensions().getByType(BaseExtension.class), classPath));
`
475
478
`try {
`
476
``
`-
((PublishArtifactSet) forScope.invoke(variant.getArtifacts(), scope))
`
477
``
`-
.use(provider)
`
478
``
`-
.toTransform(artifact, ByteBuddyLocalClassesEnhancerTask::getLocalJars, ByteBuddyLocalClassesEnhancerTask::getLocalClassesDirs, ByteBuddyLocalClassesEnhancerTask::getOutputFile);
`
``
479
`+
Object scopedArtifacts = forScope.invoke(variant.getArtifacts(), scope);
`
``
480
`+
Method useMethod = scopedArtifacts.getClass().getMethod("use", TaskProvider.class);
`
``
481
`+
Object scopedArtifactsOperation = useMethod.invoke(scopedArtifacts, provider);
`
``
482
`+
Class<?> scopedArtifactClass = Class.forName("com.android.build.api.artifact.ScopedArtifact");
`
``
483
`+
Method toTransformMethod = scopedArtifactsOperation.getClass().getMethod("toTransform", scopedArtifactClass, Function1.class, Function1.class, Function1.class);
`
``
484
`+
toTransformMethod.invoke(scopedArtifactsOperation,
`
``
485
`+
scopedArtifactClass.cast(artifact),
`
``
486
`+
(Function1<ByteBuddyLocalClassesEnhancerTask, ListProperty>) ByteBuddyLocalClassesEnhancerTask::getLocalJars,
`
``
487
`+
(Function1<ByteBuddyLocalClassesEnhancerTask, ListProperty>) ByteBuddyLocalClassesEnhancerTask::getLocalClassesDirs,
`
``
488
`+
(Function1<ByteBuddyLocalClassesEnhancerTask, RegularFileProperty>) ByteBuddyLocalClassesEnhancerTask::getOutputFile
`
``
489
`+
);
`
479
490
` } catch (IllegalAccessException exception) {
`
480
491
`throw new IllegalStateException("Failed to variant scope", exception);
`
481
492
` } catch (InvocationTargetException exception) {
`
482
493
`throw new IllegalStateException("Failed to resolve runtime scope", exception.getCause());
`
``
494
`+
} catch (NoSuchMethodException exception) {
`
``
495
`+
throw new IllegalStateException("Failed to resolve runtime method", exception.getCause());
`
``
496
`+
} catch (ClassNotFoundException exception) {
`
``
497
`+
throw new IllegalStateException("Failed to resolve runtime class", exception.getCause());
`
483
498
` }
`
484
499
` }
`
485
500
` }
`