/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.build.gradle.internal; import com.android.annotations.NonNull; import com.android.build.gradle.api.AndroidSourceSet; import com.android.build.gradle.internal.coverage.JacocoExtension; import com.android.build.gradle.internal.dsl.AaptOptions; import com.android.build.gradle.internal.dsl.AdbOptions; import com.android.build.gradle.internal.dsl.AndroidSourceSetFactory; import com.android.build.gradle.internal.dsl.DexOptions; import com.android.build.gradle.internal.dsl.LintOptions; import com.android.build.gradle.internal.dsl.PackagingOptions; import com.android.build.gradle.internal.dsl.PreprocessingOptions; import com.android.build.gradle.internal.dsl.Splits; import com.android.build.gradle.internal.dsl.TestOptions; import com.android.build.gradle.managed.AndroidConfig; import com.android.builder.core.BuilderConstants; import com.android.builder.core.LibraryRequest; import com.android.builder.testing.api.DeviceProvider; import com.android.builder.testing.api.TestServer; import com.google.common.collect.Lists; import org.gradle.api.Action; import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.ConfigurationContainer; import org.gradle.internal.reflect.Instantiator; /** * Utility functions for initializing an AndroidConfig. */ public class AndroidConfigHelper { public static void configure( @NonNull AndroidConfig model, @NonNull Instantiator instantiator) { model.setDefaultPublishConfig(BuilderConstants.RELEASE); model.setPublishNonDefault(false); model.setGeneratePureSplits(false); model.setPreProcessingOptions(instantiator.newInstance(PreprocessingOptions.class)); model.setDeviceProviders(Lists.<DeviceProvider>newArrayList()); model.setTestServers(Lists.<TestServer>newArrayList()); model.setAaptOptions(instantiator.newInstance(AaptOptions.class)); model.setDexOptions(instantiator.newInstance(DexOptions.class)); model.setLintOptions(instantiator.newInstance(LintOptions.class)); model.setTestOptions(instantiator.newInstance(TestOptions.class)); model.setCompileOptions(instantiator.newInstance(CompileOptions.class)); model.setPackagingOptions(instantiator.newInstance(PackagingOptions.class)); model.setJacoco(instantiator.newInstance(JacocoExtension.class)); model.setAdbOptions(instantiator.newInstance(AdbOptions.class)); model.setSplits(instantiator.newInstance(Splits.class, instantiator)); model.setLibraryRequests(Lists.<LibraryRequest>newArrayList()); } public static NamedDomainObjectContainer<AndroidSourceSet> createSourceSetsContainer( @NonNull final Project project, @NonNull Instantiator instantiator, final boolean isLibrary) { NamedDomainObjectContainer<AndroidSourceSet> sourceSetsContainer = project.container( AndroidSourceSet.class, new AndroidSourceSetFactory(instantiator, project, isLibrary)); sourceSetsContainer.whenObjectAdded(new Action<AndroidSourceSet>() { @Override public void execute(AndroidSourceSet sourceSet) { ConfigurationContainer configurations = project.getConfigurations(); createConfiguration( configurations, sourceSet.getCompileConfigurationName(), "Classpath for compiling the ${sourceSet.name} sources."); String packageConfigDescription; if (isLibrary) { packageConfigDescription = "Classpath only used when publishing '${sourceSet.name}'."; } else { packageConfigDescription = "Classpath packaged with the compiled '${sourceSet.name}' classes."; } createConfiguration( configurations, sourceSet.getPackageConfigurationName(), packageConfigDescription); createConfiguration( configurations, sourceSet.getProvidedConfigurationName(), "Classpath for only compiling the ${sourceSet.name} sources."); createConfiguration( configurations, sourceSet.getWearAppConfigurationName(), "Link to a wear app to embed for object '${sourceSet.name}'."); sourceSet.setRoot(String.format("src/%s", sourceSet.getName())); } }); return sourceSetsContainer; } private static void createConfiguration( @NonNull ConfigurationContainer configurations, @NonNull String configurationName, @NonNull String configurationDescription) { Configuration configuration = configurations.findByName(configurationName); if (configuration == null) { configuration = configurations.create(configurationName); } // Disable modification to configurations as this causes issues when accessed through the // tooling-api. Check that it works with Studio's ImportProjectAction before re-enabling // them. //configuration.setVisible(false); //configuration.setDescription(configurationDescription); } }