diff options
author | Xavier Ducrohet <xav@android.com> | 2013-03-29 15:53:40 -0700 |
---|---|---|
committer | Xavier Ducrohet <xav@android.com> | 2013-04-04 17:07:13 -0700 |
commit | a03b680faaebe3bbf93e2abc7a00f69377e6918d (patch) | |
tree | 86a1292ae5cc65db0a6b992b917465f2e1436fae | |
parent | 5894d6b0a48611186d8630a14f66f5e12c76af18 (diff) | |
download | build-a03b680faaebe3bbf93e2abc7a00f69377e6918d.tar.gz |
Refactor ApplicationVariant/BuildVariant.
[Application|ProductionApp|TestApp]Variant
-> [Base|Apk|Application|Test|Library]VariantData
Also moved under internal.variant package
BuildVariant
-> [Base|Apk|Application|Test|Library]Variant
Also moved under api package. These are interfaces.
Implementation in internal.api
Change-Id: I6ef0a6433797325836a4ce39f9310641704eeda7
53 files changed, 2072 insertions, 1232 deletions
diff --git a/builder/src/main/java/com/android/builder/VariantConfiguration.java b/builder/src/main/java/com/android/builder/VariantConfiguration.java index a186623..0ec9aac 100644 --- a/builder/src/main/java/com/android/builder/VariantConfiguration.java +++ b/builder/src/main/java/com/android/builder/VariantConfiguration.java @@ -22,8 +22,6 @@ import com.android.annotations.VisibleForTesting; import com.android.builder.dependency.AndroidDependency; import com.android.builder.dependency.DependencyContainer; import com.android.builder.dependency.JarDependency; -import com.android.builder.model.BuildType; -import com.android.builder.model.ProductFlavor; import com.android.builder.model.SourceProvider; import com.android.builder.resources.AssetSet; import com.android.builder.resources.ResourceSet; @@ -104,8 +102,10 @@ public class VariantConfiguration { * @param debugName an optional debug name */ public VariantConfiguration( - @NonNull DefaultProductFlavor defaultConfig, @NonNull SourceProvider defaultSourceProvider, - @NonNull DefaultBuildType buildType, @NonNull SourceProvider buildTypeSourceProvider, + @NonNull DefaultProductFlavor defaultConfig, + @NonNull SourceProvider defaultSourceProvider, + @NonNull DefaultBuildType buildType, + @NonNull SourceProvider buildTypeSourceProvider, @Nullable String debugName) { this(defaultConfig, defaultSourceProvider, buildType, buildTypeSourceProvider, @@ -237,7 +237,7 @@ public class VariantConfiguration { } @NonNull - public ProductFlavor getDefaultConfig() { + public DefaultProductFlavor getDefaultConfig() { return mDefaultConfig; } @@ -247,12 +247,12 @@ public class VariantConfiguration { } @NonNull - public ProductFlavor getMergedFlavor() { + public DefaultProductFlavor getMergedFlavor() { return mMergedFlavor; } @NonNull - public BuildType getBuildType() { + public DefaultBuildType getBuildType() { return mBuildType; } diff --git a/gradle-model/src/main/java/com/android/build/gradle/model/Variant.java b/gradle-model/src/main/java/com/android/build/gradle/model/Variant.java index a624d4d..3ad9ab4 100644 --- a/gradle-model/src/main/java/com/android/build/gradle/model/Variant.java +++ b/gradle-model/src/main/java/com/android/build/gradle/model/Variant.java @@ -16,6 +16,7 @@ package com.android.build.gradle.model; +import com.android.annotations.NonNull; import com.android.builder.model.ProductFlavor; import java.io.File; @@ -25,11 +26,15 @@ import java.io.File; */ public interface Variant { + @NonNull String getName(); + @NonNull File getOutput(); + @NonNull String getBuildType(); + @NonNull ProductFlavor getMergedFlavor(); } diff --git a/gradle/src/main/groovy/com/android/build/gradle/AppExtension.groovy b/gradle/src/main/groovy/com/android/build/gradle/AppExtension.groovy index 26c71ef..52fdc52 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AppExtension.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/AppExtension.groovy @@ -14,15 +14,15 @@ * limitations under the License. */ package com.android.build.gradle - +import com.android.build.gradle.api.ApplicationVariant import com.android.builder.DefaultBuildType import com.android.builder.DefaultProductFlavor import com.android.builder.signing.SigningConfig import org.gradle.api.Action import org.gradle.api.NamedDomainObjectContainer +import org.gradle.api.internal.DefaultDomainObjectSet import org.gradle.api.internal.project.ProjectInternal import org.gradle.internal.reflect.Instantiator - /** * Extension for 'application' project. */ @@ -32,6 +32,9 @@ public class AppExtension extends BaseExtension { final NamedDomainObjectContainer<DefaultBuildType> buildTypes final NamedDomainObjectContainer<SigningConfig> signingConfigs + private final DefaultDomainObjectSet<ApplicationVariant> applicationVariantList = + new DefaultDomainObjectSet<ApplicationVariant>(ApplicationVariant.class) + List<String> flavorGroupList String testBuildType = "debug" @@ -60,4 +63,13 @@ public class AppExtension extends BaseExtension { public void flavorGroups(String... groups) { flavorGroupList = Arrays.asList(groups) } + + public DefaultDomainObjectSet<ApplicationVariant> getApplicationVariants() { + plugin.createAndroidTasks() + return applicationVariantList + } + + void addApplicationVariant(ApplicationVariant applicationVariant) { + applicationVariantList.add(applicationVariant) + } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy b/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy index e0f2621..ade1fc7 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy @@ -15,11 +15,15 @@ */ package com.android.build.gradle + +import com.android.annotations.NonNull +import com.android.annotations.Nullable +import com.android.build.gradle.api.ApplicationVariant +import com.android.build.gradle.api.TestVariant import com.android.build.gradle.internal.BuildTypeData -import com.android.build.gradle.internal.DefaultBuildVariant import com.android.build.gradle.internal.ProductFlavorData -import com.android.build.gradle.internal.ProductionAppVariant -import com.android.build.gradle.internal.TestAppVariant +import com.android.build.gradle.internal.api.ApplicationVariantImpl +import com.android.build.gradle.internal.api.TestVariantImpl import com.android.build.gradle.internal.dependency.ConfigurationDependencies import com.android.build.gradle.internal.dsl.BuildTypeDsl import com.android.build.gradle.internal.dsl.BuildTypeFactory @@ -31,6 +35,8 @@ import com.android.build.gradle.internal.tasks.AndroidReportTask import com.android.build.gradle.internal.tasks.AndroidTestTask import com.android.build.gradle.internal.test.PluginHolder import com.android.build.gradle.internal.test.report.ReportType +import com.android.build.gradle.internal.variant.ApplicationVariantData +import com.android.build.gradle.internal.variant.TestVariantData import com.android.builder.DefaultBuildType import com.android.builder.VariantConfiguration import com.android.builder.signing.SigningConfig @@ -55,6 +61,7 @@ import static com.android.builder.BuilderConstants.LINT import static com.android.builder.BuilderConstants.RELEASE import static com.android.builder.BuilderConstants.REPORTS import static com.android.builder.BuilderConstants.UI_TEST + /** * Gradle plugin class for 'application' projects. */ @@ -323,7 +330,7 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl throw new RuntimeException("Test Build Type '$extension.testBuildType' does not exist.") } - ProductionAppVariant testedVariant = null + ApplicationVariantData testedVariantData = null ProductFlavorData defaultConfigData = getDefaultConfigData(); @@ -342,26 +349,28 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl variantConfig.setDependencies(configDependencies) - ProductionAppVariant productionAppVariant = addVariant(variantConfig, + // create the variant and get its internal storage object. + ApplicationVariantData productionAppVariant = createApplicationVariant(variantConfig, buildTypeData.assembleTask, configDependencies) - variants.add(productionAppVariant) + variantDataList.add(productionAppVariant) if (buildTypeData == testData) { - testedVariant = productionAppVariant + testedVariantData = productionAppVariant } else { - // add this non-tested variant to the list - DefaultBuildVariant buildVariant = instantiator.newInstance( - DefaultBuildVariant.class, productionAppVariant) - extension.buildVariants.add(buildVariant) + // create the API object for this variant. + ApplicationVariant applicationVariant = instantiator.newInstance( + ApplicationVariantImpl.class, productionAppVariant) + extension.addApplicationVariant(applicationVariant) } } - assert testedVariant != null + assert testedVariantData != null def testVariantConfig = new VariantConfiguration( defaultConfigData.productFlavor, defaultConfigData.testSourceSet, testData.buildType, null, - VariantConfiguration.Type.TEST, testedVariant.config, project.name) + VariantConfiguration.Type.TEST, testedVariantData.variantConfiguration, + project.name) // dependencies for the test variant List<ConfigurationDependencies> testConfigDependencies = [] @@ -369,17 +378,25 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl testVariantConfig.setDependencies(testConfigDependencies) - def testVariant = new TestAppVariant(testVariantConfig) - variants.add(testVariant) - createTestTasks(testVariant, testedVariant, testConfigDependencies, true /*mainTestTask*/) - - // add the test and tested variants to the list - DefaultBuildVariant testedBuildVariant = instantiator.newInstance( - DefaultBuildVariant.class, testVariant) - extension.testBuildVariants.add(testedBuildVariant) - DefaultBuildVariant buildVariant = instantiator.newInstance( - DefaultBuildVariant.class, testedVariant, testedBuildVariant) - extension.buildVariants.add(buildVariant) + // create the internal storage for this variant. + def testVariantData = new TestVariantData(testVariantConfig) + variantDataList.add(testVariantData) + createTestTasks(testVariantData, testedVariantData, testConfigDependencies, + true /*mainTestTask*/) + + // and now create the API objects for the test variant and the tested variant. + // first the tested variant. + ApplicationVariantImpl applicationVariant = instantiator.newInstance( + ApplicationVariantImpl.class, testedVariantData) + extension.applicationVariants.add(applicationVariant) + + // now the test variant + TestVariant testVariant = instantiator.newInstance( + TestVariantImpl.class, testVariantData, applicationVariant) + extension.addTestVariant(testVariant) + + // finally wire the test variant inside the tested variant + applicationVariant.setTestVariant(testVariant) } /** @@ -394,7 +411,7 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl throw new RuntimeException("Test Build Type '$extension.testBuildType' does not exist.") } - ProductionAppVariant testedVariant = null + ApplicationVariantData testedVariantData = null // assembleTask for this flavor(group) def assembleTask @@ -406,7 +423,7 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl List<ConfigurationDependencies> configDependencies = [] configDependencies.add(buildTypeData) - def variantConfig = new VariantConfiguration( + VariantConfiguration variantConfig = new VariantConfiguration( extension.defaultConfig, getDefaultConfigData().sourceSet, buildTypeData.buildType, buildTypeData.sourceSet, project.name) @@ -420,9 +437,10 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl variantConfig.setDependencies(configDependencies) - ProductionAppVariant productionAppVariant = addVariant(variantConfig, null, - configDependencies) - variants.add(productionAppVariant) + // create the variant and get its internal storage object. + ApplicationVariantData productionAppVariant = createApplicationVariant(variantConfig, + null, configDependencies) + variantDataList.add(productionAppVariant) buildTypeData.assembleTask.dependsOn productionAppVariant.assembleTask @@ -434,21 +452,22 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl assembleTask.dependsOn productionAppVariant.assembleTask if (buildTypeData == testData) { - testedVariant = productionAppVariant + testedVariantData = productionAppVariant } else { - // add this non-tested variant to the list - DefaultBuildVariant buildVariant = instantiator.newInstance( - DefaultBuildVariant.class, productionAppVariant) - extension.buildVariants.add(buildVariant) + // create the API object for this variant. + ApplicationVariant applicationVariant = instantiator.newInstance( + ApplicationVariantImpl.class, productionAppVariant) + extension.addApplicationVariant(applicationVariant) } } - assert testedVariant != null + assert testedVariantData != null - def testVariantConfig = new VariantConfiguration( + VariantConfiguration testVariantConfig = new VariantConfiguration( extension.defaultConfig, getDefaultConfigData().testSourceSet, testData.buildType, null, - VariantConfiguration.Type.TEST, testedVariant.config, project.name) + VariantConfiguration.Type.TEST, + testedVariantData.variantConfiguration, project.name) /// add the container of dependencies // the order of the libraries is important. In descending order: @@ -465,25 +484,31 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl testVariantConfig.setDependencies(testConfigDependencies) - def testVariant = new TestAppVariant(testVariantConfig) - variants.add(testVariant) - AndroidTestTask testFlavorTask = createTestTasks(testVariant, testedVariant, + // create the internal storage for this variant. + TestVariantData testVariantData = new TestVariantData(testVariantConfig) + variantDataList.add(testVariantData) + AndroidTestTask testFlavorTask = createTestTasks(testVariantData, testedVariantData, testConfigDependencies, false /*mainTestTask*/) testTask.addTask(testFlavorTask) - // add the test and tested variants to the list - DefaultBuildVariant testedBuildVariant = instantiator.newInstance( - DefaultBuildVariant.class, testVariant) - extension.testBuildVariants.add(testedBuildVariant) - DefaultBuildVariant buildVariant = instantiator.newInstance( - DefaultBuildVariant.class, testedVariant, testedBuildVariant) - extension.buildVariants.add(buildVariant) + // and now create the API objects for the test variant and the tested variant. + // first the tested variant. + ApplicationVariantImpl applicationVariant = instantiator.newInstance( + ApplicationVariantImpl.class, testedVariantData) + extension.applicationVariants.add(applicationVariant) + + // now the test variant + TestVariant testVariant = instantiator.newInstance( + TestVariantImpl.class, testVariantData, applicationVariant) + extension.addTestVariant(testVariant) + // finally wire the test variant inside the tested variant + applicationVariant.setTestVariant(testVariant) } private Task createAssembleTask(ProductFlavorData[] flavorDataList) { - def name = ProductFlavorData.getFlavoredName(flavorDataList, true) + String name = ProductFlavorData.getFlavoredName(flavorDataList, true) def assembleTask = project.tasks.add("assemble${name}") assembleTask.description = "Assembles all builds for flavor ${name}" @@ -493,16 +518,19 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl } /** - * Creates build tasks for a given variant. - * @param variantConfig + * Creates an ApplicationVariantData and its tasks for a given variant configuration. + * @param variantConfig the non-null variant configuration. * @param assembleTask an optional assembleTask to be used. If null, a new one is created. + * @param configDependencies a non null list of dependencies for this variant. * @return */ - private ProductionAppVariant addVariant(VariantConfiguration variantConfig, - Task assembleTask, - List<ConfigurationDependencies> configDependencies) { + @NonNull + private ApplicationVariantData createApplicationVariant( + @NonNull VariantConfiguration variantConfig, + @Nullable Task assembleTask, + @NonNull List<ConfigurationDependencies> configDependencies) { - def variant = new ProductionAppVariant(variantConfig) + ApplicationVariantData variant = new ApplicationVariantData(variantConfig) createPrepareDependenciesTask(variant, configDependencies) diff --git a/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy b/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy index fd220d8..47a92ac 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy @@ -15,6 +15,8 @@ */ package com.android.build.gradle +import com.android.build.gradle.api.AndroidSourceSet +import com.android.build.gradle.api.TestVariant import com.android.build.gradle.internal.CompileOptions import com.android.build.gradle.internal.dsl.AaptOptionsImpl import com.android.build.gradle.internal.dsl.AndroidSourceSetFactory @@ -31,6 +33,7 @@ import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.internal.DefaultDomainObjectSet import org.gradle.api.internal.project.ProjectInternal import org.gradle.internal.reflect.Instantiator + /** * Base android extension for all android plugins. */ @@ -46,11 +49,9 @@ public abstract class BaseExtension { final CompileOptions compileOptions - private final BasePlugin plugin - private final DefaultDomainObjectSet<BuildVariant> buildVariants = - new DefaultDomainObjectSet<BuildVariant>(BuildVariant.class) - private final DefaultDomainObjectSet<BuildVariant> testBuildVariants = - new DefaultDomainObjectSet<BuildVariant>(BuildVariant.class) + protected final BasePlugin plugin + private final DefaultDomainObjectSet<TestVariant> testVariantList = + new DefaultDomainObjectSet<TestVariant>(TestVariant.class) /** * The source sets container. @@ -149,14 +150,13 @@ public abstract class BaseExtension { action.execute(testOptions) } - public DefaultDomainObjectSet<BuildVariant> getBuildVariants() { + public DefaultDomainObjectSet<TestVariant> getTestVariants() { plugin.createAndroidTasks() - return buildVariants + return testVariantList } - public DefaultDomainObjectSet<BuildVariant> getTestBuildVariants() { - plugin.createAndroidTasks() - return testBuildVariants + void addTestVariant(TestVariant testVariant) { + testVariantList.add(testVariant) } public String getCompileSdkVersion() { diff --git a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy index 1b8b50a..e0138a7 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy @@ -14,14 +14,13 @@ * limitations under the License. */ package com.android.build.gradle + import com.android.SdkConstants import com.android.annotations.NonNull -import com.android.build.gradle.internal.ApplicationVariant +import com.android.build.gradle.api.AndroidSourceSet import com.android.build.gradle.internal.BadPluginException import com.android.build.gradle.internal.LoggerWrapper import com.android.build.gradle.internal.ProductFlavorData -import com.android.build.gradle.internal.ProductionAppVariant -import com.android.build.gradle.internal.TestAppVariant import com.android.build.gradle.internal.dependency.AndroidDependencyImpl import com.android.build.gradle.internal.dependency.ConfigurationDependencies import com.android.build.gradle.internal.dependency.DependencyChecker @@ -39,6 +38,9 @@ import com.android.build.gradle.internal.tasks.TestFlavorTask import com.android.build.gradle.internal.tasks.TestLibraryTask import com.android.build.gradle.internal.tasks.UninstallTask import com.android.build.gradle.internal.tasks.ValidateSigningTask +import com.android.build.gradle.internal.variant.ApkVariantData +import com.android.build.gradle.internal.variant.BaseVariantData +import com.android.build.gradle.internal.variant.TestVariantData import com.android.build.gradle.tasks.AidlCompile import com.android.build.gradle.tasks.Dex import com.android.build.gradle.tasks.GenerateBuildConfig @@ -51,19 +53,21 @@ import com.android.build.gradle.tasks.ProcessTestManifest import com.android.build.gradle.tasks.RenderscriptCompile import com.android.build.gradle.tasks.ZipAlign import com.android.builder.AndroidBuilder +import com.android.builder.DefaultProductFlavor import com.android.builder.DefaultSdkParser import com.android.builder.PlatformSdkParser -import com.android.builder.DefaultProductFlavor import com.android.builder.SdkParser -import com.android.builder.model.SourceProvider import com.android.builder.VariantConfiguration import com.android.builder.dependency.AndroidDependency import com.android.builder.dependency.JarDependency +import com.android.builder.model.ProductFlavor +import com.android.builder.model.SourceProvider import com.android.builder.signing.SigningConfig import com.android.sdklib.repository.FullRevision import com.android.utils.ILogger import com.google.common.collect.ArrayListMultimap import com.google.common.collect.Lists +import com.google.common.collect.Maps import com.google.common.collect.Multimap import org.gradle.api.GradleException import org.gradle.api.NamedDomainObjectContainer @@ -93,6 +97,7 @@ import static com.android.builder.BuilderConstants.INSTRUMENTATION_RESULTS import static com.android.builder.BuilderConstants.INSTRUMENTATION_TEST import static com.android.builder.BuilderConstants.INSTRUMENTATION_TESTS import static com.android.builder.BuilderConstants.REPORTS + /** * Base class for all Android plugins */ @@ -107,9 +112,9 @@ public abstract class BasePlugin { protected Instantiator instantiator private ToolingModelBuilderRegistry registry - private final Map<Object, AndroidBuilder> builders = [:] + private final Map<Object, AndroidBuilder> builders = Maps.newIdentityHashMap() - final List<ApplicationVariant> variants = [] + final List<BaseVariantData> variantDataList = [] final Map<AndroidDependencyImpl, PrepareLibraryTask> prepareTaskMap = [:] final Map<SigningConfig, ValidateSigningTask> validateSigningTaskMap = [:] @@ -228,8 +233,8 @@ public abstract class BasePlugin { return project.logger.isEnabled(LogLevel.DEBUG) } - AndroidBuilder getAndroidBuilder(ApplicationVariant variant) { - AndroidBuilder androidBuilder = builders.get(variant) + AndroidBuilder getAndroidBuilder(BaseVariantData variantData) { + AndroidBuilder androidBuilder = builders.get(variantData) if (androidBuilder == null) { String target = androidExtension.getCompileSdkVersion() @@ -246,7 +251,7 @@ public abstract class BasePlugin { sdkParser.initParser(target, buildToolsRevision, logger) androidBuilder = new AndroidBuilder(sdkParser, logger, verbose) - builders.put(variant, androidBuilder) + builders.put(variantData, androidBuilder) } return androidBuilder @@ -307,24 +312,24 @@ public abstract class BasePlugin { } } - protected String getRuntimeJars(ApplicationVariant variant) { - AndroidBuilder androidBuilder = getAndroidBuilder(variant) + protected String getRuntimeJars(BaseVariantData variantData) { + AndroidBuilder androidBuilder = getAndroidBuilder(variantData) return androidBuilder.runtimeClasspath.join(File.pathSeparator) } - protected void createProcessManifestTask(ApplicationVariant variant, + protected void createProcessManifestTask(BaseVariantData variantData, String manifestOurDir) { - def processManifestTask = project.tasks.add("process${variant.name}Manifest", + def processManifestTask = project.tasks.add("process${variantData.name}Manifest", ProcessAppManifest) - variant.processManifestTask = processManifestTask - processManifestTask.dependsOn variant.prepareDependenciesTask + variantData.processManifestTask = processManifestTask + processManifestTask.dependsOn variantData.prepareDependenciesTask processManifestTask.plugin = this - processManifestTask.variant = variant + processManifestTask.variant = variantData - VariantConfiguration config = variant.config - DefaultProductFlavor mergedFlavor = config.mergedFlavor + VariantConfiguration config = variantData.variantConfiguration + ProductFlavor mergedFlavor = config.mergedFlavor processManifestTask.conventionMapping.mainManifest = { config.mainManifest @@ -352,21 +357,21 @@ public abstract class BasePlugin { } processManifestTask.conventionMapping.manifestOutputFile = { project.file( - "$project.buildDir/${manifestOurDir}/$variant.dirName/AndroidManifest.xml") + "$project.buildDir/${manifestOurDir}/$variantData.dirName/AndroidManifest.xml") } } - protected void createProcessTestManifestTask(ApplicationVariant variant, + protected void createProcessTestManifestTask(BaseVariantData variantData, String manifestOurDir) { - def processTestManifestTask = project.tasks.add("process${variant.name}TestManifest", + def processTestManifestTask = project.tasks.add("process${variantData.name}TestManifest", ProcessTestManifest) - variant.processManifestTask = processTestManifestTask - processTestManifestTask.dependsOn variant.prepareDependenciesTask + variantData.processManifestTask = processTestManifestTask + processTestManifestTask.dependsOn variantData.prepareDependenciesTask processTestManifestTask.plugin = this - processTestManifestTask.variant = variant + processTestManifestTask.variant = variantData - VariantConfiguration config = variant.config + VariantConfiguration config = variantData.variantConfiguration processTestManifestTask.conventionMapping.testPackageName = { config.packageName @@ -385,20 +390,20 @@ public abstract class BasePlugin { } processTestManifestTask.conventionMapping.manifestOutputFile = { project.file( - "$project.buildDir/${manifestOurDir}/$variant.dirName/AndroidManifest.xml") + "$project.buildDir/${manifestOurDir}/$variantData.dirName/AndroidManifest.xml") } } - protected void createRenderscriptTask(ApplicationVariant variant) { - VariantConfiguration config = variant.config + protected void createRenderscriptTask(BaseVariantData variantData) { + VariantConfiguration config = variantData.variantConfiguration - def renderscriptTask = project.tasks.add("compile${variant.name}Renderscript", + def renderscriptTask = project.tasks.add("compile${variantData.name}Renderscript", RenderscriptCompile) - variant.renderscriptCompileTask = renderscriptTask + variantData.renderscriptCompileTask = renderscriptTask - renderscriptTask.dependsOn variant.prepareDependenciesTask + renderscriptTask.dependsOn variantData.prepareDependenciesTask renderscriptTask.plugin = this - renderscriptTask.variant = variant + renderscriptTask.variant = variantData renderscriptTask.targetApi = config.mergedFlavor.renderscriptTargetApi renderscriptTask.debugBuild = config.buildType.renderscriptDebugBuild @@ -408,201 +413,209 @@ public abstract class BasePlugin { renderscriptTask.conventionMapping.importDirs = { config.renderscriptImports } renderscriptTask.conventionMapping.sourceOutputDir = { - project.file("$project.buildDir/source/rs/$variant.dirName") + project.file("$project.buildDir/source/rs/$variantData.dirName") } renderscriptTask.conventionMapping.resOutputDir = { - project.file("$project.buildDir/res/rs/$variant.dirName") + project.file("$project.buildDir/res/rs/$variantData.dirName") } } - protected void createMergeResourcesTask(ApplicationVariant variant, boolean process9Patch) { - createMergeResourcesTask(variant, "$project.buildDir/res/all/$variant.dirName", + protected void createMergeResourcesTask(BaseVariantData variantData, boolean process9Patch) { + createMergeResourcesTask(variantData, "$project.buildDir/res/all/$variantData.dirName", process9Patch) } - protected void createMergeResourcesTask(ApplicationVariant variant, String location, + protected void createMergeResourcesTask(BaseVariantData variantData, String location, boolean process9Patch) { - def mergeResourcesTask = project.tasks.add("merge${variant.name}Resources", MergeResources) - variant.mergeResourcesTask = mergeResourcesTask + def mergeResourcesTask = project.tasks.add("merge${variantData.name}Resources", + MergeResources) + variantData.mergeResourcesTask = mergeResourcesTask - mergeResourcesTask.dependsOn variant.prepareDependenciesTask, variant.renderscriptCompileTask + mergeResourcesTask.dependsOn variantData.prepareDependenciesTask, variantData.renderscriptCompileTask mergeResourcesTask.plugin = this - mergeResourcesTask.variant = variant + mergeResourcesTask.variant = variantData mergeResourcesTask.incrementalFolder = - project.file("$project.buildDir/incremental/mergeResources/$variant.dirName") + project.file("$project.buildDir/incremental/mergeResources/$variantData.dirName") mergeResourcesTask.process9Patch = process9Patch mergeResourcesTask.conventionMapping.inputResourceSets = { - variant.config.getResourceSets(variant.renderscriptCompileTask.getResOutputDir()) + variantData.variantConfiguration.getResourceSets( + variantData.renderscriptCompileTask.getResOutputDir()) } mergeResourcesTask.conventionMapping.outputDir = { project.file(location) } } - protected void createMergeAssetsTask(ApplicationVariant variant, String location) { + protected void createMergeAssetsTask(BaseVariantData variantData, String location) { if (location == null) { - location = "$project.buildDir/assets/$variant.dirName" + location = "$project.buildDir/assets/$variantData.dirName" } - def mergeAssetsTask = project.tasks.add("merge${variant.name}Assets", MergeAssets) - variant.mergeAssetsTask = mergeAssetsTask + def mergeAssetsTask = project.tasks.add("merge${variantData.name}Assets", MergeAssets) + variantData.mergeAssetsTask = mergeAssetsTask - mergeAssetsTask.dependsOn variant.prepareDependenciesTask + mergeAssetsTask.dependsOn variantData.prepareDependenciesTask mergeAssetsTask.plugin = this - mergeAssetsTask.variant = variant + mergeAssetsTask.variant = variantData mergeAssetsTask.incrementalFolder = - project.file("$project.buildDir/incremental/mergeAssets/$variant.dirName") + project.file("$project.buildDir/incremental/mergeAssets/$variantData.dirName") - mergeAssetsTask.conventionMapping.inputAssetSets = { variant.config.assetSets } + mergeAssetsTask.conventionMapping.inputAssetSets = { + variantData.variantConfiguration.assetSets + } mergeAssetsTask.conventionMapping.outputDir = { project.file(location) } } - protected void createBuildConfigTask(ApplicationVariant variant) { + protected void createBuildConfigTask(BaseVariantData variantData) { def generateBuildConfigTask = project.tasks.add( - "generate${variant.name}BuildConfig", GenerateBuildConfig) - variant.generateBuildConfigTask = generateBuildConfigTask - if (variant.config.type == VariantConfiguration.Type.TEST) { + "generate${variantData.name}BuildConfig", GenerateBuildConfig) + variantData.generateBuildConfigTask = generateBuildConfigTask + + VariantConfiguration variantConfiguration = variantData.variantConfiguration + + if (variantConfiguration.type == VariantConfiguration.Type.TEST) { // in case of a test project, the manifest is generated so we need to depend // on its creation. - generateBuildConfigTask.dependsOn variant.processManifestTask + generateBuildConfigTask.dependsOn variantData.processManifestTask } generateBuildConfigTask.plugin = this - generateBuildConfigTask.variant = variant + generateBuildConfigTask.variant = variantData generateBuildConfigTask.conventionMapping.packageName = { - variant.config.originalPackageName + variantConfiguration.originalPackageName } generateBuildConfigTask.conventionMapping.debuggable = { - variant.config.buildType.isDebuggable() + variantConfiguration.buildType.isDebuggable() } generateBuildConfigTask.conventionMapping.javaLines = { - variant.config.buildConfigLines + variantConfiguration.buildConfigLines } generateBuildConfigTask.conventionMapping.sourceOutputDir = { - project.file("$project.buildDir/source/buildConfig/${variant.dirName}") + project.file("$project.buildDir/source/buildConfig/${variantData.dirName}") } } - protected void createProcessResTask(ApplicationVariant variant) { - createProcessResTask(variant, "$project.buildDir/symbols/$variant.dirName") + protected void createProcessResTask(BaseVariantData variantData) { + createProcessResTask(variantData, "$project.buildDir/symbols/$variantData.dirName") } - protected void createProcessResTask(ApplicationVariant variant, final String symbolLocation) { - def processResources = project.tasks.add("process${variant.name}Resources", + protected void createProcessResTask(BaseVariantData variantData, final String symbolLocation) { + def processResources = project.tasks.add("process${variantData.name}Resources", ProcessAndroidResources) - variant.processResourcesTask = processResources - processResources.dependsOn variant.processManifestTask, variant.mergeResourcesTask, variant.mergeAssetsTask + variantData.processResourcesTask = processResources + processResources.dependsOn variantData.processManifestTask, variantData.mergeResourcesTask, variantData.mergeAssetsTask processResources.plugin = this - processResources.variant = variant + processResources.variant = variantData - VariantConfiguration config = variant.config + VariantConfiguration variantConfiguration = variantData.variantConfiguration processResources.conventionMapping.manifestFile = { - variant.processManifestTask.manifestOutputFile + variantData.processManifestTask.manifestOutputFile } processResources.conventionMapping.resDir = { - variant.mergeResourcesTask.outputDir + variantData.mergeResourcesTask.outputDir } processResources.conventionMapping.assetsDir = { - variant.mergeAssetsTask.outputDir + variantData.mergeAssetsTask.outputDir } processResources.conventionMapping.libraries = { - getTextSymbolDependencies(config.allLibraries) + getTextSymbolDependencies(variantConfiguration.allLibraries) } processResources.conventionMapping.packageForR = { - config.originalPackageName + variantConfiguration.originalPackageName } // TODO: unify with generateBuilderConfig, compileAidl, and library packaging somehow? processResources.conventionMapping.sourceOutputDir = { - project.file("$project.buildDir/source/r/$variant.dirName") + project.file("$project.buildDir/source/r/$variantData.dirName") } processResources.conventionMapping.textSymbolOutputDir = { project.file(symbolLocation) } processResources.conventionMapping.packageOutputFile = { project.file( - "$project.buildDir/libs/${project.archivesBaseName}-${variant.baseName}.ap_") + "$project.buildDir/libs/${project.archivesBaseName}-${variantData.baseName}.ap_") } - if (variant.runProguard) { + if (variantData.runProguard) { processResources.conventionMapping.proguardOutputFile = { - project.file("$project.buildDir/proguard/${variant.dirName}/rules.txt") + project.file("$project.buildDir/proguard/${variantData.dirName}/rules.txt") } } - processResources.conventionMapping.type = { config.type } - processResources.conventionMapping.debuggable = { config.buildType.debuggable } + processResources.conventionMapping.type = { variantConfiguration.type } + processResources.conventionMapping.debuggable = { variantConfiguration.buildType.debuggable } processResources.conventionMapping.aaptOptions = { extension.aaptOptions } } - protected void createProcessJavaResTask(ApplicationVariant variant) { - VariantConfiguration config = variant.config + protected void createProcessJavaResTask(BaseVariantData variantData) { + VariantConfiguration variantConfiguration = variantData.variantConfiguration - Copy processResources = project.tasks.add("process${variant.name}JavaRes", + Copy processResources = project.tasks.add("process${variantData.name}JavaRes", ProcessResources); - variant.processJavaResources = processResources + variantData.processJavaResources = processResources // set the input - processResources.from(((AndroidSourceSet) config.defaultSourceSet).resources) + processResources.from(((AndroidSourceSet) variantConfiguration.defaultSourceSet).resources) - if (config.getType() != VariantConfiguration.Type.TEST) { - processResources.from(((AndroidSourceSet) config.buildTypeSourceSet).resources) + if (variantConfiguration.type != VariantConfiguration.Type.TEST) { + processResources.from( + ((AndroidSourceSet) variantConfiguration.buildTypeSourceSet).resources) } - if (config.hasFlavors()) { - for (SourceProvider flavorSourceSet : config.flavorSourceSets) { + if (variantConfiguration.hasFlavors()) { + for (SourceProvider flavorSourceSet : variantConfiguration.flavorSourceSets) { processResources.from(((AndroidSourceSet) flavorSourceSet).resources) } } processResources.conventionMapping.destinationDir = { - project.file("$project.buildDir/javaResources/$variant.dirName") + project.file("$project.buildDir/javaResources/$variantData.dirName") } } - protected void createAidlTask(ApplicationVariant variant) { - VariantConfiguration config = variant.config + protected void createAidlTask(BaseVariantData variantData) { + VariantConfiguration variantConfiguration = variantData.variantConfiguration - def compileTask = project.tasks.add("compile${variant.name}Aidl", AidlCompile) - variant.aidlCompileTask = compileTask - variant.aidlCompileTask.dependsOn variant.prepareDependenciesTask + def compileTask = project.tasks.add("compile${variantData.name}Aidl", AidlCompile) + variantData.aidlCompileTask = compileTask + variantData.aidlCompileTask.dependsOn variantData.prepareDependenciesTask compileTask.plugin = this - compileTask.variant = variant + compileTask.variant = variantData compileTask.incrementalFolder = - project.file("$project.buildDir/incremental/aidl/$variant.dirName") + project.file("$project.buildDir/incremental/aidl/$variantData.dirName") - compileTask.conventionMapping.sourceDirs = { config.aidlSourceList } - compileTask.conventionMapping.importDirs = { config.aidlImports } + compileTask.conventionMapping.sourceDirs = { variantConfiguration.aidlSourceList } + compileTask.conventionMapping.importDirs = { variantConfiguration.aidlImports } compileTask.conventionMapping.sourceOutputDir = { - project.file("$project.buildDir/source/aidl/$variant.dirName") + project.file("$project.buildDir/source/aidl/$variantData.dirName") } } - protected void createCompileTask(ApplicationVariant variant, - ApplicationVariant testedVariant) { - def compileTask = project.tasks.add("compile${variant.name}", JavaCompile) - variant.javaCompileTask = compileTask - compileTask.dependsOn variant.processResourcesTask, variant.generateBuildConfigTask, variant.aidlCompileTask + protected void createCompileTask(BaseVariantData variantData, + BaseVariantData testedVariantData) { + def compileTask = project.tasks.add("compile${variantData.name}", JavaCompile) + variantData.javaCompileTask = compileTask + compileTask.dependsOn variantData.processResourcesTask, variantData.generateBuildConfigTask, variantData.aidlCompileTask - VariantConfiguration config = variant.config + VariantConfiguration config = variantData.variantConfiguration List<Object> sourceList = new ArrayList<Object>(); sourceList.add(((AndroidSourceSet) config.defaultSourceSet).java) - sourceList.add({ variant.processResourcesTask.sourceOutputDir }) - sourceList.add({ variant.generateBuildConfigTask.sourceOutputDir }) - sourceList.add({ variant.aidlCompileTask.sourceOutputDir }) - sourceList.add({ variant.renderscriptCompileTask.sourceOutputDir }) + sourceList.add({ variantData.processResourcesTask.sourceOutputDir }) + sourceList.add({ variantData.generateBuildConfigTask.sourceOutputDir }) + sourceList.add({ variantData.aidlCompileTask.sourceOutputDir }) + sourceList.add({ variantData.renderscriptCompileTask.sourceOutputDir }) if (config.getType() != VariantConfiguration.Type.TEST) { sourceList.add(((AndroidSourceSet) config.buildTypeSourceSet).java) @@ -614,8 +627,8 @@ public abstract class BasePlugin { } compileTask.source = sourceList.toArray() - if (testedVariant != null) { - compileTask.classpath = project.files({config.compileClasspath}) + testedVariant.javaCompileTask.classpath + testedVariant.javaCompileTask.outputs.files + if (testedVariantData != null) { + compileTask.classpath = project.files({config.compileClasspath}) + testedVariantData.javaCompileTask.classpath + testedVariantData.javaCompileTask.outputs.files } else { compileTask.classpath = project.files({config.compileClasspath}) } @@ -625,10 +638,10 @@ public abstract class BasePlugin { compileTask.dependsOn project.configurations.compile.buildDependencies compileTask.conventionMapping.destinationDir = { - project.file("$project.buildDir/classes/$variant.dirName") + project.file("$project.buildDir/classes/$variantData.dirName") } compileTask.conventionMapping.dependencyCacheDir = { - project.file("$project.buildDir/dependency-cache/$variant.dirName") + project.file("$project.buildDir/dependency-cache/$variantData.dirName") } // set source/target compatibility @@ -642,7 +655,7 @@ public abstract class BasePlugin { // setup the boot classpath just before the task actually runs since this will // force the sdk to be parsed. compileTask.doFirst { - compileTask.options.bootClasspath = getRuntimeJars(variant) + compileTask.options.bootClasspath = getRuntimeJars(variantData) } } @@ -659,87 +672,87 @@ public abstract class BasePlugin { * @param mainTestTask whether the main task is a main test task. * @return the test task. */ - protected AndroidTestTask createTestTasks(TestAppVariant variant, - ProductionAppVariant testedVariant, + protected AndroidTestTask createTestTasks(@NonNull TestVariantData variantData, + @NonNull BaseVariantData testedVariantData, List<ConfigurationDependencies> configDependencies, boolean mainTestTask) { // The test app is signed with the same info as the tested app so there's no need // to test both. - if (!testedVariant.isSigned()) { + if (!variantData.isSigned()) { throw new GradleException("Tested Variant '${testedVariant.name}' is not configured to create a signed APK.") } - createPrepareDependenciesTask(variant, configDependencies) + createPrepareDependenciesTask(variantData, configDependencies) // Add a task to process the manifest - createProcessTestManifestTask(variant, "manifests") + createProcessTestManifestTask(variantData, "manifests") // Add a task to compile renderscript files. - createRenderscriptTask(variant) + createRenderscriptTask(variantData) // Add a task to merge the resource folders - createMergeResourcesTask(variant, true /*process9Patch*/) + createMergeResourcesTask(variantData, true /*process9Patch*/) // Add a task to merge the assets folders - createMergeAssetsTask(variant, null /*default location*/) + createMergeAssetsTask(variantData, null /*default location*/) - if (testedVariant.config.type == VariantConfiguration.Type.LIBRARY) { + if (testedVariantData.variantConfiguration.type == VariantConfiguration.Type.LIBRARY) { // in this case the tested library must be fully built before test can be built! - if (testedVariant.assembleTask != null) { - variant.processManifestTask.dependsOn testedVariant.assembleTask - variant.mergeResourcesTask.dependsOn testedVariant.assembleTask + if (testedVariantData.assembleTask != null) { + variantData.processManifestTask.dependsOn testedVariantData.assembleTask + variantData.mergeResourcesTask.dependsOn testedVariantData.assembleTask } } // Add a task to create the BuildConfig class - createBuildConfigTask(variant) + createBuildConfigTask(variantData) // Add a task to generate resource source files - createProcessResTask(variant) + createProcessResTask(variantData) // process java resources - createProcessJavaResTask(variant) + createProcessJavaResTask(variantData) - createAidlTask(variant) + createAidlTask(variantData) // Add a task to compile the test application - createCompileTask(variant, testedVariant) + createCompileTask(variantData, testedVariantData) - addPackageTasks(variant, null) + addPackageTasks(variantData, null) if (assembleTest != null) { - assembleTest.dependsOn variant.assembleTask + assembleTest.dependsOn variantData.assembleTask } // create the check task for this test def testFlavorTask = project.tasks.add( - mainTestTask ? INSTRUMENTATION_TEST : "$INSTRUMENTATION_TEST${testedVariant.name}", + mainTestTask ? INSTRUMENTATION_TEST : "$INSTRUMENTATION_TEST${testedVariantData.name}", mainTestTask ? TestLibraryTask : TestFlavorTask) - testFlavorTask.description = "Installs and runs the tests for Build ${testedVariant.name}." + testFlavorTask.description = "Installs and runs the tests for Build ${testedVariantData.name}." testFlavorTask.group = JavaBasePlugin.VERIFICATION_GROUP - testFlavorTask.dependsOn testedVariant.assembleTask, variant.assembleTask + testFlavorTask.dependsOn testedVariantData.assembleTask, variantData.assembleTask if (mainTestTask) { deviceCheck.dependsOn testFlavorTask } testFlavorTask.plugin = this - testFlavorTask.variant = variant - testFlavorTask.testedVariant = testedVariant - testFlavorTask.flavorName = variant.flavorName + testFlavorTask.variant = variantData + testFlavorTask.testedVariantData = testedVariantData + testFlavorTask.flavorName = variantData.flavorName testFlavorTask.conventionMapping.adbExe = { androidSdkParser.adb } - testFlavorTask.conventionMapping.testApp = { variant.outputFile } - if (testedVariant.config.type != VariantConfiguration.Type.LIBRARY) { - testFlavorTask.conventionMapping.testedApp = { testedVariant.outputFile } + testFlavorTask.conventionMapping.testApp = { variantData.outputFile } + if (testedVariantData.variantConfiguration.type != VariantConfiguration.Type.LIBRARY) { + testFlavorTask.conventionMapping.testedApp = { testedVariantData.outputFile } } testFlavorTask.conventionMapping.resultsDir = { String rootLocation = extension.testOptions.resultsDir != null ? extension.testOptions.resultsDir : "$project.buildDir/$INSTRUMENTATION_RESULTS" - String flavorFolder = variant.flavorDirName + String flavorFolder = variantData.flavorDirName if (!flavorFolder.isEmpty()) { flavorFolder = "$FLAVORS/" + flavorFolder } @@ -750,61 +763,63 @@ public abstract class BasePlugin { String rootLocation = extension.testOptions.reportDir != null ? extension.testOptions.reportDir : "$project.buildDir/$REPORTS/$INSTRUMENTATION_TESTS" - String flavorFolder = variant.flavorDirName + String flavorFolder = variantData.flavorDirName if (!flavorFolder.isEmpty()) { flavorFolder = "$FLAVORS/" + flavorFolder } project.file("$rootLocation/$flavorFolder") } - variant.testFlavorTask = testFlavorTask + variantData.testFlavorTask = testFlavorTask return testFlavorTask } /** * Creates the packaging tasks for the given Variant. - * @param variant the variant. + * @param variantData the variant data. * @param assembleTask an optional assembleTask to be used. If null a new one is created. The * assembleTask is always set in the Variant. */ - protected void addPackageTasks(ApplicationVariant variant, Task assembleTask) { + protected void addPackageTasks(ApkVariantData variantData, Task assembleTask) { // Add a dex task - def dexTaskName = "dex${variant.name}" + def dexTaskName = "dex${variantData.name}" def dexTask = project.tasks.add(dexTaskName, Dex) - variant.dexTask = dexTask - dexTask.dependsOn variant.javaCompileTask + variantData.dexTask = dexTask + dexTask.dependsOn variantData.javaCompileTask dexTask.plugin = this - dexTask.variant = variant + dexTask.variant = variantData dexTask.incrementalFolder = - project.file("$project.buildDir/incremental/dex/$variant.dirName") + project.file("$project.buildDir/incremental/dex/$variantData.dirName") - dexTask.conventionMapping.libraries = { project.files({ variant.config.packagedJars }) } - dexTask.conventionMapping.sourceFiles = { variant.javaCompileTask.outputs.files } // this creates a dependency + dexTask.conventionMapping.libraries = { project.files({ variantData.variantConfiguration.packagedJars }) } + dexTask.conventionMapping.sourceFiles = { variantData.javaCompileTask.outputs.files } // this creates a dependency dexTask.conventionMapping.outputFile = { project.file( - "${project.buildDir}/libs/${project.archivesBaseName}-${variant.baseName}.dex") + "${project.buildDir}/libs/${project.archivesBaseName}-${variantData.baseName}.dex") } dexTask.dexOptions = extension.dexOptions // Add a task to generate application package - def packageApp = project.tasks.add("package${variant.name}", PackageApplication) - variant.packageApplicationTask = packageApp - packageApp.dependsOn variant.processResourcesTask, dexTask, variant.processJavaResources + def packageApp = project.tasks.add("package${variantData.name}", PackageApplication) + variantData.packageApplicationTask = packageApp + packageApp.dependsOn variantData.processResourcesTask, dexTask, variantData.processJavaResources packageApp.plugin = this - packageApp.variant = variant + packageApp.variant = variantData - VariantConfiguration config = variant.config + VariantConfiguration config = variantData.variantConfiguration - packageApp.conventionMapping.resourceFile = { variant.processResourcesTask.packageOutputFile } + packageApp.conventionMapping.resourceFile = { + variantData.processResourcesTask.packageOutputFile + } packageApp.conventionMapping.dexFile = { dexTask.outputFile } packageApp.conventionMapping.packagedJars = { config.packagedJars } packageApp.conventionMapping.javaResourceDir = { - getOptionalDir(variant.processJavaResources.destinationDir) + getOptionalDir(variantData.processJavaResources.destinationDir) } packageApp.conventionMapping.jniDebugBuild = { config.buildType.jniDebugBuild } @@ -825,88 +840,89 @@ public abstract class BasePlugin { packageApp.dependsOn validateSigningTask } - def signedApk = variant.isSigned() + def signedApk = variantData.isSigned() def apkName = signedApk ? - "${project.archivesBaseName}-${variant.baseName}-unaligned.apk" : - "${project.archivesBaseName}-${variant.baseName}-unsigned.apk" + "${project.archivesBaseName}-${variantData.baseName}-unaligned.apk" : + "${project.archivesBaseName}-${variantData.baseName}-unsigned.apk" packageApp.conventionMapping.outputFile = { project.file("$project.buildDir/apk/${apkName}") } def appTask = packageApp - variant.outputFile = project.file("$project.buildDir/apk/${apkName}") + variantData.outputFile = project.file("$project.buildDir/apk/${apkName}") if (signedApk) { - if (variant.zipAlign) { + if (variantData.zipAlign) { // Add a task to zip align application package - def zipAlignTask = project.tasks.add("zipalign${variant.name}", ZipAlign) - variant.zipAlignTask = zipAlignTask + def zipAlignTask = project.tasks.add("zipalign${variantData.name}", ZipAlign) + variantData.zipAlignTask = zipAlignTask zipAlignTask.dependsOn packageApp zipAlignTask.conventionMapping.inputFile = { packageApp.outputFile } zipAlignTask.conventionMapping.outputFile = { project.file( - "$project.buildDir/apk/${project.archivesBaseName}-${variant.baseName}.apk") + "$project.buildDir/apk/${project.archivesBaseName}-${variantData.baseName}.apk") } zipAlignTask.conventionMapping.zipAlignExe = { androidSdkParser.zipAlign } appTask = zipAlignTask - variant.outputFile = project.file( - "$project.buildDir/apk/${project.archivesBaseName}-${variant.baseName}.apk") + variantData.outputFile = project.file( + "$project.buildDir/apk/${project.archivesBaseName}-${variantData.baseName}.apk") } // Add a task to install the application package - def installTask = project.tasks.add("install${variant.name}", InstallTask) - installTask.description = "Installs the " + variant.description + def installTask = project.tasks.add("install${variantData.name}", InstallTask) + installTask.description = "Installs the " + variantData.description installTask.group = INSTALL_GROUP installTask.dependsOn appTask installTask.conventionMapping.packageFile = { appTask.outputFile } installTask.conventionMapping.adbExe = { androidSdkParser.adb } - variant.installTask = installTask + variantData.installTask = installTask } // Add an assemble task if (assembleTask == null) { - assembleTask = project.tasks.add("assemble${variant.name}") - assembleTask.description = "Assembles the " + variant.description + assembleTask = project.tasks.add("assemble${variantData.name}") + assembleTask.description = "Assembles the " + variantData.description assembleTask.group = org.gradle.api.plugins.BasePlugin.BUILD_GROUP } assembleTask.dependsOn appTask - variant.assembleTask = assembleTask + variantData.assembleTask = assembleTask // add an uninstall task - def uninstallTask = project.tasks.add("uninstall${variant.name}", UninstallTask) - uninstallTask.description = "Uninstalls the " + variant.description + def uninstallTask = project.tasks.add("uninstall${variantData.name}", UninstallTask) + uninstallTask.description = "Uninstalls the " + variantData.description uninstallTask.group = INSTALL_GROUP - uninstallTask.variant = variant + uninstallTask.variant = variantData uninstallTask.conventionMapping.adbExe = { androidSdkParser.adb } - variant.uninstallTask = uninstallTask + variantData.uninstallTask = uninstallTask uninstallAll.dependsOn uninstallTask } private void createReportTasks() { def dependencyReportTask = project.tasks.add("androidDependencies", DependencyReportTask) dependencyReportTask.setDescription("Displays the Android dependencies of the project") - dependencyReportTask.setVariants(variants) + dependencyReportTask.setVariants(variantDataList) dependencyReportTask.setGroup("Android") def signingReportTask = project.tasks.add("signingReport", SigningReportTask) signingReportTask.setDescription("Displays the signing info for each variant") - signingReportTask.setVariants(variants) + signingReportTask.setVariants(variantDataList) signingReportTask.setGroup("Android") } - protected void createPrepareDependenciesTask(ApplicationVariant variant, - List<ConfigurationDependencies> configDependenciesList) { - def prepareDependenciesTask = project.tasks.add("prepare${variant.name}Dependencies", + protected void createPrepareDependenciesTask( + @NonNull BaseVariantData variantData, + @NonNull List<ConfigurationDependencies> configDependenciesList) { + def prepareDependenciesTask = project.tasks.add("prepare${variantData.name}Dependencies", PrepareDependenciesTask) - variant.prepareDependenciesTask = prepareDependenciesTask + variantData.prepareDependenciesTask = prepareDependenciesTask prepareDependenciesTask.plugin = this - prepareDependenciesTask.variant = variant + prepareDependenciesTask.variant = variantData // for all libraries required by the configurations of this variant, make this task // depend on all the tasks preparing these libraries. diff --git a/gradle/src/main/groovy/com/android/build/gradle/BuildVariant.groovy b/gradle/src/main/groovy/com/android/build/gradle/BuildVariant.groovy deleted file mode 100644 index 3ef4d61..0000000 --- a/gradle/src/main/groovy/com/android/build/gradle/BuildVariant.groovy +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (C) 2012 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 -import com.android.annotations.NonNull -import com.android.annotations.Nullable -import com.android.build.gradle.tasks.AidlCompile -import com.android.build.gradle.tasks.Dex -import com.android.build.gradle.tasks.GenerateBuildConfig -import com.android.build.gradle.tasks.MergeAssets -import com.android.build.gradle.tasks.MergeResources -import com.android.build.gradle.tasks.PackageApplication -import com.android.build.gradle.tasks.ProcessAndroidResources -import com.android.build.gradle.tasks.ProcessManifest -import com.android.build.gradle.tasks.RenderscriptCompile -import com.android.build.gradle.tasks.ZipAlign -import com.android.builder.DefaultBuildType -import com.android.builder.DefaultProductFlavor -import com.android.builder.signing.SigningConfig -import org.gradle.api.DefaultTask -import org.gradle.api.Task -import org.gradle.api.tasks.Copy -import org.gradle.api.tasks.bundling.Zip -import org.gradle.api.tasks.compile.JavaCompile -/** - * A Build variant and all its public data. - */ -public interface BuildVariant { - - /** - * Returns the name of the variant. Guaranteed to be unique. - */ - @NonNull - String getName() - - /** - * Returns a description for the build variant. - */ - @NonNull - String getDescription() - - /** - * Returns a subfolder name for the variant. Guaranteed to be unique. - * - * This is usually a mix of build type and flavor(s) (if applicable). - * For instance this could be: - * "debug" - * "debug/myflavor" - * "release/Flavor1Flavor2" - */ - @NonNull - String getDirName() - - /** - * Returns the base name for the output of the variant. Guaranteed to be unique. - */ - @NonNull - String getBaseName() - - /** - * Returns the {@link DefaultBuildType} for this build variant. - */ - @NonNull - DefaultBuildType getBuildType() - - /** - * Returns the list of {@link DefaultProductFlavor} for this build variant. - * - * This is always non-null but could be empty. - */ - @NonNull - List<DefaultProductFlavor> getProductFlavors() - - /** - * Returns a {@link DefaultProductFlavor} that represents the merging of the default config - * and the flavors of this build variant. - */ - @NonNull - DefaultProductFlavor getMergedFlavor() - - /** - * Returns the output file for this build variants. Depending on the configuration, this could - * be an apk (regular and test project) or a bundled library (library project). - * - * If it's an apk, it could be signed, or not; zip-aligned, or not. - */ - @NonNull - File getOutputFile() - - /** - * Returns the {@link SigningConfig} for this build variant, if one has been specified. - */ - @Nullable - SigningConfig getSigningConfig() - - /** - * Returns true if this variant has the information it needs to create a signed APK. - */ - boolean isSigningReady() - - /** - * Returns the build variant that will test this build variant. - * - * Will return null if this build variant is a test build already. - */ - @Nullable - BuildVariant getTestVariant() - - /** - * Returns the Manifest processing task. - */ - @NonNull - ProcessManifest getProcessManifest() - - /** - * Returns the AIDL compilation task. - */ - @NonNull - AidlCompile getAidlCompile() - - /** - * Returns the Renderscript compilation task. - */ - @NonNull - RenderscriptCompile getRenderscriptCompile() - - /** - * Returns the resource merging task. - */ - @Nullable - MergeResources getMergeResources() - - /** - * Returns the asset merging task. - */ - @Nullable - MergeAssets getMergeAssets() - - /** - * Returns the Android Resources processing task. - */ - @NonNull - ProcessAndroidResources getProcessResources() - - /** - * Returns the BuildConfig generation task. - */ - @Nullable - GenerateBuildConfig getGenerateBuildConfig() - - /** - * Returns the Java Compilation task. - */ - @NonNull - JavaCompile getJavaCompile() - - /** - * Returns the Java resource processing task. - */ - @NonNull - Copy getProcessJavaResources() - - /** - * Returns the Dex task. - */ - @Nullable - Dex getDex() - - /** - * Returns the APK packaging task. - */ - @Nullable - PackageApplication getPackageApplication() - - /** - * Returns the Zip align task. - */ - @Nullable - ZipAlign getZipAlign() - - /** - * Returns the Library AAR packaging task. - */ - @Nullable - Zip getPackageLibrary() - - /** - * Returns the assemble task. - */ - @Nullable - Task getAssemble() - - /** - * Returns the installation task. - * - * Even for variant for regular project, this can be null if the app cannot be signed. - */ - @Nullable - DefaultTask getInstall() - - /** - * Returns the uinstallation task. - * - * For non-library project this is always true even if the APK is not created because - * signing isn't setup. - */ - @Nullable - DefaultTask getUninstall() - - /** - * Returns the task to run the tests. - * Only valid for test project. - */ - @Nullable - DefaultTask getInstrumentTest() -} diff --git a/gradle/src/main/groovy/com/android/build/gradle/LibraryExtension.groovy b/gradle/src/main/groovy/com/android/build/gradle/LibraryExtension.groovy index e39ee45..12faa97 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/LibraryExtension.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/LibraryExtension.groovy @@ -15,15 +15,16 @@ */ package com.android.build.gradle +import com.android.build.gradle.api.LibraryVariant import com.android.build.gradle.internal.dsl.BuildTypeDsl import com.android.build.gradle.internal.dsl.SigningConfigDsl -import com.android.builder.DefaultBuildType import com.android.builder.BuilderConstants +import com.android.builder.DefaultBuildType import com.android.builder.signing.SigningConfig import org.gradle.api.Action +import org.gradle.api.internal.DefaultDomainObjectSet import org.gradle.api.internal.project.ProjectInternal import org.gradle.internal.reflect.Instantiator - /** * Extension for 'library' project. */ @@ -33,6 +34,9 @@ public class LibraryExtension extends BaseExtension { final DefaultBuildType release final SigningConfig debugSigningConfig + private final DefaultDomainObjectSet<LibraryVariant> libraryVariantList = + new DefaultDomainObjectSet<LibraryVariant>(LibraryVariant.class) + LibraryExtension(BasePlugin plugin, ProjectInternal project, Instantiator instantiator) { super(plugin, project, instantiator) @@ -57,4 +61,13 @@ public class LibraryExtension extends BaseExtension { void debugSigningConfig(Action<SigningConfig> action) { action.execute(debugSigningConfig) } + + public DefaultDomainObjectSet<LibraryVariant> getLibraryVariants() { + plugin.createAndroidTasks() + return libraryVariantList + } + + void addLibraryVariant(LibraryVariant libraryVariant) { + libraryVariantList.add(libraryVariant) + } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/LibraryPlugin.groovy b/gradle/src/main/groovy/com/android/build/gradle/LibraryPlugin.groovy index c4e5020..6f9d229 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/LibraryPlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/LibraryPlugin.groovy @@ -14,20 +14,24 @@ * limitations under the License. */ package com.android.build.gradle + import com.android.SdkConstants +import com.android.annotations.NonNull +import com.android.build.gradle.api.AndroidSourceSet import com.android.build.gradle.internal.BuildTypeData -import com.android.build.gradle.internal.DefaultBuildVariant import com.android.build.gradle.internal.ProductFlavorData -import com.android.build.gradle.internal.ProductionAppVariant -import com.android.build.gradle.internal.TestAppVariant +import com.android.build.gradle.internal.api.LibraryVariantImpl +import com.android.build.gradle.internal.api.TestVariantImpl import com.android.build.gradle.internal.dependency.ConfigurationDependencies -import com.android.builder.dependency.AndroidDependency +import com.android.build.gradle.internal.variant.LibraryVariantData +import com.android.build.gradle.internal.variant.TestVariantData import com.android.builder.BuilderConstants +import com.android.builder.VariantConfiguration +import com.android.builder.dependency.AndroidDependency import com.android.builder.dependency.BundleDependency import com.android.builder.dependency.DependencyContainer import com.android.builder.dependency.JarDependency import com.android.builder.dependency.ManifestDependency -import com.android.builder.VariantConfiguration import com.google.common.collect.Sets import org.gradle.api.Plugin import org.gradle.api.Project @@ -41,6 +45,7 @@ import org.gradle.tooling.BuildException import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import javax.inject.Inject + /** * Gradle plugin class for 'library' projects. */ @@ -116,28 +121,33 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { dependencies.add(releaseBuildTypeData) resolveDependencies(dependencies) - ProductionAppVariant testedVariant = createLibraryTasks(debugBuildTypeData, false) - ProductionAppVariant nonTestedVariant = createLibraryTasks(releaseBuildTypeData, true) - TestAppVariant testVariant = createTestTasks(testedVariant) + // create the variants and get their internal storage objects. + LibraryVariantData testedVariantData = createLibraryVariant(debugBuildTypeData, false) + LibraryVariantData notTestedVariantData = createLibraryVariant(releaseBuildTypeData, true) + TestVariantData testVariantData = createTestVariant(testedVariantData) + + // and now create the API objects for the variants // add the not-tested build variant. - extension.buildVariants.add( - instantiator.newInstance(DefaultBuildVariant.class, nonTestedVariant)) + extension.addLibraryVariant( + instantiator.newInstance(LibraryVariantImpl.class, notTestedVariantData)) - // and add the test variant - DefaultBuildVariant testBuildVariant = instantiator.newInstance( - DefaultBuildVariant.class, testVariant) - extension.testBuildVariants.add(testBuildVariant) + // add the tested build variant + LibraryVariantImpl libraryVariant = instantiator.newInstance(LibraryVariantImpl.class, + testedVariantData); + extension.addLibraryVariant(libraryVariant); - // and finally the tested variant - extension.buildVariants.add( - instantiator.newInstance(DefaultBuildVariant.class, - testedVariant, testBuildVariant)) + // add the test variant + TestVariantImpl testVariant = instantiator.newInstance(TestVariantImpl.class, + testVariantData, libraryVariant) + extension.addTestVariant(testVariant) + // finally, wire the test Variant inside the tested library variant. + libraryVariant.setTestVariant(testVariant) } - private ProductionAppVariant createLibraryTasks(BuildTypeData buildTypeData, - boolean publishArtifact) { + private LibraryVariantData createLibraryVariant( + @NonNull BuildTypeData buildTypeData, boolean publishArtifact) { ProductFlavorData defaultConfigData = getDefaultConfigData(); // the order of the libraries is important. In descending order: @@ -155,50 +165,51 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { String packageName = variantConfig.getPackageFromManifest() if (packageName == null) { - throw new BuildException("Failed to read manifest") + throw new BuildException("Failed to read manifest", null) } - ProductionAppVariant variant = new ProductionAppVariant(variantConfig) - variants.add(variant) + LibraryVariantData variantData = new LibraryVariantData(variantConfig) + variantDataList.add(variantData) - createPrepareDependenciesTask(variant, configDependencies) + createPrepareDependenciesTask(variantData, configDependencies) // Add a task to process the manifest(s) - createProcessManifestTask(variant, DIR_BUNDLES) + createProcessManifestTask(variantData, DIR_BUNDLES) // Add a task to compile renderscript files. - createRenderscriptTask(variant) + createRenderscriptTask(variantData) // Add a task to merge the resource folders - createMergeResourcesTask(variant, "$project.buildDir/$DIR_BUNDLES/${variant.dirName}/res", + createMergeResourcesTask(variantData, + "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/res", false /*process9Patch*/) // Add a task to merge the assets folders - createMergeAssetsTask(variant, - "$project.buildDir/$DIR_BUNDLES/${variant.dirName}/assets") + createMergeAssetsTask(variantData, + "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/assets") // Add a task to create the BuildConfig class - createBuildConfigTask(variant) + createBuildConfigTask(variantData) // Add a task to generate resource source files, directing the location // of the r.txt file to be directly in the bundle. - createProcessResTask(variant, "$project.buildDir/$DIR_BUNDLES/${variant.dirName}") + createProcessResTask(variantData, "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}") // process java resources - createProcessJavaResTask(variant) + createProcessJavaResTask(variantData) - createAidlTask(variant) + createAidlTask(variantData) // Add a compile task - createCompileTask(variant, null/*testedVariant*/) + createCompileTask(variantData, null/*testedVariant*/) // jar the classes. Jar jar = project.tasks.add("package${buildTypeData.buildType.name.capitalize()}Jar", Jar); - jar.dependsOn variant.javaCompileTask, variant.processJavaResources - jar.from(variant.javaCompileTask.outputs); - jar.from(variant.processJavaResources.destinationDir) + jar.dependsOn variantData.javaCompileTask, variantData.processJavaResources + jar.from(variantData.javaCompileTask.outputs); + jar.from(variantData.processJavaResources.destinationDir) - jar.destinationDir = project.file("$project.buildDir/$DIR_BUNDLES/${variant.dirName}") + jar.destinationDir = project.file("$project.buildDir/$DIR_BUNDLES/${variantData.dirName}") jar.archiveName = "classes.jar" packageName = packageName.replace('.', '/'); jar.exclude(packageName + "/R.class") @@ -206,39 +217,39 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { jar.exclude(packageName + "/BuildConfig.class") // package the aidl files into the bundle folder - Sync packageAidl = project.tasks.add("package${variant.name}Aidl", Sync) + Sync packageAidl = project.tasks.add("package${variantData.name}Aidl", Sync) // packageAidl from 3 sources. the order is important to make sure the override works well. packageAidl.from(defaultConfigData.sourceSet.aidl.srcDirs, buildTypeData.sourceSet.aidl.srcDirs).include("**/*.aidl") packageAidl.into(project.file( - "$project.buildDir/$DIR_BUNDLES/${variant.dirName}/$SdkConstants.FD_AIDL")) + "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/$SdkConstants.FD_AIDL")) // package the renderscript header files files into the bundle folder - Sync packageRenderscript = project.tasks.add("package${variant.name}Renderscript", Sync) + Sync packageRenderscript = project.tasks.add("package${variantData.name}Renderscript", Sync) // package from 3 sources. the order is important to make sure the override works well. packageRenderscript.from(defaultConfigData.sourceSet.renderscript.srcDirs, buildTypeData.sourceSet.renderscript.srcDirs).include("**/*.rsh") packageRenderscript.into(project.file( - "$project.buildDir/$DIR_BUNDLES/${variant.dirName}/$SdkConstants.FD_RENDERSCRIPT")) + "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/$SdkConstants.FD_RENDERSCRIPT")) // package the renderscript header files files into the bundle folder - Sync packageLocalJar = project.tasks.add("package${variant.name}LocalJar", Sync) + Sync packageLocalJar = project.tasks.add("package${variantData.name}LocalJar", Sync) packageLocalJar.from(getLocalJarFileList(configDependencies)) packageLocalJar.into(project.file( - "$project.buildDir/$DIR_BUNDLES/${variant.dirName}/$SdkConstants.LIBS_FOLDER")) + "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/$SdkConstants.LIBS_FOLDER")) - Zip bundle = project.tasks.add("bundle${variant.name}", Zip) + Zip bundle = project.tasks.add("bundle${variantData.name}", Zip) bundle.dependsOn jar, packageAidl, packageRenderscript, packageLocalJar - bundle.setDescription("Assembles a bundle containing the library in ${variant.name}."); + bundle.setDescription("Assembles a bundle containing the library in ${variantData.name}."); bundle.destinationDir = project.file("$project.buildDir/libs") bundle.extension = BuilderConstants.EXT_LIB_ARCHIVE - if (variant.baseName != BuilderConstants.RELEASE) { - bundle.classifier = variant.baseName + if (variantData.baseName != BuilderConstants.RELEASE) { + bundle.classifier = variantData.baseName } - bundle.from(project.file("$project.buildDir/$DIR_BUNDLES/${variant.dirName}")) + bundle.from(project.file("$project.buildDir/$DIR_BUNDLES/${variantData.dirName}")) - variant.packageLibTask = bundle - variant.outputFile = bundle.archivePath + variantData.packageLibTask = bundle + variantData.outputFile = bundle.archivePath if (publishArtifact) { // add the artifact that will be published @@ -246,12 +257,12 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { } buildTypeData.assembleTask.dependsOn bundle - variant.assembleTask = bundle + variantData.assembleTask = bundle // configure the variant to be testable. variantConfig.output = new BundleDependency( - project.file("$project.buildDir/$DIR_BUNDLES/${variant.dirName}"), - variant.getName()) { + project.file("$project.buildDir/$DIR_BUNDLES/${variantData.dirName}"), + variantData.getName()) { @Override List<AndroidDependency> getDependencies() { @@ -264,7 +275,7 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { } }; - return variant + return variantData } static Object[] getLocalJarFileList(List<? extends DependencyContainer> containerList) { @@ -278,7 +289,7 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { return files.toArray() } - private TestAppVariant createTestTasks(ProductionAppVariant testedVariant) { + private TestVariantData createTestVariant(LibraryVariantData testedVariantData) { ProductFlavorData defaultConfigData = getDefaultConfigData(); // the order of the libraries is important. In descending order: @@ -289,14 +300,16 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { def testVariantConfig = new VariantConfiguration( defaultConfigData.productFlavor, defaultConfigData.testSourceSet, debugBuildTypeData.buildType, null, - VariantConfiguration.Type.TEST, testedVariant.config, project.name) + VariantConfiguration.Type.TEST, + testedVariantData.variantConfiguration, project.name) testVariantConfig.setDependencies(configDependencies) - def testVariant = new TestAppVariant(testVariantConfig,) - variants.add(testVariant) - createTestTasks(testVariant, testedVariant, configDependencies, true /*mainTestTask*/) + TestVariantData testVariantData = new TestVariantData(testVariantConfig,) + variantDataList.add(testVariantData) + createTestTasks(testVariantData, testedVariantData, configDependencies, + true /*mainTestTask*/) - return testVariant + return testVariantData } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceDirectorySet.java b/gradle/src/main/groovy/com/android/build/gradle/api/AndroidSourceDirectorySet.java index 12b6f7b..1c37913 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceDirectorySet.java +++ b/gradle/src/main/groovy/com/android/build/gradle/api/AndroidSourceDirectorySet.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.build.gradle; +package com.android.build.gradle.api; import com.android.annotations.NonNull; diff --git a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceFile.java b/gradle/src/main/groovy/com/android/build/gradle/api/AndroidSourceFile.java index 4cffb03..b6bc97a 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceFile.java +++ b/gradle/src/main/groovy/com/android/build/gradle/api/AndroidSourceFile.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.build.gradle; +package com.android.build.gradle.api; import java.io.File; diff --git a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceSet.groovy b/gradle/src/main/groovy/com/android/build/gradle/api/AndroidSourceSet.groovy index a922161..72f58d7 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceSet.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/api/AndroidSourceSet.groovy @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.build.gradle +package com.android.build.gradle.api import com.android.annotations.NonNull import org.gradle.api.file.SourceDirectorySet diff --git a/gradle/src/main/groovy/com/android/build/gradle/api/ApkVariant.java b/gradle/src/main/groovy/com/android/build/gradle/api/ApkVariant.java new file mode 100644 index 0000000..0104656 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/api/ApkVariant.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2013 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.api; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.build.gradle.tasks.Dex; +import com.android.build.gradle.tasks.PackageApplication; +import com.android.build.gradle.tasks.ZipAlign; +import com.android.builder.DefaultBuildType; +import com.android.builder.DefaultProductFlavor; +import com.android.builder.signing.SigningConfig; +import org.gradle.api.DefaultTask; + +import java.util.List; + +/** + * A Build variant and all its public data. + */ +public interface ApkVariant extends BaseVariant { + + /** + * Returns the {@link com.android.builder.DefaultBuildType} for this build variant. + */ + @NonNull + DefaultBuildType getBuildType(); + + /** + * Returns the list of {@link com.android.builder.DefaultProductFlavor} for this build variant. + * + * This is always non-null but could be empty. + */ + @NonNull + List<DefaultProductFlavor> getProductFlavors(); + + /** + * Returns a {@link com.android.builder.DefaultProductFlavor} that represents the merging + * of the default config and the flavors of this build variant. + */ + @NonNull + DefaultProductFlavor getMergedFlavor(); + + /** + * Returns the {@link com.android.builder.signing.SigningConfig} for this build variant, + * if one has been specified. + */ + @Nullable + SigningConfig getSigningConfig(); + + /** + * Returns true if this variant has the information it needs to create a signed APK. + */ + boolean isSigningReady(); + + /** + * Returns the Dex task. + */ + @Nullable + Dex getDex(); + + /** + * Returns the APK packaging task. + */ + @Nullable + PackageApplication getPackageApplication(); + + /** + * Returns the Zip align task. + */ + @Nullable + ZipAlign getZipAlign(); + + /** + * Returns the installation task. + * + * Even for variant for regular project, this can be null if the app cannot be signed. + */ + @Nullable + DefaultTask getInstall(); + + /** + * Returns the uinstallation task. + * + * For non-library project this is always true even if the APK is not created because + * signing isn't setup. + */ + @Nullable + DefaultTask getUninstall(); +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/api/ApplicationVariant.java b/gradle/src/main/groovy/com/android/build/gradle/api/ApplicationVariant.java new file mode 100644 index 0000000..d5caf5b --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/api/ApplicationVariant.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2013 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.api; + +import com.android.annotations.Nullable; + +/** + * A Build variant and all its public data. + */ +public interface ApplicationVariant extends ApkVariant { + + /** + * Returns the build variant that will test this build variant. + */ + @Nullable + TestVariant getTestVariant(); +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/api/BaseVariant.java b/gradle/src/main/groovy/com/android/build/gradle/api/BaseVariant.java new file mode 100644 index 0000000..190bf47 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/api/BaseVariant.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2013 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.api; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.build.gradle.tasks.AidlCompile; +import com.android.build.gradle.tasks.GenerateBuildConfig; +import com.android.build.gradle.tasks.MergeAssets; +import com.android.build.gradle.tasks.MergeResources; +import com.android.build.gradle.tasks.ProcessAndroidResources; +import com.android.build.gradle.tasks.ProcessManifest; +import com.android.build.gradle.tasks.RenderscriptCompile; +import org.gradle.api.Task; +import org.gradle.api.tasks.Copy; +import org.gradle.api.tasks.compile.JavaCompile; + +import java.io.File; + +/** + * A Build variant and all its public data. This is the base class for items common to apps, + * test apps, and libraries + */ +public interface BaseVariant { + + /** + * Returns the name of the variant. Guaranteed to be unique. + */ + @NonNull + String getName(); + + /** + * Returns a description for the build variant. + */ + @NonNull + String getDescription(); + + /** + * Returns a subfolder name for the variant. Guaranteed to be unique. + * + * This is usually a mix of build type and flavor(s) (if applicable). + * For instance this could be: + * "debug" + * "debug/myflavor" + * "release/Flavor1Flavor2" + */ + @NonNull + String getDirName(); + + /** + * Returns the base name for the output of the variant. Guaranteed to be unique. + */ + @NonNull + String getBaseName(); + + /** + * Returns the output file for this build variants. Depending on the configuration, this could + * be an apk (regular and test project) or a bundled library (library project). + * + * If it's an apk, it could be signed, or not; zip-aligned, or not. + */ + @NonNull + File getOutputFile(); + + void setOutputFile(@NonNull File outputFile); + + /** + * Returns the Manifest processing task. + */ + @NonNull + ProcessManifest getProcessManifest(); + + /** + * Returns the AIDL compilation task. + */ + @NonNull + AidlCompile getAidlCompile(); + + /** + * Returns the Renderscript compilation task. + */ + @NonNull + RenderscriptCompile getRenderscriptCompile(); + + /** + * Returns the resource merging task. + */ + @Nullable + MergeResources getMergeResources(); + + /** + * Returns the asset merging task. + */ + @Nullable + MergeAssets getMergeAssets(); + + /** + * Returns the Android Resources processing task. + */ + @NonNull + ProcessAndroidResources getProcessResources(); + + /** + * Returns the BuildConfig generation task. + */ + @Nullable + GenerateBuildConfig getGenerateBuildConfig(); + + /** + * Returns the Java Compilation task. + */ + @NonNull + JavaCompile getJavaCompile(); + + /** + * Returns the Java resource processing task. + */ + @NonNull + Copy getProcessJavaResources(); + + /** + * Returns the assemble task. + */ + @Nullable + Task getAssemble(); +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/api/LibraryVariant.java b/gradle/src/main/groovy/com/android/build/gradle/api/LibraryVariant.java new file mode 100644 index 0000000..5bcfd9f --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/api/LibraryVariant.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2013 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.api; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.builder.DefaultBuildType; +import com.android.builder.DefaultProductFlavor; +import org.gradle.api.tasks.bundling.Zip; + +/** + * A Build variant and all its public data. + */ +public interface LibraryVariant extends BaseVariant { + + /** + * Returns the {@link com.android.builder.DefaultBuildType} for this build variant. + */ + @NonNull + DefaultBuildType getBuildType(); + + /** + * Returns a {@link com.android.builder.DefaultProductFlavor} that represents the merging + * of the default config and the flavors of this build variant. + */ + @NonNull + DefaultProductFlavor getConfig(); + + /** + * Returns the build variant that will test this build variant. + * + * Will return null if this build variant is a test build already. + */ + @Nullable + TestVariant getTestVariant(); + + /** + * Returns the Library AAR packaging task. + */ + @Nullable + Zip getPackageLibrary(); +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/api/TestVariant.java b/gradle/src/main/groovy/com/android/build/gradle/api/TestVariant.java new file mode 100644 index 0000000..cd561c0 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/api/TestVariant.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2013 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.api; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import org.gradle.api.DefaultTask; + +/** + * A Build variant and all its public data. + */ +public interface TestVariant extends ApkVariant { + + /** + * Returns the build variant that is tested by this variant. + */ + @NonNull + BaseVariant getTestedVariant(); + + /** + * Returns the task to run the tests. + * Only valid for test project. + */ + @Nullable + DefaultTask getInstrumentTest(); +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/AndroidAsciiReportRenderer.java b/gradle/src/main/groovy/com/android/build/gradle/internal/AndroidAsciiReportRenderer.java index 25b9972..d64ca05 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/AndroidAsciiReportRenderer.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/AndroidAsciiReportRenderer.java @@ -16,6 +16,7 @@ package com.android.build.gradle.internal; +import com.android.build.gradle.internal.variant.BaseVariantData; import com.android.builder.dependency.AndroidDependency; import com.android.builder.dependency.BundleDependency; import org.gradle.api.Action; @@ -56,7 +57,7 @@ public class AndroidAsciiReportRenderer extends TextReportRenderer { super.completeProject(project); } - public void startVariant(final ApplicationVariant variant) { + public void startVariant(final BaseVariantData variantData) { if (hasConfigs) { getTextOutput().println(); } @@ -65,7 +66,7 @@ public class AndroidAsciiReportRenderer extends TextReportRenderer { renderer.visit(new Action<StyledTextOutput>() { @Override public void execute(StyledTextOutput styledTextOutput) { - getTextOutput().withStyle(Identifier).text(variant.getName()); + getTextOutput().withStyle(Identifier).text(variantData.getName()); getTextOutput().withStyle(Description).text(""); } }, true); @@ -76,10 +77,11 @@ public class AndroidAsciiReportRenderer extends TextReportRenderer { configuration.getDescription()) ? " - " + configuration.getDescription() : ""; } - public void completeConfiguration(ApplicationVariant variant) {} + public void completeConfiguration(BaseVariantData variantData) {} - public void render(ApplicationVariant variant) throws IOException { - List<AndroidDependency> libraries = variant.getVariantConfiguration().getDirectLibraries(); + public void render(BaseVariantData variantData) throws IOException { + List<AndroidDependency> libraries = + variantData.getVariantConfiguration().getDirectLibraries(); renderNow(libraries); } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/ApplicationVariant.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/ApplicationVariant.groovy deleted file mode 100644 index c821bbd..0000000 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/ApplicationVariant.groovy +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2012 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.build.gradle.internal.tasks.PrepareDependenciesTask -import com.android.build.gradle.internal.tasks.TestFlavorTask -import com.android.build.gradle.tasks.AidlCompile -import com.android.build.gradle.tasks.Dex -import com.android.build.gradle.tasks.GenerateBuildConfig -import com.android.build.gradle.tasks.MergeAssets -import com.android.build.gradle.tasks.MergeResources -import com.android.build.gradle.tasks.PackageApplication -import com.android.build.gradle.tasks.ProcessAndroidResources -import com.android.build.gradle.tasks.ProcessManifest -import com.android.build.gradle.tasks.RenderscriptCompile -import com.android.build.gradle.tasks.ZipAlign -import com.android.builder.BuilderConstants -import com.android.builder.DefaultProductFlavor -import com.android.builder.VariantConfiguration -import org.gradle.api.DefaultTask -import org.gradle.api.tasks.Copy -import org.gradle.api.tasks.bundling.Zip -import org.gradle.api.tasks.compile.JavaCompile -/** - * Represents something that can be packaged into an APK and installed. - */ -public abstract class ApplicationVariant { - - final VariantConfiguration config - - PrepareDependenciesTask prepareDependenciesTask - - ProcessManifest processManifestTask - RenderscriptCompile renderscriptCompileTask - AidlCompile aidlCompileTask - MergeResources mergeResourcesTask - MergeAssets mergeAssetsTask - ProcessAndroidResources processResourcesTask - GenerateBuildConfig generateBuildConfigTask - - JavaCompile javaCompileTask - Copy processJavaResources - - Dex dexTask - PackageApplication packageApplicationTask - ZipAlign zipAlignTask - - Zip packageLibTask - - File outputFile - - DefaultTask assembleTask - - DefaultTask installTask - DefaultTask uninstallTask - - TestFlavorTask testFlavorTask - - ApplicationVariant(VariantConfiguration config) { - this.config = config - } - - public VariantConfiguration getVariantConfiguration() { - return config - } - - abstract String getName() - - abstract String getDescription() - - abstract String getDirName() - - String getFlavorDirName() { - if (config.hasFlavors()) { - return "${getFlavoredName(false)}" - } else { - return "" - } - } - - String getFlavorName() { - if (config.hasFlavors()) { - return "${getFlavoredName(true)}" - } else { - return BuilderConstants.MAIN.capitalize() - } - } - - abstract String getBaseName() - - abstract boolean getZipAlign() - - boolean isSigned() { - return config.isSigningReady() - } - - abstract boolean getRunProguard() - - String getPackageName() { - return config.getPackageName() - } - - protected String getFlavoredName(boolean capitalized) { - StringBuilder builder = new StringBuilder() - for (DefaultProductFlavor flavor : config.flavorConfigs) { - builder.append(capitalized ? flavor.name.capitalize() : flavor.name) - } - - return builder.toString() - } -} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/BuildTypeData.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/BuildTypeData.groovy index 227187f..94684b3 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/BuildTypeData.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/BuildTypeData.groovy @@ -15,7 +15,7 @@ */ package com.android.build.gradle.internal -import com.android.build.gradle.AndroidSourceSet +import com.android.build.gradle.api.AndroidSourceSet import com.android.build.gradle.internal.dependency.ConfigurationDependencies import com.android.builder.DefaultBuildType import org.gradle.api.Project diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultBuildVariant.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultBuildVariant.groovy deleted file mode 100644 index fefc9b4..0000000 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultBuildVariant.groovy +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (C) 2012 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.build.gradle.BuildVariant -import com.android.build.gradle.tasks.AidlCompile -import com.android.build.gradle.tasks.Dex -import com.android.build.gradle.tasks.GenerateBuildConfig -import com.android.build.gradle.tasks.MergeAssets -import com.android.build.gradle.tasks.MergeResources -import com.android.build.gradle.tasks.PackageApplication -import com.android.build.gradle.tasks.ProcessAndroidResources -import com.android.build.gradle.tasks.ProcessManifest -import com.android.build.gradle.tasks.RenderscriptCompile -import com.android.build.gradle.tasks.ZipAlign -import com.android.builder.DefaultBuildType -import com.android.builder.DefaultProductFlavor -import com.android.builder.signing.SigningConfig -import org.gradle.api.DefaultTask -import org.gradle.api.Task -import org.gradle.api.tasks.Copy -import org.gradle.api.tasks.bundling.Zip -import org.gradle.api.tasks.compile.JavaCompile -/** - * implementation of the {@link BuildVariant} interface around an {@link ApplicationVariant} - * object. - */ -public class DefaultBuildVariant implements BuildVariant { - - private final ApplicationVariant variant - private final BuildVariant testVariant - - public DefaultBuildVariant(ApplicationVariant variant, BuildVariant testVariant) { - this.variant = variant - this.testVariant = testVariant - } - - public DefaultBuildVariant(ApplicationVariant variant) { - this(variant, null) - } - - @Override - String getName() { - return variant.name - } - - String getDescription() { - return variant.description - } - - String getDirName() { - return variant.dirName - } - - String getBaseName() { - return variant.baseName - } - - @Override - DefaultBuildType getBuildType() { - return variant.config.buildType - } - - @Override - List<DefaultProductFlavor> getProductFlavors() { - return variant.config.flavorConfigs - } - - @Override - DefaultProductFlavor getMergedFlavor() { - return variant.config.mergedFlavor - } - - @Override - File getOutputFile() { - return variant.outputFile - } - - @Override - BuildVariant getTestVariant() { - return testVariant - } - - @Override - ProcessManifest getProcessManifest() { - return variant.processManifestTask - } - - @Override - AidlCompile getAidlCompile() { - return variant.aidlCompileTask - } - - @Override - RenderscriptCompile getRenderscriptCompile() { - return variant.renderscriptCompileTask - } - - @Override - MergeResources getMergeResources() { - return variant.mergeResourcesTask - } - - @Override - MergeAssets getMergeAssets() { - return variant.mergeAssetsTask - } - - @Override - ProcessAndroidResources getProcessResources() { - return variant.processResourcesTask - } - - @Override - GenerateBuildConfig getGenerateBuildConfig() { - return variant.generateBuildConfigTask - } - - @Override - JavaCompile getJavaCompile() { - return variant.javaCompileTask - } - - @Override - Copy getProcessJavaResources() { - return variant.processJavaResources - } - - @Override - Dex getDex() { - return variant.dexTask - } - - @Override - PackageApplication getPackageApplication() { - return variant.packageApplicationTask - } - - @Override - ZipAlign getZipAlign() { - return variant.zipAlignTask - } - - @Override - Zip getPackageLibrary() { - return variant.packageLibTask - } - - @Override - Task getAssemble() { - return variant.assembleTask - } - - @Override - DefaultTask getInstall() { - return variant.installTask - } - - @Override - DefaultTask getUninstall() { - return variant.uninstallTask - } - - @Override - DefaultTask getInstrumentTest() { - return variant.testFlavorTask - } - - @Override - SigningConfig getSigningConfig() { - return variant.config.keystore - } - - @Override - boolean isSigningReady() { - return variant.isSigned() - } -} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/ProductFlavorData.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/ProductFlavorData.groovy index 758d704..94826e1 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/ProductFlavorData.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/ProductFlavorData.groovy @@ -15,7 +15,8 @@ */ package com.android.build.gradle.internal -import com.android.build.gradle.AndroidSourceSet +import com.android.build.gradle.api.AndroidSourceSet +import com.android.build.gradle.internal.api.DefaultAndroidSourceSet import com.android.build.gradle.internal.dependency.ConfigurationDependencies import com.android.builder.DefaultProductFlavor import org.gradle.api.Project @@ -27,7 +28,7 @@ public class ProductFlavorData<T extends DefaultProductFlavor> extends Configura final T productFlavor - final AndroidSourceSet testSourceSet + final DefaultAndroidSourceSet testSourceSet Task assembleTask diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/ProductionAppVariant.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/ProductionAppVariant.groovy deleted file mode 100644 index 9e75822..0000000 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/ProductionAppVariant.groovy +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2012 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.builder.VariantConfiguration - -class ProductionAppVariant extends ApplicationVariant { - final String name - - ProductionAppVariant(VariantConfiguration config) { - super(config) - if (config.hasFlavors()) { - name = "${getFlavoredName(true)}${config.buildType.name.capitalize()}" - } else { - name = "${config.buildType.name.capitalize()}" - } - } - - String getDescription() { - if (config.hasFlavors()) { - return "${config.buildType.name.capitalize()} build for flavor ${getFlavoredName(true)}" - } else { - return "${config.buildType.name.capitalize()} build" - } - } - - String getDirName() { - if (config.hasFlavors()) { - return "${getFlavoredName(false)}/$config.buildType.name" - } else { - return "$config.buildType.name" - } - } - - String getBaseName() { - if (config.hasFlavors()) { - return "${getFlavoredName(false)}-$config.buildType.name" - } else { - return "$config.buildType.name" - } - } - - @Override - boolean getZipAlign() { - return config.buildType.zipAlign - } - - @Override - boolean getRunProguard() { - return config.buildType.runProguard - } -} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/StringHelper.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/StringHelper.groovy new file mode 100644 index 0000000..51aa208 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/StringHelper.groovy @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2013 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 + +/** + * Helper to give access to Groovy string methods from Java classes. + */ +class StringHelper { + + @NonNull + public static String capitalize(@NonNull String string) { + return string.capitalize() + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/TestAppVariant.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/TestAppVariant.groovy deleted file mode 100644 index ce7ece6..0000000 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/TestAppVariant.groovy +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2012 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.builder.VariantConfiguration - -class TestAppVariant extends ApplicationVariant { - final String name - - TestAppVariant(VariantConfiguration config) { - super(config) - if (config.hasFlavors()) { - this.name = "${getFlavoredName(true)}Test" - } else { - this.name = "Test" - } - } - - @Override - String getDescription() { - if (config.hasFlavors()) { - return "Test build for the ${getFlavoredName(true)}${config.buildType.name.capitalize()} build" - } else { - return "Test for the ${config.buildType.name.capitalize()} build" - } - } - - String getDirName() { - if (config.hasFlavors()) { - return "${getFlavoredName(false)}/test" - } else { - return "test" - } - } - - String getBaseName() { - if (config.hasFlavors()) { - return "${getFlavoredName(false)}-test" - } else { - return "test" - } - } - - @Override - boolean getZipAlign() { - return false - } - - @Override - boolean getRunProguard() { - return false - } -} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/api/ApplicationVariantImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/api/ApplicationVariantImpl.java new file mode 100644 index 0000000..6bff2e3 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/api/ApplicationVariantImpl.java @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2013 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.api; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.build.gradle.api.ApplicationVariant; +import com.android.build.gradle.api.TestVariant; +import com.android.build.gradle.internal.variant.ApplicationVariantData; +import com.android.build.gradle.tasks.AidlCompile; +import com.android.build.gradle.tasks.Dex; +import com.android.build.gradle.tasks.GenerateBuildConfig; +import com.android.build.gradle.tasks.MergeAssets; +import com.android.build.gradle.tasks.MergeResources; +import com.android.build.gradle.tasks.PackageApplication; +import com.android.build.gradle.tasks.ProcessAndroidResources; +import com.android.build.gradle.tasks.ProcessManifest; +import com.android.build.gradle.tasks.RenderscriptCompile; +import com.android.build.gradle.tasks.ZipAlign; +import com.android.builder.DefaultBuildType; +import com.android.builder.DefaultProductFlavor; +import com.android.builder.signing.SigningConfig; +import org.gradle.api.DefaultTask; +import org.gradle.api.Task; +import org.gradle.api.tasks.Copy; +import org.gradle.api.tasks.compile.JavaCompile; + +import java.io.File; +import java.util.List; + +/** + * implementation of the {@link ApplicationVariant} interface around an + * {@link ApplicationVariantData} object. + */ +public class ApplicationVariantImpl implements ApplicationVariant { + + @NonNull + private final ApplicationVariantData variantData; + @Nullable + private TestVariant testVariant = null; + + public ApplicationVariantImpl(@NonNull ApplicationVariantData variantData) { + this.variantData = variantData; + } + + public void setTestVariant(@Nullable TestVariant testVariant) { + this.testVariant = testVariant; + } + + @Override + @NonNull + public String getName() { + return variantData.getName(); + } + + @Override + @NonNull + public String getDescription() { + return variantData.getDescription(); + } + + @Override + @NonNull + public String getDirName() { + return variantData.getDirName(); + } + + @Override + @NonNull + public String getBaseName() { + return variantData.getBaseName(); + } + + @Override + @NonNull + public DefaultBuildType getBuildType() { + return variantData.getVariantConfiguration().getBuildType(); + } + + @Override + @NonNull + public List<DefaultProductFlavor> getProductFlavors() { + return variantData.getVariantConfiguration().getFlavorConfigs(); + } + + @Override + @NonNull + public DefaultProductFlavor getMergedFlavor() { + return variantData.getVariantConfiguration().getMergedFlavor(); + } + + @Override + @NonNull + public File getOutputFile() { + return variantData.packageApplicationTask.getOutputFile(); + } + + @Override + public void setOutputFile(@NonNull File outputFile) { + variantData.packageApplicationTask.setOutputFile(outputFile); + } + + @Override + @Nullable + public TestVariant getTestVariant() { + return testVariant; + } + + @Override + @NonNull + public ProcessManifest getProcessManifest() { + return variantData.processManifestTask; + } + + @Override + @NonNull + public AidlCompile getAidlCompile() { + return variantData.aidlCompileTask; + } + + @Override + @NonNull + public RenderscriptCompile getRenderscriptCompile() { + return variantData.renderscriptCompileTask; + } + + @Override + public MergeResources getMergeResources() { + return variantData.mergeResourcesTask; + } + + @Override + public MergeAssets getMergeAssets() { + return variantData.mergeAssetsTask; + } + + @Override + @NonNull + public ProcessAndroidResources getProcessResources() { + return variantData.processResourcesTask; + } + + @Override + public GenerateBuildConfig getGenerateBuildConfig() { + return variantData.generateBuildConfigTask; + } + + @Override + @NonNull + public JavaCompile getJavaCompile() { + return variantData.javaCompileTask; + } + + @Override + @NonNull + public Copy getProcessJavaResources() { + return variantData.processJavaResources; + } + + @Override + public Dex getDex() { + return variantData.dexTask; + } + + @Override + public PackageApplication getPackageApplication() { + return variantData.packageApplicationTask; + } + + @Override + public ZipAlign getZipAlign() { + return variantData.zipAlignTask; + } + + @Override + public Task getAssemble() { + return variantData.assembleTask; + } + + @Override + public DefaultTask getInstall() { + return variantData.installTask; + } + + @Override + public DefaultTask getUninstall() { + return variantData.uninstallTask; + } + + @Override + public SigningConfig getSigningConfig() { + return variantData.getVariantConfiguration().getSigningConfig(); + } + + @Override + public boolean isSigningReady() { + return variantData.isSigned(); + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultAndroidSourceDirectorySet.java b/gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceDirectorySet.java index 2b546f6..a9647e6 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultAndroidSourceDirectorySet.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceDirectorySet.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package com.android.build.gradle.internal; +package com.android.build.gradle.internal.api; import com.android.annotations.NonNull; -import com.android.build.gradle.AndroidSourceDirectorySet; +import com.android.build.gradle.api.AndroidSourceDirectorySet; import com.google.common.collect.Lists; import org.gradle.api.internal.file.FileResolver; diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultAndroidSourceFile.java b/gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceFile.java index 6a31fb5..67778bc 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultAndroidSourceFile.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceFile.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package com.android.build.gradle.internal; +package com.android.build.gradle.internal.api; -import com.android.build.gradle.AndroidSourceFile; +import com.android.build.gradle.api.AndroidSourceFile; import org.gradle.api.internal.file.FileResolver; import java.io.File; diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultAndroidSourceSet.java b/gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceSet.java index d78b051..a10e213 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultAndroidSourceSet.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceSet.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package com.android.build.gradle.internal; +package com.android.build.gradle.internal.api; import com.android.SdkConstants; import com.android.annotations.NonNull; -import com.android.build.gradle.AndroidSourceDirectorySet; -import com.android.build.gradle.AndroidSourceFile; -import com.android.build.gradle.AndroidSourceSet; +import com.android.build.gradle.api.AndroidSourceDirectorySet; +import com.android.build.gradle.api.AndroidSourceFile; +import com.android.build.gradle.api.AndroidSourceSet; import com.android.builder.model.SourceProvider; import groovy.lang.Closure; import org.gradle.api.file.FileTreeElement; diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/api/LibraryVariantImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/api/LibraryVariantImpl.java new file mode 100644 index 0000000..a4acfd6 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/api/LibraryVariantImpl.java @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2013 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.api; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.build.gradle.api.LibraryVariant; +import com.android.build.gradle.api.TestVariant; +import com.android.build.gradle.internal.variant.LibraryVariantData; +import com.android.build.gradle.tasks.AidlCompile; +import com.android.build.gradle.tasks.GenerateBuildConfig; +import com.android.build.gradle.tasks.MergeAssets; +import com.android.build.gradle.tasks.MergeResources; +import com.android.build.gradle.tasks.ProcessAndroidResources; +import com.android.build.gradle.tasks.ProcessManifest; +import com.android.build.gradle.tasks.RenderscriptCompile; +import com.android.builder.DefaultBuildType; +import com.android.builder.DefaultProductFlavor; +import org.gradle.api.Task; +import org.gradle.api.tasks.Copy; +import org.gradle.api.tasks.bundling.Zip; +import org.gradle.api.tasks.compile.JavaCompile; + +import java.io.File; + +/** + * implementation of the {@link LibraryVariant} interface around a + * {@link LibraryVariantData} object. + */ +public class LibraryVariantImpl implements LibraryVariant { + + @NonNull + private final LibraryVariantData variantData; + @Nullable + private TestVariant testVariant = null; + + public LibraryVariantImpl(@NonNull LibraryVariantData variantData) { + this.variantData = variantData; + } + + public void setTestVariant(@Nullable TestVariant testVariant) { + this.testVariant = testVariant; + } + + @Override + @NonNull + public String getName() { + return variantData.getName(); + } + + @Override + @NonNull + public String getDescription() { + return variantData.getDescription(); + } + + @Override + @NonNull + public String getDirName() { + return variantData.getDirName(); + } + + @Override + @NonNull + public String getBaseName() { + return variantData.getBaseName(); + } + + @Override + @NonNull + public DefaultBuildType getBuildType() { + return variantData.getVariantConfiguration().getBuildType(); + } + + @NonNull + @Override + public DefaultProductFlavor getConfig() { + return variantData.getVariantConfiguration().getDefaultConfig(); + } + + @Override + @NonNull + public File getOutputFile() { + return variantData.packageLibTask.getArchivePath(); + } + + @Override + public void setOutputFile(@NonNull File outputFile) { + variantData.packageLibTask.setDestinationDir(outputFile.getParentFile()); + variantData.packageLibTask.setArchiveName(outputFile.getName()); + } + + @Override + @Nullable + public TestVariant getTestVariant() { + return testVariant; + } + + @Override + @NonNull + public ProcessManifest getProcessManifest() { + return variantData.processManifestTask; + } + + @Override + @NonNull + public AidlCompile getAidlCompile() { + return variantData.aidlCompileTask; + } + + @Override + @NonNull + public RenderscriptCompile getRenderscriptCompile() { + return variantData.renderscriptCompileTask; + } + + @Override + public MergeResources getMergeResources() { + return variantData.mergeResourcesTask; + } + + @Override + public MergeAssets getMergeAssets() { + return variantData.mergeAssetsTask; + } + + @Override + @NonNull + public ProcessAndroidResources getProcessResources() { + return variantData.processResourcesTask; + } + + @Override + public GenerateBuildConfig getGenerateBuildConfig() { + return variantData.generateBuildConfigTask; + } + + @Override + @NonNull + public JavaCompile getJavaCompile() { + return variantData.javaCompileTask; + } + + @Override + @NonNull + public Copy getProcessJavaResources() { + return variantData.processJavaResources; + } + + @Override + public Zip getPackageLibrary() { + return variantData.packageLibTask; + } + + @Override + public Task getAssemble() { + return variantData.assembleTask; + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/api/TestVariantImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/api/TestVariantImpl.java new file mode 100644 index 0000000..8572544 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/api/TestVariantImpl.java @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2013 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.api; + +import com.android.annotations.NonNull; +import com.android.build.gradle.api.BaseVariant; +import com.android.build.gradle.api.TestVariant; +import com.android.build.gradle.internal.variant.TestVariantData; +import com.android.build.gradle.tasks.AidlCompile; +import com.android.build.gradle.tasks.Dex; +import com.android.build.gradle.tasks.GenerateBuildConfig; +import com.android.build.gradle.tasks.MergeAssets; +import com.android.build.gradle.tasks.MergeResources; +import com.android.build.gradle.tasks.PackageApplication; +import com.android.build.gradle.tasks.ProcessAndroidResources; +import com.android.build.gradle.tasks.ProcessManifest; +import com.android.build.gradle.tasks.RenderscriptCompile; +import com.android.build.gradle.tasks.ZipAlign; +import com.android.builder.DefaultBuildType; +import com.android.builder.DefaultProductFlavor; +import com.android.builder.signing.SigningConfig; +import org.gradle.api.DefaultTask; +import org.gradle.api.Task; +import org.gradle.api.tasks.Copy; +import org.gradle.api.tasks.compile.JavaCompile; + +import java.io.File; +import java.util.List; + +/** + * implementation of the {@link TestVariant} interface around an {@link TestVariantData} object. + */ +public class TestVariantImpl implements TestVariant { + + @NonNull + private final TestVariantData variantData; + @NonNull + private final BaseVariant testedVariant; + + public TestVariantImpl(@NonNull TestVariantData variantData, + @NonNull BaseVariant testedVariant) { + this.variantData = variantData; + this.testedVariant = testedVariant; + } + + @Override + @NonNull + public String getName() { + return variantData.getName(); + } + + @Override + @NonNull + public String getDescription() { + return variantData.getDescription(); + } + + @Override + @NonNull + public String getDirName() { + return variantData.getDirName(); + } + + @Override + @NonNull + public String getBaseName() { + return variantData.getBaseName(); + } + + @Override + @NonNull + public DefaultBuildType getBuildType() { + return variantData.getVariantConfiguration().getBuildType(); + } + + @Override + @NonNull + public List<DefaultProductFlavor> getProductFlavors() { + return variantData.getVariantConfiguration().getFlavorConfigs(); + } + + @Override + @NonNull + public DefaultProductFlavor getMergedFlavor() { + return variantData.getVariantConfiguration().getMergedFlavor(); + } + + @Override + @NonNull + public File getOutputFile() { + return variantData.packageApplicationTask.getOutputFile(); + } + + @Override + public void setOutputFile(@NonNull File outputFile) { + variantData.packageApplicationTask.setOutputFile(outputFile); + } + + @Override + @NonNull + public BaseVariant getTestedVariant() { + return testedVariant; + } + + @Override + @NonNull + public ProcessManifest getProcessManifest() { + return variantData.processManifestTask; + } + + @Override + @NonNull + public AidlCompile getAidlCompile() { + return variantData.aidlCompileTask; + } + + @Override + @NonNull + public RenderscriptCompile getRenderscriptCompile() { + return variantData.renderscriptCompileTask; + } + + @Override + public MergeResources getMergeResources() { + return variantData.mergeResourcesTask; + } + + @Override + public MergeAssets getMergeAssets() { + return variantData.mergeAssetsTask; + } + + @Override + @NonNull + public ProcessAndroidResources getProcessResources() { + return variantData.processResourcesTask; + } + + @Override + public GenerateBuildConfig getGenerateBuildConfig() { + return variantData.generateBuildConfigTask; + } + + @Override + @NonNull + public JavaCompile getJavaCompile() { + return variantData.javaCompileTask; + } + + @Override + @NonNull + public Copy getProcessJavaResources() { + return variantData.processJavaResources; + } + + @Override + public Dex getDex() { + return variantData.dexTask; + } + + @Override + public PackageApplication getPackageApplication() { + return variantData.packageApplicationTask; + } + + @Override + public ZipAlign getZipAlign() { + return variantData.zipAlignTask; + } + + @Override + public Task getAssemble() { + return variantData.assembleTask; + } + + @Override + public DefaultTask getInstall() { + return variantData.installTask; + } + + @Override + public DefaultTask getUninstall() { + return variantData.uninstallTask; + } + + @Override + public DefaultTask getInstrumentTest() { + return variantData.testFlavorTask; + } + + @Override + public SigningConfig getSigningConfig() { + return variantData.getVariantConfiguration().getSigningConfig(); + } + + @Override + public boolean isSigningReady() { + return variantData.isSigned(); + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dependency/ConfigurationDependencies.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/dependency/ConfigurationDependencies.groovy index 1db7729..9428364 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/dependency/ConfigurationDependencies.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dependency/ConfigurationDependencies.groovy @@ -16,7 +16,8 @@ package com.android.build.gradle.internal.dependency import com.android.annotations.NonNull -import com.android.build.gradle.AndroidSourceSet +import com.android.build.gradle.api.AndroidSourceSet +import com.android.build.gradle.internal.api.DefaultAndroidSourceSet import com.android.builder.dependency.AndroidDependency import com.android.builder.dependency.DependencyContainer import com.android.builder.dependency.JarDependency @@ -31,7 +32,7 @@ public class ConfigurationDependencies implements DependencyContainer { public static enum ConfigType { DEFAULT, FLAVOR, BUILDTYPE } final Project project - final AndroidSourceSet sourceSet + final DefaultAndroidSourceSet sourceSet final ConfigType type ConfigurationDependencies testConfigDependencies; diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AndroidSourceSetFactory.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AndroidSourceSetFactory.groovy index 3612e4f..f4a08c0 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AndroidSourceSetFactory.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AndroidSourceSetFactory.groovy @@ -16,8 +16,8 @@ package com.android.build.gradle.internal.dsl -import com.android.build.gradle.AndroidSourceSet -import com.android.build.gradle.internal.DefaultAndroidSourceSet +import com.android.build.gradle.api.AndroidSourceSet +import com.android.build.gradle.internal.api.DefaultAndroidSourceSet import org.gradle.api.NamedDomainObjectFactory import org.gradle.api.internal.file.FileResolver import org.gradle.internal.reflect.Instantiator diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeContainerImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeContainerImpl.java index 8f0e768..29963e7 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeContainerImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeContainerImpl.java @@ -23,7 +23,7 @@ import com.android.builder.model.SourceProvider; import java.io.Serializable; -public class BuildTypeContainerImpl implements BuildTypeContainer, Serializable { +class BuildTypeContainerImpl implements BuildTypeContainer, Serializable { private static final long serialVersionUID = 1L; @NonNull diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java index 51447d6..90ab5cf 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java @@ -29,7 +29,7 @@ import java.util.Map; /** * Implementation of the AndroidProject model object. */ -public class DefaultAndroidProject implements AndroidProject, Serializable { +class DefaultAndroidProject implements AndroidProject, Serializable { private static final long serialVersionUID = 1L; private final String name; @@ -55,6 +55,11 @@ public class DefaultAndroidProject implements AndroidProject, Serializable { return this; } + DefaultAndroidProject addVariant(Variant variant) { + variants.put(variant.getName(), variant); + return this; + } + @Override @NonNull public String getName() { diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy index 755171a..9571e3a 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy @@ -22,9 +22,11 @@ import com.android.build.gradle.BasePlugin import com.android.build.gradle.LibraryPlugin import com.android.build.gradle.internal.BuildTypeData import com.android.build.gradle.internal.ProductFlavorData +import com.android.build.gradle.internal.variant.BaseVariantData import com.android.build.gradle.model.AndroidProject import com.android.build.gradle.model.BuildTypeContainer import com.android.build.gradle.model.ProductFlavorContainer +import com.android.build.gradle.model.Variant import com.android.builder.model.SourceProvider import org.gradle.api.Project import org.gradle.api.plugins.UnknownPluginException @@ -67,9 +69,20 @@ public class ModelBuilder implements ToolingModelBuilder { .addBuildType(createBTC(libPlugin.releaseBuildTypeData)) } + for (BaseVariantData variantData : basePlugin.variantDataList) { + androidProject.addVariant(createVariant(variantData)) + } + return androidProject } + @NonNull + private static Variant createVariant(BaseVariantData variantData) { + return new VariantImpl( + variantData.baseName, + variantData.variantConfiguration.mergedFlavor); + } + /** * Create a ProductFlavorContainer from a ProductFlavorData * @param productFlavorData the product flavor data diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/VariantImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/VariantImpl.java index 0352221..69a799f 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/VariantImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/VariantImpl.java @@ -16,34 +16,48 @@ package com.android.build.gradle.internal.model; +import com.android.annotations.NonNull; import com.android.build.gradle.model.Variant; import com.android.builder.model.ProductFlavor; import java.io.File; +import java.io.Serializable; /** * Implementation of Variant that is serializable. */ -public class VariantImpl implements Variant { +class VariantImpl implements Variant, Serializable { + private static final long serialVersionUID = 1L; + private final String name; + private final ProductFlavor mergedFlavor; + + VariantImpl(String name, ProductFlavor mergedFlavor) { + this.name = name; + this.mergedFlavor = ProductFlavorImpl.cloneFlavor(mergedFlavor); + } @Override + @NonNull public String getName() { - return null; //To change body of implemented methods use File | Settings | File Templates. + return name; } @Override + @NonNull public File getOutput() { - return null; //To change body of implemented methods use File | Settings | File Templates. + return new File(""); } @Override + @NonNull public String getBuildType() { - return null; //To change body of implemented methods use File | Settings | File Templates. + return ""; } @Override + @NonNull public ProductFlavor getMergedFlavor() { - return null; //To change body of implemented methods use File | Settings | File Templates. + return mergedFlavor; } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/BaseTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/BaseTask.groovy index 3d27246..41c3794 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/BaseTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/BaseTask.groovy @@ -14,15 +14,16 @@ * limitations under the License. */ package com.android.build.gradle.internal.tasks + import com.android.build.gradle.BasePlugin -import com.android.build.gradle.internal.ApplicationVariant +import com.android.build.gradle.internal.variant.BaseVariantData import com.android.builder.AndroidBuilder import org.gradle.api.DefaultTask public abstract class BaseTask extends DefaultTask { BasePlugin plugin - ApplicationVariant variant + BaseVariantData variant protected AndroidBuilder getBuilder() { return plugin.getAndroidBuilder(variant) diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/DependencyReportTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/DependencyReportTask.groovy index aaac8aa..a4d832e 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/DependencyReportTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/DependencyReportTask.groovy @@ -15,34 +15,31 @@ */ package com.android.build.gradle.internal.tasks - import com.android.build.gradle.internal.AndroidAsciiReportRenderer -import com.android.build.gradle.internal.ApplicationVariant +import com.android.build.gradle.internal.variant.BaseVariantData import org.gradle.api.DefaultTask -import org.gradle.api.artifacts.Configuration import org.gradle.api.tasks.TaskAction import org.gradle.logging.StyledTextOutputFactory - /** */ public class DependencyReportTask extends DefaultTask { private AndroidAsciiReportRenderer renderer = new AndroidAsciiReportRenderer(); - private Set<ApplicationVariant> variants = []; + private Set<BaseVariantData> variants = []; @TaskAction public void generate() throws IOException { renderer.setOutput(getServices().get(StyledTextOutputFactory.class).create(getClass())); - SortedSet<ApplicationVariant> sortedConfigurations = new TreeSet<Configuration>( - new Comparator<ApplicationVariant>() { - public int compare(ApplicationVariant conf1, ApplicationVariant conf2) { + SortedSet<BaseVariantData> sortedConfigurations = new TreeSet<BaseVariantData>( + new Comparator<BaseVariantData>() { + public int compare(BaseVariantData conf1, BaseVariantData conf2) { return conf1.getName().compareTo(conf2.getName()); } }); sortedConfigurations.addAll(getVariants()); - for (ApplicationVariant variant : sortedConfigurations) { + for (BaseVariantData variant : sortedConfigurations) { renderer.startVariant(variant); renderer.render(variant); } @@ -54,7 +51,7 @@ public class DependencyReportTask extends DefaultTask { * * @return the configurations. */ - public Set<ApplicationVariant> getVariants() { + public Set<BaseVariantData> getVariants() { return variants; } @@ -63,7 +60,7 @@ public class DependencyReportTask extends DefaultTask { * * @param configurations The configuration. Must not be null. */ - public void setVariants(Collection<ApplicationVariant> variants) { + public void setVariants(Collection<BaseVariantData> variants) { this.variants.addAll(variants); } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/PrepareDependenciesTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/PrepareDependenciesTask.groovy index 943d043..53a78b7 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/PrepareDependenciesTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/PrepareDependenciesTask.groovy @@ -29,7 +29,7 @@ public class PrepareDependenciesTask extends BaseTask { @TaskAction protected void prepare() { - def minSdkVersion = variant.config.minSdkVersion + def minSdkVersion = variant.variantConfiguration.minSdkVersion for (DependencyChecker checker : checkers) { for (Integer api : checker.foundAndroidApis) { diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/SigningReportTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/SigningReportTask.groovy index a69323c..d07117c 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/SigningReportTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/SigningReportTask.groovy @@ -16,8 +16,8 @@ package com.android.build.gradle.internal.tasks -import com.android.build.gradle.internal.ApplicationVariant import com.android.build.gradle.internal.dsl.SigningConfigDsl +import com.android.build.gradle.internal.variant.BaseVariantData import com.android.builder.signing.CertificateInfo import com.android.builder.signing.KeystoreHelper import com.android.builder.signing.KeytoolException @@ -43,7 +43,7 @@ import static org.gradle.logging.StyledTextOutput.Style.Normal */ class SigningReportTask extends BaseTask { - private Set<ApplicationVariant> variants = []; + private Set<BaseVariantData> variants = []; @TaskAction public void generate() throws IOException { @@ -53,13 +53,13 @@ class SigningReportTask extends BaseTask { Map<SigningConfig, SigningInfo> cache = Maps.newHashMap() - for (ApplicationVariant variant : variants) { + for (BaseVariantData variant : variants) { textOutput.withStyle(Identifier).text("Variant: ") textOutput.withStyle(Description).text(variant.name) textOutput.println() // get the data - SigningConfigDsl signingConfig = (SigningConfigDsl) variant.config.signingConfig + SigningConfigDsl signingConfig = (SigningConfigDsl) variant.variantConfiguration.signingConfig if (signingConfig == null) { textOutput.withStyle(Identifier).text("Config: ") textOutput.withStyle(Normal).text("none") @@ -112,11 +112,11 @@ class SigningReportTask extends BaseTask { * * @param configurations The configuration. Must not be null. */ - public void setVariants(Collection<ApplicationVariant> variants) { + public void setVariants(Collection<BaseVariantData> variants) { this.variants.addAll(variants); } - private SigningInfo getSigningInfo(SigningConfig signingConfig, + private static SigningInfo getSigningInfo(SigningConfig signingConfig, Map<SigningConfig, SigningInfo> cache) { SigningInfo signingInfo = cache.get(signingConfig) diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/TestFlavorTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/TestFlavorTask.groovy index bdb5c15..92011fb 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/TestFlavorTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/TestFlavorTask.groovy @@ -17,9 +17,11 @@ package com.android.build.gradle.internal.tasks import com.android.annotations.NonNull import com.android.annotations.Nullable -import com.android.build.gradle.internal.ApplicationVariant import com.android.build.gradle.internal.test.report.ReportType import com.android.build.gradle.internal.test.report.TestReport +import com.android.build.gradle.internal.variant.BaseVariantData +import com.android.build.gradle.internal.variant.TestVariantData +import com.android.builder.internal.util.concurrent.WaitableExecutor import com.android.builder.testing.CustomTestRunListener import com.android.ddmlib.AndroidDebugBridge import com.android.ddmlib.IDevice @@ -61,7 +63,7 @@ public class TestFlavorTask extends BaseTask implements AndroidTestTask { @Input String flavorName - ApplicationVariant testedVariant + BaseVariantData testedVariantData boolean ignoreFailures boolean testFailed @@ -71,81 +73,82 @@ public class TestFlavorTask extends BaseTask implements AndroidTestTask { */ private static class DeviceTestRunner implements Callable<Boolean> { - private final IDevice mDevice - private final String mDeviceName - private final String mFlavorName - private final File mResultsDir - private final File mTestApk - private final ApplicationVariant mVariant - private final File mTestedApk - private final ApplicationVariant mTestedVariant - private final ILogger mLogger - private final Project mProject + private final Project project + private final IDevice device + private final String deviceName + private final String flavorName + private final File resultsDir + private final File testApk + private final TestVariantData variantData + private final File testedApk + private final BaseVariantData testedVariantData + private final ILogger logger DeviceTestRunner(@NonNull IDevice device, @NonNull Project project, @NonNull String flavorName, - @NonNull File testApk, @NonNull ApplicationVariant variant, - @Nullable File testedApk, @NonNull ApplicationVariant testedVariant, + @NonNull File testApk, @NonNull TestVariantData variantData, + @Nullable File testedApk, @NonNull BaseVariantData testedVariantData, @NonNull File resultsDir, @NonNull ILogger logger) { - mProject = project - mDevice = device - mDeviceName = computeDeviceName(device) - mFlavorName = flavorName - mResultsDir = resultsDir - mTestApk = testApk - mVariant = variant - mTestedApk = testedApk - mTestedVariant = testedVariant - mLogger = logger + this.project = project + this.device = device + this.deviceName = computeDeviceName(device) + this.flavorName = flavorName + this.resultsDir = resultsDir + this.testApk = testApk + this.variantData = variantData + this.testedApk = testedApk + this.testedVariantData = testedVariantData + this.logger = logger } @Override Boolean call() throws Exception { try { - if (mTestedApk != null) { - mLogger.info("Device '%s': installing %s", mDeviceName, mTestedApk.absolutePath) - mDevice.installPackage(mTestedApk.absolutePath, true /*reinstall*/) + if (testedApk != null) { + logger.info("Device '%s': installing %s", deviceName, testedApk.absolutePath) + device.installPackage(testedApk.absolutePath, true /*reinstall*/) } - mLogger.info("Device '%s': installing %s", mDeviceName, mTestApk.absolutePath) - mDevice.installPackage(mTestApk.absolutePath, true /*reinstall*/) + logger.info("Device '%s': installing %s", deviceName, testApk.absolutePath) + device.installPackage(testApk.absolutePath, true /*reinstall*/) RemoteAndroidTestRunner runner = new RemoteAndroidTestRunner( - mVariant.config.packageName, mVariant.config.instrumentationRunner, - mDevice) + variantData.variantConfiguration.packageName, + variantData.variantConfiguration.instrumentationRunner, + device) - runner.setRunName(mDevice.serialNumber) + runner.setRunName(device.serialNumber) CustomTestRunListener runListener = new CustomTestRunListener( - mDeviceName, mProject.name, mFlavorName, mLogger) - runListener.setReportDir(mResultsDir) + deviceName, project.name, flavorName, logger) + runListener.setReportDir(resultsDir) runner.run(runListener) return runListener.runResult.hasFailedTests() } finally { // uninstall the apps - String packageName = mVariant.packageName - mLogger.info("Device '%s': uninstalling %s", mDeviceName, packageName) - mDevice.uninstallPackage(packageName) - - if (mTestedApk != null) { - packageName = mTestedVariant.packageName - mLogger.info("Device '%s': uninstalling %s", mDeviceName, packageName) - mDevice.uninstallPackage(packageName) + String packageName = variantData.packageName + logger.info("Device '%s': uninstalling %s", deviceName, packageName) + device.uninstallPackage(packageName) + + if (testedApk != null) { + packageName = testedVariantData.packageName + logger.info("Device '%s': uninstalling %s", deviceName, packageName) + device.uninstallPackage(packageName) } } } - private String computeDeviceName(@NonNull IDevice device) { + private static String computeDeviceName(@NonNull IDevice device) { String version = device.getProperty(IDevice.PROP_BUILD_VERSION); boolean emulator = device.isEmulator() String name; if (emulator) { - name = mDevice.avdName != null ? mDevice.avdName + "(AVD)" : mDevice.serialNumber + name = device.avdName != null ? device.avdName + "(AVD)" : device.serialNumber } else { String model = device.getProperty(IDevice.PROP_DEVICE_MODEL) - name = model != null ? model : mDevice.serialNumber + name = model != null ? model : device.serialNumber } return version != null ? name + " - " + version : name @@ -188,10 +191,13 @@ public class TestFlavorTask extends BaseTask implements AndroidTestTask { String flavor = getFlavorName() + assert variant instanceof TestVariantData + TestVariantData testVariantData = (TestVariantData) variant + for (IDevice device : devices) { executor.execute(new DeviceTestRunner(device, project, flavor, - testApk, variant, - testedApk, testedVariant, + testApk, testVariantData, + testedApk, testedVariantData, resultsOutDir, plugin.logger)) } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/variant/ApkVariantData.java b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/ApkVariantData.java new file mode 100644 index 0000000..ef74235 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/ApkVariantData.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2013 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.variant; + +import com.android.annotations.NonNull; +import com.android.build.gradle.tasks.Dex; +import com.android.build.gradle.tasks.PackageApplication; +import com.android.build.gradle.tasks.ZipAlign; +import com.android.builder.VariantConfiguration; +import org.gradle.api.DefaultTask; + +/** + * Base data about a variant that generates an APK file. + */ +public abstract class ApkVariantData extends BaseVariantData { + + public Dex dexTask; + public PackageApplication packageApplicationTask; + public ZipAlign zipAlignTask; + + public DefaultTask installTask; + public DefaultTask uninstallTask; + + protected ApkVariantData(@NonNull VariantConfiguration config) { + super(config); + } + + @Override + @NonNull + public String getDescription() { + if (getVariantConfiguration().hasFlavors()) { + return String.format("%s build for flavor %s", + getCapitalizedBuildTypeName(), + getFlavoredName(true)); + } else { + return String.format("%s build", getCapitalizedBuildTypeName()); + } + } + + @Override + @NonNull + public String getDirName() { + if (getVariantConfiguration().hasFlavors()) { + return String.format("%s/%s", + getFlavoredName(false), getVariantConfiguration().getBuildType().getName()); + } else { + return getVariantConfiguration().getBuildType().getName(); + } + } + + @Override + @NonNull + public String getBaseName() { + if (getVariantConfiguration().hasFlavors()) { + return String.format("%s-%s", + getFlavoredName(false), getVariantConfiguration().getBuildType().getName()); + } else { + return getVariantConfiguration().getBuildType().getName(); + } + } + + public boolean isSigned() { + return getVariantConfiguration().isSigningReady(); + } + + public boolean getZipAlign() { + return getVariantConfiguration().getBuildType().isZipAlign(); + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/variant/ApplicationVariantData.java b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/ApplicationVariantData.java new file mode 100644 index 0000000..7ba9675 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/ApplicationVariantData.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2013 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.variant; + +import com.android.annotations.NonNull; +import com.android.builder.VariantConfiguration; + +/** + * Data about a variant that produce an application APK + */ +public class ApplicationVariantData extends ApkVariantData { + + public ApplicationVariantData(@NonNull VariantConfiguration config) { + super(config); + } + + @NonNull + @Override + protected String computeName() { + return getVariantConfiguration().hasFlavors() ? + String.format("%s%s", + getFlavoredName(true), getCapitalizedBuildTypeName()) : + getCapitalizedBuildTypeName(); + } + + @Override + public boolean getRunProguard() { + return getVariantConfiguration().getBuildType().isRunProguard(); + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/variant/BaseVariantData.java b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/BaseVariantData.java new file mode 100644 index 0000000..a8bf7e5 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/BaseVariantData.java @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2013 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.variant; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.build.gradle.internal.StringHelper; +import com.android.build.gradle.internal.tasks.PrepareDependenciesTask; +import com.android.build.gradle.internal.tasks.TestFlavorTask; +import com.android.build.gradle.tasks.AidlCompile; +import com.android.build.gradle.tasks.GenerateBuildConfig; +import com.android.build.gradle.tasks.MergeAssets; +import com.android.build.gradle.tasks.MergeResources; +import com.android.build.gradle.tasks.ProcessAndroidResources; +import com.android.build.gradle.tasks.ProcessManifest; +import com.android.build.gradle.tasks.RenderscriptCompile; +import com.android.builder.BuilderConstants; +import com.android.builder.DefaultProductFlavor; +import com.android.builder.VariantConfiguration; +import org.gradle.api.DefaultTask; +import org.gradle.api.tasks.Copy; +import org.gradle.api.tasks.compile.JavaCompile; + +import java.io.File; + +/** + * Base data about a variant. + */ +public abstract class BaseVariantData { + + private String name; + private final VariantConfiguration variantConfiguration; + + public PrepareDependenciesTask prepareDependenciesTask; + + public ProcessManifest processManifestTask; + public RenderscriptCompile renderscriptCompileTask; + public AidlCompile aidlCompileTask; + public MergeResources mergeResourcesTask; + public MergeAssets mergeAssetsTask; + public ProcessAndroidResources processResourcesTask; + public GenerateBuildConfig generateBuildConfigTask; + + public JavaCompile javaCompileTask; + public Copy processJavaResources; + + public File outputFile; + + public DefaultTask assembleTask; + public TestFlavorTask testFlavorTask; + + public BaseVariantData(@NonNull VariantConfiguration variantConfiguration) { + this.variantConfiguration = variantConfiguration; + this.name = computeName(); + } + + @NonNull + protected abstract String computeName(); + + @NonNull + public VariantConfiguration getVariantConfiguration() { + return variantConfiguration; + } + + @NonNull + public String getName() { + return name; + } + + @NonNull + public abstract String getDescription(); + + @NonNull + public abstract String getDirName(); + + @NonNull + public String getFlavorDirName() { + if (variantConfiguration.hasFlavors()) { + return getFlavoredName(false); + } else { + return ""; + } + } + + @NonNull + public String getFlavorName() { + if (variantConfiguration.hasFlavors()) { + return getFlavoredName(true); + } else { + return StringHelper.capitalize(BuilderConstants.MAIN); + } + } + + @NonNull + public abstract String getBaseName(); + + @Nullable + public String getPackageName() { + return variantConfiguration.getPackageName(); + } + + @NonNull + protected String getFlavoredName(boolean capitalized) { + StringBuilder builder = new StringBuilder(); + for (DefaultProductFlavor flavor : variantConfiguration.getFlavorConfigs()) { + String name = flavor.getName(); + builder.append(capitalized ? StringHelper.capitalize(name) : name); + } + + return builder.toString(); + } + + @NonNull + protected String getCapitalizedBuildTypeName() { + return StringHelper.capitalize(variantConfiguration.getBuildType().getName()); + } + + public boolean getRunProguard() { + return false; + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/variant/LibraryVariantData.java b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/LibraryVariantData.java new file mode 100644 index 0000000..3e75d8b --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/LibraryVariantData.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2013 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.variant; + +import com.android.annotations.NonNull; +import com.android.builder.VariantConfiguration; +import org.gradle.api.tasks.bundling.Zip; + +/** + * Data about a variant that produce a Library bundle (.aar) + */ +public class LibraryVariantData extends BaseVariantData { + + public Zip packageLibTask; + + public LibraryVariantData(VariantConfiguration config) { + super(config); + } + + @Override + @NonNull + protected String computeName() { + return getVariantConfiguration().hasFlavors() ? + String.format("%s%s", + getFlavoredName(true), getCapitalizedBuildTypeName()) : + getCapitalizedBuildTypeName(); + } + + @Override + @NonNull + public String getDescription() { + if (getVariantConfiguration().hasFlavors()) { + return "Test build for the ${getFlavoredName(true)}${config.buildType.name.capitalize()} build"; + } else { + return "Test for the ${config.buildType.name.capitalize()} build"; + } + } + + @Override + @NonNull + public String getDirName() { + return getVariantConfiguration().getBuildType().getName(); + } + + @Override + @NonNull + public String getBaseName() { + return getVariantConfiguration().getBuildType().getName(); + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/variant/TestVariantData.java b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/TestVariantData.java new file mode 100644 index 0000000..b021daa --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/TestVariantData.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2013 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.variant; + +import com.android.annotations.NonNull; +import com.android.builder.VariantConfiguration; + +/** + * Data about a variant that produce a test APK + */ +public class TestVariantData extends ApkVariantData { + + public TestVariantData(@NonNull VariantConfiguration config) { + super(config); + } + + @NonNull + @Override + protected String computeName() { + return getVariantConfiguration().hasFlavors() ? + String.format("%sTest", getFlavoredName(true)) : + "Test"; + } + + @Override + @NonNull + public String getDescription() { + if (getVariantConfiguration().hasFlavors()) { + return String.format("Test build for the %s%s build", + getFlavoredName(true), getCapitalizedBuildTypeName()); + } else { + return String.format("Test build for the %s build", + getCapitalizedBuildTypeName()); + } + } + + @Override + @NonNull + public String getDirName() { + if (getVariantConfiguration().hasFlavors()) { + return String.format("%s/test", getFlavoredName(false)); + } else { + return "test"; + } + } + + @Override + @NonNull + public String getBaseName() { + if (getVariantConfiguration().hasFlavors()) { + return String.format("%s-test", getFlavoredName(false)); + } else { + return "test"; + } + } + + @Override + public boolean getZipAlign() { + return false; + } +} diff --git a/gradle/src/test/groovy/com/android/build/gradle/AppPluginDslTest.groovy b/gradle/src/test/groovy/com/android/build/gradle/AppPluginDslTest.groovy index 2fcfc10..9b6ed59 100644 --- a/gradle/src/test/groovy/com/android/build/gradle/AppPluginDslTest.groovy +++ b/gradle/src/test/groovy/com/android/build/gradle/AppPluginDslTest.groovy @@ -14,11 +14,13 @@ * limitations under the License. */ package com.android.build.gradle - +import com.android.annotations.NonNull +import com.android.build.gradle.api.ApkVariant +import com.android.build.gradle.api.ApplicationVariant +import com.android.build.gradle.api.TestVariant import com.android.build.gradle.internal.test.BaseTest import org.gradle.api.Project import org.gradle.testfixtures.ProjectBuilder - /** * Tests for the public DSL of the App plugin ("android") */ @@ -39,10 +41,10 @@ public class AppPluginDslTest extends BaseTest { compileSdkVersion 15 } - Set<BuildVariant> variants = project.android.buildVariants + Set<ApplicationVariant> variants = project.android.applicationVariants assertEquals(2, variants.size()) - Set<BuildVariant> testVariants = project.android.testBuildVariants + Set<TestVariant> testVariants = project.android.testVariants assertEquals(1, testVariants.size()) checkTestedVariant("Debug", "Test", variants, testVariants) @@ -62,10 +64,10 @@ public class AppPluginDslTest extends BaseTest { compileSdkVersion = 15 } - Set<BuildVariant> variants = project.android.buildVariants + Set<ApplicationVariant> variants = project.android.applicationVariants assertEquals(2, variants.size()) - Set<BuildVariant> testVariants = project.android.testBuildVariants + Set<TestVariant> testVariants = project.android.testVariants assertEquals(1, testVariants.size()) checkTestedVariant("Debug", "Test", variants, testVariants) @@ -82,10 +84,10 @@ public class AppPluginDslTest extends BaseTest { compileSdkVersion "android-15" } - Set<BuildVariant> variants = project.android.buildVariants + Set<ApplicationVariant> variants = project.android.applicationVariants assertEquals(2, variants.size()) - Set<BuildVariant> testVariants = project.android.testBuildVariants + Set<TestVariant> testVariants = project.android.testVariants assertEquals(1, testVariants.size()) checkTestedVariant("Debug", "Test", variants, testVariants) @@ -131,10 +133,10 @@ public class AppPluginDslTest extends BaseTest { } // does not include tests - Set<BuildVariant> variants = project.android.buildVariants + Set<ApplicationVariant> variants = project.android.applicationVariants assertEquals(3, variants.size()) - Set<BuildVariant> testVariants = project.android.testBuildVariants + Set<TestVariant> testVariants = project.android.testVariants assertEquals(1, testVariants.size()) checkTestedVariant("Staging", "Test", variants, testVariants) @@ -163,10 +165,10 @@ public class AppPluginDslTest extends BaseTest { } // does not include tests - Set<BuildVariant> variants = project.android.buildVariants + Set<ApplicationVariant> variants = project.android.applicationVariants assertEquals(4, variants.size()) - Set<BuildVariant> testVariants = project.android.testBuildVariants + Set<TestVariant> testVariants = project.android.testVariants assertEquals(2, testVariants.size()) checkTestedVariant("Flavor1Debug", "Flavor1Test", variants, testVariants) @@ -208,10 +210,10 @@ public class AppPluginDslTest extends BaseTest { } // does not include tests - Set<BuildVariant> variants = project.android.buildVariants + Set<ApplicationVariant> variants = project.android.applicationVariants assertEquals(12, variants.size()) - Set<BuildVariant> testVariants = project.android.testBuildVariants + Set<TestVariant> testVariants = project.android.testVariants assertEquals(6, testVariants.size()) checkTestedVariant("F1FaDebug", "F1FaTest", variants, testVariants) @@ -248,25 +250,30 @@ public class AppPluginDslTest extends BaseTest { } - private void checkTestedVariant(String variantName, String testedVariantName, - Set<BuildVariant> variants, Set<BuildVariant> testVariants) { - BuildVariant variant = findVariant(variants, variantName) + private static void checkTestedVariant(@NonNull String variantName, + @NonNull String testedVariantName, + @NonNull Set<ApplicationVariant> variants, + @NonNull Set<TestVariant> testVariants) { + ApplicationVariant variant = findNamedItem(variants, variantName) assertNotNull(variant) assertNotNull(variant.testVariant) assertEquals(testedVariantName, variant.testVariant.name) - assertEquals(variant.testVariant, findVariant(testVariants, testedVariantName)) - checkTasks(variant, false) - checkTasks(variant.testVariant, true) + assertEquals(variant.testVariant, findNamedItem(testVariants, testedVariantName)) + checkTasks(variant) + checkTasks(variant.testVariant) } - private void checkNonTestedVariant(String variantName, Set<BuildVariant> variants) { - BuildVariant variant = findVariant(variants, variantName) + private static void checkNonTestedVariant(@NonNull String variantName, + @NonNull Set<ApplicationVariant> variants) { + ApplicationVariant variant = findNamedItem(variants, variantName) assertNotNull(variant) assertNull(variant.testVariant) - checkTasks(variant, false) + checkTasks(variant) } - private static void checkTasks(BuildVariant variant, boolean testVariant) { + private static void checkTasks(@NonNull ApkVariant variant) { + boolean isTestVariant = variant instanceof TestVariant; + assertNotNull(variant.processManifest) assertNotNull(variant.aidlCompile) assertNotNull(variant.mergeResources) @@ -285,7 +292,7 @@ public class AppPluginDslTest extends BaseTest { assertNotNull(variant.install) // tested variant are never zipAligned. - if (!testVariant && variant.buildType.zipAlign) { + if (!isTestVariant && variant.buildType.zipAlign) { assertNotNull(variant.zipAlign) } else { assertNull(variant.zipAlign) @@ -294,20 +301,10 @@ public class AppPluginDslTest extends BaseTest { assertNull(variant.install) } - if (testVariant) { - assertNotNull(variant.instrumentTest) - } else { - assertNull(variant.instrumentTest) + if (isTestVariant) { + TestVariant testVariant = variant as TestVariant + assertNotNull(testVariant.instrumentTest) + assertNotNull(testVariant.testedVariant) } } - - private static BuildVariant findVariant(Collection<BuildVariant> variants, String name) { - for (BuildVariant variant : variants) { - if (name.equals(variant.name)) { - return variant - } - } - - return null - } }
\ No newline at end of file diff --git a/gradle/src/test/groovy/com/android/build/gradle/AppPluginInternalTest.groovy b/gradle/src/test/groovy/com/android/build/gradle/AppPluginInternalTest.groovy index 2cd1d02..a096fee 100644 --- a/gradle/src/test/groovy/com/android/build/gradle/AppPluginInternalTest.groovy +++ b/gradle/src/test/groovy/com/android/build/gradle/AppPluginInternalTest.groovy @@ -16,17 +16,16 @@ package com.android.build.gradle -import com.android.build.gradle.internal.ApplicationVariant import com.android.build.gradle.internal.BadPluginException import com.android.build.gradle.internal.test.BaseTest import com.android.build.gradle.internal.test.PluginHolder -import com.android.builder.DefaultBuildType +import com.android.build.gradle.internal.variant.BaseVariantData import com.android.builder.BuilderConstants +import com.android.builder.DefaultBuildType import com.android.builder.signing.KeystoreHelper import com.android.builder.signing.SigningConfig import org.gradle.api.Project import org.gradle.testfixtures.ProjectBuilder - /** * Tests for the internal workings of the app plugin ("android") */ @@ -57,16 +56,16 @@ public class AppPluginInternalTest extends BaseTest { assertEquals(0, plugin.productFlavors.size()) - List<ApplicationVariant> variants = plugin.variants + List<BaseVariantData> variants = plugin.variantDataList assertEquals(3, variants.size()) // includes the test variant(s) - ApplicationVariant debugVariant = findVariant(variants, "Debug") + BaseVariantData debugVariant = findNamedItem(variants, "Debug") assertNotNull(debugVariant) - ApplicationVariant release = findVariant(variants, "Release") + BaseVariantData release = findNamedItem(variants, "Release") assertNotNull(release) - ApplicationVariant test = findVariant(variants, "Test") + BaseVariantData test = findNamedItem(variants, "Test") assertNotNull(test) } @@ -135,21 +134,21 @@ public class AppPluginInternalTest extends BaseTest { assertEquals(3, plugin.buildTypes.size()) - List<ApplicationVariant> variants = plugin.variants + List<BaseVariantData> variants = plugin.variantDataList assertEquals(4, variants.size()) // includes the test variant(s) - ApplicationVariant debugVariant = findVariant(variants, "Debug") + BaseVariantData debugVariant = findNamedItem(variants, "Debug") assertNotNull(debugVariant) - ApplicationVariant releaseVariant = findVariant(variants, "Release") + BaseVariantData releaseVariant = findNamedItem(variants, "Release") assertNotNull(releaseVariant) - ApplicationVariant stagingVariant = findVariant(variants, "Staging") + BaseVariantData stagingVariant = findNamedItem(variants, "Staging") assertNotNull(stagingVariant) - ApplicationVariant testVariant = findVariant(variants, "Test") + BaseVariantData testVariant = findNamedItem(variants, "Test") assertNotNull(testVariant) - assertEquals("staging", testVariant.config.buildType.name) + assertEquals("staging", testVariant.variantConfiguration.buildType.name) } public void testFlavors() { @@ -176,15 +175,15 @@ public class AppPluginInternalTest extends BaseTest { assertEquals(2, plugin.productFlavors.size()) - List<ApplicationVariant> variants = plugin.variants + List<BaseVariantData> variants = plugin.variantDataList assertEquals(6, variants.size()) // includes the test variant(s) - assertNotNull(findVariant(variants, "Flavor1Debug")) - assertNotNull(findVariant(variants, "Flavor1Release")) - assertNotNull(findVariant(variants, "Flavor1Test")) - assertNotNull(findVariant(variants, "Flavor2Debug")) - assertNotNull(findVariant(variants, "Flavor2Release")) - assertNotNull(findVariant(variants, "Flavor2Test")) + assertNotNull(findNamedItem(variants, "Flavor1Debug")) + assertNotNull(findNamedItem(variants, "Flavor1Release")) + assertNotNull(findNamedItem(variants, "Flavor1Test")) + assertNotNull(findNamedItem(variants, "Flavor2Debug")) + assertNotNull(findNamedItem(variants, "Flavor2Release")) + assertNotNull(findNamedItem(variants, "Flavor2Test")) } public void testMultiFlavors() { @@ -223,27 +222,27 @@ public class AppPluginInternalTest extends BaseTest { assertEquals(5, plugin.productFlavors.size()) - List<ApplicationVariant> variants = plugin.variants + List<BaseVariantData> variants = plugin.variantDataList assertEquals(18, variants.size()) // includes the test variant(s) - assertNotNull(findVariant(variants, "F1FaDebug")) - assertNotNull(findVariant(variants, "F1FbDebug")) - assertNotNull(findVariant(variants, "F1FcDebug")) - assertNotNull(findVariant(variants, "F2FaDebug")) - assertNotNull(findVariant(variants, "F2FbDebug")) - assertNotNull(findVariant(variants, "F2FcDebug")) - assertNotNull(findVariant(variants, "F1FaRelease")) - assertNotNull(findVariant(variants, "F1FbRelease")) - assertNotNull(findVariant(variants, "F1FcRelease")) - assertNotNull(findVariant(variants, "F2FaRelease")) - assertNotNull(findVariant(variants, "F2FbRelease")) - assertNotNull(findVariant(variants, "F2FcRelease")) - assertNotNull(findVariant(variants, "F1FaTest")) - assertNotNull(findVariant(variants, "F1FbTest")) - assertNotNull(findVariant(variants, "F1FcTest")) - assertNotNull(findVariant(variants, "F2FaTest")) - assertNotNull(findVariant(variants, "F2FbTest")) - assertNotNull(findVariant(variants, "F2FcTest")) + assertNotNull(findNamedItem(variants, "F1FaDebug")) + assertNotNull(findNamedItem(variants, "F1FbDebug")) + assertNotNull(findNamedItem(variants, "F1FcDebug")) + assertNotNull(findNamedItem(variants, "F2FaDebug")) + assertNotNull(findNamedItem(variants, "F2FbDebug")) + assertNotNull(findNamedItem(variants, "F2FcDebug")) + assertNotNull(findNamedItem(variants, "F1FaRelease")) + assertNotNull(findNamedItem(variants, "F1FbRelease")) + assertNotNull(findNamedItem(variants, "F1FcRelease")) + assertNotNull(findNamedItem(variants, "F2FaRelease")) + assertNotNull(findNamedItem(variants, "F2FbRelease")) + assertNotNull(findNamedItem(variants, "F2FcRelease")) + assertNotNull(findNamedItem(variants, "F1FaTest")) + assertNotNull(findNamedItem(variants, "F1FbTest")) + assertNotNull(findNamedItem(variants, "F1FcTest")) + assertNotNull(findNamedItem(variants, "F2FaTest")) + assertNotNull(findNamedItem(variants, "F2FbTest")) + assertNotNull(findNamedItem(variants, "F2FcTest")) } public void testSigningConfigs() { @@ -306,44 +305,44 @@ public class AppPluginInternalTest extends BaseTest { AppPlugin plugin = AppPlugin.pluginHolder.plugin plugin.createAndroidTasks() - List<ApplicationVariant> variants = plugin.variants + List<BaseVariantData> variants = plugin.variantDataList assertEquals(8, variants.size()) // includes the test variant(s) - ApplicationVariant variant + BaseVariantData variant SigningConfig signingConfig - variant = findVariant(variants, "Flavor1Debug") + variant = findNamedItem(variants, "Flavor1Debug") assertNotNull(variant) - signingConfig = variant.config.signingConfig + signingConfig = variant.variantConfiguration.signingConfig assertNotNull(signingConfig) assertEquals(KeystoreHelper.defaultDebugKeystoreLocation(), signingConfig.storeFile?.absolutePath) - variant = findVariant(variants, "Flavor1Staging") + variant = findNamedItem(variants, "Flavor1Staging") assertNotNull(variant) - signingConfig = variant.config.signingConfig + signingConfig = variant.variantConfiguration.signingConfig assertNull(signingConfig) - variant = findVariant(variants, "Flavor1Release") + variant = findNamedItem(variants, "Flavor1Release") assertNotNull(variant) - signingConfig = variant.config.signingConfig + signingConfig = variant.variantConfiguration.signingConfig assertNotNull(signingConfig) assertEquals(new File(project.projectDir, "a3"), signingConfig.storeFile) - variant = findVariant(variants, "Flavor2Debug") + variant = findNamedItem(variants, "Flavor2Debug") assertNotNull(variant) - signingConfig = variant.config.signingConfig + signingConfig = variant.variantConfiguration.signingConfig assertNotNull(signingConfig) assertEquals(KeystoreHelper.defaultDebugKeystoreLocation(), signingConfig.storeFile?.absolutePath) - variant = findVariant(variants, "Flavor2Staging") + variant = findNamedItem(variants, "Flavor2Staging") assertNotNull(variant) - signingConfig = variant.config.signingConfig + signingConfig = variant.variantConfiguration.signingConfig assertNotNull(signingConfig) assertEquals(new File(project.projectDir, "a1"), signingConfig.storeFile) - variant = findVariant(variants, "Flavor2Release") + variant = findNamedItem(variants, "Flavor2Release") assertNotNull(variant) - signingConfig = variant.config.signingConfig + signingConfig = variant.variantConfiguration.signingConfig assertNotNull(signingConfig) assertEquals(new File(project.projectDir, "a3"), signingConfig.storeFile) } @@ -426,15 +425,4 @@ public class AppPluginInternalTest extends BaseTest { assertNotNull(recordedException) assertEquals(BadPluginException.class, recordedException.getClass()) } - - private static ApplicationVariant findVariant(Collection<ApplicationVariant> variants, - String name) { - for (ApplicationVariant variant : variants) { - if (name.equals(variant.name)) { - return variant - } - } - - return null - } }
\ No newline at end of file diff --git a/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy b/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy index 1f39d6f..0cf9322 100644 --- a/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy +++ b/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy @@ -14,6 +14,10 @@ * limitations under the License. */ package com.android.build.gradle + +import com.android.annotations.NonNull +import com.android.build.gradle.api.LibraryVariant +import com.android.build.gradle.api.TestVariant import com.android.build.gradle.internal.test.BaseTest import com.android.builder.signing.SigningConfig import org.gradle.api.Project @@ -38,10 +42,10 @@ public class LibraryPluginDslTest extends BaseTest { compileSdkVersion 15 } - Set<BuildVariant> variants = project.android.buildVariants + Set<LibraryVariant> variants = project.android.libraryVariants assertEquals(2, variants.size()) - Set<BuildVariant> testVariants = project.android.testBuildVariants + Set<TestVariant> testVariants = project.android.testVariants assertEquals(1, testVariants.size()) checkTestedVariant("Debug", "Test", variants, testVariants) @@ -72,26 +76,28 @@ public class LibraryPluginDslTest extends BaseTest { assertEquals("foo", signingConfig.storePassword) } - - private void checkTestedVariant(String variantName, String testedVariantName, - Set<BuildVariant> variants, Set<BuildVariant> testVariants) { - BuildVariant variant = findVariant(variants, variantName) + private static void checkTestedVariant(@NonNull String variantName, + @NonNull String testedVariantName, + @NonNull Set<LibraryVariant> variants, + @NonNull Set<TestVariant> testVariants) { + LibraryVariant variant = findNamedItem(variants, variantName) assertNotNull(variant) assertNotNull(variant.testVariant) assertEquals(testedVariantName, variant.testVariant.name) - assertEquals(variant.testVariant, findVariant(testVariants, testedVariantName)) + assertEquals(variant.testVariant, findNamedItem(testVariants, testedVariantName)) checkLibraryTasks(variant) checkTestTasks(variant.testVariant) } - private void checkNonTestedVariant(String variantName, Set<BuildVariant> variants) { - BuildVariant variant = findVariant(variants, variantName) + private static void checkNonTestedVariant(@NonNull String variantName, + @NonNull Set<LibraryVariant> variants) { + LibraryVariant variant = findNamedItem(variants, variantName) assertNotNull(variant) assertNull(variant.testVariant) checkLibraryTasks(variant) } - private static void checkTestTasks(BuildVariant variant) { + private static void checkTestTasks(@NonNull TestVariant variant) { assertNotNull(variant.processManifest) assertNotNull(variant.aidlCompile) assertNotNull(variant.mergeResources) @@ -117,7 +123,7 @@ public class LibraryPluginDslTest extends BaseTest { assertNotNull(variant.instrumentTest) } - private static void checkLibraryTasks(BuildVariant variant) { + private static void checkLibraryTasks(@NonNull LibraryVariant variant) { assertNotNull(variant.processManifest) assertNotNull(variant.aidlCompile) assertNotNull(variant.processResources) @@ -126,22 +132,5 @@ public class LibraryPluginDslTest extends BaseTest { assertNotNull(variant.processJavaResources) assertNotNull(variant.assemble) - - assertNull(variant.dex) - assertNull(variant.packageApplication) - assertNull(variant.zipAlign) - assertNull(variant.install) - assertNull(variant.uninstall) - assertNull(variant.instrumentTest) - } - - private static BuildVariant findVariant(Collection<BuildVariant> variants, String name) { - for (BuildVariant variant : variants) { - if (name.equals(variant.name)) { - return variant - } - } - - return null } }
\ No newline at end of file diff --git a/gradle/src/test/groovy/com/android/build/gradle/internal/test/BaseTest.groovy b/gradle/src/test/groovy/com/android/build/gradle/internal/test/BaseTest.groovy index f542fbc..5a96009 100755 --- a/gradle/src/test/groovy/com/android/build/gradle/internal/test/BaseTest.groovy +++ b/gradle/src/test/groovy/com/android/build/gradle/internal/test/BaseTest.groovy @@ -15,7 +15,7 @@ */ package com.android.build.gradle.internal.test - +import com.android.annotations.NonNull import com.android.sdklib.internal.project.ProjectProperties import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy import junit.framework.TestCase @@ -153,4 +153,21 @@ public abstract class BaseTest extends TestCase { folder.delete() } + + /** + * Returns the name item from the collection of items. The items *must* have a "name" property. + * @param items the item collection to search for a match + * @param name the name of the item to return + * @return the found item or null + */ + protected static <T> T findNamedItem(@NonNull Collection<T> items, + @NonNull String name) { + for (T item : items) { + if (name.equals(item.name)) { + return item + } + } + + return null + } } diff --git a/tests/api/app/build.gradle b/tests/api/app/build.gradle index d05a6e2..0cf9a85 100644 --- a/tests/api/app/build.gradle +++ b/tests/api/app/build.gradle @@ -6,7 +6,7 @@ android { } // query for all (non-test) variants and inject a new step in the builds -android.buildVariants.each { variant -> +android.applicationVariants.each { variant -> // create a task that "handles" the compile classes // does some processing (or not) // and outputs a jar diff --git a/tests/api/lib/build.gradle b/tests/api/lib/build.gradle index 4630a6e..a354f5b 100644 --- a/tests/api/lib/build.gradle +++ b/tests/api/lib/build.gradle @@ -6,7 +6,7 @@ android { } // query for all (non-test) variants and inject a new step in the builds -android.buildVariants.each { variant -> +android.libraryVariants.each { variant -> // create a task that copies some additional data in the library bundle def copyBlahTask = tasks.add(name: "copy${variant.name.capitalize()}Blah", type: Copy) { from file("$project.projectDir/blah") |