From 60a5b2383dc6c67f85edfdf0d0fd33db6ec9e715 Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet Date: Fri, 21 Jun 2013 19:27:56 -0700 Subject: Improve model. Since we are already changing the model in non compatible way, now is a good time to fix some issues. Refactoring all the properties of an artifact out of variant and into its own ArtifactInfo class, so that we can have both the main and test artifact in the variant in an elegant way. Also adding SigningConfig info to enable the creation of export wizard from the IDE. Change-Id: Ib6c48873ba0e5c5a61bc1e79b00a90e2be83652f --- .../android/build/gradle/AutomatedBuildTest.java | 9 +- .../com/android/build/gradle/AppExtension.groovy | 4 +- .../com/android/build/gradle/AppPlugin.groovy | 4 +- .../com/android/build/gradle/BasePlugin.groovy | 4 +- .../android/build/gradle/LibraryExtension.groovy | 3 +- .../com/android/build/gradle/api/ApkVariant.java | 4 +- .../internal/api/ApplicationVariantImpl.java | 2 +- .../build/gradle/internal/api/TestVariantImpl.java | 2 +- .../gradle/internal/dsl/AaptOptionsImpl.groovy | 3 +- .../build/gradle/internal/dsl/BuildTypeDsl.groovy | 4 +- .../gradle/internal/dsl/SigningConfigDsl.java | 26 ++--- .../internal/dsl/SigningConfigFactory.groovy | 2 +- .../gradle/internal/model/ArtifactInfoImpl.java | 130 +++++++++++++++++++++ .../internal/model/DefaultAndroidProject.java | 18 +++ .../gradle/internal/model/ModelBuilder.groovy | 95 +++++++++++---- .../gradle/internal/model/SigningConfigImpl.java | 104 +++++++++++++++++ .../build/gradle/internal/model/VariantImpl.java | 121 ++----------------- .../gradle/internal/tasks/SigningReportTask.groovy | 2 +- .../internal/tasks/ValidateSigningTask.groovy | 3 +- .../build/gradle/tasks/ProcessAppManifest.groovy | 4 +- .../build/gradle/AppPluginInternalTest.groovy | 3 +- .../build/gradle/LibraryPluginDslTest.groovy | 3 +- 22 files changed, 378 insertions(+), 172 deletions(-) create mode 100644 gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactInfoImpl.java create mode 100644 gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java (limited to 'gradle/src') diff --git a/gradle/src/build-test/groovy/com/android/build/gradle/AutomatedBuildTest.java b/gradle/src/build-test/groovy/com/android/build/gradle/AutomatedBuildTest.java index 17389f6..96fea26 100644 --- a/gradle/src/build-test/groovy/com/android/build/gradle/AutomatedBuildTest.java +++ b/gradle/src/build-test/groovy/com/android/build/gradle/AutomatedBuildTest.java @@ -34,10 +34,11 @@ public class AutomatedBuildTest extends BuildTest { private static enum TestType { BUILD, REPORT } private static final String[] sBuiltProjects = new String[] { - "aidl", "api", "applibtest", "assets", "basic", "dependencies", "flavored", - "flavorlib", "flavors", "libsTest", "localJars", "migrated", "multiproject", "multires", - "overlay1", "overlay2", "pkgOverride", "renderscript", "renderscriptInLib", - "renderscriptMultiSrc", "sameNamedLibs", "tictactoe" /*, "autorepo"*/ + "aidl", "api", "applibtest", "assets", "attrOrder", "basic", "dependencies", "flavored", + "flavorlib", "flavors", "libTestDep", "libsTest", "localJars", "migrated", + "multiproject", "multires", "overlay1", "overlay2", "pkgOverride", "proguard", + "proguardLib", "renderscript", "renderscriptInLib", "renderscriptMultiSrc", + "sameNamedLibs", "tictactoe" /*, "autorepo"*/ }; private static final String[] sReportProjects = new String[] { diff --git a/gradle/src/main/groovy/com/android/build/gradle/AppExtension.groovy b/gradle/src/main/groovy/com/android/build/gradle/AppExtension.groovy index 5f60990..b7be7db 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AppExtension.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/AppExtension.groovy @@ -14,15 +14,17 @@ * limitations under the License. */ package com.android.build.gradle + import com.android.build.gradle.api.ApplicationVariant import com.android.builder.DefaultBuildType import com.android.builder.DefaultProductFlavor -import com.android.builder.signing.SigningConfig +import com.android.builder.model.SigningConfig import org.gradle.api.Action import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.internal.DefaultDomainObjectSet import org.gradle.api.internal.project.ProjectInternal import org.gradle.internal.reflect.Instantiator + /** * Extension for 'application' project. */ 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 f3f465f..f8ee3d3 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy @@ -15,6 +15,7 @@ */ package com.android.build.gradle + import com.android.annotations.NonNull import com.android.annotations.Nullable import com.android.build.gradle.api.BaseVariant @@ -37,7 +38,7 @@ import com.android.build.gradle.internal.variant.BaseVariantData import com.android.build.gradle.internal.variant.TestVariantData import com.android.builder.DefaultBuildType import com.android.builder.VariantConfiguration -import com.android.builder.signing.SigningConfig +import com.android.builder.model.SigningConfig import com.google.common.collect.ArrayListMultimap import com.google.common.collect.ListMultimap import com.google.common.collect.Maps @@ -56,6 +57,7 @@ import static com.android.builder.BuilderConstants.INSTRUMENT_TEST import static com.android.builder.BuilderConstants.LINT import static com.android.builder.BuilderConstants.RELEASE import static com.android.builder.BuilderConstants.UI_TEST + /** * Gradle plugin class for 'application' projects. */ 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 720b955..584e510 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy @@ -68,8 +68,8 @@ import com.android.builder.VariantConfiguration import com.android.builder.dependency.JarDependency import com.android.builder.dependency.LibraryDependency import com.android.builder.model.ProductFlavor +import com.android.builder.model.SigningConfig import com.android.builder.model.SourceProvider -import com.android.builder.signing.SigningConfig import com.android.builder.testing.ConnectedDeviceProvider import com.android.builder.testing.api.DeviceProvider import com.android.builder.testing.api.TestServer @@ -329,7 +329,7 @@ public abstract class BasePlugin { processManifestTask.conventionMapping.manifestOverlays = { config.manifestOverlays } - processManifestTask.conventionMapping.packageName = { + processManifestTask.conventionMapping.packageNameOverride = { config.packageOverride } processManifestTask.conventionMapping.versionName = { diff --git a/gradle/src/main/groovy/com/android/build/gradle/LibraryExtension.groovy b/gradle/src/main/groovy/com/android/build/gradle/LibraryExtension.groovy index 3b847fe..ce7f73e 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/LibraryExtension.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/LibraryExtension.groovy @@ -20,11 +20,12 @@ import com.android.build.gradle.internal.dsl.BuildTypeDsl import com.android.build.gradle.internal.dsl.SigningConfigDsl import com.android.builder.BuilderConstants import com.android.builder.DefaultBuildType -import com.android.builder.signing.SigningConfig +import com.android.builder.model.SigningConfig import org.gradle.api.Action import org.gradle.api.internal.DefaultDomainObjectSet import org.gradle.api.internal.project.ProjectInternal import org.gradle.internal.reflect.Instantiator + /** * Extension for 'library' project. */ 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 0104656..d28b6dd 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 @@ -23,7 +23,7 @@ import com.android.build.gradle.tasks.PackageApplication; import com.android.build.gradle.tasks.ZipAlign; import com.android.builder.DefaultBuildType; import com.android.builder.DefaultProductFlavor; -import com.android.builder.signing.SigningConfig; +import com.android.builder.model.SigningConfig; import org.gradle.api.DefaultTask; import java.util.List; @@ -55,7 +55,7 @@ public interface ApkVariant extends BaseVariant { DefaultProductFlavor getMergedFlavor(); /** - * Returns the {@link com.android.builder.signing.SigningConfig} for this build variant, + * Returns the {@link SigningConfig} for this build variant, * if one has been specified. */ @Nullable 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 1f644ec..efbbad3 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 @@ -33,7 +33,7 @@ import com.android.build.gradle.tasks.RenderscriptCompile; import com.android.build.gradle.tasks.ZipAlign; import com.android.builder.DefaultBuildType; import com.android.builder.DefaultProductFlavor; -import com.android.builder.signing.SigningConfig; +import com.android.builder.model.SigningConfig; import org.gradle.api.DefaultTask; import org.gradle.api.Task; import org.gradle.api.tasks.Copy; 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 8dfc8f1..305c2e5 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 @@ -32,7 +32,7 @@ import com.android.build.gradle.tasks.RenderscriptCompile; import com.android.build.gradle.tasks.ZipAlign; import com.android.builder.DefaultBuildType; import com.android.builder.DefaultProductFlavor; -import com.android.builder.signing.SigningConfig; +import com.android.builder.model.SigningConfig; import org.gradle.api.DefaultTask; import org.gradle.api.Task; import org.gradle.api.tasks.Copy; diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy index 319cd96..449a43f 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy @@ -16,8 +16,7 @@ package com.android.build.gradle.internal.dsl; - -import com.android.builder.AaptOptions +import com.android.builder.model.AaptOptions import org.gradle.api.tasks.Input public class AaptOptionsImpl implements AaptOptions { diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy index b2c164e..8b9eed0 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy @@ -17,9 +17,9 @@ package com.android.build.gradle.internal.dsl import com.android.annotations.NonNull -import com.android.builder.DefaultBuildType import com.android.builder.BuilderConstants -import com.android.builder.signing.SigningConfig +import com.android.builder.DefaultBuildType +import com.android.builder.model.SigningConfig import com.google.common.collect.Lists /** diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/SigningConfigDsl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/SigningConfigDsl.java index 1455032..2960e18 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/SigningConfigDsl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/SigningConfigDsl.java @@ -18,9 +18,11 @@ package com.android.build.gradle.internal.dsl; import com.android.annotations.NonNull; import com.android.builder.BuilderConstants; -import com.android.builder.signing.SigningConfig; +import com.android.builder.model.SigningConfig; +import com.android.builder.signing.DefaultSigningConfig; import com.android.prefs.AndroidLocation; import com.google.common.base.Objects; +import org.gradle.api.Named; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.Optional; @@ -30,14 +32,11 @@ import java.io.File; import java.io.Serializable; /** - * DSL overlay for {@link SigningConfig}. + * DSL overlay for {@link DefaultSigningConfig}. */ -public class SigningConfigDsl extends SigningConfig implements Serializable { +public class SigningConfigDsl extends DefaultSigningConfig implements Serializable, Named { private static final long serialVersionUID = 1L; - @NonNull - private final String name; - /** * Creates a SigningConfig with a given name. * @@ -45,8 +44,8 @@ public class SigningConfigDsl extends SigningConfig implements Serializable { * */ public SigningConfigDsl(@NonNull String name) { - super(); - this.name = name; + super(name); + if (BuilderConstants.DEBUG.equals(name)) { try { initDebug(); @@ -56,11 +55,6 @@ public class SigningConfigDsl extends SigningConfig implements Serializable { } } - @NonNull - public String getName() { - return name; - } - public SigningConfigDsl initWith(SigningConfig that) { setStoreFile(that.getStoreFile()); setStorePassword(that.getStorePassword()); @@ -122,7 +116,7 @@ public class SigningConfigDsl extends SigningConfig implements Serializable { SigningConfigDsl that = (SigningConfigDsl) o; - if (!name.equals(that.name)) return false; + if (!mName.equals(that.mName)) return false; return true; } @@ -130,14 +124,14 @@ public class SigningConfigDsl extends SigningConfig implements Serializable { @Override public int hashCode() { int result = super.hashCode(); - result = 31 * result + name.hashCode(); + result = 31 * result + mName.hashCode(); return result; } @Override public String toString() { return Objects.toStringHelper(this) - .add("name", name) + .add("name", mName) .add("storeFile", getStoreFile() != null ? getStoreFile().getAbsolutePath() : "null") .add("storePassword", getStorePassword()) .add("keyAlias", getKeyAlias()) diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/SigningConfigFactory.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/SigningConfigFactory.groovy index 57af98e..cdb3ebf 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/SigningConfigFactory.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/SigningConfigFactory.groovy @@ -16,7 +16,7 @@ package com.android.build.gradle.internal.dsl -import com.android.builder.signing.SigningConfig +import com.android.builder.model.SigningConfig import org.gradle.api.NamedDomainObjectFactory import org.gradle.internal.reflect.Instantiator diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactInfoImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactInfoImpl.java new file mode 100644 index 0000000..9978fd0 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactInfoImpl.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.build.gradle.internal.model; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.build.gradle.model.ArtifactInfo; +import com.android.build.gradle.model.Dependencies; + +import java.io.File; +import java.io.Serializable; +import java.util.List; + +/** + * Implementation of ArtifactInfo that is serializable + */ +public class ArtifactInfoImpl implements ArtifactInfo, Serializable { + + @NonNull + private final File outputFile; + private final boolean isSigned; + @Nullable + private final String signingConfigName; + @NonNull + private final String assembleTaskName; + @NonNull + private final String packageName; + @NonNull + private final List generatedSourceFolders; + @NonNull + private final List generatedResourceFolders; + @NonNull + private final File classesFolder; + @NonNull + private final Dependencies dependencies; + + + ArtifactInfoImpl(@NonNull String assembleTaskName, + @NonNull File outputFile, + boolean isSigned, + @Nullable String signingConfigName, + @NonNull String packageName, + @NonNull List generatedSourceFolders, + @NonNull List generatedResourceFolders, + @NonNull File classesFolder, + @NonNull Dependencies dependencies) { + this.assembleTaskName = assembleTaskName; + this.outputFile = outputFile; + this.isSigned = isSigned; + this.signingConfigName = signingConfigName; + this.packageName = packageName; + this.generatedSourceFolders = generatedSourceFolders; + this.generatedResourceFolders = generatedResourceFolders; + this.classesFolder = classesFolder; + this.dependencies = dependencies; + } + + @NonNull + @Override + public File getOutputFile() { + return outputFile; + } + + @Override + public boolean isSigned() { + return isSigned; + } + + @Nullable + @Override + public String getSigningConfigName() { + return signingConfigName; + } + + @NonNull + @Override + public String getPackageName() { + return packageName; + } + + @NonNull + @Override + public String getSourceGenTaskName() { + return "TODO"; + } + + @NonNull + @Override + public String getAssembleTaskName() { + return assembleTaskName; + } + + @NonNull + @Override + public List getGeneratedSourceFolders() { + return generatedSourceFolders; + } + + @NonNull + @Override + public List getGeneratedResourceFolders() { + return generatedResourceFolders; + } + + @NonNull + @Override + public File getClassesFolder() { + return classesFolder; + } + + @NonNull + @Override + public Dependencies getDependencies() { + return dependencies; + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java index fe5caec..84d0fd6 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java @@ -21,6 +21,8 @@ import com.android.build.gradle.model.AndroidProject; import com.android.build.gradle.model.BuildTypeContainer; import com.android.build.gradle.model.ProductFlavorContainer; import com.android.build.gradle.model.Variant; +import com.android.builder.model.AaptOptions; +import com.android.builder.model.SigningConfig; import com.google.common.collect.Maps; import java.io.Serializable; @@ -41,6 +43,8 @@ class DefaultAndroidProject implements AndroidProject, Serializable { private final String compileTarget; @NonNull private final List bootClasspath; + @NonNull + private final List signingConfigs; private final boolean isLibrary; private final Map buildTypes = Maps.newHashMap(); @@ -52,11 +56,13 @@ class DefaultAndroidProject implements AndroidProject, Serializable { DefaultAndroidProject(@NonNull String modelVersion, @NonNull String name, @NonNull String compileTarget, @NonNull List bootClasspath, + @NonNull List signingConfigs, boolean isLibrary) { this.modelVersion = modelVersion; this.name = name; this.compileTarget = compileTarget; this.bootClasspath = bootClasspath; + this.signingConfigs = signingConfigs; this.isLibrary = isLibrary; } @@ -138,4 +144,16 @@ class DefaultAndroidProject implements AndroidProject, Serializable { public List getBootClasspath() { return bootClasspath; } + + @NonNull + @Override + public List getSigningConfigs() { + return signingConfigs; + } + + @NonNull + @Override + public AaptOptions getAaptOptions() { + return null; + } } 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 95b6425..d63665f 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 @@ -27,10 +27,13 @@ import com.android.build.gradle.internal.variant.BaseVariantData import com.android.build.gradle.internal.variant.LibraryVariantData import com.android.build.gradle.internal.variant.TestVariantData import com.android.build.gradle.model.AndroidProject +import com.android.build.gradle.model.ArtifactInfo import com.android.build.gradle.model.BuildTypeContainer import com.android.build.gradle.model.ProductFlavorContainer import com.android.builder.DefaultProductFlavor import com.android.builder.SdkParser +import com.android.builder.VariantConfiguration +import com.android.builder.model.SigningConfig import com.android.builder.model.SourceProvider import com.google.common.collect.Lists import org.gradle.api.Project @@ -39,7 +42,6 @@ import org.gradle.tooling.provider.model.ToolingModelBuilder import java.util.jar.Attributes import java.util.jar.Manifest - /** * Builder for the custom Android model. */ @@ -56,8 +58,12 @@ public class ModelBuilder implements ToolingModelBuilder { LibraryPlugin libPlugin = null BasePlugin basePlugin = appPlugin + Collection signingConfigs + if (appPlugin == null) { basePlugin = libPlugin = getPlugin(project, LibraryPlugin.class) + } else { + signingConfigs = appPlugin.extension.signingConfigs } if (basePlugin == null) { @@ -65,13 +71,22 @@ public class ModelBuilder implements ToolingModelBuilder { return null } + if (libPlugin != null) { + signingConfigs = Collections.singletonList(libPlugin.extension.debugSigningConfig) + } SdkParser sdkParser = basePlugin.getLoadedSdkParser() - List bootClasspath = basePlugin.runtimeJarList; + List bootClasspath = basePlugin.runtimeJarList String compileTarget = sdkParser.target.hashString() - DefaultAndroidProject androidProject = new DefaultAndroidProject(getModelVersion(), - project.name, compileTarget, bootClasspath, libPlugin != null) + //noinspection GroovyVariableNotAssigned + DefaultAndroidProject androidProject = new DefaultAndroidProject( + getModelVersion(), + project.name, + compileTarget, + bootClasspath, + cloneSigningConfigs(signingConfigs), + libPlugin != null) .setDefaultConfig(createPFC(basePlugin.defaultConfigData)) if (appPlugin != null) { @@ -79,7 +94,7 @@ public class ModelBuilder implements ToolingModelBuilder { androidProject.addBuildType(createBTC(btData)) } for (ProductFlavorData pfData : appPlugin.productFlavors.values()) { - androidProject.addProductFlavors(createPFC(pfData)); + androidProject.addProductFlavors(createPFC(pfData)) } } else if (libPlugin != null) { @@ -96,7 +111,6 @@ public class ModelBuilder implements ToolingModelBuilder { return androidProject } - @NonNull private static String getModelVersion() { Class clazz = AndroidProject.class @@ -107,12 +121,12 @@ public class ModelBuilder implements ToolingModelBuilder { return "unknown" } String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + - "/META-INF/MANIFEST.MF"; - Manifest manifest = new Manifest(new URL(manifestPath).openStream()); - Attributes attr = manifest.getMainAttributes(); - String version = attr.getValue("Model-Version"); + "/META-INF/MANIFEST.MF" + Manifest manifest = new Manifest(new URL(manifestPath).openStream()) + Attributes attr = manifest.getMainAttributes() + String version = attr.getValue("Model-Version") if (version != null) { - return version; + return version } return "unknown" @@ -126,27 +140,41 @@ public class ModelBuilder implements ToolingModelBuilder { testVariantData = variantData.testVariantData } + ArtifactInfo mainArtifact = createArtifactInfo(variantData) + ArtifactInfo testArtifact = testVariantData != null ? createArtifactInfo(testVariantData) : null + VariantImpl variant = new VariantImpl( variantData.name, variantData.baseName, - variantData.assembleTask.name, - testVariantData?.assembleTask?.name, variantData.variantConfiguration.buildType.name, getProductFlavorNames(variantData), ProductFlavorImpl.cloneFlavor(variantData.variantConfiguration.mergedFlavor), + mainArtifact, + testArtifact) + + return variant + } + + private static ArtifactInfo createArtifactInfo(@NonNull BaseVariantData variantData) { + VariantConfiguration vC = variantData.variantConfiguration + + SigningConfig signingConfig = vC.signingConfig + String signingConfigName = null + if (signingConfig != null) { + signingConfigName = signingConfig.name + } + + return new ArtifactInfoImpl( + variantData.assembleTask.name, variantData.outputFile, - testVariantData?.outputFile, - variantData.variantConfiguration.isSigningReady(), + vC.isSigningReady(), + signingConfigName, + vC.packageName, getGeneratedSourceFolders(variantData), - getGeneratedSourceFolders(testVariantData), getGeneratedResourceFolders(variantData), - getGeneratedResourceFolders(testVariantData), variantData.javaCompileTask.destinationDir, - DependenciesImpl.cloneDependencies(variantData.variantDependency), - DependenciesImpl.cloneDependencies(testVariantData?.variantDependency), + DependenciesImpl.cloneDependencies(variantData.variantDependency) ) - - return variant; } @NonNull @@ -157,7 +185,7 @@ public class ModelBuilder implements ToolingModelBuilder { flavorNames.add(flavor.name) } - return flavorNames; + return flavorNames } @NonNull @@ -210,6 +238,29 @@ public class ModelBuilder implements ToolingModelBuilder { SourceProviderImpl.cloneProvider((SourceProvider) buildTypeData.sourceSet)) } + @NonNull + private static List cloneSigningConfigs(Collection signingConfigs) { + List results = Lists.newArrayListWithCapacity(signingConfigs.size()) + + for (SigningConfig signingConfig : signingConfigs) { + results.add(createSigningConfig(signingConfig)) + } + + return results + } + + @NonNull + private static SigningConfig createSigningConfig(SigningConfig signingConfig) { + return new SigningConfigImpl( + signingConfig.getName(), + signingConfig.getStoreFile(), + signingConfig.getStorePassword(), + signingConfig.getKeyAlias(), + signingConfig.getKeyPassword(), + signingConfig.getStoreType(), + signingConfig.isSigningReady()) + } + /** * Safely queries a project for a given plugin class. * @param project the project to query diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java new file mode 100644 index 0000000..06e219c --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.build.gradle.internal.model; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.builder.model.SigningConfig; + +import java.io.File; +import java.io.Serializable; + +/** + * Implementation of SigningConfig that is serializable. Objects used in the DSL cannot be + * serialized. + */ +class SigningConfigImpl implements SigningConfig, Serializable { + private static final long serialVersionUID = 1L; + + @NonNull + private final String name; + @Nullable + private final File storeFile; + @Nullable + private final String storePassword; + @Nullable + private final String keyAlias; + @Nullable + private final String keyPassword; + @Nullable + private final String storeType; + private final boolean signingReady; + + SigningConfigImpl(@NonNull String name, + @Nullable File storeFile, + @Nullable String storePassword, + @Nullable String keyAlias, + @Nullable String keyPassword, + @Nullable String storeType, + boolean signingReady) { + + this.name = name; + this.storeFile = storeFile; + this.storePassword = storePassword; + this.keyAlias = keyAlias; + this.keyPassword = keyPassword; + this.storeType = storeType; + this.signingReady = signingReady; + } + + @NonNull + @Override + public String getName() { + return name; + } + + @Nullable + @Override + public File getStoreFile() { + return storeFile; + } + + @Nullable + @Override + public String getStorePassword() { + return storePassword; + } + + @Nullable + @Override + public String getKeyAlias() { + return keyAlias; + } + + @Nullable + @Override + public String getKeyPassword() { + return keyPassword; + } + + @Nullable + @Override + public String getStoreType() { + return storeType; + } + + @Override + public boolean isSigningReady() { + return signingReady; + } +} 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 c2e41c7..cffc10f 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 @@ -18,11 +18,10 @@ package com.android.build.gradle.internal.model; import com.android.annotations.NonNull; import com.android.annotations.Nullable; -import com.android.build.gradle.model.Dependencies; +import com.android.build.gradle.model.ArtifactInfo; import com.android.build.gradle.model.Variant; import com.android.builder.model.ProductFlavor; -import java.io.File; import java.io.Serializable; import java.util.List; @@ -37,69 +36,30 @@ class VariantImpl implements Variant, Serializable { @NonNull private final String displayName; @NonNull - private final String assembleTaskName; - @Nullable - private final String assembleTestTaskName; - @NonNull private final String buildTypeName; @NonNull private final List productFlavorNames; @NonNull private final ProductFlavor mergedFlavor; @NonNull - private final File outputFile; - @Nullable - private final File testOutputFile; - private final boolean isSigned; - @NonNull - private final List generatedSourceFolders; - @Nullable - private final List generatedTestSourceFolders; - @NonNull - private final List generatedResourceFolders; + private final ArtifactInfo mainArtifactInfo; @Nullable - private final List generatedTestResourceFolders; - @NonNull - private final File classesFolder; - @NonNull - private final Dependencies dependencies; - @NonNull - private final Dependencies testDependencies; + private final ArtifactInfo testArtifactInfo; VariantImpl(@NonNull String name, @NonNull String displayName, - @NonNull String assembleTaskName, - @Nullable String assembleTestTaskName, @NonNull String buildTypeName, @NonNull List productFlavorNames, @NonNull ProductFlavorImpl mergedFlavor, - @NonNull File outputFile, - @Nullable File testOutputFile, - boolean isSigned, - @NonNull List generatedSourceFolders, - @Nullable List generatedTestSourceFolders, - @NonNull List generatedResourceFolders, - @Nullable List generatedTestResourceFolders, - @NonNull File classesFolder, - @NonNull Dependencies dependencies, - @NonNull Dependencies testDependencies) { + @NonNull ArtifactInfo mainArtifactInfo, + @Nullable ArtifactInfo testArtifactInfo) { this.name = name; this.displayName = displayName; - this.assembleTaskName = assembleTaskName; - this.assembleTestTaskName = assembleTestTaskName; this.buildTypeName = buildTypeName; this.productFlavorNames = productFlavorNames; this.mergedFlavor = mergedFlavor; - this.outputFile = outputFile; - this.testOutputFile = testOutputFile; - this.isSigned = isSigned; - this.generatedSourceFolders = generatedSourceFolders; - this.generatedTestSourceFolders = generatedTestSourceFolders; - this.generatedResourceFolders = generatedResourceFolders; - this.generatedTestResourceFolders = generatedTestResourceFolders; - this.classesFolder = classesFolder; - this.dependencies = dependencies; - this.testDependencies = testDependencies; + this.mainArtifactInfo = mainArtifactInfo; + this.testArtifactInfo = testArtifactInfo; } @Override @@ -114,35 +74,6 @@ class VariantImpl implements Variant, Serializable { return displayName; } - @NonNull - @Override - public String getAssembleTaskName() { - return assembleTaskName; - } - - @Nullable - @Override - public String getAssembleTestTaskName() { - return assembleTestTaskName; - } - - @Override - @NonNull - public File getOutputFile() { - return outputFile; - } - - @Nullable - @Override - public File getOutputTestFile() { - return testOutputFile; - } - - @Override - public boolean isSigned() { - return isSigned; - } - @Override @NonNull public String getBuildType() { @@ -163,43 +94,13 @@ class VariantImpl implements Variant, Serializable { @NonNull @Override - public List getGeneratedSourceFolders() { - return generatedSourceFolders; - } - - @Nullable - @Override - public List getGeneratedTestSourceFolders() { - return generatedTestSourceFolders; - } - - @NonNull - @Override - public List getGeneratedResourceFolders() { - return generatedResourceFolders; + public ArtifactInfo getMainArtifactInfo() { + return mainArtifactInfo; } @Nullable @Override - public List getGeneratedTestResourceFolders() { - return generatedTestResourceFolders; - } - - @NonNull - @Override - public File getClassesFolder() { - return classesFolder; - } - - @NonNull - @Override - public Dependencies getDependencies() { - return dependencies; - } - - @NonNull - @Override - public Dependencies getTestDependencies() { - return testDependencies; + public ArtifactInfo getTestArtifactInfo() { + return testArtifactInfo; } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/SigningReportTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/SigningReportTask.groovy index d07117c..9d7c170 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/SigningReportTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/SigningReportTask.groovy @@ -18,10 +18,10 @@ package com.android.build.gradle.internal.tasks import com.android.build.gradle.internal.dsl.SigningConfigDsl import com.android.build.gradle.internal.variant.BaseVariantData +import com.android.builder.model.SigningConfig import com.android.builder.signing.CertificateInfo import com.android.builder.signing.KeystoreHelper import com.android.builder.signing.KeytoolException -import com.android.builder.signing.SigningConfig import com.google.common.collect.Maps import org.gradle.api.tasks.TaskAction import org.gradle.logging.StyledTextOutput diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ValidateSigningTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ValidateSigningTask.groovy index cfc7e27..d506f04 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ValidateSigningTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ValidateSigningTask.groovy @@ -16,12 +16,13 @@ package com.android.build.gradle.internal.tasks +import com.android.builder.model.SigningConfig import com.android.builder.signing.KeystoreHelper -import com.android.builder.signing.SigningConfig import org.gradle.api.tasks.Input import org.gradle.api.tasks.Optional import org.gradle.api.tasks.TaskAction import org.gradle.tooling.BuildException + /** * A validate task that creates the debug keystore if it's missing. * It only creates it if it's in the default debug keystore location. diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessAppManifest.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessAppManifest.groovy index d0cf411..72ddcd8 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessAppManifest.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessAppManifest.groovy @@ -37,7 +37,7 @@ public class ProcessAppManifest extends ProcessManifest { List libraries @Input @Optional - String packageName + String packageNameOverride @Input int versionCode @@ -57,7 +57,7 @@ public class ProcessAppManifest extends ProcessManifest { getMainManifest(), getManifestOverlays(), getLibraries(), - getPackageName(), + getPackageNameOverride(), getVersionCode(), getVersionName(), getMinSdkVersion(), 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 edbfa45..d840272 100644 --- a/gradle/src/test/groovy/com/android/build/gradle/AppPluginInternalTest.groovy +++ b/gradle/src/test/groovy/com/android/build/gradle/AppPluginInternalTest.groovy @@ -22,10 +22,11 @@ import com.android.build.gradle.internal.test.PluginHolder import com.android.build.gradle.internal.variant.BaseVariantData import com.android.builder.BuilderConstants import com.android.builder.DefaultBuildType +import com.android.builder.model.SigningConfig import com.android.builder.signing.KeystoreHelper -import com.android.builder.signing.SigningConfig import org.gradle.api.Project import org.gradle.testfixtures.ProjectBuilder + /** * Tests for the internal workings of the app plugin ("android") */ diff --git a/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy b/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy index 7dfb9c3..5dd9668 100644 --- a/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy +++ b/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy @@ -19,9 +19,10 @@ import com.android.annotations.NonNull import com.android.build.gradle.api.LibraryVariant import com.android.build.gradle.api.TestVariant import com.android.build.gradle.internal.test.BaseTest -import com.android.builder.signing.SigningConfig +import com.android.builder.model.SigningConfig import org.gradle.api.Project import org.gradle.testfixtures.ProjectBuilder + /** * Tests for the public DSL of the App plugin ("android-library") */ -- cgit v1.2.3