aboutsummaryrefslogtreecommitdiff
path: root/gradle
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@google.com>2013-12-03 23:20:10 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2013-12-03 23:20:10 +0000
commite2bee4d96ec7a492037e345fcc2c256eaa17efeb (patch)
treeb18419b0c00c29ed4fc5ef22b5e54fd0b14e0afc /gradle
parent95740365fec6948f6110218bc35dbd57ef97de60 (diff)
parent2cae6225fe7c618afd5efc6bff9efd69d0e9a724 (diff)
downloadbuild-e2bee4d96ec7a492037e345fcc2c256eaa17efeb.tar.gz
Merge "Extensible model with extra artifacts per variants."
Diffstat (limited to 'gradle')
-rw-r--r--gradle/src/build-test/groovy/com/android/build/gradle/ManualBuildTest.java44
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy15
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy51
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy169
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/api/BaseVariant.java8
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/AndroidAsciiReportRenderer.java8
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/SourceSetSourceProviderWrapper.java89
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/api/BaseVariantImpl.java6
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy2
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy2
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java2
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/dsl/ProductFlavorDsl.groovy3
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidArtifactImpl.java (renamed from gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactInfoImpl.java)73
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidLibraryImpl.java5
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactMetaDataImpl.java56
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/BaseArtifactImpl.java106
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeContainerImpl.java39
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeImpl.java2
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java82
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/JavaArtifactImpl.java55
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy161
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorContainerImpl.java49
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java3
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java14
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderContainerImpl.java102
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderImpl.java42
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/model/VariantImpl.java58
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/tasks/NdkTask.groovy3
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/internal/variant/DefaultSourceProviderContainer.java51
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/tasks/Lint.groovy10
-rw-r--r--gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy2
31 files changed, 1054 insertions, 258 deletions
diff --git a/gradle/src/build-test/groovy/com/android/build/gradle/ManualBuildTest.java b/gradle/src/build-test/groovy/com/android/build/gradle/ManualBuildTest.java
index 423107a..6512f0d 100644
--- a/gradle/src/build-test/groovy/com/android/build/gradle/ManualBuildTest.java
+++ b/gradle/src/build-test/groovy/com/android/build/gradle/ManualBuildTest.java
@@ -32,23 +32,55 @@ import java.io.IOException;
*/
public class ManualBuildTest extends BuildTest {
+ private final static int RED = 0xFFFF0000;
+ private final static int GREEN = 0xFF00FF00;
+ private final static int BLUE = 0xFF0000FF;
+
public void testOverlay1Content() throws Exception {
File project = buildProject("overlay1", BasePlugin.GRADLE_MIN_VERSION);
File drawableOutput = new File(project, "build/res/all/debug/drawable");
- checkImageColor(drawableOutput, "no_overlay.png", (int) 0xFF00FF00);
- checkImageColor(drawableOutput, "type_overlay.png", (int) 0xFF00FF00);
+ checkImageColor(drawableOutput, "no_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "type_overlay.png", GREEN);
}
public void testOverlay2Content() throws Exception {
File project = buildProject("overlay2", BasePlugin.GRADLE_MIN_VERSION);
File drawableOutput = new File(project, "build/res/all/one/debug/drawable");
- checkImageColor(drawableOutput, "no_overlay.png", (int) 0xFF00FF00);
- checkImageColor(drawableOutput, "type_overlay.png", (int) 0xFF00FF00);
- checkImageColor(drawableOutput, "flavor_overlay.png", (int) 0xFF00FF00);
- checkImageColor(drawableOutput, "type_flavor_overlay.png", (int) 0xFF00FF00);
+ checkImageColor(drawableOutput, "no_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "type_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "flavor_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "type_flavor_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "variant_type_flavor_overlay.png", GREEN);
+ }
+
+ public void testOverlay3Content() throws Exception {
+ File project = buildProject("overlay3", BasePlugin.GRADLE_MIN_VERSION);
+ File drawableOutput = new File(project, "build/res/all/freebeta/debug/drawable");
+
+ checkImageColor(drawableOutput, "no_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "debug_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "beta_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "free_beta_debug_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "free_normal_overlay.png", RED);
+
+ drawableOutput = new File(project, "build/res/all/freenormal/debug/drawable");
+
+ checkImageColor(drawableOutput, "no_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "debug_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "beta_overlay.png", RED);
+ checkImageColor(drawableOutput, "free_beta_debug_overlay.png", RED);
+ checkImageColor(drawableOutput, "free_normal_overlay.png", GREEN);
+
+ drawableOutput = new File(project, "build/res/all/paidbeta/debug/drawable");
+
+ checkImageColor(drawableOutput, "no_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "debug_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "beta_overlay.png", GREEN);
+ checkImageColor(drawableOutput, "free_beta_debug_overlay.png", RED);
+ checkImageColor(drawableOutput, "free_normal_overlay.png", RED);
}
public void testRepo() {
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 33db4c3..0cc4e35 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy
+++ b/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy
@@ -20,7 +20,6 @@ import com.android.annotations.Nullable
import com.android.build.gradle.api.BaseVariant
import com.android.build.gradle.internal.BuildTypeData
import com.android.build.gradle.internal.ConfigurationProvider
-import com.android.build.gradle.internal.ConfigurationProviderImpl
import com.android.build.gradle.internal.ProductFlavorData
import com.android.build.gradle.internal.api.ApplicationVariantImpl
import com.android.build.gradle.internal.api.DefaultAndroidSourceSet
@@ -451,9 +450,17 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements Plugin<Pr
// create the variant and get its internal storage object.
ApplicationVariantData appVariantData = new ApplicationVariantData(variantConfig)
- DefaultAndroidSourceSet sourceSet = (DefaultAndroidSourceSet) extension.sourceSetsContainer.maybeCreate(variantConfig.fullName)
- variantConfig.setVariantSourceProvider(sourceSet)
- variantProviders.add(new ConfigurationProviderImpl(project, sourceSet))
+ DefaultAndroidSourceSet variantSourceSet = (DefaultAndroidSourceSet) extension.sourceSetsContainer.maybeCreate(variantConfig.fullName)
+ variantConfig.setVariantSourceProvider(variantSourceSet)
+ // TODO: hmm this won't work
+ //variantProviders.add(new ConfigurationProviderImpl(project, variantSourceSet))
+
+ if (flavorDataList.size() > 1) {
+ DefaultAndroidSourceSet multiFlavorSourceSet = (DefaultAndroidSourceSet) extension.sourceSetsContainer.maybeCreate(variantConfig.flavorName)
+ variantConfig.setMultiFlavorSourceProvider(multiFlavorSourceSet)
+ // TODO: hmm this won't work
+ //variantProviders.add(new ConfigurationProviderImpl(project, multiFlavorSourceSet))
+ }
VariantDependencies variantDep = VariantDependencies.compute(
project, appVariantData.variantConfiguration.fullName,
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 889a70a..974fe16 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy
+++ b/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy
@@ -17,9 +17,12 @@ package com.android.build.gradle
import com.android.SdkConstants
import com.android.annotations.NonNull
+import com.android.annotations.Nullable
import com.android.build.gradle.api.AndroidSourceSet
+import com.android.build.gradle.api.BaseVariant
import com.android.build.gradle.api.TestVariant
import com.android.build.gradle.internal.CompileOptions
+import com.android.build.gradle.internal.SourceSetSourceProviderWrapper
import com.android.build.gradle.internal.dsl.AaptOptionsImpl
import com.android.build.gradle.internal.dsl.AndroidSourceSetFactory
import com.android.build.gradle.internal.dsl.DexOptionsImpl
@@ -27,6 +30,9 @@ import com.android.build.gradle.internal.dsl.ProductFlavorDsl
import com.android.build.gradle.internal.test.TestOptions
import com.android.builder.BuilderConstants
import com.android.builder.DefaultProductFlavor
+import com.android.builder.model.BuildType
+import com.android.builder.model.ProductFlavor
+import com.android.builder.model.SourceProvider
import com.android.builder.testing.api.DeviceProvider
import com.android.builder.testing.api.TestServer
import com.android.sdklib.repository.FullRevision
@@ -38,8 +44,8 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ConfigurationContainer
import org.gradle.api.internal.DefaultDomainObjectSet
import org.gradle.api.internal.project.ProjectInternal
+import org.gradle.api.tasks.SourceSet
import org.gradle.internal.reflect.Instantiator
-
/**
* Base android extension for all android plugins.
*/
@@ -201,6 +207,49 @@ public abstract class BaseExtension {
testVariantList.add(testVariant)
}
+ public void registerArtifactType(@NonNull String name,
+ boolean isTest,
+ int artifactType) {
+ plugin.registerArtifactType(name, isTest, artifactType)
+ }
+
+ public void registerBuildTypeSourceProvider(
+ @NonNull String name,
+ @NonNull BuildType buildType,
+ @NonNull SourceProvider sourceProvider) {
+ plugin.registerBuildTypeSourceProvider(name, buildType, sourceProvider)
+ }
+
+ public void registerProductFlavorSourceProvider(
+ @NonNull String name,
+ @NonNull ProductFlavor productFlavor,
+ @NonNull SourceProvider sourceProvider) {
+ plugin.registerProductFlavorSourceProvider(name, productFlavor, sourceProvider)
+ }
+
+ public void registerJavaArtifact(
+ @NonNull String name,
+ @NonNull BaseVariant variant,
+ @NonNull String assembleTaskName,
+ @NonNull String javaCompileTaskName,
+ @NonNull File classesFolder,
+ @Nullable SourceProvider sourceProvider) {
+ plugin.registerJavaArtifact(name, variant, assembleTaskName, javaCompileTaskName,
+ classesFolder, sourceProvider)
+ }
+
+ public void registerMultiFlavorSourceProvider(
+ @NonNull String name,
+ @NonNull String flavorName,
+ @NonNull SourceProvider sourceProvider) {
+ plugin.registerMultiFlavorSourceProvider(name, flavorName, sourceProvider)
+ }
+
+ @NonNull
+ public SourceProvider wrapJavaSourceSet(@NonNull SourceSet sourceSet) {
+ return new SourceSetSourceProviderWrapper(sourceSet)
+ }
+
public String getCompileSdkVersion() {
return target
}
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 b407228..29bf0a2 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy
+++ b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy
@@ -18,6 +18,7 @@ package com.android.build.gradle
import com.android.annotations.NonNull
import com.android.annotations.Nullable
import com.android.build.gradle.api.AndroidSourceSet
+import com.android.build.gradle.api.BaseVariant
import com.android.build.gradle.internal.BadPluginException
import com.android.build.gradle.internal.LoggerWrapper
import com.android.build.gradle.internal.ProductFlavorData
@@ -29,6 +30,8 @@ import com.android.build.gradle.internal.dependency.ManifestDependencyImpl
import com.android.build.gradle.internal.dependency.SymbolFileProviderImpl
import com.android.build.gradle.internal.dependency.VariantDependencies
import com.android.build.gradle.internal.dsl.SigningConfigDsl
+import com.android.build.gradle.internal.model.ArtifactMetaDataImpl
+import com.android.build.gradle.internal.model.JavaArtifactImpl
import com.android.build.gradle.internal.model.ModelBuilder
import com.android.build.gradle.internal.tasks.AndroidReportTask
import com.android.build.gradle.internal.tasks.DependencyReportTask
@@ -46,6 +49,7 @@ import com.android.build.gradle.internal.test.report.ReportType
import com.android.build.gradle.internal.variant.ApkVariantData
import com.android.build.gradle.internal.variant.ApplicationVariantData
import com.android.build.gradle.internal.variant.BaseVariantData
+import com.android.build.gradle.internal.variant.DefaultSourceProviderContainer
import com.android.build.gradle.internal.variant.LibraryVariantData
import com.android.build.gradle.internal.variant.TestVariantData
import com.android.build.gradle.internal.variant.TestedVariantData
@@ -69,15 +73,21 @@ import com.android.builder.SdkParser
import com.android.builder.VariantConfiguration
import com.android.builder.dependency.JarDependency
import com.android.builder.dependency.LibraryDependency
+import com.android.builder.model.AndroidArtifact
import com.android.builder.model.AndroidProject
+import com.android.builder.model.ArtifactMetaData
+import com.android.builder.model.BuildType
+import com.android.builder.model.JavaArtifact
import com.android.builder.model.ProductFlavor
import com.android.builder.model.SigningConfig
import com.android.builder.model.SourceProvider
+import com.android.builder.model.SourceProviderContainer
import com.android.builder.testing.ConnectedDeviceProvider
import com.android.builder.testing.api.DeviceProvider
import com.android.builder.testing.api.TestServer
import com.android.utils.ILogger
import com.google.common.collect.ArrayListMultimap
+import com.google.common.collect.ListMultimap
import com.google.common.collect.Lists
import com.google.common.collect.Maps
import com.google.common.collect.Multimap
@@ -668,7 +678,7 @@ public abstract class BasePlugin {
((AndroidSourceSet) variantConfiguration.buildTypeSourceSet).resources)
}
if (variantConfiguration.hasFlavors()) {
- for (SourceProvider flavorSourceSet : variantConfiguration.flavorSourceSets) {
+ for (SourceProvider flavorSourceSet : variantConfiguration.flavorSourceProviders) {
processResources.from(((AndroidSourceSet) flavorSourceSet).resources)
}
}
@@ -723,8 +733,8 @@ public abstract class BasePlugin {
sourceList.add(((AndroidSourceSet) config.buildTypeSourceSet).java)
}
if (config.hasFlavors()) {
- for (SourceProvider flavorSourceSet : config.flavorSourceSets) {
- sourceList.add(((AndroidSourceSet) flavorSourceSet).java)
+ for (SourceProvider flavorSourceProvider : config.flavorSourceProviders) {
+ sourceList.add(((AndroidSourceSet) flavorSourceProvider).java)
}
}
compileTask.source = sourceList.toArray()
@@ -892,7 +902,7 @@ public abstract class BasePlugin {
for (int i = 0 ; i < count ; i++) {
final BaseVariantData baseVariantData = variantDataList.get(i)
String variantName = baseVariantData.variantConfiguration.fullName
- Task lintCheck = project.tasks.create("lint" + variantName, Lint)
+ Lint lintCheck = project.tasks.create("lint" + variantName, Lint)
lintCheck.dependsOn baseVariantData.javaCompileTask, lintCompile
lint.dependsOn lintCheck
lintCheck.setPlugin(this)
@@ -900,11 +910,11 @@ public abstract class BasePlugin {
String outputName = "$project.buildDir/lint/" + variantName
VariantConfiguration config = baseVariantData.variantConfiguration
List<LibraryDependency> depList = config.getAllLibraries()
- List<Set<File>> javaSource = Lists.newArrayList()
- List<Set<File>> resourceSource = Lists.newArrayList()
+ List<Collection<File>> javaSource = Lists.newArrayList()
+ List<Collection<File>> resourceSource = Lists.newArrayList()
// set the java and res source of this variant's flavors
- Iterator<SourceProvider> flavorSources = config.flavorSourceSets.iterator()
+ Iterator<SourceProvider> flavorSources = config.flavorSourceProviders.iterator()
SourceProvider source
while (flavorSources.hasNext()) {
source = flavorSources.next()
@@ -916,8 +926,15 @@ public abstract class BasePlugin {
if (config.getType() != VariantConfiguration.Type.TEST) {
javaSource.add(config.buildTypeSourceSet.javaDirectories)
}
- if (config.variantSourceProvider != null) {
- javaSource.add(config.variantSourceProvider.javaDirectories)
+ SourceProvider sourceProvider = config.variantSourceProvider
+ if (sourceProvider != null) {
+ javaSource.add(sourceProvider.javaDirectories)
+ resourceSource.add(sourceProvider.resDirectories)
+ }
+ sourceProvider = config.multiFlavorSourceProvider
+ if (sourceProvider != null) {
+ javaSource.add(sourceProvider.javaDirectories)
+ resourceSource.add(sourceProvider.resDirectories)
}
resourceSource.add(config.defaultSourceSet.resDirectories)
@@ -1566,6 +1583,112 @@ public abstract class BasePlugin {
"generate${variantData.variantConfiguration.fullName.capitalize()}Sources")
}
+
+ private final Map<String, ArtifactMetaData> extraArtifactMap = Maps.newHashMap()
+ private final ListMultimap<String, AndroidArtifact> extraAndroidArtifacts = ArrayListMultimap.create()
+ private final ListMultimap<String, JavaArtifact> extraJavaArtifacts = ArrayListMultimap.create()
+ private final ListMultimap<String, SourceProviderContainer> extraVariantSourceProviders = ArrayListMultimap.create()
+ private final ListMultimap<String, SourceProviderContainer> extraBuildTypeSourceProviders = ArrayListMultimap.create()
+ private final ListMultimap<String, SourceProviderContainer> extraProductFlavorSourceProviders = ArrayListMultimap.create()
+ private final ListMultimap<String, SourceProviderContainer> extraMultiFlavorSourceProviders = ArrayListMultimap.create()
+
+
+ public Collection<ArtifactMetaData> getExtraArtifacts() {
+ return extraArtifactMap.values()
+ }
+
+ public Collection<AndroidArtifact> getExtraAndroidArtifacts(@NonNull String variantName) {
+ return extraAndroidArtifacts.get(variantName)
+ }
+
+ public Collection<JavaArtifact> getExtraJavaArtifacts(@NonNull String variantName) {
+ return extraJavaArtifacts.get(variantName)
+ }
+
+ public Collection<SourceProviderContainer> getExtraVariantSourceProviders(@NonNull String variantName) {
+ return extraVariantSourceProviders.get(variantName)
+ }
+
+ public Collection<SourceProviderContainer> getExtraFlavorSourceProviders(@NonNull String flavorName) {
+ return extraProductFlavorSourceProviders.get(flavorName)
+ }
+
+ public Collection<SourceProviderContainer> getExtraBuildTypeSourceProviders(@NonNull String buildTypeName) {
+ return extraBuildTypeSourceProviders.get(buildTypeName)
+ }
+
+ public void registerArtifactType(@NonNull String name,
+ boolean isTest,
+ int artifactType) {
+
+ if (extraArtifactMap.get(name) != null) {
+ throw new IllegalArgumentException("Artifact with name $name already registered.")
+ }
+
+ extraArtifactMap.put(name, new ArtifactMetaDataImpl(name, isTest, artifactType))
+ }
+
+ public void registerBuildTypeSourceProvider(@NonNull String name,
+ @NonNull BuildType buildType,
+ @NonNull SourceProvider sourceProvider) {
+ if (extraArtifactMap.get(name) == null) {
+ throw new IllegalArgumentException(
+ "Artifact with name $name is not yet registered. Use registerArtifactType()")
+ }
+
+ extraBuildTypeSourceProviders.put(buildType.name,
+ new DefaultSourceProviderContainer(name, sourceProvider))
+
+ }
+
+ public void registerProductFlavorSourceProvider(@NonNull String name,
+ @NonNull ProductFlavor productFlavor,
+ @NonNull SourceProvider sourceProvider) {
+ if (extraArtifactMap.get(name) == null) {
+ throw new IllegalArgumentException(
+ "Artifact with name $name is not yet registered. Use registerArtifactType()")
+ }
+
+ extraProductFlavorSourceProviders.put(productFlavor.name,
+ new DefaultSourceProviderContainer(name, sourceProvider))
+
+ }
+
+ public void registerMultiFlavorSourceProvider(@NonNull String name,
+ @NonNull String flavorName,
+ @NonNull SourceProvider sourceProvider) {
+ if (extraArtifactMap.get(name) == null) {
+ throw new IllegalArgumentException(
+ "Artifact with name $name is not yet registered. Use registerArtifactType()")
+ }
+
+ extraMultiFlavorSourceProviders.put(flavorName,
+ new DefaultSourceProviderContainer(name, sourceProvider))
+ }
+
+ public void registerJavaArtifact(
+ @NonNull String name,
+ @NonNull BaseVariant variant,
+ @NonNull String assembleTaskName,
+ @NonNull String javaCompileTaskName,
+ @NonNull File classesFolder,
+ @Nullable SourceProvider sourceProvider) {
+ ArtifactMetaData artifactMetaData = extraArtifactMap.get(name)
+ if (artifactMetaData == null) {
+ throw new IllegalArgumentException(
+ "Artifact with name $name is not yet registered. Use registerArtifactType()")
+ }
+ if (artifactMetaData.type != ArtifactMetaData.TYPE_JAVA) {
+ throw new IllegalArgumentException(
+ "Artifact with name $name is not of type JAVA")
+ }
+
+ JavaArtifact artifact = new JavaArtifactImpl(
+ name, assembleTaskName, javaCompileTaskName, classesFolder,
+ null, sourceProvider, null)
+ extraJavaArtifacts.put(variant.name, artifact)
+ }
+
//----------------------------------------------------------------------------------------------
//------------------------------ START DEPENDENCY STUFF ----------------------------------------
//----------------------------------------------------------------------------------------------
@@ -1857,18 +1980,22 @@ public abstract class BasePlugin {
}
private static String getLocalVersion() {
- Class clazz = BasePlugin.class
- String className = clazz.getSimpleName() + ".class"
- String classPath = clazz.getResource(className).toString()
- if (!classPath.startsWith("jar")) {
- // Class not from JAR, unlikely
- return null
- }
- String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) +
- "/META-INF/MANIFEST.MF";
- Manifest manifest = new Manifest(new URL(manifestPath).openStream());
- Attributes attr = manifest.getMainAttributes();
- return attr.getValue("Plugin-Version");
+ try {
+ Class clazz = BasePlugin.class
+ String className = clazz.getSimpleName() + ".class"
+ String classPath = clazz.getResource(className).toString()
+ if (!classPath.startsWith("jar")) {
+ // Class not from JAR, unlikely
+ return null
+ }
+ String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) +
+ "/META-INF/MANIFEST.MF";
+ Manifest manifest = new Manifest(new URL(manifestPath).openStream());
+ Attributes attr = manifest.getMainAttributes();
+ return attr.getValue("Plugin-Version");
+ } catch (Throwable t) {
+ return null;
+ }
}
public Project getProject() {
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
index 297121d..4357456 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/api/BaseVariant.java
+++ b/gradle/src/main/groovy/com/android/build/gradle/api/BaseVariant.java
@@ -71,6 +71,14 @@ public interface BaseVariant {
String getBaseName();
/**
+ * Returns the flavor name of the variant. This is a concatenation of all the
+ * applied flavors
+ * @return the name of the flavors, or an empty string if there is not flavors.
+ */
+ @NonNull
+ String getFlavorName();
+
+ /**
* Returns the {@link com.android.builder.DefaultBuildType} for this build variant.
*/
@NonNull
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 25ea1ca..6704129 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
@@ -31,6 +31,7 @@ import org.gradle.logging.StyledTextOutput;
import org.gradle.util.GUtil;
import java.io.IOException;
+import java.util.Collection;
import java.util.List;
import static org.gradle.logging.StyledTextOutput.Style.Description;
@@ -132,15 +133,16 @@ public class AndroidAsciiReportRenderer extends TextReportRenderer {
}
private void renderChildren(@NonNull List<LibraryDependency> libraries,
- @Nullable List<JarDependency> localJars) {
+ @Nullable Collection<JarDependency> localJars) {
renderer.startChildren();
if (localJars != null) {
final boolean emptyChildren = libraries.isEmpty();
final int count = localJars.size();
- for (int i = 0; i < count; i++) {
- JarDependency jarDependency = localJars.get(i);
+ int i = 0;
+ for (JarDependency jarDependency : localJars) {
render(jarDependency, emptyChildren && i == count - 1);
+ i++;
}
}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/SourceSetSourceProviderWrapper.java b/gradle/src/main/groovy/com/android/build/gradle/internal/SourceSetSourceProviderWrapper.java
new file mode 100644
index 0000000..0cc3f7c
--- /dev/null
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/SourceSetSourceProviderWrapper.java
@@ -0,0 +1,89 @@
+/*
+ * 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;
+import com.android.builder.model.SourceProvider;
+import org.gradle.api.tasks.SourceSet;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * An implementation of SourceProvider that's wrapper around a Java SourceSet.
+ * This is useful for the case where we store SourceProviders but don't want to
+ * query the content of the SourceSet at the moment the SourceProvider is created.
+ */
+public class SourceSetSourceProviderWrapper implements SourceProvider {
+
+ @NonNull
+ private final SourceSet sourceSet;
+
+ public SourceSetSourceProviderWrapper(@NonNull SourceSet sourceSet) {
+
+ this.sourceSet = sourceSet;
+ }
+
+ @NonNull
+ @Override
+ public File getManifestFile() {
+ throw new IllegalAccessError("Shouldn't access manifest from SourceSetSourceProviderWrapper");
+ }
+
+ @NonNull
+ @Override
+ public Collection<File> getJavaDirectories() {
+ return sourceSet.getAllJava().getSrcDirs();
+ }
+
+ @NonNull
+ @Override
+ public Collection<File> getResourcesDirectories() {
+ return sourceSet.getResources().getSrcDirs();
+ }
+
+ @NonNull
+ @Override
+ public Collection<File> getAidlDirectories() {
+ return Collections.emptyList();
+ }
+
+ @NonNull
+ @Override
+ public Collection<File> getRenderscriptDirectories() {
+ return Collections.emptyList();
+ }
+
+ @NonNull
+ @Override
+ public Collection<File> getJniDirectories() {
+ return Collections.emptyList();
+ }
+
+ @NonNull
+ @Override
+ public Collection<File> getResDirectories() {
+ return Collections.emptyList();
+ }
+
+ @NonNull
+ @Override
+ public Collection<File> getAssetsDirectories() {
+ return Collections.emptyList();
+ }
+}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/api/BaseVariantImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/api/BaseVariantImpl.java
index 1e99d91..894fe8a 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/api/BaseVariantImpl.java
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/api/BaseVariantImpl.java
@@ -64,6 +64,12 @@ abstract class BaseVariantImpl implements BaseVariant {
return getVariantData().getVariantConfiguration().getBaseName();
}
+ @NonNull
+ @Override
+ public String getFlavorName() {
+ return getVariantData().getVariantConfiguration().getFlavorName();
+ }
+
@Override
@NonNull
public DefaultBuildType getBuildType() {
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy
index 449a43f..d50371e 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy
@@ -45,7 +45,7 @@ public class AaptOptionsImpl implements AaptOptions {
}
@Override
- List<String> getNoCompress() {
+ Collection<String> getNoCompress() {
return noCompressList
}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy
index a4770b6..6b51bc4 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy
@@ -21,7 +21,7 @@ import com.android.annotations.VisibleForTesting
import com.android.builder.AndroidBuilder
import com.android.builder.BuilderConstants
import com.android.builder.DefaultBuildType
-import com.android.builder.NdkConfig
+import com.android.builder.model.NdkConfig
import com.android.builder.model.SigningConfig
import org.gradle.api.Action
import org.gradle.api.internal.file.FileResolver
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java
index 64f704a..87b6dcd 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java
@@ -18,7 +18,7 @@ package com.android.build.gradle.internal.dsl;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
-import com.android.builder.NdkConfig;
+import com.android.builder.model.NdkConfig;
import com.google.common.collect.Sets;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Optional;
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/ProductFlavorDsl.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/ProductFlavorDsl.groovy
index 1645a03..cda61b0 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/ProductFlavorDsl.groovy
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/ProductFlavorDsl.groovy
@@ -15,11 +15,12 @@
*/
package com.android.build.gradle.internal.dsl
+
import com.android.annotations.NonNull
import com.android.annotations.Nullable
import com.android.builder.AndroidBuilder
import com.android.builder.DefaultProductFlavor
-import com.android.builder.NdkConfig
+import com.android.builder.model.NdkConfig
import org.gradle.api.Action
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/ArtifactInfoImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidArtifactImpl.java
index d7bb7f9..f27a055 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactInfoImpl.java
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidArtifactImpl.java
@@ -18,17 +18,19 @@ package com.android.build.gradle.internal.model;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
-import com.android.builder.model.ArtifactInfo;
+import com.android.builder.model.AndroidArtifact;
import com.android.builder.model.Dependencies;
+import com.android.builder.model.SourceProvider;
import java.io.File;
import java.io.Serializable;
import java.util.List;
/**
- * Implementation of ArtifactInfo that is serializable
+ * Implementation of AndroidArtifact that is serializable
*/
-public class ArtifactInfoImpl implements ArtifactInfo, Serializable {
+public class AndroidArtifactImpl extends BaseArtifactImpl implements AndroidArtifact, Serializable {
+ private static final long serialVersionUID = 1L;
@NonNull
private final File outputFile;
@@ -36,49 +38,42 @@ public class ArtifactInfoImpl implements ArtifactInfo, Serializable {
@Nullable
private final String signingConfigName;
@NonNull
- private final String assembleTaskName;
- @NonNull
private final String packageName;
@NonNull
private final String sourceGenTaskName;
@NonNull
- private final String javaCompileTaskName;
- @NonNull
private final File generatedManifest;
@NonNull
private final List<File> generatedSourceFolders;
@NonNull
private final List<File> generatedResourceFolders;
- @NonNull
- private final File classesFolder;
- @NonNull
- private final Dependencies dependencies;
+ AndroidArtifactImpl(@NonNull String name,
+ @NonNull String assembleTaskName,
+ @NonNull File outputFile,
+ boolean isSigned,
+ @Nullable String signingConfigName,
+ @NonNull String packageName,
+ @NonNull String sourceGenTaskName,
+ @NonNull String javaCompileTaskName,
+ @NonNull File generatedManifest,
+ @NonNull List<File> generatedSourceFolders,
+ @NonNull List<File> generatedResourceFolders,
+ @NonNull File classesFolder,
+ @NonNull Dependencies dependencies,
+ @Nullable SourceProvider variantSourceProvider,
+ @Nullable SourceProvider multiFlavorSourceProviders) {
+ super(name, assembleTaskName, javaCompileTaskName, classesFolder, dependencies,
+ variantSourceProvider, multiFlavorSourceProviders);
- ArtifactInfoImpl(@NonNull String assembleTaskName,
- @NonNull File outputFile,
- boolean isSigned,
- @Nullable String signingConfigName,
- @NonNull String packageName,
- @NonNull String sourceGenTaskName,
- @NonNull String javaCompileTaskName,
- @NonNull File generatedManifest,
- @NonNull List<File> generatedSourceFolders,
- @NonNull List<File> generatedResourceFolders,
- @NonNull File classesFolder,
- @NonNull Dependencies dependencies) {
- this.assembleTaskName = assembleTaskName;
this.outputFile = outputFile;
this.isSigned = isSigned;
this.signingConfigName = signingConfigName;
this.packageName = packageName;
this.sourceGenTaskName = sourceGenTaskName;
- this.javaCompileTaskName = javaCompileTaskName;
this.generatedManifest = generatedManifest;
this.generatedSourceFolders = generatedSourceFolders;
this.generatedResourceFolders = generatedResourceFolders;
- this.classesFolder = classesFolder;
- this.dependencies = dependencies;
}
@NonNull
@@ -112,18 +107,6 @@ public class ArtifactInfoImpl implements ArtifactInfo, Serializable {
@NonNull
@Override
- public String getJavaCompileTaskName() {
- return javaCompileTaskName;
- }
-
- @NonNull
- @Override
- public String getAssembleTaskName() {
- return assembleTaskName;
- }
-
- @NonNull
- @Override
public File getGeneratedManifest() {
return generatedManifest;
}
@@ -139,16 +122,4 @@ public class ArtifactInfoImpl implements ArtifactInfo, Serializable {
public List<File> getGeneratedResourceFolders() {
return generatedResourceFolders;
}
-
- @NonNull
- @Override
- public File getClassesFolder() {
- return classesFolder;
- }
-
- @NonNull
- @Override
- public Dependencies getDependencies() {
- return dependencies;
- }
}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidLibraryImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidLibraryImpl.java
index b3fc9d1..8635ce8 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidLibraryImpl.java
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidLibraryImpl.java
@@ -23,6 +23,7 @@ import com.android.builder.model.AndroidLibrary;
import java.io.File;
import java.io.Serializable;
+import java.util.Collection;
import java.util.List;
public class AndroidLibraryImpl implements AndroidLibrary, Serializable {
@@ -39,7 +40,7 @@ public class AndroidLibraryImpl implements AndroidLibrary, Serializable {
@NonNull
private final File jarFile;
@NonNull
- private final List<File> localJars;
+ private final Collection<File> localJars;
@NonNull
private final File resFolder;
@NonNull
@@ -115,7 +116,7 @@ public class AndroidLibraryImpl implements AndroidLibrary, Serializable {
@NonNull
@Override
- public List<File> getLocalJars() {
+ public Collection<File> getLocalJars() {
return localJars;
}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactMetaDataImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactMetaDataImpl.java
new file mode 100644
index 0000000..8f33c2d
--- /dev/null
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactMetaDataImpl.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.internal.model;
+
+import com.android.annotations.NonNull;
+import com.android.builder.model.ArtifactMetaData;
+
+import java.io.Serializable;
+
+/**
+ * Implementation of ArtifactMetaData that is serializable
+ */
+public class ArtifactMetaDataImpl implements ArtifactMetaData, Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @NonNull
+ private final String name;
+ private final boolean isTest;
+ private final int type;
+
+ public ArtifactMetaDataImpl(@NonNull String name, boolean isTest, int type) {
+ this.name = name;
+ this.isTest = isTest;
+ this.type = type;
+ }
+
+ @NonNull
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public boolean isTest() {
+ return isTest;
+ }
+
+ @Override
+ public int getType() {
+ return type;
+ }
+}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/BaseArtifactImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BaseArtifactImpl.java
new file mode 100644
index 0000000..65c0c87
--- /dev/null
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BaseArtifactImpl.java
@@ -0,0 +1,106 @@
+/*
+ * 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.model;
+
+import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
+import com.android.builder.model.BaseArtifact;
+import com.android.builder.model.Dependencies;
+import com.android.builder.model.SourceProvider;
+
+import java.io.File;
+import java.io.Serializable;
+
+/**
+ * Implementation of BaseArtifact that is serializable
+ */
+class BaseArtifactImpl implements BaseArtifact, Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private final String name;
+ @NonNull
+ private final String assembleTaskName;
+ @NonNull
+ private final String javaCompileTaskName;
+ @NonNull
+ private final File classesFolder;
+ @NonNull
+ private final Dependencies dependencies;
+ @Nullable
+ private final SourceProvider variantSourceProvider;
+ @Nullable
+ private final SourceProvider multiFlavorSourceProviders;
+
+
+ BaseArtifactImpl(@NonNull String name,
+ @NonNull String assembleTaskName,
+ @NonNull String javaCompileTaskName,
+ @NonNull File classesFolder,
+ @NonNull Dependencies dependencies,
+ @Nullable SourceProvider variantSourceProvider,
+ @Nullable SourceProvider multiFlavorSourceProviders) {
+ this.name = name;
+ this.assembleTaskName = assembleTaskName;
+ this.javaCompileTaskName = javaCompileTaskName;
+ this.classesFolder = classesFolder;
+ this.dependencies = dependencies;
+ this.variantSourceProvider = variantSourceProvider;
+ this.multiFlavorSourceProviders = multiFlavorSourceProviders;
+ }
+
+ @NonNull
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @NonNull
+ @Override
+ public String getJavaCompileTaskName() {
+ return javaCompileTaskName;
+ }
+
+ @NonNull
+ @Override
+ public String getAssembleTaskName() {
+ return assembleTaskName;
+ }
+
+ @NonNull
+ @Override
+ public File getClassesFolder() {
+ return classesFolder;
+ }
+
+ @NonNull
+ @Override
+ public Dependencies getDependencies() {
+ return dependencies;
+ }
+
+ @Nullable
+ @Override
+ public SourceProvider getVariantSourceProvider() {
+ return variantSourceProvider;
+ }
+
+ @Nullable
+ @Override
+ public SourceProvider getMultiFlavorSourceProvider() {
+ return multiFlavorSourceProviders;
+ }
+}
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 db8dc17..a4c302f 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
@@ -17,11 +17,14 @@
package com.android.build.gradle.internal.model;
import com.android.annotations.NonNull;
-import com.android.builder.model.BuildTypeContainer;
+import com.android.build.gradle.internal.BuildTypeData;
import com.android.builder.model.BuildType;
+import com.android.builder.model.BuildTypeContainer;
import com.android.builder.model.SourceProvider;
+import com.android.builder.model.SourceProviderContainer;
import java.io.Serializable;
+import java.util.Collection;
class BuildTypeContainerImpl implements BuildTypeContainer, Serializable {
private static final long serialVersionUID = 1L;
@@ -30,11 +33,35 @@ class BuildTypeContainerImpl implements BuildTypeContainer, Serializable {
private final BuildType buildType;
@NonNull
private final SourceProvider sourceProvider;
+ @NonNull
+ private final Collection<SourceProviderContainer> extraSourceProviders;
- BuildTypeContainerImpl(@NonNull BuildTypeImpl buildType,
- @NonNull SourceProviderImpl sourceProvider) {
+ /**
+ * Create a BuildTypeContainer from a BuildTypeData
+ *
+ * @param buildTypeData the build type data
+ * @param sourceProviderContainers collection of extra source providers
+ *
+ * @return a non-null BuildTypeContainer
+ */
+ @NonNull
+ static BuildTypeContainer createBTC(
+ @NonNull BuildTypeData buildTypeData,
+ @NonNull Collection<SourceProviderContainer> sourceProviderContainers) {
+
+ return new BuildTypeContainerImpl(
+ BuildTypeImpl.cloneBuildType(buildTypeData.getBuildType()),
+ SourceProviderImpl.cloneProvider(buildTypeData.getSourceSet()),
+ SourceProviderContainerImpl.cloneCollection(sourceProviderContainers));
+ }
+
+ private BuildTypeContainerImpl(
+ @NonNull BuildTypeImpl buildType,
+ @NonNull SourceProviderImpl sourceProvider,
+ @NonNull Collection<SourceProviderContainer> extraSourceProviders) {
this.buildType = buildType;
this.sourceProvider = sourceProvider;
+ this.extraSourceProviders = extraSourceProviders;
}
@Override
@@ -48,4 +75,10 @@ class BuildTypeContainerImpl implements BuildTypeContainer, Serializable {
public SourceProvider getSourceProvider() {
return sourceProvider;
}
+
+ @NonNull
+ @Override
+ public Collection<SourceProviderContainer> getExtraSourceProviders() {
+ return extraSourceProviders;
+ }
}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeImpl.java
index ccb1e8b..e3f5cdc 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeImpl.java
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeImpl.java
@@ -18,9 +18,9 @@ package com.android.build.gradle.internal.model;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
-import com.android.builder.NdkConfig;
import com.android.builder.model.BuildType;
import com.android.builder.model.ClassField;
+import com.android.builder.model.NdkConfig;
import java.io.File;
import java.io.Serializable;
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 39e184d..fab28d1 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
@@ -18,20 +18,19 @@ package com.android.build.gradle.internal.model;
import com.android.annotations.NonNull;
import com.android.build.gradle.internal.CompileOptions;
+import com.android.builder.model.AaptOptions;
import com.android.builder.model.AndroidProject;
+import com.android.builder.model.ArtifactMetaData;
import com.android.builder.model.BuildTypeContainer;
import com.android.builder.model.JavaCompileOptions;
import com.android.builder.model.ProductFlavorContainer;
-import com.android.builder.model.Variant;
-import com.android.builder.model.AaptOptions;
import com.android.builder.model.SigningConfig;
-import com.google.common.collect.Maps;
+import com.android.builder.model.Variant;
+import com.google.common.collect.Lists;
import java.io.File;
import java.io.Serializable;
import java.util.Collection;
-import java.util.List;
-import java.util.Map;
/**
* Implementation of the AndroidProject model object.
@@ -46,28 +45,32 @@ class DefaultAndroidProject implements AndroidProject, Serializable {
@NonNull
private final String compileTarget;
@NonNull
- private final List<String> bootClasspath;
+ private final Collection<String> bootClasspath;
@NonNull
- private final List<File> frameworkSource;
+ private final Collection<File> frameworkSource;
@NonNull
- private final Map<String, SigningConfig> signingConfigs;
+ private final Collection<SigningConfig> signingConfigs;
+ @NonNull
+ private final Collection<ArtifactMetaData> extraArtifacts;
@NonNull
private final Collection<String> unresolvedDependencies;
@NonNull
private final JavaCompileOptions javaCompileOptions;
private final boolean isLibrary;
- private final Map<String, BuildTypeContainer> buildTypes = Maps.newHashMap();
- private final Map<String, ProductFlavorContainer> productFlavors = Maps.newHashMap();
- private final Map<String, Variant> variants = Maps.newHashMap();
+ private final Collection<BuildTypeContainer> buildTypes = Lists.newArrayList();
+ private final Collection<ProductFlavorContainer> productFlavors = Lists.newArrayList();
+ private final Collection<Variant> variants = Lists.newArrayList();
private ProductFlavorContainer defaultConfig;
DefaultAndroidProject(@NonNull String modelVersion,
- @NonNull String name, @NonNull String compileTarget,
- @NonNull List<String> bootClasspath,
- @NonNull List<File> frameworkSource,
- @NonNull Map<String, SigningConfig> signingConfigs,
+ @NonNull String name,
+ @NonNull String compileTarget,
+ @NonNull Collection<String> bootClasspath,
+ @NonNull Collection<File> frameworkSource,
+ @NonNull Collection<SigningConfig> signingConfigs,
+ @NonNull Collection<ArtifactMetaData> extraArtifacts,
@NonNull Collection<String> unresolvedDependencies,
@NonNull CompileOptions compileOptions,
boolean isLibrary) {
@@ -77,6 +80,7 @@ class DefaultAndroidProject implements AndroidProject, Serializable {
this.bootClasspath = bootClasspath;
this.frameworkSource = frameworkSource;
this.signingConfigs = signingConfigs;
+ this.extraArtifacts = extraArtifacts;
this.unresolvedDependencies = unresolvedDependencies;
javaCompileOptions = new DefaultJavaCompileOptions(compileOptions);
this.isLibrary = isLibrary;
@@ -90,26 +94,25 @@ class DefaultAndroidProject implements AndroidProject, Serializable {
@NonNull
DefaultAndroidProject addBuildType(@NonNull BuildTypeContainer buildTypeContainer) {
- buildTypes.put(buildTypeContainer.getBuildType().getName(), buildTypeContainer);
+ buildTypes.add(buildTypeContainer);
return this;
}
@NonNull
DefaultAndroidProject addProductFlavors(
@NonNull ProductFlavorContainer productFlavorContainer) {
- productFlavors.put(productFlavorContainer.getProductFlavor().getName(),
- productFlavorContainer);
+ productFlavors.add(productFlavorContainer);
return this;
}
@NonNull
DefaultAndroidProject addVariant(@NonNull VariantImpl variant) {
- variants.put(variant.getName(), variant);
+ variants.add(variant);
return this;
}
- @NonNull
@Override
+ @NonNull
public String getModelVersion() {
return modelVersion;
}
@@ -120,72 +123,79 @@ class DefaultAndroidProject implements AndroidProject, Serializable {
return name;
}
- @NonNull
@Override
+ @NonNull
public ProductFlavorContainer getDefaultConfig() {
return defaultConfig;
}
- @NonNull
@Override
- public Map<String, BuildTypeContainer> getBuildTypes() {
+ @NonNull
+ public Collection<BuildTypeContainer> getBuildTypes() {
return buildTypes;
}
- @NonNull
@Override
- public Map<String, ProductFlavorContainer> getProductFlavors() {
+ @NonNull
+ public Collection<ProductFlavorContainer> getProductFlavors() {
return productFlavors;
}
- @NonNull
@Override
- public Map<String, Variant> getVariants() {
+ @NonNull
+ public Collection<Variant> getVariants() {
return variants;
}
+ @NonNull
+ @Override
+ public Collection<ArtifactMetaData> getExtraArtifacts() {
+ return extraArtifacts;
+ }
+
@Override
public boolean isLibrary() {
return isLibrary;
}
- @NonNull
@Override
+ @NonNull
public String getCompileTarget() {
return compileTarget;
}
- @NonNull
@Override
- public List<String> getBootClasspath() {
+ @NonNull
+ public Collection<String> getBootClasspath() {
return bootClasspath;
}
@Override
- public List<File> getFrameworkSource() {
+ @NonNull
+ public Collection<File> getFrameworkSources() {
return frameworkSource;
}
- @NonNull
@Override
- public Map<String,SigningConfig> getSigningConfigs() {
+ @NonNull
+ public Collection<SigningConfig> getSigningConfigs() {
return signingConfigs;
}
- @NonNull
@Override
+ @NonNull
public AaptOptions getAaptOptions() {
return null;
}
- @NonNull
@Override
+ @NonNull
public Collection<String> getUnresolvedDependencies() {
return unresolvedDependencies;
}
- @NonNull
@Override
+ @NonNull
public JavaCompileOptions getJavaCompileOptions() {
return javaCompileOptions;
}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/JavaArtifactImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/JavaArtifactImpl.java
new file mode 100644
index 0000000..4c7584c
--- /dev/null
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/JavaArtifactImpl.java
@@ -0,0 +1,55 @@
+/*
+ * 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.model;
+
+import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
+import com.android.builder.model.Dependencies;
+import com.android.builder.model.JavaArtifact;
+import com.android.builder.model.SourceProvider;
+
+import java.io.File;
+import java.io.Serializable;
+
+/**
+ * Implementation of JavaArtifact that is serializable
+ */
+public class JavaArtifactImpl extends BaseArtifactImpl implements JavaArtifact, Serializable {
+ private static final long serialVersionUID = 1L;
+
+ public static JavaArtifactImpl clone(@NonNull JavaArtifact javaArtifact) {
+ return new JavaArtifactImpl(
+ javaArtifact.getName(),
+ javaArtifact.getAssembleTaskName(),
+ javaArtifact.getJavaCompileTaskName(),
+ javaArtifact.getClassesFolder(),
+ javaArtifact.getDependencies(), // TODO:FixME
+ SourceProviderImpl.cloneProvider(javaArtifact.getVariantSourceProvider()),
+ SourceProviderImpl.cloneProvider(javaArtifact.getMultiFlavorSourceProvider()));
+ }
+
+ public JavaArtifactImpl(@NonNull String name,
+ @NonNull String assembleTaskName,
+ @NonNull String javaCompileTaskName,
+ @NonNull File classesFolder,
+ @NonNull Dependencies dependencies,
+ @Nullable SourceProvider variantSourceProvider,
+ @Nullable SourceProvider multiFlavorSourceProviders) {
+ super(name, assembleTaskName, javaCompileTaskName, classesFolder, dependencies,
+ variantSourceProvider, multiFlavorSourceProviders);
+ }
+}
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 c3ede88..9bf6c46 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
@@ -26,23 +26,27 @@ import com.android.build.gradle.internal.variant.ApplicationVariantData
import com.android.build.gradle.internal.variant.BaseVariantData
import com.android.build.gradle.internal.variant.LibraryVariantData
import com.android.build.gradle.internal.variant.TestVariantData
-import com.android.builder.model.AndroidProject
-import com.android.builder.model.ArtifactInfo
-import com.android.builder.model.BuildTypeContainer
-import com.android.builder.model.ProductFlavorContainer
import com.android.builder.DefaultProductFlavor
import com.android.builder.SdkParser
import com.android.builder.VariantConfiguration
+import com.android.builder.model.AndroidArtifact
+import com.android.builder.model.AndroidProject
+import com.android.builder.model.ArtifactMetaData
+import com.android.builder.model.JavaArtifact
import com.android.builder.model.SigningConfig
import com.android.builder.model.SourceProvider
+import com.android.builder.model.SourceProviderContainer
import com.google.common.collect.Lists
-import com.google.common.collect.Maps
import org.gradle.api.Project
import org.gradle.api.plugins.UnknownPluginException
import org.gradle.tooling.provider.model.ToolingModelBuilder
import java.util.jar.Attributes
import java.util.jar.Manifest
+
+import static com.android.builder.model.AndroidProject.ARTIFACT_INSTRUMENT_TEST
+import static com.android.builder.model.AndroidProject.ARTIFACT_MAIN
+
/**
* Builder for the custom Android model.
*/
@@ -81,6 +85,15 @@ public class ModelBuilder implements ToolingModelBuilder {
List<File> frameworkSource = Collections.emptyList();
String compileTarget = sdkParser.target.hashString()
+ // list of extra artifacts
+ List<ArtifactMetaData> artifactMetaDataList = Lists.newArrayList(basePlugin.extraArtifacts)
+ // plus the instrumentation test one.
+ artifactMetaDataList.add(
+ new ArtifactMetaDataImpl(
+ ARTIFACT_INSTRUMENT_TEST,
+ true /*isTest*/,
+ ArtifactMetaData.TYPE_ANDROID));
+
//noinspection GroovyVariableNotAssigned
DefaultAndroidProject androidProject = new DefaultAndroidProject(
getModelVersion(),
@@ -89,29 +102,40 @@ public class ModelBuilder implements ToolingModelBuilder {
bootClasspath,
frameworkSource,
cloneSigningConfigs(signingConfigs),
+ artifactMetaDataList,
basePlugin.unresolvedDependencies,
basePlugin.extension.compileOptions,
libPlugin != null)
- .setDefaultConfig(createPFC(basePlugin.defaultConfigData))
+ .setDefaultConfig(ProductFlavorContainerImpl.createPFC(
+ basePlugin.defaultConfigData,
+ basePlugin.getExtraFlavorSourceProviders(basePlugin.defaultConfigData.productFlavor.name)))
if (appPlugin != null) {
for (BuildTypeData btData : appPlugin.buildTypes.values()) {
- androidProject.addBuildType(createBTC(btData))
+ androidProject.addBuildType(BuildTypeContainerImpl.createBTC(
+ btData,
+ basePlugin.getExtraBuildTypeSourceProviders(btData.buildType.name)))
}
for (ProductFlavorData pfData : appPlugin.productFlavors.values()) {
- androidProject.addProductFlavors(createPFC(pfData))
+ androidProject.addProductFlavors(ProductFlavorContainerImpl.createPFC(
+ pfData,
+ basePlugin.getExtraFlavorSourceProviders(pfData.productFlavor.name)))
}
} else if (libPlugin != null) {
- androidProject.addBuildType(createBTC(libPlugin.debugBuildTypeData))
- .addBuildType(createBTC(libPlugin.releaseBuildTypeData))
+ androidProject.addBuildType(BuildTypeContainerImpl.createBTC(
+ libPlugin.debugBuildTypeData,
+ basePlugin.getExtraBuildTypeSourceProviders(libPlugin.debugBuildTypeData.buildType.name)))
+ .addBuildType(BuildTypeContainerImpl.createBTC(
+ libPlugin.releaseBuildTypeData,
+ basePlugin.getExtraBuildTypeSourceProviders(libPlugin.releaseBuildTypeData.buildType.name)))
}
Set<Project> gradleProjects = project.getRootProject().getAllprojects();
for (BaseVariantData variantData : basePlugin.variantDataList) {
if (!(variantData instanceof TestVariantData)) {
- androidProject.addVariant(createVariant(variantData, gradleProjects))
+ androidProject.addVariant(createVariant(variantData, basePlugin, gradleProjects))
}
}
@@ -141,6 +165,7 @@ public class ModelBuilder implements ToolingModelBuilder {
@NonNull
private static VariantImpl createVariant(@NonNull BaseVariantData variantData,
+ @NonNull BasePlugin basePlugin,
@NonNull Set<Project> gradleProjects) {
TestVariantData testVariantData = null
if (variantData instanceof ApplicationVariantData ||
@@ -148,30 +173,43 @@ public class ModelBuilder implements ToolingModelBuilder {
testVariantData = variantData.testVariantData
}
- ArtifactInfo mainArtifact = createArtifactInfo(variantData, gradleProjects)
- ArtifactInfo testArtifact = testVariantData != null ?
- createArtifactInfo(testVariantData, gradleProjects) : null
+ AndroidArtifact mainArtifact = createArtifactInfo(
+ ARTIFACT_MAIN, variantData, basePlugin, gradleProjects)
+
+ String variantName = variantData.variantConfiguration.fullName
+
+ // extra Android Artifacts
+ AndroidArtifact testArtifact = testVariantData != null ?
+ createArtifactInfo(ARTIFACT_INSTRUMENT_TEST, testVariantData, basePlugin, gradleProjects) : null
- SourceProvider sp = variantData.variantConfiguration.getVariantSourceProvider();
- if (sp != null) {
- sp = SourceProviderImpl.cloneProvider(sp);
+ List<AndroidArtifact> extraAndroidArtifacts = Lists.newArrayList(
+ basePlugin.getExtraAndroidArtifacts(variantName))
+ if (testArtifact != null) {
+ extraAndroidArtifacts.add(testArtifact)
}
+ // extra Java Artifacts
+ List<JavaArtifact> extraJavaArtifacts = Lists.newArrayList(
+ basePlugin.getExtraJavaArtifacts(variantName))
+
VariantImpl variant = new VariantImpl(
- variantData.variantConfiguration.fullName,
+ variantName,
variantData.variantConfiguration.baseName,
variantData.variantConfiguration.buildType.name,
getProductFlavorNames(variantData),
ProductFlavorImpl.cloneFlavor(variantData.variantConfiguration.mergedFlavor),
mainArtifact,
- testArtifact,
- sp)
+ extraAndroidArtifacts,
+ extraJavaArtifacts)
return variant
}
- private static ArtifactInfo createArtifactInfo(@NonNull BaseVariantData variantData,
- @NonNull Set<Project> gradleProjects) {
+ private static AndroidArtifact createArtifactInfo(
+ @NonNull String name,
+ @NonNull BaseVariantData variantData,
+ @NonNull BasePlugin basePlugin,
+ @NonNull Set<Project> gradleProjects) {
VariantConfiguration vC = variantData.variantConfiguration
SigningConfig signingConfig = vC.signingConfig
@@ -180,7 +218,26 @@ public class ModelBuilder implements ToolingModelBuilder {
signingConfigName = signingConfig.name
}
- return new ArtifactInfoImpl(
+ SourceProvider variantSourceProvider = null;
+ SourceProvider multiFlavorSourceProvider = null;
+
+ if (ARTIFACT_MAIN.equals(name)) {
+ variantSourceProvider = variantData.variantConfiguration.variantSourceProvider
+ multiFlavorSourceProvider = variantData.variantConfiguration.multiFlavorSourceProvider
+ } else {
+ SourceProviderContainer container = getSourceProviderContainer(
+ basePlugin.getExtraVariantSourceProviders(variantData.getVariantConfiguration().getFullName()),
+ name)
+ if (container != null) {
+ variantSourceProvider = container.sourceProvider
+ }
+ }
+
+ variantSourceProvider = variantSourceProvider != null ? SourceProviderImpl.cloneProvider(variantSourceProvider) : null
+ multiFlavorSourceProvider = multiFlavorSourceProvider != null ? SourceProviderImpl.cloneProvider(multiFlavorSourceProvider) : null
+
+ return new AndroidArtifactImpl(
+ name,
variantData.assembleTask.name,
variantData.outputFile,
vC.isSigningReady(),
@@ -192,8 +249,9 @@ public class ModelBuilder implements ToolingModelBuilder {
getGeneratedSourceFolders(variantData),
getGeneratedResourceFolders(variantData),
variantData.javaCompileTask.destinationDir,
- DependenciesImpl.cloneDependencies(variantData.variantDependency, gradleProjects)
- )
+ DependenciesImpl.cloneDependencies(variantData.variantDependency, gradleProjects),
+ variantSourceProvider,
+ multiFlavorSourceProvider)
}
@NonNull
@@ -237,54 +295,29 @@ public class ModelBuilder implements ToolingModelBuilder {
return Collections.singletonList(variantData.renderscriptCompileTask.resOutputDir)
}
- /**
- * Create a ProductFlavorContainer from a ProductFlavorData
- * @param productFlavorData the product flavor data
- * @return a non-null ProductFlavorContainer
- */
- @NonNull
- private static ProductFlavorContainer createPFC(@NonNull ProductFlavorData productFlavorData) {
- return new ProductFlavorContainerImpl(
- ProductFlavorImpl.cloneFlavor(productFlavorData.productFlavor),
- SourceProviderImpl.cloneProvider((SourceProvider) productFlavorData.sourceSet),
- SourceProviderImpl.cloneProvider((SourceProvider) productFlavorData.testSourceSet))
- }
-
- /**
- * Create a BuildTypeContainer from a BuildTypeData
- * @param buildTypeData the build type data
- * @return a non-null BuildTypeContainer
- */
@NonNull
- private static BuildTypeContainer createBTC(@NonNull BuildTypeData buildTypeData) {
- return new BuildTypeContainerImpl(
- BuildTypeImpl.cloneBuildType(buildTypeData.buildType),
- SourceProviderImpl.cloneProvider((SourceProvider) buildTypeData.sourceSet))
- }
-
- @NonNull
- private static Map<String, SigningConfig> cloneSigningConfigs(
+ private static Collection<SigningConfig> cloneSigningConfigs(
@NonNull Collection<SigningConfig> signingConfigs) {
- Map<String, SigningConfig> results = Maps.newHashMapWithExpectedSize(signingConfigs.size())
+ Collection<SigningConfig> results = Lists.newArrayListWithCapacity(signingConfigs.size())
for (SigningConfig signingConfig : signingConfigs) {
- SigningConfig clonedSigningConfig = createSigningConfig(signingConfig)
- results.put(clonedSigningConfig.name, clonedSigningConfig)
+ results.add(SigningConfigImpl.createSigningConfig(signingConfig))
}
return results
}
- @NonNull
- private static SigningConfig createSigningConfig(@NonNull SigningConfig signingConfig) {
- return new SigningConfigImpl(
- signingConfig.getName(),
- signingConfig.getStoreFile(),
- signingConfig.getStorePassword(),
- signingConfig.getKeyAlias(),
- signingConfig.getKeyPassword(),
- signingConfig.getStoreType(),
- signingConfig.isSigningReady())
+ @Nullable
+ private static SourceProviderContainer getSourceProviderContainer(
+ @NonNull Collection<SourceProviderContainer> items,
+ @NonNull String name) {
+ for (SourceProviderContainer item : items) {
+ if (name.equals(item.getArtifactName())) {
+ return item;
+ }
+ }
+
+ return null;
}
/**
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorContainerImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorContainerImpl.java
index dac38e6..92fa794 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorContainerImpl.java
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorContainerImpl.java
@@ -17,11 +17,16 @@
package com.android.build.gradle.internal.model;
import com.android.annotations.NonNull;
-import com.android.builder.model.ProductFlavorContainer;
+import com.android.build.gradle.internal.ProductFlavorData;
+import com.android.builder.model.AndroidProject;
import com.android.builder.model.ProductFlavor;
+import com.android.builder.model.ProductFlavorContainer;
import com.android.builder.model.SourceProvider;
+import com.android.builder.model.SourceProviderContainer;
import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
/**
*/
@@ -33,15 +38,43 @@ class ProductFlavorContainerImpl implements ProductFlavorContainer, Serializable
@NonNull
private final SourceProvider sourceProvider;
@NonNull
- private final SourceProvider testSourceProvider;
+ private final Collection<SourceProviderContainer> extraSourceProviders;
+
+ /**
+ * Create a ProductFlavorContainer from a ProductFlavorData
+ *
+ * @param productFlavorData the product flavor data
+ * @param sourceProviderContainers collection of extra source providers
+ *
+ * @return a non-null ProductFlavorContainer
+ */
+ @NonNull
+ static ProductFlavorContainer createPFC(
+ @NonNull ProductFlavorData productFlavorData,
+ @NonNull Collection<SourceProviderContainer> sourceProviderContainers) {
+
+ List<SourceProviderContainer> clonedContainer = SourceProviderContainerImpl.cloneCollection(sourceProviderContainers);
+
+ // instrument test Source Provider
+ SourceProviderContainer testASP = SourceProviderContainerImpl.create(
+ AndroidProject.ARTIFACT_INSTRUMENT_TEST, productFlavorData.getTestSourceSet());
+
+ clonedContainer.add(testASP);
+
+ return new ProductFlavorContainerImpl(
+ ProductFlavorImpl.cloneFlavor(productFlavorData.getProductFlavor()),
+ SourceProviderImpl.cloneProvider(productFlavorData.getSourceSet()),
+ clonedContainer);
+ }
- ProductFlavorContainerImpl(@NonNull ProductFlavorImpl productFlavor,
- @NonNull SourceProviderImpl sourceProvider,
- @NonNull SourceProviderImpl testSourceProvider) {
+ private ProductFlavorContainerImpl(
+ @NonNull ProductFlavorImpl productFlavor,
+ @NonNull SourceProviderImpl sourceProvider,
+ @NonNull Collection<SourceProviderContainer> extraSourceProviders) {
this.productFlavor = productFlavor;
this.sourceProvider = sourceProvider;
- this.testSourceProvider = testSourceProvider;
+ this.extraSourceProviders = extraSourceProviders;
}
@NonNull
@@ -58,7 +91,7 @@ class ProductFlavorContainerImpl implements ProductFlavorContainer, Serializable
@NonNull
@Override
- public SourceProvider getTestSourceProvider() {
- return testSourceProvider;
+ public Collection<SourceProviderContainer> getExtraSourceProviders() {
+ return extraSourceProviders;
}
}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java
index 8380ae3..cc7aad6 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java
@@ -18,8 +18,8 @@ package com.android.build.gradle.internal.model;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
-import com.android.builder.NdkConfig;
import com.android.builder.model.ClassField;
+import com.android.builder.model.NdkConfig;
import com.android.builder.model.ProductFlavor;
import java.io.File;
@@ -182,5 +182,4 @@ class ProductFlavorImpl implements ProductFlavor, Serializable {
", mTestFunctionalTest='" + mTestFunctionalTest + '\'' +
'}';
}
-
}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java
index 06e219c..19c867c 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java
@@ -44,7 +44,19 @@ class SigningConfigImpl implements SigningConfig, Serializable {
private final String storeType;
private final boolean signingReady;
- SigningConfigImpl(@NonNull String name,
+ @NonNull
+ static SigningConfig createSigningConfig(@NonNull SigningConfig signingConfig) {
+ return new SigningConfigImpl(
+ signingConfig.getName(),
+ signingConfig.getStoreFile(),
+ signingConfig.getStorePassword(),
+ signingConfig.getKeyAlias(),
+ signingConfig.getKeyPassword(),
+ signingConfig.getStoreType(),
+ signingConfig.isSigningReady());
+ }
+
+ private SigningConfigImpl(@NonNull String name,
@Nullable File storeFile,
@Nullable String storePassword,
@Nullable String keyAlias,
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderContainerImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderContainerImpl.java
new file mode 100644
index 0000000..fe41180
--- /dev/null
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderContainerImpl.java
@@ -0,0 +1,102 @@
+/*
+ * 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.model;
+
+import com.android.annotations.NonNull;
+import com.android.builder.model.SourceProvider;
+import com.android.builder.model.SourceProviderContainer;
+import com.google.common.collect.Lists;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Implementation of SourceProviderContainer that is serializable and is meant to be used
+ * in the model sent to the tooling API.
+ *
+ * It also provides convenient methods to create an instance, cloning the original
+ * SourceProvider.
+ *
+ * When the source Provider is cloned, its values are queried and then statically stored.
+ * Any further change through the DSL will not be impact. Therefore instances of this class
+ * should only be used when the model is built.
+ *
+ * To create more dynamic isntances of SourceProviderContainer, use
+ * {@link com.android.build.gradle.internal.variant.DefaultSourceProviderContainer}
+ */
+class SourceProviderContainerImpl implements SourceProviderContainer, Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @NonNull
+ private final String name;
+ @NonNull
+ private final SourceProvider sourceProvider;
+
+ /**
+ * Create a {@link SourceProviderContainer} that is serializable to
+ * use in the model sent through the tooling API.
+ *
+ * @param sourceProviderContainer the source provider
+ *
+ * @return a non-null SourceProviderContainer
+ */
+ @NonNull
+ static SourceProviderContainer clone(
+ @NonNull SourceProviderContainer sourceProviderContainer) {
+ return create(
+ sourceProviderContainer.getArtifactName(),
+ sourceProviderContainer.getSourceProvider());
+ }
+
+ @NonNull
+ static List<SourceProviderContainer> cloneCollection(@NonNull Collection<SourceProviderContainer> containers) {
+ List<SourceProviderContainer> clones = Lists.newArrayListWithCapacity(containers.size());
+
+ for (SourceProviderContainer container : containers) {
+ clones.add(clone(container));
+ }
+
+ return clones;
+ }
+
+ @NonNull
+ static SourceProviderContainer create(
+ @NonNull String name,
+ @NonNull SourceProvider sourceProvider) {
+ return new SourceProviderContainerImpl(name,
+ SourceProviderImpl.cloneProvider(sourceProvider));
+ }
+
+ private SourceProviderContainerImpl(@NonNull String name,
+ @NonNull SourceProvider sourceProvider) {
+ this.name = name;
+ this.sourceProvider = sourceProvider;
+ }
+
+ @NonNull
+ @Override
+ public String getArtifactName() {
+ return name;
+ }
+
+ @NonNull
+ @Override
+ public SourceProvider getSourceProvider() {
+ return sourceProvider;
+ }
+}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderImpl.java
index 7d0293b..de02737 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderImpl.java
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderImpl.java
@@ -18,10 +18,11 @@ package com.android.build.gradle.internal.model;
import com.android.annotations.NonNull;
import com.android.builder.model.SourceProvider;
+import com.google.common.collect.Lists;
import java.io.File;
import java.io.Serializable;
-import java.util.Set;
+import java.util.Collection;
/**
* Implementation of SourceProvider that is serializable. Objects used in the DSL cannot be
@@ -31,13 +32,13 @@ class SourceProviderImpl implements SourceProvider, Serializable {
private static final long serialVersionUID = 1L;
private File manifestFile;
- private Set<File> javaDirs;
- private Set<File> resourcesDirs;
- private Set<File> aidlDirs;
- private Set<File> rsDirs;
- private Set<File> jniDirs;
- private Set<File> resDirs;
- private Set<File> assetsDirs;
+ private Collection<File> javaDirs;
+ private Collection<File> resourcesDirs;
+ private Collection<File> aidlDirs;
+ private Collection<File> rsDirs;
+ private Collection<File> jniDirs;
+ private Collection<File> resDirs;
+ private Collection<File> assetsDirs;
@NonNull
static SourceProviderImpl cloneProvider(SourceProvider sourceProvider) {
@@ -55,6 +56,17 @@ class SourceProviderImpl implements SourceProvider, Serializable {
return sourceProviderClone;
}
+ @NonNull
+ static Collection<SourceProvider> cloneCollection(
+ @NonNull Collection<SourceProvider> sourceProviders) {
+ Collection<SourceProvider> results = Lists.newArrayListWithCapacity(sourceProviders.size());
+ for (SourceProvider sourceProvider : sourceProviders) {
+ results.add(SourceProviderImpl.cloneProvider(sourceProvider));
+ }
+
+ return results;
+ }
+
private SourceProviderImpl() {
}
@@ -66,43 +78,43 @@ class SourceProviderImpl implements SourceProvider, Serializable {
@NonNull
@Override
- public Set<File> getJavaDirectories() {
+ public Collection<File> getJavaDirectories() {
return javaDirs;
}
@NonNull
@Override
- public Set<File> getResourcesDirectories() {
+ public Collection<File> getResourcesDirectories() {
return resourcesDirs;
}
@NonNull
@Override
- public Set<File> getAidlDirectories() {
+ public Collection<File> getAidlDirectories() {
return aidlDirs;
}
@NonNull
@Override
- public Set<File> getRenderscriptDirectories() {
+ public Collection<File> getRenderscriptDirectories() {
return rsDirs;
}
@NonNull
@Override
- public Set<File> getJniDirectories() {
+ public Collection<File> getJniDirectories() {
return jniDirs;
}
@NonNull
@Override
- public Set<File> getResDirectories() {
+ public Collection<File> getResDirectories() {
return resDirs;
}
@NonNull
@Override
- public Set<File> getAssetsDirectories() {
+ public Collection<File> getAssetsDirectories() {
return assetsDirs;
}
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 2baef84..c15f480 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
@@ -17,13 +17,13 @@
package com.android.build.gradle.internal.model;
import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.builder.model.ArtifactInfo;
-import com.android.builder.model.SourceProvider;
-import com.android.builder.model.Variant;
+import com.android.builder.model.AndroidArtifact;
+import com.android.builder.model.JavaArtifact;
import com.android.builder.model.ProductFlavor;
+import com.android.builder.model.Variant;
import java.io.Serializable;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -44,28 +44,28 @@ class VariantImpl implements Variant, Serializable {
@NonNull
private final ProductFlavor mergedFlavor;
@NonNull
- private final ArtifactInfo mainArtifactInfo;
- @Nullable
- private final ArtifactInfo testArtifactInfo;
- @Nullable
- private final SourceProvider variantSourceProvider;
+ private final AndroidArtifact mainArtifactInfo;
+ @NonNull
+ private final Collection<AndroidArtifact> extraAndroidArtifacts;
+ @NonNull
+ private final Collection<JavaArtifact> extraJavaArtifacts;
- VariantImpl(@NonNull String name,
- @NonNull String displayName,
- @NonNull String buildTypeName,
- @NonNull List<String> productFlavorNames,
- @NonNull ProductFlavorImpl mergedFlavor,
- @NonNull ArtifactInfo mainArtifactInfo,
- @Nullable ArtifactInfo testArtifactInfo,
- @Nullable SourceProvider variantSourceProvider) {
+ VariantImpl(@NonNull String name,
+ @NonNull String displayName,
+ @NonNull String buildTypeName,
+ @NonNull List<String> productFlavorNames,
+ @NonNull ProductFlavorImpl mergedFlavor,
+ @NonNull AndroidArtifact mainArtifactInfo,
+ @NonNull Collection<AndroidArtifact> extraAndroidArtifacts,
+ @NonNull Collection<JavaArtifact> extraJavaArtifacts) {
this.name = name;
this.displayName = displayName;
this.buildTypeName = buildTypeName;
this.productFlavorNames = productFlavorNames;
this.mergedFlavor = mergedFlavor;
this.mainArtifactInfo = mainArtifactInfo;
- this.testArtifactInfo = testArtifactInfo;
- this.variantSourceProvider = variantSourceProvider;
+ this.extraAndroidArtifacts = extraAndroidArtifacts;
+ this.extraJavaArtifacts = extraJavaArtifacts;
}
@Override
@@ -100,25 +100,25 @@ class VariantImpl implements Variant, Serializable {
@NonNull
@Override
- public ArtifactInfo getMainArtifactInfo() {
+ public AndroidArtifact getMainArtifact() {
return mainArtifactInfo;
}
- @Nullable
+ @NonNull
@Override
- public ArtifactInfo getTestArtifactInfo() {
- return testArtifactInfo;
+ public Collection<AndroidArtifact> getExtraAndroidArtifacts() {
+ return extraAndroidArtifacts;
}
- @Override
@NonNull
- public List<String> getResourceConfigurations() {
- return Collections.emptyList();
+ @Override
+ public Collection<JavaArtifact> getExtraJavaArtifacts() {
+ return extraJavaArtifacts;
}
@Override
- @Nullable
- public SourceProvider getSourceProvider() {
- return variantSourceProvider;
+ @NonNull
+ public List<String> getResourceConfigurations() {
+ return Collections.emptyList();
}
}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/NdkTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/NdkTask.groovy
index 05c56d8..ba48552 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/NdkTask.groovy
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/NdkTask.groovy
@@ -15,7 +15,8 @@
*/
package com.android.build.gradle.internal.tasks
-import com.android.builder.NdkConfig
+
+import com.android.builder.model.NdkConfig
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/variant/DefaultSourceProviderContainer.java b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/DefaultSourceProviderContainer.java
new file mode 100644
index 0000000..06f2e5f
--- /dev/null
+++ b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/DefaultSourceProviderContainer.java
@@ -0,0 +1,51 @@
+/*
+ * 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.model.SourceProvider;
+import com.android.builder.model.SourceProviderContainer;
+
+/**
+ * Default implementation of a SourceProviderContainer that wraps an existing instance of a
+ * SourceProvider.
+ */
+public class DefaultSourceProviderContainer implements SourceProviderContainer {
+
+ @NonNull
+ private final String name;
+ @NonNull
+ private final SourceProvider sourceProvider;
+
+ public DefaultSourceProviderContainer(@NonNull String name,
+ @NonNull SourceProvider sourceProvider) {
+ this.name = name;
+ this.sourceProvider = sourceProvider;
+ }
+
+ @NonNull
+ @Override
+ public String getArtifactName() {
+ return name;
+ }
+
+ @NonNull
+ @Override
+ public SourceProvider getSourceProvider() {
+ return sourceProvider;
+ }
+}
diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/Lint.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/Lint.groovy
index d91f5b3..17d62cf 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/tasks/Lint.groovy
+++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/Lint.groovy
@@ -37,9 +37,9 @@ public class Lint extends DefaultTask {
@Nullable private File mConfigFile
@Nullable private File mHtmlOutput
@Nullable private File mXmlOutput
- @Nullable private List<Set<File>> mSourceSets
+ @Nullable private List<Collection<File>> mSourceSets
@Nullable private String mClassPath
- @Nullable private List<Set<File>> mResourceSets
+ @Nullable private List<Collection<File>> mResourceSets
private boolean mQuiet
public void setPlugin(@NonNull BasePlugin plugin) {
@@ -74,7 +74,7 @@ public class Lint extends DefaultTask {
*
* @param sourceSets files to be added to sources.
*/
- public void setSources(@NonNull List<Set<File>> sourceSets) {
+ public void setSources(@NonNull List<Collection<File>> sourceSets) {
mSourceSets = sourceSets
}
@@ -164,7 +164,7 @@ public class Lint extends DefaultTask {
// Flags: sources, resources, classes
- for (Set<File> args : mSourceSets) {
+ for (Collection<File> args : mSourceSets) {
for (File input : args) {
if (input.exists()) {
List<File> sources = flags.getSourcesOverride()
@@ -190,7 +190,7 @@ public class Lint extends DefaultTask {
classes.add(input);
}
- for (Set<File> args : mResourceSets) {
+ for (Collection<File> args : mResourceSets) {
for (File input : args) {
if (input.exists()) {
List<File> resources = flags.getResourcesOverride()
diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy
index d2a34d5..4526371 100644
--- a/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy
+++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy
@@ -18,7 +18,7 @@ package com.android.build.gradle.tasks
import com.android.annotations.NonNull
import com.android.build.gradle.internal.tasks.NdkTask
-import com.android.builder.NdkConfig
+import com.android.builder.model.NdkConfig
import com.android.sdklib.IAndroidTarget
import com.google.common.base.Charsets
import com.google.common.base.Joiner