val android: CommonExtension<*, *, *, *, *, *> by extensions val androidComponents: AndroidComponentsExtension<*, *, *> by extensions interface MyVariantExt : VariantExtension { val envApiKey: Property } interface MyProjectExt { val envApiKey: Property } interface MyBuildTypeExt { val envApiKey: Property } interface MyProductFlavorExt { val envApiKey: Property } androidComponents.registerExtension( DslExtension.Builder("myExt") .extendProjectWith(MyProjectExt::class.java) .extendBuildTypeWith(MyBuildTypeExt::class.java) .extendProductFlavorWith(MyProductFlavorExt::class.java) .build() ) { objects.newInstance() } androidComponents.onVariants { variant -> val variantExt = variant.getExtension(MyVariantExt::class.java)!! val buildTypeExt = variant.buildType?.let { android.buildTypes.findByName(it) }?.extensions?.getByType() val flavorExt = variant.flavorName?.let { android.productFlavors.findByName(it) }?.extensions?.getByType() val projectExt = (android as ExtensionAware).extensions.getByType() variantExt.envApiKey.convention( listOfNotNull(buildTypeExt?.envApiKey, flavorExt?.envApiKey, projectExt.envApiKey) .reduce(Provider::orElse) ) }