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

` }

`