diff options
author | Xavier Ducrohet <xav@google.com> | 2013-11-21 23:09:23 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-11-21 23:09:24 +0000 |
commit | c33ad41c453894a91f2a0300bb6c1657c4217e0a (patch) | |
tree | 47ade19cf7bbcee30d0961ff0d90d621f31d86c9 | |
parent | f535d4e1d12ba0a4060ecbc093ab57d97b058af9 (diff) | |
parent | 99aaa1a33ef9e403bf0d2d993e736672420b89ca (diff) | |
download | build-c33ad41c453894a91f2a0300bb6c1657c4217e0a.tar.gz |
Merge "Per-Variant source folder and dependency config."
34 files changed, 755 insertions, 697 deletions
diff --git a/builder-model/src/main/java/com/android/builder/model/Variant.java b/builder-model/src/main/java/com/android/builder/model/Variant.java index 21ef33e..2f32c66 100644 --- a/builder-model/src/main/java/com/android/builder/model/Variant.java +++ b/builder-model/src/main/java/com/android/builder/model/Variant.java @@ -91,6 +91,13 @@ public interface Variant { ProductFlavor getMergedFlavor(); /** + * The variant specific SourceProvider. + * @return a source provider or null + */ + @Nullable + SourceProvider getSourceProvider(); + + /** * Returns the resource configuration for this variant. * TODO implement this. * diff --git a/builder/src/main/java/com/android/builder/VariantConfiguration.java b/builder/src/main/java/com/android/builder/VariantConfiguration.java index 72fbf9a..d21a795 100644 --- a/builder/src/main/java/com/android/builder/VariantConfiguration.java +++ b/builder/src/main/java/com/android/builder/VariantConfiguration.java @@ -23,6 +23,8 @@ import com.android.builder.dependency.DependencyContainer; import com.android.builder.dependency.JarDependency; import com.android.builder.dependency.LibraryDependency; import com.android.builder.internal.NdkConfigImpl; +import com.android.builder.internal.StringHelper; +import com.android.builder.model.ProductFlavor; import com.android.builder.model.SigningConfig; import com.android.builder.model.SourceProvider; import com.android.builder.testing.TestData; @@ -46,20 +48,52 @@ public class VariantConfiguration implements TestData { private static final ManifestParser sManifestParser = new DefaultManifestParser(); + /** + * Full, unique name of the variant in camel case, including BuildType and Flavors (and Test) + */ + private String mFullName; + /** + * Flavor Name of the variant, including all flavors in camel case (starting with a lower + * case). + */ + private String mFlavorName; + /** + * Full, unique name of the variant, including BuildType, flavors and test, dash separated. + * (similar to full name but with dashes) + */ + private String mBaseName; + /** + * Unique directory name (can include multiple folders) for the variant, based on build type, + * flavor and test. + * This always uses forward slashes ('/') as separator on all platform. + * + */ + private String mDirName; + + @NonNull private final DefaultProductFlavor mDefaultConfig; + @NonNull private final SourceProvider mDefaultSourceProvider; + @NonNull private final DefaultBuildType mBuildType; /** SourceProvider for the BuildType. Can be null */ + @Nullable private final SourceProvider mBuildTypeSourceProvider; private final List<DefaultProductFlavor> mFlavorConfigs = Lists.newArrayList(); private final List<SourceProvider> mFlavorSourceProviders = Lists.newArrayList(); + /** + * Variant specific source provider, may be null + */ + @Nullable + private SourceProvider mVariantSourceProvider; + + @NonNull private final Type mType; /** Optional tested config in case type is Type#TEST */ private final VariantConfiguration mTestedConfig; - private final String mDebugName; /** An optional output that is only valid if the type is Type#LIBRARY so that the test * for the library can use the library as if it was a normal dependency. */ private LibraryDependency mOutput; @@ -100,18 +134,16 @@ public class VariantConfiguration implements TestData { * @param defaultSourceProvider the default source provider. Required * @param buildType the build type for this variant. Required. * @param buildTypeSourceProvider the source provider for the build type. Required. - * @param debugName an optional debug name */ public VariantConfiguration( @NonNull DefaultProductFlavor defaultConfig, @NonNull SourceProvider defaultSourceProvider, @NonNull DefaultBuildType buildType, - @Nullable SourceProvider buildTypeSourceProvider, - @Nullable String debugName) { - this(defaultConfig, defaultSourceProvider, + @Nullable SourceProvider buildTypeSourceProvider) { + this( + defaultConfig, defaultSourceProvider, buildType, buildTypeSourceProvider, - Type.DEFAULT, null /*testedConfig*/, - debugName); + Type.DEFAULT, null /*testedConfig*/); } /** @@ -122,19 +154,17 @@ public class VariantConfiguration implements TestData { * @param buildType the build type for this variant. Required. * @param buildTypeSourceProvider the source provider for the build type. * @param type the type of the project. - * @param debugName an optional debug name */ public VariantConfiguration( @NonNull DefaultProductFlavor defaultConfig, @NonNull SourceProvider defaultSourceProvider, @NonNull DefaultBuildType buildType, @Nullable SourceProvider buildTypeSourceProvider, - @NonNull Type type, - @Nullable String debugName) { - this(defaultConfig, defaultSourceProvider, + @NonNull Type type) { + this( + defaultConfig, defaultSourceProvider, buildType, buildTypeSourceProvider, - type, null /*testedConfig*/, - debugName); + type, null /*testedConfig*/); } /** @@ -146,7 +176,6 @@ public class VariantConfiguration implements TestData { * @param buildTypeSourceProvider the source provider for the build type. * @param type the type of the project. * @param testedConfig the reference to the tested project. Required if type is Type.TEST - * @param debugName an optional debug name */ public VariantConfiguration( @NonNull DefaultProductFlavor defaultConfig, @@ -154,15 +183,13 @@ public class VariantConfiguration implements TestData { @NonNull DefaultBuildType buildType, @Nullable SourceProvider buildTypeSourceProvider, @NonNull Type type, - @Nullable VariantConfiguration testedConfig, - @Nullable String debugName) { + @Nullable VariantConfiguration testedConfig) { mDefaultConfig = checkNotNull(defaultConfig); mDefaultSourceProvider = checkNotNull(defaultSourceProvider); mBuildType = checkNotNull(buildType); mBuildTypeSourceProvider = buildTypeSourceProvider; mType = checkNotNull(type); mTestedConfig = testedConfig; - mDebugName = debugName; checkState(mType != Type.TEST || mTestedConfig != null); mMergedFlavor = mDefaultConfig; @@ -178,6 +205,124 @@ public class VariantConfiguration implements TestData { } /** + * Returns the full, unique name of the variant in camel case (starting with a lower case), + * including BuildType, Flavors and Test (if applicable). + * + * @return the name of the variant + */ + @NonNull + public String getFullName() { + if (mFullName == null) { + StringBuilder sb = new StringBuilder(); + String flavorName = getFlavorName(); + if (!flavorName.isEmpty()) { + sb.append(flavorName); + sb.append(StringHelper.capitalize(mBuildType.getName())); + } else { + sb.append(mBuildType.getName()); + } + + if (mType == Type.TEST) { + sb.append("Test"); + } + + mFullName = sb.toString(); + } + + return mFullName; + } + + + /** + * Returns the flavor name of the variant, including all flavors in camel case (starting + * with a lower case). If the variant has no flavor, then an empty string is returned. + * + * @return the flavor name or an empty string. + */ + @NonNull + public String getFlavorName() { + if (mFlavorName == null) { + if (mFlavorConfigs.isEmpty()) { + mFlavorName = ""; + } else { + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (DefaultProductFlavor flavor : mFlavorConfigs) { + sb.append(first ? flavor.getName() : StringHelper.capitalize(flavor.getName())); + first = false; + } + + mFlavorName = sb.toString(); + } + } + + return mFlavorName; + } + + /** + * Returns the full, unique name of the variant, including BuildType, flavors and test, + * dash separated. (similar to full name but with dashes) + * + * @return the name of the variant + */ + @NonNull + public String getBaseName() { + if (mBaseName == null) { + StringBuilder sb = new StringBuilder(); + + if (!mFlavorConfigs.isEmpty()) { + for (ProductFlavor pf : mFlavorConfigs) { + sb.append(pf.getName()).append('-'); + } + } + + sb.append(mBuildType.getName()); + + if (mType == Type.TEST) { + sb.append('-').append("test"); + } + + mBaseName = sb.toString(); + } + + return mBaseName; + } + + /** + * Returns a unique directory name (can include multiple folders) for the variant, + * based on build type, flavor and test. + * This always uses forward slashes ('/') as separator on all platform. + * + * @return the directory name for the variant + */ + @NonNull + public String getDirName() { + if (mDirName == null) { + StringBuilder sb = new StringBuilder(); + + if (mType == Type.TEST) { + sb.append("test/"); + } + + if (!mFlavorConfigs.isEmpty()) { + for (DefaultProductFlavor flavor : mFlavorConfigs) { + sb.append(flavor.getName()); + } + + sb.append('/').append(mBuildType.getName()); + + } else { + sb.append(mBuildType.getName()); + } + + mDirName = sb.toString(); + + } + + return mDirName; + } + + /** * Add a new configured ProductFlavor. * * If multiple flavors are added, the priority follows the order they are added when it @@ -185,13 +330,14 @@ public class VariantConfiguration implements TestData { * latter added ones). * * @param productFlavor the configured product flavor - * @param sourceProvider + * @param sourceProvider the source provider for the product flavor * * @return the config object */ @NonNull public VariantConfiguration addProductFlavor(@NonNull DefaultProductFlavor productFlavor, @NonNull SourceProvider sourceProvider) { + mFlavorConfigs.add(productFlavor); mFlavorSourceProviders.add(sourceProvider); @@ -201,6 +347,27 @@ public class VariantConfiguration implements TestData { return this; } + /** + * Sets the variant-specific source provider. + * @param sourceProvider the source provider for the product flavor + * + * @return the config object + */ + public VariantConfiguration setVariantSourceProvider(@Nullable SourceProvider sourceProvider) { + mVariantSourceProvider = sourceProvider; + + return this; + } + + /** + * Returns the variant specific source provider + * @return the source provider or null if none has been provided. + */ + @Nullable + public SourceProvider getVariantSourceProvider() { + return mVariantSourceProvider; + } + private void computeNdkConfig() { mMergedNdkConfig.reset(); @@ -412,7 +579,7 @@ public class VariantConfiguration implements TestData { } if (packageName == null) { - throw new RuntimeException("Failed get query package name for " + mDebugName); + throw new RuntimeException("Failed get query package name for " + getFullName()); } return packageName; @@ -612,6 +779,13 @@ public class VariantConfiguration implements TestData { public List<File> getManifestOverlays() { List<File> inputs = Lists.newArrayList(); + if (mVariantSourceProvider != null) { + File variantLocation = mVariantSourceProvider.getManifestFile(); + if (variantLocation.isFile()) { + inputs.add(variantLocation); + } + } + if (mBuildTypeSourceProvider != null) { File typeLocation = mBuildTypeSourceProvider.getManifestFile(); if (typeLocation.isFile()) { @@ -682,6 +856,7 @@ public class VariantConfiguration implements TestData { resourceSets.add(resourceSet); } + // build type overrides the flavors if (mBuildTypeSourceProvider != null) { Set<File> typeResDirs = mBuildTypeSourceProvider.getResDirectories(); resourceSet = new ResourceSet(mBuildType.getName()); @@ -689,6 +864,14 @@ public class VariantConfiguration implements TestData { resourceSets.add(resourceSet); } + // variant specific overrides all + if (mVariantSourceProvider != null) { + Set<File> variantResDirs = mVariantSourceProvider.getResDirectories(); + resourceSet = new ResourceSet(getFullName()); + resourceSet.addSources(variantResDirs); + resourceSets.add(resourceSet); + } + return resourceSets; } @@ -737,6 +920,7 @@ public class VariantConfiguration implements TestData { assetSets.add(assetSet); } + // build type overrides flavors if (mBuildTypeSourceProvider != null) { Set<File> typeResDirs = mBuildTypeSourceProvider.getAssetsDirectories(); assetSet = new AssetSet(mBuildType.getName()); @@ -744,6 +928,14 @@ public class VariantConfiguration implements TestData { assetSets.add(assetSet); } + // variant specific overrides all + if (mVariantSourceProvider != null) { + Set<File> variantResDirs = mVariantSourceProvider.getAssetsDirectories(); + assetSet = new AssetSet(getFullName()); + assetSet.addSources(variantResDirs); + assetSets.add(assetSet); + } + return assetSets; } @@ -799,6 +991,10 @@ public class VariantConfiguration implements TestData { } } + if (mVariantSourceProvider != null) { + sourceList.addAll(mVariantSourceProvider.getRenderscriptDirectories()); + } + return sourceList; } @@ -833,6 +1029,31 @@ public class VariantConfiguration implements TestData { } } + if (mVariantSourceProvider != null) { + sourceList.addAll(mVariantSourceProvider.getAidlDirectories()); + } + + return sourceList; + } + + @NonNull + public List<File> getJniSourceList() { + List<File> sourceList = Lists.newArrayList(); + sourceList.addAll(mDefaultSourceProvider.getJniDirectories()); + if (mType != Type.TEST && mBuildTypeSourceProvider != null) { + sourceList.addAll(mBuildTypeSourceProvider.getJniDirectories()); + } + + if (hasFlavors()) { + for (SourceProvider flavorSourceSet : mFlavorSourceProviders) { + sourceList.addAll(flavorSourceSet.getJniDirectories()); + } + } + + if (mVariantSourceProvider != null) { + sourceList.addAll(mVariantSourceProvider.getJniDirectories()); + } + return sourceList; } diff --git a/builder/src/main/java/com/android/builder/internal/StringHelper.java b/builder/src/main/java/com/android/builder/internal/StringHelper.java new file mode 100644 index 0000000..4a59a82 --- /dev/null +++ b/builder/src/main/java/com/android/builder/internal/StringHelper.java @@ -0,0 +1,34 @@ +/* + * 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.builder.internal; + +import com.android.annotations.NonNull; + +import java.util.Locale; + +/** + */ +public class StringHelper { + + @NonNull + public static String capitalize(@NonNull String string) { + StringBuilder sb = new StringBuilder(); + sb.append(string.substring(0, 1).toUpperCase(Locale.US)).append(string.substring(1)); + + return sb.toString(); + } +} diff --git a/builder/src/test/java/com/android/builder/VariantConfigurationTest.java b/builder/src/test/java/com/android/builder/VariantConfigurationTest.java index 6d244ac..424a5f3 100644 --- a/builder/src/test/java/com/android/builder/VariantConfigurationTest.java +++ b/builder/src/test/java/com/android/builder/VariantConfigurationTest.java @@ -128,7 +128,7 @@ public class VariantConfigurationTest extends TestCase { VariantConfiguration variant = new VariantConfiguration( mDefaultConfig, new MockSourceProvider("main"), mBuildType, new MockSourceProvider("debug"), - VariantConfiguration.Type.DEFAULT, "test") { + VariantConfiguration.Type.DEFAULT) { // don't do validation. @Override protected void validate() { @@ -145,7 +145,7 @@ public class VariantConfigurationTest extends TestCase { VariantConfiguration variant = new VariantConfiguration( mDefaultConfig, new MockSourceProvider("main"), mBuildType, new MockSourceProvider("debug"), - VariantConfiguration.Type.DEFAULT, "test") { + VariantConfiguration.Type.DEFAULT) { @Override public String getPackageFromManifest() { return packageName; @@ -165,7 +165,7 @@ public class VariantConfigurationTest extends TestCase { VariantConfiguration variant = new VariantConfiguration( mDefaultConfig, new MockSourceProvider("main"), mBuildType, new MockSourceProvider("debug"), - VariantConfiguration.Type.DEFAULT, "test") { + VariantConfiguration.Type.DEFAULT) { @Override public String getVersionNameFromManifest() { return versionName; diff --git a/gradle-model/src/test/java/com/android/build/gradle/model/AndroidProjectTest.java b/gradle-model/src/test/java/com/android/build/gradle/model/AndroidProjectTest.java index 0af75cc..4118c87 100644 --- a/gradle-model/src/test/java/com/android/build/gradle/model/AndroidProjectTest.java +++ b/gradle-model/src/test/java/com/android/build/gradle/model/AndroidProjectTest.java @@ -191,8 +191,8 @@ public class AndroidProjectTest extends TestCase { assertEquals("Variant Count", 2 , variants.size()); // debug variant - Variant debugVariant = variants.get("Debug"); - assertNotNull("Debug Variant null-check", debugVariant); + Variant debugVariant = variants.get("debug"); + assertNotNull("debug Variant null-check", debugVariant); new ProductFlavorTester(debugVariant.getMergedFlavor(), "Debug Merged Flavor") .setVersionCode(12) .setVersionName("2.0") @@ -220,12 +220,12 @@ public class AndroidProjectTest extends TestCase { assertNotNull("Test output file null-check", debugTestInfo.getOutputFile()); assertTrue("Test signed check", debugTestInfo.isSigned()); assertEquals("Test signingConfig name", "myConfig", debugTestInfo.getSigningConfigName()); - assertEquals("Test sourceGenTask", "generateTestSources", debugTestInfo.getSourceGenTaskName()); - assertEquals("Test javaCompileTask", "compileTestJava", debugTestInfo.getJavaCompileTaskName()); + assertEquals("Test sourceGenTask", "generateDebugTestSources", debugTestInfo.getSourceGenTaskName()); + assertEquals("Test javaCompileTask", "compileDebugTestJava", debugTestInfo.getJavaCompileTaskName()); // release variant, not tested. - Variant releaseVariant = variants.get("Release"); - assertNotNull("Release Variant null-check", releaseVariant); + Variant releaseVariant = variants.get("release"); + assertNotNull("release Variant null-check", releaseVariant); ArtifactInfo relMainInfo = releaseVariant.getMainArtifactInfo(); assertNotNull("Release main info null-check", relMainInfo); @@ -360,11 +360,11 @@ public class AndroidProjectTest extends TestCase { Map<String, Variant> variants = model.getVariants(); assertEquals("Variant Count", 8 , variants.size()); - Variant f1faDebugVariant = variants.get("F1FaDebug"); - assertNotNull("F1faDebug Variant null-check", f1faDebugVariant); + Variant f1faDebugVariant = variants.get("f1FaDebug"); + assertNotNull("f1faDebug Variant null-check", f1faDebugVariant); new ProductFlavorTester(f1faDebugVariant.getMergedFlavor(), "F1faDebug Merged Flavor") .test(); - new VariantTester(f1faDebugVariant, projectDir, "flavors-f1fa-debug-unaligned.apk").test(); + new VariantTester(f1faDebugVariant, projectDir, "flavors-f1-fa-debug-unaligned.apk").test(); } public void testTicTacToe() throws Exception { @@ -377,7 +377,7 @@ public class AndroidProjectTest extends TestCase { ProjectData appModelData = map.get(":app"); assertNotNull("app module model null-check", appModelData); - Dependencies dependencies = appModelData.model.getVariants().get("Debug").getMainArtifactInfo().getDependencies(); + Dependencies dependencies = appModelData.model.getVariants().get("debug").getMainArtifactInfo().getDependencies(); assertNotNull(dependencies); List<AndroidLibrary> libs = dependencies.getLibraries(); @@ -407,7 +407,7 @@ public class AndroidProjectTest extends TestCase { ProductFlavorContainer flavor1 = model.getProductFlavors().get("flavor1"); assertNotNull(flavor1); - Variant flavor1Debug = variants.get("Flavor1Debug"); + Variant flavor1Debug = variants.get("flavor1Debug"); assertNotNull(flavor1Debug); Dependencies dependencies = flavor1Debug.getMainArtifactInfo().getDependencies(); @@ -423,7 +423,7 @@ public class AndroidProjectTest extends TestCase { ProductFlavorContainer flavor2 = model.getProductFlavors().get("flavor2"); assertNotNull(flavor2); - Variant flavor2Debug = variants.get("Flavor2Debug"); + Variant flavor2Debug = variants.get("flavor2Debug"); assertNotNull(flavor2Debug); dependencies = flavor2Debug.getMainArtifactInfo().getDependencies(); @@ -447,8 +447,8 @@ public class AndroidProjectTest extends TestCase { Map<String, Variant> variants = model.getVariants(); assertEquals("Variant count", 2, variants.size()); - Variant variant = variants.get("Release"); - assertNotNull("Release variant null-check", variant); + Variant variant = variants.get("release"); + assertNotNull("release variant null-check", variant); ArtifactInfo mainInfo = variant.getMainArtifactInfo(); assertNotNull("Main Artifact null-check", mainInfo); 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 77e9807..33db4c3 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy @@ -20,6 +20,7 @@ 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 @@ -139,7 +140,7 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements Plugin<Pr throw new RuntimeException("BuildType names cannot collide with ProductFlavor names") } - def sourceSet = extension.sourceSetsContainer.create(name) + def sourceSet = extension.sourceSetsContainer.maybeCreate(name) BuildTypeData buildTypeData = new BuildTypeData(buildType, sourceSet, project) project.tasks.assemble.dependsOn buildTypeData.assembleTask @@ -161,9 +162,9 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements Plugin<Pr throw new RuntimeException("ProductFlavor names cannot collide with BuildType names") } - def mainSourceSet = (DefaultAndroidSourceSet) extension.sourceSetsContainer.create(productFlavor.name) + def mainSourceSet = (DefaultAndroidSourceSet) extension.sourceSetsContainer.maybeCreate(productFlavor.name) String testName = "${INSTRUMENT_TEST}${productFlavor.name.capitalize()}" - def testSourceSet = (DefaultAndroidSourceSet) extension.sourceSetsContainer.create(testName) + def testSourceSet = (DefaultAndroidSourceSet) extension.sourceSetsContainer.maybeCreate(testName) ProductFlavorData<GroupableProductFlavorDsl> productFlavorData = new ProductFlavorData<GroupableProductFlavorDsl>( @@ -296,12 +297,13 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements Plugin<Pr defaultConfigData.productFlavor, defaultConfigData.sourceSet, buildTypeData.buildType, - buildTypeData.sourceSet, project.name) + buildTypeData.sourceSet) // create the variant and get its internal storage object. ApplicationVariantData appVariantData = new ApplicationVariantData(variantConfig) VariantDependencies variantDep = VariantDependencies.compute( - project, appVariantData.name, buildTypeData, defaultConfigData.mainProvider) + project, appVariantData.variantConfiguration.fullName, + buildTypeData, defaultConfigData.mainProvider) appVariantData.setVariantDependency(variantDep) variantDataList.add(appVariantData) @@ -319,8 +321,7 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements Plugin<Pr defaultConfigData.testSourceSet, testData.buildType, null, - VariantConfiguration.Type.TEST, testedVariantData.variantConfiguration, - project.name) + VariantConfiguration.Type.TEST, testedVariantData.variantConfiguration) // create the internal storage for this variant. def testVariantData = new TestVariantData(testVariantConfig, testedVariantData) @@ -330,7 +331,8 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements Plugin<Pr // dependencies for the test variant VariantDependencies variantDep = VariantDependencies.compute( - project, testVariantData.name, defaultConfigData.testProvider) + project, testVariantData.variantConfiguration.fullName, + defaultConfigData.testProvider) testVariantData.setVariantDependency(variantDep) // now loop on the VariantDependency and resolve them, and create the tasks @@ -434,8 +436,7 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements Plugin<Pr extension.defaultConfig, getDefaultConfigData().sourceSet, buildTypeData.buildType, - buildTypeData.sourceSet, - project.name) + buildTypeData.sourceSet) for (ProductFlavorData data : flavorDataList) { variantConfig.addProductFlavor( @@ -449,8 +450,13 @@ 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)) + VariantDependencies variantDep = VariantDependencies.compute( - project, appVariantData.name, + project, appVariantData.variantConfiguration.fullName, variantProviders.toArray(new ConfigurationProvider[variantProviders.size()])) appVariantData.setVariantDependency(variantDep) @@ -470,7 +476,7 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements Plugin<Pr testData.buildType, null, VariantConfiguration.Type.TEST, - testedVariantData.variantConfiguration, project.name) + testedVariantData.variantConfiguration) /// add the container of dependencies // the order of the libraries is important. In descending order: @@ -495,7 +501,7 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements Plugin<Pr // dependencies for the test variant VariantDependencies variantDep = VariantDependencies.compute( - project, testVariantData.name, + project, testVariantData.variantConfiguration.fullName, testVariantProviders.toArray(new ConfigurationProvider[testVariantProviders.size()])) testVariantData.setVariantDependency(variantDep) 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 405ef32..d442514 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy @@ -346,7 +346,8 @@ public abstract class BasePlugin { protected void createProcessManifestTask(BaseVariantData variantData, String manifestOurDir) { - def processManifestTask = project.tasks.create("process${variantData.name}Manifest", + def processManifestTask = project.tasks.create( + "process${variantData.variantConfiguration.fullName.capitalize()}Manifest", ProcessAppManifest) variantData.processManifestTask = processManifestTask processManifestTask.dependsOn variantData.prepareDependenciesTask @@ -383,13 +384,14 @@ public abstract class BasePlugin { } processManifestTask.conventionMapping.manifestOutputFile = { project.file( - "$project.buildDir/${manifestOurDir}/$variantData.dirName/AndroidManifest.xml") + "$project.buildDir/${manifestOurDir}/${variantData.variantConfiguration.dirName}/AndroidManifest.xml") } } protected void createProcessTestManifestTask(BaseVariantData variantData, String manifestOurDir) { - def processTestManifestTask = project.tasks.create("process${variantData.name}TestManifest", + def processTestManifestTask = project.tasks.create( + "process${variantData.variantConfiguration.fullName.capitalize()}Manifest", ProcessTestManifest) variantData.processManifestTask = processTestManifestTask processTestManifestTask.dependsOn variantData.prepareDependenciesTask @@ -425,14 +427,15 @@ public abstract class BasePlugin { } processTestManifestTask.conventionMapping.manifestOutputFile = { project.file( - "$project.buildDir/${manifestOurDir}/$variantData.dirName/AndroidManifest.xml") + "$project.buildDir/${manifestOurDir}/${variantData.variantConfiguration.dirName}/AndroidManifest.xml") } } protected void createRenderscriptTask(BaseVariantData variantData) { VariantConfiguration config = variantData.variantConfiguration - def renderscriptTask = project.tasks.create("compile${variantData.name}Renderscript", + def renderscriptTask = project.tasks.create( + "compile${variantData.variantConfiguration.fullName.capitalize()}Renderscript", RenderscriptCompile) variantData.renderscriptCompileTask = renderscriptTask @@ -450,16 +453,16 @@ public abstract class BasePlugin { renderscriptTask.conventionMapping.importDirs = { config.renderscriptImports } renderscriptTask.conventionMapping.sourceOutputDir = { - project.file("$project.buildDir/source/rs/$variantData.dirName") + project.file("$project.buildDir/source/rs/${variantData.variantConfiguration.dirName}") } renderscriptTask.conventionMapping.resOutputDir = { - project.file("$project.buildDir/res/rs/$variantData.dirName") + project.file("$project.buildDir/res/rs/${variantData.variantConfiguration.dirName}") } renderscriptTask.conventionMapping.objOutputDir = { - project.file("$project.buildDir/rs/$variantData.dirName/obj") + project.file("$project.buildDir/rs/${variantData.variantConfiguration.dirName}/obj") } renderscriptTask.conventionMapping.libOutputDir = { - project.file("$project.buildDir/rs/$variantData.dirName/lib") + project.file("$project.buildDir/rs/${variantData.variantConfiguration.dirName}/lib") } renderscriptTask.conventionMapping.ndkConfig = { config.ndkConfig } } @@ -469,7 +472,7 @@ public abstract class BasePlugin { MergeResources mergeResourcesTask = basicCreateMergeResourcesTask( variantData, "merge", - "$project.buildDir/res/all/$variantData.dirName", + "$project.buildDir/res/all/${variantData.variantConfiguration.dirName}", true /*includeDependencies*/, process9Patch) variantData.mergeResourcesTask = mergeResourcesTask @@ -482,13 +485,14 @@ public abstract class BasePlugin { final boolean includeDependencies, final boolean process9Patch) { MergeResources mergeResourcesTask = project.tasks.create( - "$taskNamePrefix${variantData.name}Resources", MergeResources) + "$taskNamePrefix${variantData.variantConfiguration.fullName.capitalize()}Resources", + MergeResources) mergeResourcesTask.dependsOn variantData.prepareDependenciesTask, variantData.renderscriptCompileTask mergeResourcesTask.plugin = this mergeResourcesTask.variant = variantData mergeResourcesTask.incrementalFolder = project.file( - "$project.buildDir/incremental/${taskNamePrefix}Resources/$variantData.dirName") + "$project.buildDir/incremental/${taskNamePrefix}Resources/${variantData.variantConfiguration.dirName}") mergeResourcesTask.process9Patch = process9Patch @@ -507,17 +511,19 @@ public abstract class BasePlugin { @Nullable String outputLocation, final boolean includeDependencies) { if (outputLocation == null) { - outputLocation = "$project.buildDir/assets/$variantData.dirName" + outputLocation = "$project.buildDir/assets/${variantData.variantConfiguration.dirName}" } - def mergeAssetsTask = project.tasks.create("merge${variantData.name}Assets", MergeAssets) + def mergeAssetsTask = project.tasks.create( + "merge${variantData.variantConfiguration.fullName.capitalize()}Assets", + MergeAssets) variantData.mergeAssetsTask = mergeAssetsTask mergeAssetsTask.dependsOn variantData.prepareDependenciesTask mergeAssetsTask.plugin = this mergeAssetsTask.variant = variantData mergeAssetsTask.incrementalFolder = - project.file("$project.buildDir/incremental/mergeAssets/$variantData.dirName") + project.file("$project.buildDir/incremental/mergeAssets/${variantData.variantConfiguration.dirName}") mergeAssetsTask.conventionMapping.inputAssetSets = { variantData.variantConfiguration.getAssetSets(includeDependencies) @@ -527,7 +533,8 @@ public abstract class BasePlugin { protected void createBuildConfigTask(BaseVariantData variantData) { def generateBuildConfigTask = project.tasks.create( - "generate${variantData.name}BuildConfig", GenerateBuildConfig) + "generate${variantData.variantConfiguration.fullName.capitalize()}BuildConfig", + GenerateBuildConfig) variantData.generateBuildConfigTask = generateBuildConfigTask VariantConfiguration variantConfiguration = variantData.variantConfiguration @@ -555,16 +562,17 @@ public abstract class BasePlugin { } generateBuildConfigTask.conventionMapping.sourceOutputDir = { - project.file("$project.buildDir/source/buildConfig/${variantData.dirName}") + project.file("$project.buildDir/source/buildConfig/${variantData.variantConfiguration.dirName}") } } protected void createProcessResTask(BaseVariantData variantData) { - createProcessResTask(variantData, "$project.buildDir/symbols/$variantData.dirName") + createProcessResTask(variantData, "$project.buildDir/symbols/${variantData.variantConfiguration.dirName}") } protected void createProcessResTask(BaseVariantData variantData, final String symbolLocation) { - def processResources = project.tasks.create("process${variantData.name}Resources", + def processResources = project.tasks.create( + "process${variantData.variantConfiguration.fullName.capitalize()}Resources", ProcessAndroidResources) variantData.processResourcesTask = processResources @@ -597,18 +605,18 @@ public abstract class BasePlugin { // TODO: unify with generateBuilderConfig, compileAidl, and library packaging somehow? processResources.conventionMapping.sourceOutputDir = { - project.file("$project.buildDir/source/r/$variantData.dirName") + project.file("$project.buildDir/source/r/${variantData.variantConfiguration.dirName}") } processResources.conventionMapping.textSymbolOutputDir = { project.file(symbolLocation) } processResources.conventionMapping.packageOutputFile = { project.file( - "$project.buildDir/libs/${project.archivesBaseName}-${variantData.baseName}.ap_") + "$project.buildDir/libs/${project.archivesBaseName}-${variantData.variantConfiguration.baseName}.ap_") } if (variantConfiguration.buildType.runProguard) { processResources.conventionMapping.proguardOutputFile = { - project.file("$project.buildDir/proguard/${variantData.dirName}/aapt_rules.txt") + project.file("$project.buildDir/proguard/${variantData.variantConfiguration.dirName}/aapt_rules.txt") } } @@ -620,7 +628,8 @@ public abstract class BasePlugin { protected void createProcessJavaResTask(BaseVariantData variantData) { VariantConfiguration variantConfiguration = variantData.variantConfiguration - Copy processResources = project.tasks.create("process${variantData.name}JavaRes", + Copy processResources = project.tasks.create( + "process${variantData.variantConfiguration.fullName.capitalize()}JavaRes", ProcessResources); variantData.processJavaResourcesTask = processResources @@ -638,14 +647,16 @@ public abstract class BasePlugin { } processResources.conventionMapping.destinationDir = { - project.file("$project.buildDir/javaResources/$variantData.dirName") + project.file("$project.buildDir/javaResources/${variantData.variantConfiguration.dirName}") } } protected void createAidlTask(BaseVariantData variantData) { VariantConfiguration variantConfiguration = variantData.variantConfiguration - def compileTask = project.tasks.create("compile${variantData.name}Aidl", AidlCompile) + def compileTask = project.tasks.create( + "compile${variantData.variantConfiguration.fullName.capitalize()}Aidl", + AidlCompile) variantData.aidlCompileTask = compileTask variantData.sourceGenTask.dependsOn compileTask @@ -654,19 +665,21 @@ public abstract class BasePlugin { compileTask.plugin = this compileTask.variant = variantData compileTask.incrementalFolder = - project.file("$project.buildDir/incremental/aidl/$variantData.dirName") + project.file("$project.buildDir/incremental/aidl/${variantData.variantConfiguration.dirName}") compileTask.conventionMapping.sourceDirs = { variantConfiguration.aidlSourceList } compileTask.conventionMapping.importDirs = { variantConfiguration.aidlImports } compileTask.conventionMapping.sourceOutputDir = { - project.file("$project.buildDir/source/aidl/$variantData.dirName") + project.file("$project.buildDir/source/aidl/${variantData.variantConfiguration.dirName}") } } protected void createCompileTask(BaseVariantData variantData, BaseVariantData testedVariantData) { - def compileTask = project.tasks.create("compile${variantData.name}Java", JavaCompile) + def compileTask = project.tasks.create( + "compile${variantData.variantConfiguration.fullName.capitalize()}Java", + JavaCompile) variantData.javaCompileTask = compileTask compileTask.dependsOn variantData.sourceGenTask @@ -707,10 +720,10 @@ public abstract class BasePlugin { compileTask.dependsOn project.configurations.compile.buildDependencies compileTask.conventionMapping.destinationDir = { - project.file("$project.buildDir/classes/$variantData.dirName") + project.file("$project.buildDir/classes/${variantData.variantConfiguration.dirName}") } compileTask.conventionMapping.dependencyCacheDir = { - project.file("$project.buildDir/dependency-cache/$variantData.dirName") + project.file("$project.buildDir/dependency-cache/${variantData.variantConfiguration.dirName}") } // set source/target compatibility @@ -732,14 +745,15 @@ public abstract class BasePlugin { protected void createNdkTasks(@NonNull BaseVariantData variantData) { createNdkTasks( variantData, - { project.file("$project.buildDir/ndk/$variantData.dirName/lib") } + { project.file("$project.buildDir/ndk/${variantData.variantConfiguration.dirName}/lib") } ) } protected void createNdkTasks(@NonNull BaseVariantData variantData, @NonNull Closure<File> soFolderClosure) { NdkCompile ndkCompile = project.tasks.create( - "compile${variantData.name}Ndk", NdkCompile) + "compile${variantData.variantConfiguration.fullName.capitalize()}Ndk", + NdkCompile) ndkCompile.plugin = this ndkCompile.variant = variantData @@ -747,26 +761,10 @@ public abstract class BasePlugin { VariantConfiguration variantConfig = variantData.variantConfiguration - ndkCompile.conventionMapping.sourceFolders = { - - Set<File> sourceList = Sets.newHashSet() - - sourceList.addAll(((AndroidSourceSet) variantConfig.defaultSourceSet).jni.srcDirs) - - if (variantConfig.getType() != VariantConfiguration.Type.TEST) { - sourceList.addAll(((AndroidSourceSet) variantConfig.buildTypeSourceSet).jni.srcDirs) - } - if (variantConfig.hasFlavors()) { - for (SourceProvider flavorSourceSet : variantConfig.flavorSourceSets) { - sourceList.addAll(((AndroidSourceSet) flavorSourceSet).jni.srcDirs) - } - } - - return sourceList - } + ndkCompile.conventionMapping.sourceFolders = { variantConfig.jniSourceList } ndkCompile.conventionMapping.generatedMakefile = { - project.file("$project.buildDir/ndk/$variantData.dirName/Android.mk") + project.file("$project.buildDir/ndk/${variantData.variantConfiguration.dirName}/Android.mk") } ndkCompile.conventionMapping.ndkConfig = { variantConfig.ndkConfig } @@ -776,7 +774,7 @@ public abstract class BasePlugin { } ndkCompile.conventionMapping.objFolder = { - project.file("$project.buildDir/ndk/$variantData.dirName/obj") + project.file("$project.buildDir/ndk/${variantData.variantConfiguration.dirName}/obj") } ndkCompile.conventionMapping.soFolder = soFolderClosure } @@ -794,7 +792,7 @@ public abstract class BasePlugin { // to test both. if (!variantData.isSigned()) { throw new GradleException( - "Tested Variant '${testedVariantData.name}' is not configured to create a signed APK.") + "Tested Variant '${testedVariantData.variantConfiguration.fullName}' is not configured to create a signed APK.") } createAnchorTasks(variantData) @@ -866,7 +864,7 @@ public abstract class BasePlugin { int count = variantDataList.size() for (int i = 0 ; i < count ; i++) { final BaseVariantData baseVariantData = variantDataList.get(i) - String variantName = baseVariantData.computeName() + String variantName = baseVariantData.variantConfiguration.fullName Task lintCheck = project.tasks.create("lint" + variantName, Lint) lintCheck.dependsOn baseVariantData.javaCompileTask, lintCompile lint.dependsOn lintCheck @@ -891,6 +889,9 @@ public abstract class BasePlugin { if (config.getType() != VariantConfiguration.Type.TEST) { javaSource.add(config.buildTypeSourceSet.javaDirectories) } + if (config.variantSourceProvider != null) { + javaSource.add(config.variantSourceProvider.javaDirectories) + } resourceSource.add(config.defaultSourceSet.resDirectories) if (config.getType() != VariantConfiguration.Type.TEST) { @@ -928,7 +929,8 @@ public abstract class BasePlugin { // set lint project options lintCheck.setSources(javaSource) - lintCheck.setClasspath("$project.buildDir/classes/$baseVariantData.dirName") + lintCheck.setClasspath( + "$project.buildDir/classes/$baseVariantData.variantConfiguration.dirName") lintCheck.setLintResources(resourceSource) } } @@ -1013,8 +1015,8 @@ public abstract class BasePlugin { // first the connected one. def connectedTask = createDeviceProviderInstrumentTestTask( hasFlavors ? - "${connectedRootName}${baseVariantData.name}" : connectedRootName, - "Installs and runs the tests for Build '${baseVariantData.name}' on connected devices.", + "${connectedRootName}${baseVariantData.variantConfiguration.fullName}" : connectedRootName, + "Installs and runs the tests for Build '${baseVariantData.variantConfiguration.fullName}' on connected devices.", isLibraryTest ? DeviceProviderInstrumentTestLibraryTask : DeviceProviderInstrumentTestTask, @@ -1031,9 +1033,9 @@ public abstract class BasePlugin { for (DeviceProvider deviceProvider : providers) { DefaultTask providerTask = createDeviceProviderInstrumentTestTask( hasFlavors ? - "${deviceProvider.name}${INSTRUMENT_TEST.capitalize()}${baseVariantData.name}" : + "${deviceProvider.name}${INSTRUMENT_TEST.capitalize()}${baseVariantData.variantConfiguration.fullName}" : "${deviceProvider.name}${INSTRUMENT_TEST.capitalize()}", - "Installs and runs the tests for Build '${baseVariantData.name}' using Provider '${deviceProvider.name.capitalize()}'.", + "Installs and runs the tests for Build '${baseVariantData.variantConfiguration.fullName}' using Provider '${deviceProvider.name.capitalize()}'.", isLibraryTest ? DeviceProviderInstrumentTestLibraryTask : DeviceProviderInstrumentTestTask, @@ -1056,10 +1058,10 @@ public abstract class BasePlugin { for (TestServer testServer : servers) { DefaultTask serverTask = project.tasks.create( hasFlavors ? - "${testServer.name}${"upload".capitalize()}${baseVariantData.name}" : + "${testServer.name}${"upload".capitalize()}${baseVariantData.variantConfiguration.fullName}" : "${testServer.name}${"upload".capitalize()}", TestServerTask) - serverTask.description = "Uploads APKs for Build '${baseVariantData.name}' to Test Server '${testServer.name.capitalize()}'." + serverTask.description = "Uploads APKs for Build '${baseVariantData.variantConfiguration.fullName}' to Test Server '${testServer.name.capitalize()}'." serverTask.group = JavaBasePlugin.VERIFICATION_GROUP serverTask.dependsOn testVariantData.assembleTask, baseVariantData.assembleTask @@ -1070,7 +1072,7 @@ public abstract class BasePlugin { serverTask.conventionMapping.testedApk = { baseVariantData.outputFile } } - serverTask.conventionMapping.variantName = { baseVariantData.name } + serverTask.conventionMapping.variantName = { baseVariantData.variantConfiguration.fullName } deviceCheck.dependsOn serverTask @@ -1116,7 +1118,7 @@ public abstract class BasePlugin { testTask.plugin = this testTask.variant = variantData - testTask.flavorName = variantData.flavorName + testTask.flavorName = variantData.variantConfiguration.flavorName.capitalize() testTask.deviceProvider = deviceProvider testTask.conventionMapping.testApp = { variantData.outputFile } @@ -1129,7 +1131,7 @@ public abstract class BasePlugin { extension.testOptions.resultsDir : "$project.buildDir/$FD_INSTRUMENT_RESULTS" - String flavorFolder = variantData.flavorDirName + String flavorFolder = variantData.variantConfiguration.flavorName if (!flavorFolder.isEmpty()) { flavorFolder = "$FD_FLAVORS/" + flavorFolder } @@ -1141,7 +1143,7 @@ public abstract class BasePlugin { extension.testOptions.reportDir : "$project.buildDir/$FD_REPORTS/$FD_INSTRUMENT_TESTS" - String flavorFolder = variantData.flavorDirName + String flavorFolder = variantData.variantConfiguration.flavorName if (!flavorFolder.isEmpty()) { flavorFolder = "$FD_FLAVORS/" + flavorFolder } @@ -1168,7 +1170,7 @@ public abstract class BasePlugin { variantConfig.testedConfig.type != VariantConfiguration.Type.LIBRARY)) // common dex task configuration - String dexTaskName = "dex${variantData.name}" + String dexTaskName = "dex${variantData.variantConfiguration.fullName.capitalize()}" Dex dexTask = project.tasks.create(dexTaskName, Dex) variantData.dexTask = dexTask @@ -1177,7 +1179,7 @@ public abstract class BasePlugin { dexTask.conventionMapping.outputFile = { project.file( - "${project.buildDir}/libs/${project.archivesBaseName}-${variantData.baseName}.dex") + "${project.buildDir}/libs/${project.archivesBaseName}-${variantData.variantConfiguration.baseName}.dex") } dexTask.dexOptions = extension.dexOptions @@ -1198,7 +1200,7 @@ public abstract class BasePlugin { PreDex preDexTask = null; boolean runPreDex = extension.dexOptions.preDexLibraries if (runPreDex) { - def preDexTaskName = "preDex${variantData.name}" + def preDexTaskName = "preDex${variantData.variantConfiguration.fullName.capitalize()}" preDexTask = project.tasks.create(preDexTaskName, PreDex) preDexTask.dependsOn variantData.javaCompileTask @@ -1210,7 +1212,7 @@ public abstract class BasePlugin { } preDexTask.conventionMapping.outputFolder = { project.file( - "${project.buildDir}/pre-dexed/${variantData.dirName}") + "${project.buildDir}/pre-dexed/${variantData.variantConfiguration.dirName}") } } @@ -1233,7 +1235,9 @@ public abstract class BasePlugin { } // Add a task to generate application package - def packageApp = project.tasks.create("package${variantData.name}", PackageApplication) + def packageApp = project.tasks.create( + "package${variantData.variantConfiguration.fullName.capitalize()}", + PackageApplication) variantData.packageApplicationTask = packageApp packageApp.dependsOn variantData.processResourcesTask, dexTask, variantData.processJavaResourcesTask, variantData.ndkCompileTask @@ -1285,8 +1289,8 @@ public abstract class BasePlugin { def signedApk = variantData.isSigned() def apkName = signedApk ? - "${project.archivesBaseName}-${variantData.baseName}-unaligned.apk" : - "${project.archivesBaseName}-${variantData.baseName}-unsigned.apk" + "${project.archivesBaseName}-${variantData.variantConfiguration.baseName}-unaligned.apk" : + "${project.archivesBaseName}-${variantData.variantConfiguration.baseName}-unsigned.apk" packageApp.conventionMapping.outputFile = { project.file("$project.buildDir/apk/${apkName}") @@ -1298,25 +1302,29 @@ public abstract class BasePlugin { if (signedApk) { if (variantData.zipAlign) { // Add a task to zip align application package - def zipAlignTask = project.tasks.create("zipalign${variantData.name}", ZipAlign) + def zipAlignTask = project.tasks.create( + "zipalign${variantData.variantConfiguration.fullName.capitalize()}", + ZipAlign) variantData.zipAlignTask = zipAlignTask zipAlignTask.dependsOn packageApp zipAlignTask.conventionMapping.inputFile = { packageApp.outputFile } zipAlignTask.conventionMapping.outputFile = { project.file( - "$project.buildDir/apk/${project.archivesBaseName}-${variantData.baseName}.apk") + "$project.buildDir/apk/${project.archivesBaseName}-${variantData.variantConfiguration.baseName}.apk") } zipAlignTask.conventionMapping.zipAlignExe = { getSdkParser().zipAlign } appTask = zipAlignTask outputFileTask = zipAlignTask variantData.outputFile = project.file( - "$project.buildDir/apk/${project.archivesBaseName}-${variantData.baseName}.apk") + "$project.buildDir/apk/${project.archivesBaseName}-${variantData.variantConfiguration.baseName}.apk") } // Add a task to install the application package - def installTask = project.tasks.create("install${variantData.name}", InstallTask) + def installTask = project.tasks.create( + "install${variantData.variantConfiguration.fullName.capitalize()}", + InstallTask) installTask.description = "Installs the " + variantData.description installTask.group = INSTALL_GROUP installTask.dependsOn appTask @@ -1328,7 +1336,7 @@ public abstract class BasePlugin { // Add an assemble task if (assembleTask == null) { - assembleTask = project.tasks.create("assemble${variantData.name}") + assembleTask = project.tasks.create("assemble${variantData.variantConfiguration.fullName.capitalize()}") assembleTask.description = "Assembles the " + variantData.description assembleTask.group = org.gradle.api.plugins.BasePlugin.BUILD_GROUP } @@ -1338,7 +1346,9 @@ public abstract class BasePlugin { variantData.outputFile = { outputFileTask.outputFile } // add an uninstall task - def uninstallTask = project.tasks.create("uninstall${variantData.name}", UninstallTask) + def uninstallTask = project.tasks.create( + "uninstall${variantData.variantConfiguration.fullName.capitalize()}", + UninstallTask) uninstallTask.description = "Uninstalls the " + variantData.description uninstallTask.group = INSTALL_GROUP uninstallTask.variant = variantData @@ -1360,7 +1370,9 @@ public abstract class BasePlugin { @Nullable BaseVariantData testedVariantData) { VariantConfiguration variantConfig = variantData.variantConfiguration - def proguardTask = project.tasks.create("proguard${variantData.name}", ProGuardTask) + def proguardTask = project.tasks.create( + "proguard${variantData.variantConfiguration.fullName.capitalize()}", + ProGuardTask) proguardTask.dependsOn variantData.javaCompileTask if (testedVariantData != null) { proguardTask.dependsOn testedVariantData.proguardTask @@ -1373,10 +1385,10 @@ public abstract class BasePlugin { File outFile; if (variantData instanceof LibraryVariantData) { outFile = project.file( - "${project.buildDir}/$DIR_BUNDLES/${variantData.dirName}/classes.jar") + "${project.buildDir}/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}/classes.jar") } else { outFile = project.file( - "${project.buildDir}/classes-proguard/${variantData.dirName}/classes.jar") + "${project.buildDir}/classes-proguard/${variantData.variantConfiguration.dirName}/classes.jar") } // --- Proguard Config --- @@ -1390,7 +1402,7 @@ public abstract class BasePlugin { "}") // input the mapping from the tested app so that we can deal with obfuscated code - proguardTask.applymapping("${project.buildDir}/proguard/${testedVariantData.dirName}/mapping.txt") + proguardTask.applymapping("${project.buildDir}/proguard/${testedVariantData.variantConfiguration.dirName}/mapping.txt") // for tested app, we only care about their aapt config since the base // configs are the same files anyway. @@ -1475,13 +1487,13 @@ public abstract class BasePlugin { proguardTask.outjars(outFile) - proguardTask.dump("${project.buildDir}/proguard/${variantData.dirName}/dump.txt") + proguardTask.dump("${project.buildDir}/proguard/${variantData.variantConfiguration.dirName}/dump.txt") proguardTask.printseeds( - "${project.buildDir}/proguard/${variantData.dirName}/seeds.txt") + "${project.buildDir}/proguard/${variantData.variantConfiguration.dirName}/seeds.txt") proguardTask.printusage( - "${project.buildDir}/proguard/${variantData.dirName}/usage.txt") + "${project.buildDir}/proguard/${variantData.variantConfiguration.dirName}/usage.txt") proguardTask.printmapping( - "${project.buildDir}/proguard/${variantData.dirName}/mapping.txt") + "${project.buildDir}/proguard/${variantData.variantConfiguration.dirName}/mapping.txt") return outFile } @@ -1499,10 +1511,12 @@ public abstract class BasePlugin { } protected void createAnchorTasks(@NonNull BaseVariantData variantData) { - variantData.preBuildTask = project.tasks.create("pre${variantData.name}Build") + variantData.preBuildTask = project.tasks.create( + "pre${variantData.variantConfiguration.fullName.capitalize()}Build") variantData.preBuildTask.dependsOn mainPreBuild - def prepareDependenciesTask = project.tasks.create("prepare${variantData.name}Dependencies", + def prepareDependenciesTask = project.tasks.create( + "prepare${variantData.variantConfiguration.fullName.capitalize()}Dependencies", PrepareDependenciesTask) variantData.prepareDependenciesTask = prepareDependenciesTask @@ -1521,7 +1535,8 @@ public abstract class BasePlugin { } // also create sourceGenTask - variantData.sourceGenTask = project.tasks.create("generate${variantData.name}Sources") + variantData.sourceGenTask = project.tasks.create( + "generate${variantData.variantConfiguration.fullName.capitalize()}Sources") } //---------------------------------------------------------------------------------------------- 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 ba86d35..14cce5e 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/LibraryPlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/LibraryPlugin.groovy @@ -79,9 +79,9 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { // create the source sets for the build type. // the ones for the main product flavors are handled by the base plugin. DefaultAndroidSourceSet debugSourceSet = - (DefaultAndroidSourceSet) extension.sourceSetsContainer.create(BuilderConstants.DEBUG) + (DefaultAndroidSourceSet) extension.sourceSetsContainer.maybeCreate(BuilderConstants.DEBUG) DefaultAndroidSourceSet releaseSourceSet = - (DefaultAndroidSourceSet) extension.sourceSetsContainer.create(BuilderConstants.RELEASE) + (DefaultAndroidSourceSet) extension.sourceSetsContainer.maybeCreate(BuilderConstants.RELEASE) debugBuildTypeData = new BuildTypeData(extension.debug, debugSourceSet, project) releaseBuildTypeData = new BuildTypeData(extension.release, releaseSourceSet, project) @@ -140,15 +140,15 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { debugBuildTypeData.buildType, null, VariantConfiguration.Type.TEST, - debugVariantData.variantConfiguration, - project.name) + debugVariantData.variantConfiguration) TestVariantData testVariantData = new TestVariantData(testVariantConfig, debugVariantData) // link the testVariant to the tested variant in the other direction debugVariantData.setTestVariantData(testVariantData); // dependencies for the test variant - variantDep = VariantDependencies.compute(project, testVariantData.name, + variantDep = VariantDependencies.compute(project, + testVariantData.variantConfiguration.fullName, defaultConfigData.testProvider, debugVariantData.variantDependency) testVariantData.setVariantDependency(variantDep) @@ -173,13 +173,12 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { configData.sourceSet, buildTypeData.buildType, buildTypeData.sourceSet, - VariantConfiguration.Type.LIBRARY, - project.name) + VariantConfiguration.Type.LIBRARY) LibraryVariantData variantData = new LibraryVariantData(variantConfig) VariantDependencies debugVariantDep = VariantDependencies.compute( - project, variantData.name, + project, variantData.variantConfiguration.fullName, buildTypeData, configData.mainProvider) variantData.setVariantDependency(debugVariantDep) @@ -212,13 +211,13 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { // the dependencies. This is what gets packaged in the aar. MergeResources packageRes = basicCreateMergeResourcesTask(variantData, "package", - "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/res", + "$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}/res", false /*includeDependencies*/, false /*process9Patch*/) // Add a task to merge the assets folders createMergeAssetsTask(variantData, - "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/assets", + "$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}/assets", false /*includeDependencies*/) // Add a task to create the BuildConfig class @@ -226,7 +225,8 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { // Add a task to generate resource source files, directing the location // of the r.txt file to be directly in the bundle. - createProcessResTask(variantData, "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}") + createProcessResTask(variantData, + "$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}") // process java resources createProcessJavaResTask(variantData) @@ -239,40 +239,48 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { // Add NDK tasks createNdkTasks( variantData, - { project.file("$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/jni") }); + { project.file("$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}/jni") }); // package the aidl files into the bundle folder - Sync packageAidl = project.tasks.create("package${variantData.name}Aidl", Sync) + Sync packageAidl = project.tasks.create( + "package${variantData.variantConfiguration.fullName.capitalize()}Aidl", + Sync) // packageAidl from 3 sources. the order is important to make sure the override works well. packageAidl.from(variantConfig.aidlSourceList).include("**/*.aidl") packageAidl.into(project.file( - "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/$SdkConstants.FD_AIDL")) + "$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}/$SdkConstants.FD_AIDL")) // package the renderscript header files files into the bundle folder - Sync packageRenderscript = project.tasks.create("package${variantData.name}Renderscript", + Sync packageRenderscript = project.tasks.create( + "package${variantData.variantConfiguration.fullName.capitalize()}Renderscript", Sync) // package from 3 sources. the order is important to make sure the override works well. packageRenderscript.from(variantConfig.renderscriptSourceList).include("**/*.rsh") packageRenderscript.into(project.file( - "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/$SdkConstants.FD_RENDERSCRIPT")) + "$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}/$SdkConstants.FD_RENDERSCRIPT")) // merge consumer proguard files from different build types and flavors - MergeFileTask mergeProGuardFileTask = project.tasks.create("merge${variantData.name}ProguardFiles", + MergeFileTask mergeProGuardFileTask = project.tasks.create( + "merge${variantData.variantConfiguration.fullName.capitalize()}ProguardFiles", MergeFileTask) mergeProGuardFileTask.conventionMapping.inputFiles = { project.files(variantConfig.getConsumerProguardFiles()).files } mergeProGuardFileTask.conventionMapping.outputFile = { project.file( - "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/$LibraryBundle.FN_PROGUARD_TXT") + "$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}/$LibraryBundle.FN_PROGUARD_TXT") } // copy lint.jar into the bundle folder - Copy lintCopy = project.tasks.create("copy${variantData.name}Lint", Copy) + Copy lintCopy = project.tasks.create( + "copy${variantData.variantConfiguration.fullName.capitalize()}Lint", + Copy) lintCopy.dependsOn lintCompile lintCopy.from("$project.buildDir/lint/lint.jar") - lintCopy.into("$project.buildDir/$DIR_BUNDLES/$variantData.dirName") + lintCopy.into("$project.buildDir/$DIR_BUNDLES/$variantData.variantConfiguration.dirName") - Zip bundle = project.tasks.create("bundle${variantData.name}", Zip) + Zip bundle = project.tasks.create( + "bundle${variantData.variantConfiguration.fullName.capitalize()}", + Zip) if (variantConfig.buildType.runProguard) { // run proguard on output of compile task @@ -283,10 +291,12 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { bundle.dependsOn packageRes, packageAidl, packageRenderscript, mergeProGuardFileTask, lintCopy, variantData.ndkCompileTask } else { - Sync packageLocalJar = project.tasks.create("package${variantData.name}LocalJar", Sync) + Sync packageLocalJar = project.tasks.create( + "package${variantData.variantConfiguration.fullName.capitalize()}LocalJar", + Sync) packageLocalJar.from(getLocalJarFileList(variantData.variantDependency)) packageLocalJar.into(project.file( - "$project.buildDir/$DIR_BUNDLES/${variantData.dirName}/$SdkConstants.LIBS_FOLDER")) + "$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}/$SdkConstants.LIBS_FOLDER")) // jar the classes. Jar jar = project.tasks.create("package${buildType.name.capitalize()}Jar", Jar); @@ -294,7 +304,8 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { jar.from(variantData.javaCompileTask.outputs); jar.from(variantData.processJavaResourcesTask.destinationDir) - jar.destinationDir = project.file("$project.buildDir/$DIR_BUNDLES/${variantData.dirName}") + jar.destinationDir = project.file( + "$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}") jar.archiveName = "classes.jar" String packageName = variantConfig.getPackageFromManifest() @@ -313,13 +324,13 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { mergeProGuardFileTask, lintCopy, variantData.ndkCompileTask } - bundle.setDescription("Assembles a bundle containing the library in ${variantData.name}."); + bundle.setDescription("Assembles a bundle containing the library in ${variantData.variantConfiguration.fullName.capitalize()}."); bundle.destinationDir = project.file("$project.buildDir/libs") bundle.extension = BuilderConstants.EXT_LIB_ARCHIVE - if (variantData.baseName != BuilderConstants.RELEASE) { - bundle.classifier = variantData.baseName + if (variantData.variantConfiguration.baseName != BuilderConstants.RELEASE) { + bundle.classifier = variantData.variantConfiguration.baseName } - bundle.from(project.file("$project.buildDir/$DIR_BUNDLES/${variantData.dirName}")) + bundle.from(project.file("$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}")) variantData.packageLibTask = bundle variantData.outputFile = bundle.archivePath @@ -337,7 +348,7 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { // configure the variant to be testable. variantConfig.output = new LibraryBundle( bundle.archivePath, - project.file("$project.buildDir/$DIR_BUNDLES/${variantData.dirName}"), + project.file("$project.buildDir/$DIR_BUNDLES/${variantData.variantConfiguration.dirName}"), variantData.getName()) { @Nullable 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 index d28b6dd..404625e 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/api/ApkVariant.java +++ b/gradle/src/main/groovy/com/android/build/gradle/api/ApkVariant.java @@ -21,7 +21,6 @@ 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.model.SigningConfig; import org.gradle.api.DefaultTask; @@ -33,11 +32,6 @@ import java.util.List; */ 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. 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 190bf47..cfc1fd3 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 @@ -25,6 +25,8 @@ 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.compile.JavaCompile; @@ -68,6 +70,19 @@ public interface BaseVariant { String getBaseName(); /** + * 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 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). * 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 index 5bcfd9f..8db077d 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/api/LibraryVariant.java +++ b/gradle/src/main/groovy/com/android/build/gradle/api/LibraryVariant.java @@ -16,10 +16,7 @@ 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; /** @@ -28,19 +25,6 @@ import org.gradle.api.tasks.bundling.Zip; 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. 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 2de5ad0..25ea1ca 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 @@ -69,7 +69,8 @@ public class AndroidAsciiReportRenderer extends TextReportRenderer { renderer.visit(new Action<StyledTextOutput>() { @Override public void execute(StyledTextOutput styledTextOutput) { - getTextOutput().withStyle(Identifier).text(variantData.getName()); + getTextOutput().withStyle(Identifier).text( + variantData.getVariantConfiguration().getFullName()); getTextOutput().withStyle(Description).text(""); } }, true); 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 index ed0afe4..fcc3d0b 100644 --- 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 @@ -21,23 +21,13 @@ 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.internal.variant.BaseVariantData; 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.model.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; @@ -46,7 +36,7 @@ import java.util.List; * implementation of the {@link ApplicationVariant} interface around an * {@link ApplicationVariantData} object. */ -public class ApplicationVariantImpl implements ApplicationVariant { +public class ApplicationVariantImpl extends BaseVariantImpl implements ApplicationVariant { @NonNull private final ApplicationVariantData variantData; @@ -57,38 +47,13 @@ public class ApplicationVariantImpl implements ApplicationVariant { 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(); + protected BaseVariantData getVariantData() { + return variantData; } - @Override - @NonNull - public String getBaseName() { - return variantData.getBaseName(); - } - - @Override - @NonNull - public DefaultBuildType getBuildType() { - return variantData.getVariantConfiguration().getBuildType(); + public void setTestVariant(@Nullable TestVariant testVariant) { + this.testVariant = testVariant; } @Override @@ -104,12 +69,6 @@ public class ApplicationVariantImpl implements ApplicationVariant { } @Override - @NonNull - public File getOutputFile() { - return variantData.getOutputFile(); - } - - @Override public void setOutputFile(@NonNull File outputFile) { if (variantData.zipAlignTask != null) { variantData.zipAlignTask.setOutputFile(outputFile); @@ -125,57 +84,6 @@ public class ApplicationVariantImpl implements ApplicationVariant { } @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.processJavaResourcesTask; - } - - @Override public Dex getDex() { return variantData.dexTask; } @@ -191,11 +99,6 @@ public class ApplicationVariantImpl implements ApplicationVariant { } @Override - public Task getAssemble() { - return variantData.assembleTask; - } - - @Override public DefaultTask getInstall() { return variantData.installTask; } 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 new file mode 100644 index 0000000..e49b7c0 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/api/BaseVariantImpl.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.internal.api; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.build.gradle.api.BaseVariant; +import com.android.build.gradle.internal.variant.BaseVariantData; +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.compile.JavaCompile; + +import java.io.File; + +abstract class BaseVariantImpl implements BaseVariant { + + protected abstract BaseVariantData getVariantData(); + + @Override + @NonNull + public String getName() { + return getVariantData().getVariantConfiguration().getFullName(); + } + + @Override + @NonNull + public String getDescription() { + return getVariantData().getDescription(); + } + + @Override + @NonNull + public String getDirName() { + return getVariantData().getVariantConfiguration().getDirName(); + } + + @Override + @NonNull + public String getBaseName() { + return getVariantData().getVariantConfiguration().getBaseName(); + } + + @Override + @NonNull + public DefaultBuildType getBuildType() { + return getVariantData().getVariantConfiguration().getBuildType(); + } + + @NonNull + @Override + public DefaultProductFlavor getConfig() { + return getVariantData().getVariantConfiguration().getDefaultConfig(); + } + + @Override + @NonNull + public File getOutputFile() { + return getVariantData().getOutputFile(); + } + + @Override + @NonNull + public ProcessManifest getProcessManifest() { + return getVariantData().processManifestTask; + } + + @Override + @NonNull + public AidlCompile getAidlCompile() { + return getVariantData().aidlCompileTask; + } + + @Override + @NonNull + public RenderscriptCompile getRenderscriptCompile() { + return getVariantData().renderscriptCompileTask; + } + + @Override + public MergeResources getMergeResources() { + return getVariantData().mergeResourcesTask; + } + + @Override + public MergeAssets getMergeAssets() { + return getVariantData().mergeAssetsTask; + } + + @Override + @NonNull + public ProcessAndroidResources getProcessResources() { + return getVariantData().processResourcesTask; + } + + @Override + public GenerateBuildConfig getGenerateBuildConfig() { + return getVariantData().generateBuildConfigTask; + } + + @Override + @NonNull + public JavaCompile getJavaCompile() { + return getVariantData().javaCompileTask; + } + + @Override + @NonNull + public Copy getProcessJavaResources() { + return getVariantData().processJavaResourcesTask; + } + + @Override + @Nullable + public Task getAssemble() { + return getVariantData().assembleTask; + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceSet.java b/gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceSet.java index aab4146..0520fa5 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceSet.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/api/DefaultAndroidSourceSet.java @@ -267,7 +267,6 @@ public class DefaultAndroidSourceSet implements AndroidSourceSet, SourceProvider // --- SourceProvider - @NonNull @Override public Set<File> getJavaDirectories() { 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 index 7ed4c6b..f48a529 100644 --- 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 @@ -20,20 +20,9 @@ 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.BaseVariantData; 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; @@ -41,7 +30,7 @@ import java.io.File; * implementation of the {@link LibraryVariant} interface around a * {@link LibraryVariantData} object. */ -public class LibraryVariantImpl implements LibraryVariant { +public class LibraryVariantImpl extends BaseVariantImpl implements LibraryVariant { @NonNull private final LibraryVariantData variantData; @@ -52,44 +41,13 @@ public class LibraryVariantImpl implements LibraryVariant { 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(); + protected BaseVariantData getVariantData() { + return variantData; } - @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(); + public void setTestVariant(@Nullable TestVariant testVariant) { + this.testVariant = testVariant; } @Override @@ -111,63 +69,7 @@ public class LibraryVariantImpl implements LibraryVariant { } @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.processJavaResourcesTask; - } - - @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 index 37eb618..073c49d 100644 --- 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 @@ -19,24 +19,14 @@ 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.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; -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.model.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; @@ -44,7 +34,7 @@ import java.util.List; /** * implementation of the {@link TestVariant} interface around an {@link TestVariantData} object. */ -public class TestVariantImpl implements TestVariant { +public class TestVariantImpl extends BaseVariantImpl implements TestVariant { @NonNull private final TestVariantData variantData; @@ -56,33 +46,8 @@ public class TestVariantImpl implements 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(); + protected BaseVariantData getVariantData() { + return variantData; } @Override @@ -98,12 +63,6 @@ public class TestVariantImpl implements TestVariant { } @Override - @NonNull - public File getOutputFile() { - return variantData.getOutputFile(); - } - - @Override public void setOutputFile(@NonNull File outputFile) { if (variantData.zipAlignTask != null) { variantData.zipAlignTask.setOutputFile(outputFile); @@ -123,57 +82,6 @@ public class TestVariantImpl implements 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.processJavaResourcesTask; - } - - @Override public Dex getDex() { return variantData.dexTask; } @@ -189,11 +97,6 @@ public class TestVariantImpl implements TestVariant { } @Override - public Task getAssemble() { - return variantData.assembleTask; - } - - @Override public DefaultTask getInstall() { return variantData.installTask; } 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 9edd1c0..037b789 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 @@ -152,14 +152,20 @@ public class ModelBuilder implements ToolingModelBuilder { ArtifactInfo testArtifact = testVariantData != null ? createArtifactInfo(testVariantData, gradleProjects) : null + SourceProvider sp = variantData.variantConfiguration.getVariantSourceProvider(); + if (sp != null) { + sp = SourceProviderImpl.cloneProvider(sp); + } + VariantImpl variant = new VariantImpl( - variantData.name, - variantData.baseName, + variantData.variantConfiguration.fullName, + variantData.variantConfiguration.baseName, variantData.variantConfiguration.buildType.name, getProductFlavorNames(variantData), ProductFlavorImpl.cloneFlavor(variantData.variantConfiguration.mergedFlavor), mainArtifact, - testArtifact) + testArtifact, + sp) return variant } 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 f9a5c86..2baef84 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 @@ -19,6 +19,7 @@ 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.ProductFlavor; @@ -46,6 +47,8 @@ class VariantImpl implements Variant, Serializable { private final ArtifactInfo mainArtifactInfo; @Nullable private final ArtifactInfo testArtifactInfo; + @Nullable + private final SourceProvider variantSourceProvider; VariantImpl(@NonNull String name, @NonNull String displayName, @@ -53,7 +56,8 @@ class VariantImpl implements Variant, Serializable { @NonNull List<String> productFlavorNames, @NonNull ProductFlavorImpl mergedFlavor, @NonNull ArtifactInfo mainArtifactInfo, - @Nullable ArtifactInfo testArtifactInfo) { + @Nullable ArtifactInfo testArtifactInfo, + @Nullable SourceProvider variantSourceProvider) { this.name = name; this.displayName = displayName; this.buildTypeName = buildTypeName; @@ -61,6 +65,7 @@ class VariantImpl implements Variant, Serializable { this.mergedFlavor = mergedFlavor; this.mainArtifactInfo = mainArtifactInfo; this.testArtifactInfo = testArtifactInfo; + this.variantSourceProvider = variantSourceProvider; } @Override @@ -110,4 +115,10 @@ class VariantImpl implements Variant, Serializable { public List<String> getResourceConfigurations() { return Collections.emptyList(); } + + @Override + @Nullable + public SourceProvider getSourceProvider() { + return variantSourceProvider; + } } 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 index ef74235..9c1f580 100644 --- 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 @@ -44,34 +44,12 @@ public abstract class ApkVariantData extends BaseVariantData { if (getVariantConfiguration().hasFlavors()) { return String.format("%s build for flavor %s", getCapitalizedBuildTypeName(), - getFlavoredName(true)); + getCapitalizedFlavorName()); } 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(); } 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 index a602a29..91c4d08 100644 --- 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 @@ -31,15 +31,6 @@ public class ApplicationVariantData extends ApkVariantData implements TestedVari super(config); } - @NonNull - @Override - protected String computeName() { - return getVariantConfiguration().hasFlavors() ? - String.format("%s%s", - getFlavoredName(true), getCapitalizedBuildTypeName()) : - getCapitalizedBuildTypeName(); - } - @Override public void setTestVariantData(@Nullable TestVariantData testVariantData) { this.testVariantData = testVariantData; 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 index 069143e..84241c5 100644 --- 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 @@ -17,6 +17,7 @@ package com.android.build.gradle.internal.variant; import com.android.annotations.NonNull; import com.android.annotations.Nullable; +import com.android.annotations.VisibleForTesting; import com.android.build.gradle.internal.StringHelper; import com.android.build.gradle.internal.dependency.VariantDependencies; import com.android.build.gradle.internal.tasks.PrepareDependenciesTask; @@ -28,8 +29,6 @@ import com.android.build.gradle.tasks.NdkCompile; 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 groovy.lang.Closure; import org.gradle.api.Task; @@ -44,7 +43,6 @@ import java.io.File; */ public abstract class BaseVariantData { - private String name; private final VariantConfiguration variantConfiguration; private VariantDependencies variantDependency; @@ -71,13 +69,9 @@ public abstract class BaseVariantData { public BaseVariantData(@NonNull VariantConfiguration variantConfiguration) { this.variantConfiguration = variantConfiguration; - this.name = computeName(); } @NonNull - protected abstract String computeName(); - - @NonNull public VariantConfiguration getVariantConfiguration() { return variantConfiguration; } @@ -92,56 +86,21 @@ public abstract class BaseVariantData { } @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(); + protected String getCapitalizedBuildTypeName() { + return StringHelper.capitalize(variantConfiguration.getBuildType().getName()); } @NonNull - protected String getCapitalizedBuildTypeName() { - return StringHelper.capitalize(variantConfiguration.getBuildType().getName()); + protected String getCapitalizedFlavorName() { + return StringHelper.capitalize(variantConfiguration.getFlavorName()); } public void setOutputFile(Object file) { @@ -159,4 +118,10 @@ public abstract class BaseVariantData { assert false; return null; } + + @VisibleForTesting + @NonNull + String getName() { + return variantConfiguration.getFullName(); + } } 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 index 852b8c5..8a86851 100644 --- 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 @@ -36,36 +36,17 @@ public class LibraryVariantData extends BaseVariantData implements TestedVariant @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"; + return String.format("%s build for flavor %s", + getCapitalizedBuildTypeName(), + getCapitalizedFlavorName()); } else { - return "Test for the ${config.buildType.name.capitalize()} build"; + return String.format("%s build", getCapitalizedBuildTypeName()); } } @Override - @NonNull - public String getDirName() { - return getVariantConfiguration().getBuildType().getName(); - } - - @Override - @NonNull - public String getBaseName() { - return getVariantConfiguration().getBuildType().getName(); - } - - @Override public void setTestVariantData(@Nullable TestVariantData testVariantData) { this.testVariantData = testVariantData; } 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 index ebd336c..b8d45ed 100644 --- 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 @@ -43,20 +43,12 @@ public class TestVariantData extends ApkVariantData { return testedVariantData; } - @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()); + getCapitalizedFlavorName(), getCapitalizedBuildTypeName()); } else { return String.format("Test build for the %s build", getCapitalizedBuildTypeName()); @@ -64,26 +56,6 @@ public class TestVariantData extends ApkVariantData { } @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/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy index 45d7d99..19b5681 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 @@ -37,7 +37,7 @@ import org.gradle.api.tasks.util.PatternSet */ class NdkCompile extends NdkTask { - Set<File> sourceFolders + List<File> sourceFolders @OutputFile File generatedMakefile @@ -54,7 +54,7 @@ class NdkCompile extends NdkTask { @InputFiles FileTree getSource() { FileTree src = null - Set<File> sources = getSourceFolders() + List<File> sources = getSourceFolders() if (!sources.isEmpty()) { src = getProject().files(new ArrayList<Object>(sources)).getAsFileTree() } 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 756dfc7..bef2ec7 100644 --- a/gradle/src/test/groovy/com/android/build/gradle/AppPluginDslTest.groovy +++ b/gradle/src/test/groovy/com/android/build/gradle/AppPluginDslTest.groovy @@ -266,19 +266,17 @@ public class AppPluginDslTest extends BaseTest { @NonNull String testedVariantName, @NonNull Set<ApplicationVariant> variants, @NonNull Set<TestVariant> testVariants) { - ApplicationVariant variant = findNamedItem(variants, variantName) - assertNotNull(variant) + ApplicationVariant variant = findNamedItem(variants, variantName, "variantData") assertNotNull(variant.testVariant) assertEquals(testedVariantName, variant.testVariant.name) - assertEquals(variant.testVariant, findNamedItem(testVariants, testedVariantName)) + assertEquals(variant.testVariant, findNamedItemMaybe(testVariants, testedVariantName)) checkTasks(variant) checkTasks(variant.testVariant) } private static void checkNonTestedVariant(@NonNull String variantName, @NonNull Set<ApplicationVariant> variants) { - ApplicationVariant variant = findNamedItem(variants, variantName) - assertNotNull(variant) + ApplicationVariant variant = findNamedItem(variants, variantName, "variantData") assertNull(variant.testVariant) checkTasks(variant) } 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 d840272..4578945 100644 --- a/gradle/src/test/groovy/com/android/build/gradle/AppPluginInternalTest.groovy +++ b/gradle/src/test/groovy/com/android/build/gradle/AppPluginInternalTest.groovy @@ -60,14 +60,9 @@ public class AppPluginInternalTest extends BaseTest { List<BaseVariantData> variants = plugin.variantDataList assertEquals(3, variants.size()) // includes the test variant(s) - BaseVariantData debugVariant = findNamedItem(variants, "Debug") - assertNotNull(debugVariant) - - BaseVariantData release = findNamedItem(variants, "Release") - assertNotNull(release) - - BaseVariantData test = findNamedItem(variants, "Test") - assertNotNull(test) + findNamedItem(variants, "debug", "variantData") + findNamedItem(variants, "release", "variantData") + findNamedItem(variants, "debugTest", "variantData") } public void testDefaultConfig() { @@ -138,17 +133,14 @@ public class AppPluginInternalTest extends BaseTest { List<BaseVariantData> variants = plugin.variantDataList assertEquals(4, variants.size()) // includes the test variant(s) - BaseVariantData debugVariant = findNamedItem(variants, "Debug") - assertNotNull(debugVariant) + String[] variantNames = [ + "debug", "release", "staging"] - BaseVariantData releaseVariant = findNamedItem(variants, "Release") - assertNotNull(releaseVariant) - - BaseVariantData stagingVariant = findNamedItem(variants, "Staging") - assertNotNull(stagingVariant) + for (String variantName : variantNames) { + findNamedItem(variants, variantName, "variantData") + } - BaseVariantData testVariant = findNamedItem(variants, "Test") - assertNotNull(testVariant) + BaseVariantData testVariant = findNamedItem(variants, "stagingTest", "variantData") assertEquals("staging", testVariant.variantConfiguration.buildType.name) } @@ -179,12 +171,13 @@ public class AppPluginInternalTest extends BaseTest { List<BaseVariantData> variants = plugin.variantDataList assertEquals(6, variants.size()) // includes the test variant(s) - assertNotNull(findNamedItem(variants, "Flavor1Debug")) - assertNotNull(findNamedItem(variants, "Flavor1Release")) - assertNotNull(findNamedItem(variants, "Flavor1Test")) - assertNotNull(findNamedItem(variants, "Flavor2Debug")) - assertNotNull(findNamedItem(variants, "Flavor2Release")) - assertNotNull(findNamedItem(variants, "Flavor2Test")) + String[] variantNames = [ + "flavor1Debug", "flavor1Release", "flavor1DebugTest", + "flavor2Debug", "flavor2Release", "flavor2DebugTest"] + + for (String variantName : variantNames) { + findNamedItem(variants, variantName, "variantData") + } } public void testMultiFlavors() { @@ -226,24 +219,29 @@ public class AppPluginInternalTest extends BaseTest { List<BaseVariantData> variants = plugin.variantDataList assertEquals(18, variants.size()) // includes the test variant(s) - 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")) + String[] variantNames = [ + "f1FaDebug", + "f1FbDebug", + "f1FcDebug", + "f2FaDebug", + "f2FbDebug", + "f2FcDebug", + "f1FaRelease", + "f1FbRelease", + "f1FcRelease", + "f2FaRelease", + "f2FbRelease", + "f2FcRelease", + "f1FaDebugTest", + "f1FbDebugTest", + "f1FcDebugTest", + "f2FaDebugTest", + "f2FbDebugTest", + "f2FcDebugTest"]; + + for (String variantName : variantNames) { + findNamedItem(variants, variantName, "variantData"); + } } public void testSigningConfigs() { @@ -312,37 +310,31 @@ public class AppPluginInternalTest extends BaseTest { BaseVariantData variant SigningConfig signingConfig - variant = findNamedItem(variants, "Flavor1Debug") - assertNotNull(variant) + variant = findNamedItem(variants, "flavor1Debug", "variantData") signingConfig = variant.variantConfiguration.signingConfig assertNotNull(signingConfig) assertEquals(KeystoreHelper.defaultDebugKeystoreLocation(), signingConfig.storeFile?.absolutePath) - variant = findNamedItem(variants, "Flavor1Staging") - assertNotNull(variant) + variant = findNamedItem(variants, "flavor1Staging", "variantData") signingConfig = variant.variantConfiguration.signingConfig assertNull(signingConfig) - variant = findNamedItem(variants, "Flavor1Release") - assertNotNull(variant) + variant = findNamedItem(variants, "flavor1Release", "variantData") signingConfig = variant.variantConfiguration.signingConfig assertNotNull(signingConfig) assertEquals(new File(project.projectDir, "a3"), signingConfig.storeFile) - variant = findNamedItem(variants, "Flavor2Debug") - assertNotNull(variant) + variant = findNamedItem(variants, "flavor2Debug", "variantData") signingConfig = variant.variantConfiguration.signingConfig assertNotNull(signingConfig) assertEquals(KeystoreHelper.defaultDebugKeystoreLocation(), signingConfig.storeFile?.absolutePath) - variant = findNamedItem(variants, "Flavor2Staging") - assertNotNull(variant) + variant = findNamedItem(variants, "flavor2Staging", "variantData") signingConfig = variant.variantConfiguration.signingConfig assertNotNull(signingConfig) assertEquals(new File(project.projectDir, "a1"), signingConfig.storeFile) - variant = findNamedItem(variants, "Flavor2Release") - assertNotNull(variant) + variant = findNamedItem(variants, "flavor2Release", "variantData") signingConfig = variant.variantConfiguration.signingConfig assertNotNull(signingConfig) assertEquals(new File(project.projectDir, "a3"), signingConfig.storeFile) 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 ac62126..269a557 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 @@ -183,8 +183,8 @@ public abstract class BaseTest extends TestCase { * @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) { + protected static <T> T findNamedItemMaybe(@NonNull Collection<T> items, + @NonNull String name) { for (T item : items) { if (name.equals(item.name)) { return item @@ -193,4 +193,18 @@ public abstract class BaseTest extends TestCase { return null } + + /** + * 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, + @NonNull String typeName) { + T foundItem = findNamedItemMaybe(items, name); + assertNotNull("$name $typeName null-check", foundItem) + return foundItem + } } diff --git a/tests/flavored/build.gradle b/tests/flavored/build.gradle index 61f0cea..41e50d9 100644 --- a/tests/flavored/build.gradle +++ b/tests/flavored/build.gradle @@ -23,12 +23,12 @@ android { f1 { packageName = "com.android.tests.flavored.f1" versionName = "1.0.0-f1" - buildConfig "private final static String FLAVOR = \"f1\";" + buildConfig "public final static String FLAVOR = \"f1\";" } f2 { packageName = "com.android.tests.flavored.f2" versionName = "1.0.0-f2" - buildConfig "private final static String FLAVOR = \"f2\";" + buildConfig "public final static String FLAVOR = \"f2\";" } } diff --git a/tests/flavored/src/f1/res/values/strings.xml b/tests/flavored/src/f1/res/values/strings.xml index f081f40..7154c04 100644 --- a/tests/flavored/src/f1/res/values/strings.xml +++ b/tests/flavored/src/f1/res/values/strings.xml @@ -1,4 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">_Test-Flavored-f1</string> + <string name="text">F1 text</string> </resources> diff --git a/tests/flavored/src/f1Staging/res/values/strings.xml b/tests/flavored/src/f1Staging/res/values/strings.xml new file mode 100644 index 0000000..782422e --- /dev/null +++ b/tests/flavored/src/f1Staging/res/values/strings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="text">F1-Staging text</string> +</resources> diff --git a/tests/flavored/src/instrumentTest/java/com/android/tests/flavored/MainTest.java b/tests/flavored/src/instrumentTest/java/com/android/tests/flavored/MainTest.java index f44e0f0..b22c53d 100644 --- a/tests/flavored/src/instrumentTest/java/com/android/tests/flavored/MainTest.java +++ b/tests/flavored/src/instrumentTest/java/com/android/tests/flavored/MainTest.java @@ -34,5 +34,14 @@ public class MainTest extends ActivityInstrumentationTestCase2<Main> { public void testPreconditions() { assertNotNull(mTextView); } + + @MediumTest + public void testStagingText() { + if ("f1".equals(BuildConfig.FLAVOR)) { + assertEquals("F1-Staging text", mTextView.getText()); + } else { + assertEquals("default text", mTextView.getText()); + } + } } diff --git a/tests/flavored/src/main/res/layout/main.xml b/tests/flavored/src/main/res/layout/main.xml index 058715f..9d4e976 100644 --- a/tests/flavored/src/main/res/layout/main.xml +++ b/tests/flavored/src/main/res/layout/main.xml @@ -7,7 +7,7 @@ <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" - android:text="Test App - Flavored" + android:text="@string/text" android:id="@+id/text" /> </LinearLayout> diff --git a/tests/flavored/src/main/res/values/strings.xml b/tests/flavored/src/main/res/values/strings.xml index 24db545..46d8260 100644 --- a/tests/flavored/src/main/res/values/strings.xml +++ b/tests/flavored/src/main/res/values/strings.xml @@ -1,4 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">###</string> + <string name="text">default text</string> </resources> |