aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@android.com>2013-03-29 15:53:40 -0700
committerXavier Ducrohet <xav@android.com>2013-04-04 17:07:13 -0700
commita03b680faaebe3bbf93e2abc7a00f69377e6918d (patch)
tree86a1292ae5cc65db0a6b992b917465f2e1436fae
parent5894d6b0a48611186d8630a14f66f5e12c76af18 (diff)
downloadbuild-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
-rw-r--r--builder/src/main/java/com/android/builder/VariantConfiguration.java14
-rw-r--r--gradle-model/src/main/java/com/android/build/gradle/model/Variant.java5
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/AppExtension.groovy16
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy136
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy20
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy398
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/BuildVariant.groovy229
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/LibraryExtension.groovy17
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/LibraryPlugin.groovy135
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/api/AndroidSourceDirectorySet.java (renamed from gradle/src/main/groovy/com/android/build/gradle/AndroidSourceDirectorySet.java)2
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/api/AndroidSourceFile.java (renamed from gradle/src/main/groovy/com/android/build/gradle/AndroidSourceFile.java)2
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/api/AndroidSourceSet.groovy (renamed from gradle/src/main/groovy/com/android/build/gradle/AndroidSourceSet.groovy)2
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/api/ApkVariant.java103
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/api/ApplicationVariant.java31
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/api/BaseVariant.java140
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/api/LibraryVariant.java56
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/api/TestVariant.java40
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/AndroidAsciiReportRenderer.java12
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/ApplicationVariant.groovy124
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/BuildTypeData.groovy2
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/DefaultBuildVariant.groovy190
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/ProductFlavorData.groovy5
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/ProductionAppVariant.groovy65
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/StringHelper.groovy30
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/TestAppVariant.groovy66
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/api/ApplicationVariantImpl.java213
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceDirectorySet.java (renamed from gradle/src/main/groovy/com/android/build/gradle/internal/DefaultAndroidSourceDirectorySet.java)4
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceFile.java (renamed from gradle/src/main/groovy/com/android/build/gradle/internal/DefaultAndroidSourceFile.java)4
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceSet.java (renamed from gradle/src/main/groovy/com/android/build/gradle/internal/DefaultAndroidSourceSet.java)8
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/api/LibraryVariantImpl.java173
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/api/TestVariantImpl.java214
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/dependency/ConfigurationDependencies.groovy5
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AndroidSourceSetFactory.groovy4
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeContainerImpl.java2
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java7
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy13
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/VariantImpl.java24
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/tasks/BaseTask.groovy5
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/tasks/DependencyReportTask.groovy19
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/tasks/PrepareDependenciesTask.groovy2
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/tasks/SigningReportTask.groovy12
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/tasks/TestFlavorTask.groovy100
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/variant/ApkVariantData.java82
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/variant/ApplicationVariantData.java43
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/variant/BaseVariantData.java134
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/variant/LibraryVariantData.java63
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/variant/TestVariantData.java74
-rw-r--r--gradle/src/test/groovy/com/android/build/gradle/AppPluginDslTest.groovy75
-rw-r--r--gradle/src/test/groovy/com/android/build/gradle/AppPluginInternalTest.groovy116
-rw-r--r--gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy45
-rwxr-xr-xgradle/src/test/groovy/com/android/build/gradle/internal/test/BaseTest.groovy19
-rw-r--r--tests/api/app/build.gradle2
-rw-r--r--tests/api/lib/build.gradle2
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")