@@ -160,32 +160,60 @@ protected VariantAction(Project project, Configuration configuration) {
160
160
* {@inheritDoc}
161
161
*/
162
162
public void execute (Variant variant ) {
163
- if (variant .getBuildType () == null ) {
163
+ String buildType = variant .getBuildType ();
164
+ if (buildType == null ) {
164
165
throw new GradleException ("Build type for " + variant + " was null" );
165
166
}
166
- Configuration configuration = configurations .get (variant .getBuildType ());
167
- if (configuration == null ) {
168
- configuration = project .getConfigurations ().create (variant .getBuildType () + "ByteBuddy" , new VariantConfigurationConfigurationAction (project ,
169
- this .configuration ,
170
- variant .getBuildType ()));
171
- Configuration previous = configurations .putIfAbsent (variant .getBuildType (), configuration );
172
- if (previous != null ) {
173
- configuration = previous ;
174
- }
167
+ String variantName = variant .getName ();
168
+ String configurationSuffix = "ByteBuddy" ;
169
+ ConfigurationConfigurationAction declarableConfigurationAction = new ConfigurationConfigurationAction ();
170
+
171
+ // Example of declarable build config names: "debugByteBuddy, releaseByteBuddy".
172
+ Configuration buildTypeDeclarableConfiguration = getBuildTypeConfiguration (buildType , configurationSuffix , declarableConfigurationAction );
173
+
174
+ // Example of declarable variant config names for a "demo" flavor name: "demoDebugByteBuddy, demoReleaseByteBuddy".
175
+ String variantDeclarableConfigurationName = variantName + configurationSuffix ;
176
+ Configuration variantDeclarableConfiguration ;
177
+ if (variantDeclarableConfigurationName .equals (buildTypeDeclarableConfiguration .getName ())) {
178
+ // When there are no "flavors" defined, the variant and build type names are the same.
179
+ variantDeclarableConfiguration = buildTypeDeclarableConfiguration ;
180
+ } else {
181
+ variantDeclarableConfiguration = project .getConfigurations ().maybeCreate (variantDeclarableConfigurationName );
182
+ declarableConfigurationAction .execute (variantDeclarableConfiguration );
183
+ variantDeclarableConfiguration .extendsFrom (buildTypeDeclarableConfiguration );
175
184
}
185
+
186
+ // Example of resolvable variant config names: "demoDebugByteBuddyClasspath, demoReleaseByteBuddyClasspath".
187
+ Configuration variantResolvableConfiguration = project .getConfigurations ().create (variantDeclarableConfigurationName + "Classpath" , new VariantConfigurationConfigurationAction (
188
+ project , variantDeclarableConfiguration , buildType
189
+ ));
176
190
if (TRANSFORMATION_DISPATCHER instanceof TransformationDispatcher .ForApk74CompatibleAndroid ) {
177
- TRANSFORMATION_DISPATCHER .accept (project , variant , configuration , null );
191
+ TRANSFORMATION_DISPATCHER .accept (project , variant , variantResolvableConfiguration , null );
178
192
} else {
179
- Provider <ByteBuddyAndroidService > byteBuddyAndroidServiceProvider = project .getGradle ().getSharedServices ().registerIfAbsent (variant . getName () + "ByteBuddyAndroidService" ,
193
+ Provider <ByteBuddyAndroidService > byteBuddyAndroidServiceProvider = project .getGradle ().getSharedServices ().registerIfAbsent (variantName + "ByteBuddyAndroidService" ,
180
194
ByteBuddyAndroidService .class ,
181
195
new ByteBuddyAndroidService .ConfigurationAction (project .getExtensions ().getByType (BaseExtension .class )));
182
196
FileCollection classPath = RuntimeClassPathResolver .INSTANCE .apply (variant );
183
197
variant .getInstrumentation ().transformClassesWith (ByteBuddyAsmClassVisitorFactory .class , InstrumentationScope .ALL , new ByteBuddyTransformationConfiguration (project ,
184
- configuration ,
198
+ variantResolvableConfiguration ,
185
199
byteBuddyAndroidServiceProvider ,
186
200
classPath ));
187
- TRANSFORMATION_DISPATCHER .accept (project , variant , configuration , classPath );
201
+ TRANSFORMATION_DISPATCHER .accept (project , variant , variantResolvableConfiguration , classPath );
202
+ }
203
+ }
204
+
205
+ private Configuration getBuildTypeConfiguration (String buildType , String configurationSuffix , Action <Configuration > configurationAction ) {
206
+ Configuration configuration = configurations .get (buildType );
207
+ if (configuration == null ) {
208
+ configuration = project .getConfigurations ().maybeCreate (buildType + configurationSuffix );
209
+ configurationAction .execute (configuration );
210
+ configuration .extendsFrom (this .configuration );
211
+ Configuration previous = configurations .putIfAbsent (buildType , configuration );
212
+ if (previous != null ) {
213
+ configuration = previous ;
214
+ }
188
215
}
216
+ return configuration ;
189
217
}
190
218
}
191
219
@@ -346,7 +374,7 @@ protected static class VariantConfigurationConfigurationAction implements Action
346
374
private final Project project ;
347
375
348
376
/**
349
- * The general Byte Buddy configuration .
377
+ * The configuration to extend from .
350
378
*/
351
379
private final Configuration configuration ;
352
380
@@ -359,7 +387,7 @@ protected static class VariantConfigurationConfigurationAction implements Action
359
387
* Creates a new variant configuration for a {@link Configuration}.
360
388
*
361
389
* @param project The current Gradle project.
362
- * @param configuration The general Byte Buddy configuration .
390
+ * @param configuration The configuration to extend from .
363
391
* @param buildType The name of the build type.
364
392
*/
365
393
protected VariantConfigurationConfigurationAction (Project project , Configuration configuration , String buildType ) {
@@ -583,6 +611,9 @@ protected ForApk74CompatibleAndroid(Method forScope, Method use, Method toTransf
583
611
* {@inheritDoc}
584
612
*/
585
613
public void accept (Project project , Variant variant , Configuration configuration , FileCollection classPath ) {
614
+ if (configuration .getAllDependencies ().isEmpty ()) {
615
+ return ;
616
+ }
586
617
TaskProvider <ByteBuddyLocalClassesEnhancerTask > provider = project .getTasks ().register (variant .getName () + "BytebuddyTransform" ,
587
618
ByteBuddyLocalClassesEnhancerTask .class ,
588
619
new ByteBuddyLocalClassesEnhancerTask .ConfigurationAction (ByteBuddyViewConfiguration .toClassPath (project , configuration ),
0 commit comments