diff options
author | Xavier Ducrohet <xav@android.com> | 2012-11-05 15:22:34 -0800 |
---|---|---|
committer | Xavier Ducrohet <xav@android.com> | 2012-11-09 11:20:08 -0800 |
commit | 3aefe028a57edc41ada24f5cc5a07de881fc7f93 (patch) | |
tree | 1329218e1171f4d8ff85546121de8829f9ee3fb8 /gradle/src | |
parent | f6d881b932302bbdd4347a71bf58deda816c99b9 (diff) | |
download | build-3aefe028a57edc41ada24f5cc5a07de881fc7f93.tar.gz |
Continue support for build variant API.
Change-Id: Iec8b33ae0410932aca14ef75f56afe8aff01efdf
Diffstat (limited to 'gradle/src')
37 files changed, 719 insertions, 286 deletions
diff --git a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceDirectory.java b/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceDirectory.java index 45fc214..8219421 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceDirectory.java +++ b/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceDirectory.java @@ -29,9 +29,11 @@ public interface AndroidSourceDirectory extends SourceDirectory { String getName(); /** - * Sets the location of the directory - * @param o + * Sets the location of the directory. + * + * @param srcPath The source directory. This is evaluated as for + * {@link org.gradle.api.Project#file(Object)} * @return the AndroidSourceDirectory object */ - AndroidSourceDirectory srcDir(java.lang.Object o); + AndroidSourceDirectory srcDir(Object srcPath); } diff --git a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceFile.java b/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceFile.java index e3a0208..4f5fd35 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceFile.java +++ b/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceFile.java @@ -35,9 +35,11 @@ public interface AndroidSourceFile { File getFile(); /** - * Sets the location of the file - * @param o + * Sets the location of the file. + * + * @param srcPath The source directory. This is evaluated as for + * {@link org.gradle.api.Project#file(Object)} * @return the AndroidSourceFile object */ - AndroidSourceFile srcFile(java.lang.Object o); + AndroidSourceFile srcFile(Object srcPath); } diff --git a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceSet.groovy b/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceSet.groovy index c9c81b1..5864c34 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceSet.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/AndroidSourceSet.groovy @@ -95,22 +95,111 @@ public interface AndroidSourceSet { */ String getPackageConfigurationName(); + /** + * The Android Manifest file for this source set. + * + * @return the manifest. Never returns null. + */ AndroidSourceFile getManifest(); + + /** + * Configures the location of the Android Manifest for this set. + * + * <p>The given closure is used to configure the {@link AndroidSourceFile} which contains the + * manifest. + * + * @param configureClosure The closure to use to configure the Android Manifest. + * @return this + */ AndroidSourceSet manifest(Closure configureClosure); + /** + * The Android Resources directory for this source set. + * + * @return the resources. Never returns null. + */ AndroidSourceDirectory getRes(); + + /** + * Configures the location of the Android Resources for this set. + * + * <p>The given closure is used to configure the {@link AndroidSourceDirectory} which contains + * the resources. + * + * @param configureClosure The closure to use to configure the Resources. + * @return this + */ AndroidSourceSet res(Closure configureClosure); + /** + * The Android Assets directory for this source set. + * + * @return the assets. Never returns null. + */ AndroidSourceDirectory getAssets(); + + /** + * Configures the location of the Android Assets for this set. + * + * <p>The given closure is used to configure the {@link AndroidSourceDirectory} which contains + * the assets. + * + * @param configureClosure The closure to use to configure the Assets. + * @return this + */ AndroidSourceSet assets(Closure configureClosure); + /** + * The Android AIDL source directory for this source set. + * + * @return the source. Never returns null. + */ AndroidSourceDirectory getAidl(); + + /** + * Configures the location of the Android AIDL source for this set. + * + * <p>The given closure is used to configure the {@link AndroidSourceDirectory} which contains + * the AIDL source. + * + * @param configureClosure The closure to use to configure the AIDL source. + * @return this + */ AndroidSourceSet aidl(Closure configureClosure); + /** + * The Android Renderscript source directory for this source set. + * + * @return the source. Never returns null. + */ AndroidSourceDirectory getRenderscript(); + + /** + * Configures the location of the Android Renderscript source for this set. + * + * <p>The given closure is used to configure the {@link AndroidSourceDirectory} which contains + * the Renderscript source. + * + * @param configureClosure The closure to use to configure the Renderscript source. + * @return this + */ AndroidSourceSet renderscript(Closure configureClosure); + /** + * The Android JNI source directory for this source set. + * + * @return the source. Never returns null. + */ AndroidSourceDirectory getJni(); - AndroidSourceSet jni(Closure configureClosure); + /** + * Configures the location of the Android JNI source for this set. + * + * <p>The given closure is used to configure the {@link AndroidSourceDirectory} which contains + * the JNI source. + * + * @param configureClosure The closure to use to configure the JNI source. + * @return this + */ + AndroidSourceSet jni(Closure configureClosure); } 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 197c6e8..db43f04 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AppExtension.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/AppExtension.groovy @@ -19,7 +19,6 @@ import com.android.builder.BuildType import com.android.builder.ProductFlavor 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 @@ -27,23 +26,17 @@ import org.gradle.internal.reflect.Instantiator * Extension for 'application' project. */ public class AppExtension extends BaseExtension { - private final AppPlugin appPlugin final NamedDomainObjectContainer<ProductFlavor> productFlavors final NamedDomainObjectContainer<BuildType> buildTypes - private final DefaultDomainObjectSet<BuildVariant> buildVariants = - new DefaultDomainObjectSet<BuildVariant>(BuildVariant.class) - private final DefaultDomainObjectSet<BuildVariant> testBuildVariants = - new DefaultDomainObjectSet<BuildVariant>(BuildVariant.class) List<String> flavorGroupList String testBuildType = "debug" - AppExtension(AppPlugin appPlugin, ProjectInternal project, Instantiator instantiator, + AppExtension(AppPlugin plugin, ProjectInternal project, Instantiator instantiator, NamedDomainObjectContainer<BuildType> buildTypes, NamedDomainObjectContainer<ProductFlavor> productFlavors) { - super(project, instantiator) - this.appPlugin = appPlugin + super(plugin, project, instantiator) this.buildTypes = buildTypes this.productFlavors = productFlavors } @@ -59,14 +52,4 @@ public class AppExtension extends BaseExtension { public void flavorGroups(String... groups) { flavorGroupList = Arrays.asList(groups) } - - public DefaultDomainObjectSet<BuildVariant> getBuildVariants() { - appPlugin.createAndroidTasks() - return buildVariants - } - - public DefaultDomainObjectSet<BuildVariant> getTestBuildVariants() { - appPlugin.createAndroidTasks() - return testBuildVariants - } } 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 30c57b5..dc5c249 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy @@ -45,8 +45,6 @@ import javax.inject.Inject class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradle.api.Plugin<Project> { static PluginHolder pluginHolder; - private boolean hasCreatedTasks = false - final Map<String, BuildTypeData> buildTypes = [:] final Map<String, ProductFlavorData<GroupableProductFlavor>> productFlavors = [:] @@ -73,6 +71,7 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl extension = project.extensions.create('android', AppExtension, this, (ProjectInternal) project, instantiator, buildTypeContainer, productFlavorContainer) + extension. setDefaultConfig(extension.defaultConfig, extension.sourceSetsContainer) buildTypeContainer.whenObjectAdded { BuildType buildType -> @@ -93,10 +92,6 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl throw new UnsupportedOperationException( "Removing product flavors is not implemented yet.") } - - project.afterEvaluate { - createAndroidTasks() - } } private void addBuildType(BuildType buildType) { @@ -134,12 +129,8 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl productFlavors[productFlavor.name] = productFlavorData } - protected void createAndroidTasks() { - if (hasCreatedTasks) { - return - } - hasCreatedTasks = true - + @Override + protected void doCreateAndroidTasks() { // resolve dependencies for all config List<ConfigurationDependencies> dependencies = [] dependencies.addAll(buildTypes.values()) @@ -183,8 +174,6 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl createTasksForMultiFlavoredBuilds(array, 0, map) } } - - createDependencyReportTask() } private createTasksForMultiFlavoredBuilds(ProductFlavorData[] datas, int i, @@ -432,7 +421,7 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl createProcessManifestTask(variant, "manifests") // Add a task to crunch resource files - createCrunchResTask(variant) + createProcessImagesTask(variant) // Add a task to create the BuildConfig class createBuildConfigTask(variant) @@ -454,7 +443,7 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl } @Override - String getTarget() { + protected String getTarget() { return extension.target; } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy b/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy index d70287a..a26da87 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy @@ -25,6 +25,7 @@ import org.gradle.api.Action import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ConfigurationContainer +import org.gradle.api.internal.DefaultDomainObjectSet import org.gradle.api.internal.project.ProjectInternal import org.gradle.internal.reflect.Instantiator @@ -39,13 +40,21 @@ public abstract class BaseExtension { final AaptOptionsImpl aaptOptions final DexOptionsImpl dexOptions + private final BasePlugin plugin + private final DefaultDomainObjectSet<BuildVariant> buildVariants = + new DefaultDomainObjectSet<BuildVariant>(BuildVariant.class) + private final DefaultDomainObjectSet<BuildVariant> testBuildVariants = + new DefaultDomainObjectSet<BuildVariant>(BuildVariant.class) + /** * The source sets container. */ final NamedDomainObjectContainer<AndroidSourceSet> sourceSetsContainer - BaseExtension(ProjectInternal project, Instantiator instantiator) { - defaultConfig = instantiator.newInstance(ProductFlavorDsl.class, "main") + BaseExtension(BasePlugin plugin, ProjectInternal project, Instantiator instantiator) { + this.plugin = plugin + + defaultConfig = instantiator.newInstance(ProductFlavorDsl.class, ProductFlavor.MAIN) aaptOptions = instantiator.newInstance(AaptOptionsImpl.class) dexOptions = instantiator.newInstance(DexOptionsImpl.class) @@ -103,4 +112,14 @@ public abstract class BaseExtension { void dexOptions(Action<DexOptionsImpl> action) { action.execute(dexOptions) } + + public DefaultDomainObjectSet<BuildVariant> getBuildVariants() { + plugin.createAndroidTasks() + return buildVariants + } + + public DefaultDomainObjectSet<BuildVariant> getTestBuildVariants() { + plugin.createAndroidTasks() + return testBuildVariants + } } 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 2dde88c..e285403 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy @@ -26,21 +26,21 @@ import com.android.build.gradle.internal.ProductFlavorData import com.android.build.gradle.internal.ProductionAppVariant import com.android.build.gradle.internal.SymbolFileProviderImpl import com.android.build.gradle.internal.TestAppVariant -import com.android.build.gradle.tasks.AndroidDependencyTask -import com.android.build.gradle.tasks.CompileAidlTask -import com.android.build.gradle.tasks.CrunchResourcesTask -import com.android.build.gradle.tasks.DexTask -import com.android.build.gradle.tasks.GenerateBuildConfigTask -import com.android.build.gradle.tasks.InstallTask -import com.android.build.gradle.tasks.PackageApplicationTask -import com.android.build.gradle.tasks.PrepareDependenciesTask -import com.android.build.gradle.tasks.PrepareLibraryTask -import com.android.build.gradle.tasks.ProcessManifestTask -import com.android.build.gradle.tasks.ProcessResourcesTask -import com.android.build.gradle.tasks.ProcessTestManifestTask -import com.android.build.gradle.tasks.RunTestsTask -import com.android.build.gradle.tasks.UninstallTask -import com.android.build.gradle.tasks.ZipAlignTask +import com.android.build.gradle.internal.tasks.AidlCompileTask +import com.android.build.gradle.internal.tasks.AndroidDependencyTask +import com.android.build.gradle.internal.tasks.DexTask +import com.android.build.gradle.internal.tasks.GenerateBuildConfigTask +import com.android.build.gradle.internal.tasks.InstallTask +import com.android.build.gradle.internal.tasks.PackageApplicationTask +import com.android.build.gradle.internal.tasks.PrepareDependenciesTask +import com.android.build.gradle.internal.tasks.PrepareLibraryTask +import com.android.build.gradle.internal.tasks.ProcessImagesTask +import com.android.build.gradle.internal.tasks.ProcessManifestTask +import com.android.build.gradle.internal.tasks.ProcessResourcesTask +import com.android.build.gradle.internal.tasks.ProcessTestManifestTask +import com.android.build.gradle.internal.tasks.RunTestsTask +import com.android.build.gradle.internal.tasks.UninstallTask +import com.android.build.gradle.internal.tasks.ZipAlignTask import com.android.builder.AndroidBuilder import com.android.builder.AndroidDependency import com.android.builder.BuilderConstants @@ -97,6 +97,8 @@ public abstract class BasePlugin { private DefaultSdkParser androidSdkParser private LoggerWrapper loggerWrapper + private boolean hasCreatedTasks = false + private ProductFlavorData<ProductFlavor> defaultConfigData protected AndroidSourceSet mainSourceSet protected AndroidSourceSet testSourceSet @@ -104,13 +106,14 @@ public abstract class BasePlugin { protected Task uninstallAll protected Task assembleTest - abstract String getTarget() + protected abstract String getTarget() protected BasePlugin(Instantiator instantiator) { this.instantiator = instantiator } - protected abstract BaseExtension getExtension(); + protected abstract BaseExtension getExtension() + protected abstract void doCreateAndroidTasks() protected void apply(Project project) { this.project = project @@ -124,11 +127,25 @@ public abstract class BasePlugin { uninstallAll = project.tasks.add("uninstallAll") uninstallAll.description = "Uninstall all applications." uninstallAll.group = INSTALL_GROUP + + project.afterEvaluate { + createAndroidTasks() + } + } + + final void createAndroidTasks() { + if (hasCreatedTasks) { + return + } + hasCreatedTasks = true + + doCreateAndroidTasks() + createDependencyReportTask() } protected setDefaultConfig(ProductFlavor defaultConfig, NamedDomainObjectContainer<AndroidSourceSet> sourceSets) { - mainSourceSet = sourceSets.create("main") + mainSourceSet = sourceSets.create(defaultConfig.name) testSourceSet = sourceSets.create("test") defaultConfigData = new ProductFlavorData<ProductFlavor>(defaultConfig, mainSourceSet, @@ -286,15 +303,15 @@ public abstract class BasePlugin { } } - protected void createCrunchResTask(ApplicationVariant variant) { - def crunchTask = project.tasks.add("crunch${variant.name}Res", CrunchResourcesTask) - variant.crunchResourcesTask = crunchTask + protected void createProcessImagesTask(ApplicationVariant variant) { + def processImagesTask = project.tasks.add("process${variant.name}Images", ProcessImagesTask) + variant.processImagesTask = processImagesTask - crunchTask.plugin = this - crunchTask.variant = variant + processImagesTask.plugin = this + processImagesTask.variant = variant - crunchTask.conventionMapping.resDirectories = { variant.config.resourceInputs } - crunchTask.conventionMapping.outputDir = { + processImagesTask.conventionMapping.resDirectories = { variant.config.resourceInputs } + processImagesTask.conventionMapping.outputDir = { project.file("$project.buildDir/res/$variant.dirName") } } @@ -343,14 +360,14 @@ public abstract class BasePlugin { variant.processManifestTask.outManifest } - if (variant.crunchResourcesTask != null) { - processResources.dependsOn variant.crunchResourcesTask + if (variant.processImagesTask != null) { + processResources.dependsOn variant.processImagesTask processResources.conventionMapping.preprocessResDir = { - variant.crunchResourcesTask.outputDir + variant.processImagesTask.outputDir } processResources.conventionMapping.resDirectories = { - variant.crunchResourcesTask.resDirectories + variant.processImagesTask.resDirectories } } else { processResources.conventionMapping.resDirectories = { config.resourceInputs } @@ -419,9 +436,9 @@ public abstract class BasePlugin { protected void createAidlTask(ApplicationVariant variant) { VariantConfiguration config = variant.config - def compileTask = project.tasks.add("compile${variant.name}Aidl", CompileAidlTask) - variant.compileAidlTask = compileTask - variant.compileAidlTask.dependsOn variant.prepareDependenciesTask + def compileTask = project.tasks.add("compile${variant.name}Aidl", AidlCompileTask) + variant.aidlCompileTask = compileTask + variant.aidlCompileTask.dependsOn variant.prepareDependenciesTask compileTask.plugin = this compileTask.variant = variant @@ -437,8 +454,8 @@ public abstract class BasePlugin { protected void createCompileTask(ApplicationVariant variant, ApplicationVariant testedVariant) { def compileTask = project.tasks.add("compile${variant.name}", JavaCompile) - variant.compileTask = compileTask - compileTask.dependsOn variant.processResourcesTask, variant.generateBuildConfigTask, variant.compileAidlTask + variant.javaCompileTask = compileTask + compileTask.dependsOn variant.processResourcesTask, variant.generateBuildConfigTask, variant.aidlCompileTask VariantConfiguration config = variant.config @@ -456,7 +473,7 @@ public abstract class BasePlugin { compileTask.source = sourceList.toArray() if (testedVariant != null) { - compileTask.classpath = project.files({config.compileClasspath}) + testedVariant.compileTask.classpath + testedVariant.compileTask.outputs.files + compileTask.classpath = project.files({config.compileClasspath}) + testedVariant.javaCompileTask.classpath + testedVariant.javaCompileTask.outputs.files } else { compileTask.classpath = project.files({config.compileClasspath}) } @@ -504,13 +521,13 @@ public abstract class BasePlugin { createProcessTestManifestTask(variant, "manifests") // Add a task to crunch resource files - createCrunchResTask(variant) + createProcessImagesTask(variant) if (testedVariant.config.type == VariantConfiguration.Type.LIBRARY) { // in this case the tested library must be fully built before test can be built! if (testedVariant.assembleTask != null) { variant.processManifestTask.dependsOn testedVariant.assembleTask - variant.crunchResourcesTask.dependsOn testedVariant.assembleTask + variant.processImagesTask.dependsOn testedVariant.assembleTask } } @@ -570,13 +587,13 @@ public abstract class BasePlugin { def dexTaskName = "dex${variant.name}" def dexTask = project.tasks.add(dexTaskName, DexTask) variant.dexTask = dexTask - dexTask.dependsOn variant.compileTask + dexTask.dependsOn variant.javaCompileTask dexTask.plugin = this dexTask.variant = variant dexTask.conventionMapping.libraries = { project.files({ variant.config.packagedJars }) } - dexTask.conventionMapping.sourceFiles = { variant.compileTask.outputs.files } // this creates a dependency + dexTask.conventionMapping.sourceFiles = { variant.javaCompileTask.outputs.files } // this creates a dependency dexTask.conventionMapping.outputFile = { project.file( "${project.buildDir}/libs/${project.archivesBaseName}-${variant.baseName}.dex") @@ -623,20 +640,25 @@ public abstract class BasePlugin { } def appTask = packageApp + variant.outputFile = project.file("$project.buildDir/apk/${apkName}") if (signedApk) { if (variant.zipAlign) { // Add a task to zip align application package - def alignApp = project.tasks.add("zipalign${variant.name}", ZipAlignTask) - alignApp.dependsOn packageApp - alignApp.conventionMapping.inputFile = { packageApp.outputFile } - alignApp.conventionMapping.outputFile = { + def zipAlignTask = project.tasks.add("zipalign${variant.name}", ZipAlignTask) + variant.zipAlignTask = zipAlignTask + + zipAlignTask.dependsOn packageApp + zipAlignTask.conventionMapping.inputFile = { packageApp.outputFile } + zipAlignTask.conventionMapping.outputFile = { project.file( "$project.buildDir/apk/${project.archivesBaseName}-${variant.baseName}.apk") } - alignApp.sdkDir = sdkDir + zipAlignTask.sdkDir = sdkDir - appTask = alignApp + appTask = zipAlignTask + variant.outputFile = project.file( + "$project.buildDir/apk/${project.archivesBaseName}-${variant.baseName}.apk") } // Add a task to install the application package @@ -670,7 +692,7 @@ public abstract class BasePlugin { uninstallAll.dependsOn uninstallTask } - protected void createDependencyReportTask() { + private void createDependencyReportTask() { def androidDependencyTask = project.tasks.add("androidDependencies", AndroidDependencyTask) androidDependencyTask.setDescription("Displays the Android dependencies of the project") androidDependencyTask.setVariants(variants) diff --git a/gradle/src/main/groovy/com/android/build/gradle/BuildVariant.groovy b/gradle/src/main/groovy/com/android/build/gradle/BuildVariant.groovy index 81b839b..2fe7531 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BuildVariant.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BuildVariant.groovy @@ -18,14 +18,14 @@ package com.android.build.gradle import com.android.annotations.NonNull import com.android.annotations.Nullable -import com.android.build.gradle.internal.tasks.BaseManifestTask -import com.android.build.gradle.tasks.CompileAidlTask -import com.android.build.gradle.tasks.CrunchResourcesTask -import com.android.build.gradle.tasks.DexTask -import com.android.build.gradle.tasks.GenerateBuildConfigTask -import com.android.build.gradle.tasks.PackageApplicationTask -import com.android.build.gradle.tasks.ProcessResourcesTask -import com.android.build.gradle.tasks.RunTestsTask +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.PackageApplication +import com.android.build.gradle.tasks.ProcessImages +import com.android.build.gradle.tasks.ProcessManifest +import com.android.build.gradle.tasks.ProcessResources +import com.android.build.gradle.tasks.ZipAlign import com.android.builder.BuildType import com.android.builder.ProductFlavor import org.gradle.api.Task @@ -89,6 +89,15 @@ public interface BuildVariant { ProductFlavor getMergedConfig() /** + * Returns the output file for this build variants. Depending on the configuration, this could + * be an apk (regular and test project) or a bundled library (library project). + * + * If it's an apk, it could be signed, or not; zip-aligned, or not. + */ + @NonNull + File getOutputFile() + + /** * Returns the build variant that will test this build variant. * * Will return null if this build variant is a test build already. @@ -100,37 +109,37 @@ public interface BuildVariant { * Returns the Manifest processing task. */ @NonNull - BaseManifestTask getProcessManifestTask() + ProcessManifest getProcessManifest() /** * Returns the AIDL compilation task. */ @NonNull - CompileAidlTask getCompileAidlTask() + AidlCompile getAidlCompile() /** - * Returns the Resource crunching task. + * Returns the image processing task. */ @Nullable - CrunchResourcesTask getCrunchResourcesTask() + ProcessImages getProcessImages() /** * Returns the Android Resources processing task. */ @NonNull - ProcessResourcesTask getProcessResourcesTask() + ProcessResources getProcessResources() /** * Returns the BuildConfig generation task. */ @Nullable - GenerateBuildConfigTask getGenerateBuildConfigTask() + GenerateBuildConfig getGenerateBuildConfig() /** * Returns the Java Compilation task. */ @NonNull - JavaCompile getCompileTask() + JavaCompile getJavaCompile() /** * Returns the Java resource processing task. @@ -142,19 +151,25 @@ public interface BuildVariant { * Returns the Dex task. */ @Nullable - DexTask getDexTask() + Dex getDex() /** * Returns the APK packaging task. */ @Nullable - PackageApplicationTask getPackageApplicationTask() + PackageApplication getPackageApplication() + + /** + * Retursn the Zip align task. + */ + @Nullable + ZipAlign getZipAlign() /** * Returns the assemble task. */ @Nullable - Task getAssembleTask() + Task getAssemble() /** * Returns the installation task. @@ -162,7 +177,7 @@ public interface BuildVariant { * Even for variant for regular project, this can be null if the app cannot be signed. */ @Nullable - Task getInstallTask() + Task getInstall() /** * Returns the uinstallation task. @@ -171,12 +186,12 @@ public interface BuildVariant { * signing isn't setup. */ @Nullable - Task getUninstallTask() + Task getUninstall() /** * Returns the task to run the tests. * Only valid for test project. */ @Nullable - RunTestsTask getRunTestsTask() + Task getRunTests() } 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 51f2bcb..9027897 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/LibraryExtension.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/LibraryExtension.groovy @@ -29,8 +29,8 @@ public class LibraryExtension extends BaseExtension { final BuildType debug final BuildType release - LibraryExtension(ProjectInternal project, Instantiator instantiator) { - super(project, instantiator) + LibraryExtension(BasePlugin plugin, ProjectInternal project, Instantiator instantiator) { + super(plugin, project, instantiator) debug = instantiator.newInstance(BuildTypeDsl.class, BuildType.DEBUG) release = instantiator.newInstance(BuildTypeDsl.class, BuildType.RELEASE) 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 e653460..8049a41 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/LibraryPlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/LibraryPlugin.groovy @@ -17,6 +17,7 @@ package com.android.build.gradle import com.android.build.gradle.internal.BuildTypeData import com.android.build.gradle.internal.ConfigurationDependencies +import com.android.build.gradle.internal.DefaultBuildVariant import com.android.build.gradle.internal.ProductFlavorData import com.android.build.gradle.internal.ProductionAppVariant import com.android.build.gradle.internal.TestAppVariant @@ -59,7 +60,7 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { super.apply(project) extension = project.extensions.create('android', LibraryExtension, - (ProjectInternal) project, instantiator) + this, (ProjectInternal) project, instantiator) setDefaultConfig(extension.defaultConfig, extension.sourceSetsContainer) // create the source sets for the build type. @@ -73,10 +74,6 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { project.tasks.assemble.dependsOn releaseBuildTypeData.assembleTask createConfigurations() - - project.afterEvaluate { - createAndroidTasks() - } } void createConfigurations() { @@ -95,7 +92,8 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { } } - void createAndroidTasks() { + @Override + protected void doCreateAndroidTasks() { // resolve dependencies for all config List<ConfigurationDependencies> dependencies = [] dependencies.add(debugBuildTypeData) @@ -103,12 +101,25 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { resolveDependencies(dependencies) ProductionAppVariant testedVariant = createLibraryTasks(debugBuildTypeData) - createLibraryTasks(releaseBuildTypeData) - createTestTasks(testedVariant) - createDependencyReportTask() + ProductionAppVariant nonTestedVariant = createLibraryTasks(releaseBuildTypeData) + TestAppVariant testVariant = createTestTasks(testedVariant) + + // add the not-tested build variant. + extension.buildVariants.add( + instantiator.newInstance(DefaultBuildVariant.class, nonTestedVariant)) + + // and add the test variant + DefaultBuildVariant testBuildVariant = instantiator.newInstance( + DefaultBuildVariant.class, testVariant) + extension.testBuildVariants.add(testBuildVariant) + + // and finally the tested variant + extension.buildVariants.add( + instantiator.newInstance(DefaultBuildVariant.class, + testedVariant, testBuildVariant)) } - ProductionAppVariant createLibraryTasks(BuildTypeData buildTypeData) { + private ProductionAppVariant createLibraryTasks(BuildTypeData buildTypeData) { ProductFlavorData defaultConfigData = getDefaultConfigData(); List<ConfigurationDependencies> configDependencies = [] @@ -158,8 +169,8 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { // jar the classes. Jar jar = project.tasks.add("package${buildTypeData.buildType.name.capitalize()}Jar", Jar); - jar.dependsOn variant.compileTask, variant.processJavaResources - jar.from(variant.compileTask.outputs); + jar.dependsOn variant.javaCompileTask, variant.processJavaResources + jar.from(variant.javaCompileTask.outputs); jar.from(variant.processJavaResources.destinationDir) jar.destinationDir = project.file("$project.buildDir/$DIR_BUNDLES/${variant.dirName}") @@ -199,6 +210,8 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { } bundle.from(project.file("$project.buildDir/$DIR_BUNDLES/${variant.dirName}")) + variant.outputFile = bundle.archivePath + project.artifacts.add(buildTypeData.buildType.name, bundle) buildTypeData.assembleTask.dependsOn bundle @@ -223,7 +236,7 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { return variant } - void createTestTasks(ProductionAppVariant testedVariant) { + private TestAppVariant createTestTasks(ProductionAppVariant testedVariant) { ProductFlavorData defaultConfigData = getDefaultConfigData(); List<ConfigurationDependencies> configDependencies = [] @@ -249,14 +262,12 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { def testVariant = new TestAppVariant(testVariantConfig,) variants.add(testVariant) createTestTasks(testVariant, testedVariant, configDependencies) + + return testVariant } @Override - String getTarget() { + protected String getTarget() { return extension.target } - - protected String getManifestOutDir() { - return DIR_BUNDLES - } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/ApplicationVariant.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/ApplicationVariant.groovy index 194fad1..5a1b114 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/ApplicationVariant.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/ApplicationVariant.groovy @@ -16,15 +16,16 @@ package com.android.build.gradle.internal import com.android.build.gradle.BasePlugin -import com.android.build.gradle.internal.tasks.BaseManifestTask -import com.android.build.gradle.tasks.CompileAidlTask -import com.android.build.gradle.tasks.CrunchResourcesTask -import com.android.build.gradle.tasks.DexTask -import com.android.build.gradle.tasks.GenerateBuildConfigTask -import com.android.build.gradle.tasks.PackageApplicationTask -import com.android.build.gradle.tasks.PrepareDependenciesTask -import com.android.build.gradle.tasks.ProcessResourcesTask -import com.android.build.gradle.tasks.RunTestsTask +import com.android.build.gradle.internal.tasks.AidlCompileTask +import com.android.build.gradle.internal.tasks.DexTask +import com.android.build.gradle.internal.tasks.GenerateBuildConfigTask +import com.android.build.gradle.internal.tasks.PackageApplicationTask +import com.android.build.gradle.internal.tasks.PrepareDependenciesTask +import com.android.build.gradle.internal.tasks.ProcessImagesTask +import com.android.build.gradle.internal.tasks.ProcessResourcesTask +import com.android.build.gradle.internal.tasks.RunTestsTask +import com.android.build.gradle.internal.tasks.ZipAlignTask +import com.android.build.gradle.tasks.ProcessManifest import com.android.builder.AndroidBuilder import com.android.builder.ProductFlavor import com.android.builder.VariantConfiguration @@ -41,17 +42,20 @@ public abstract class ApplicationVariant { PrepareDependenciesTask prepareDependenciesTask - BaseManifestTask processManifestTask - CompileAidlTask compileAidlTask - CrunchResourcesTask crunchResourcesTask + ProcessManifest processManifestTask + AidlCompileTask aidlCompileTask + ProcessImagesTask processImagesTask ProcessResourcesTask processResourcesTask GenerateBuildConfigTask generateBuildConfigTask - JavaCompile compileTask + JavaCompile javaCompileTask Copy processJavaResources DexTask dexTask PackageApplicationTask packageApplicationTask + ZipAlignTask zipAlignTask + + File outputFile Task assembleTask diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultBuildVariant.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultBuildVariant.groovy index e39fc7d..7157e80 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultBuildVariant.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/DefaultBuildVariant.groovy @@ -16,14 +16,14 @@ package com.android.build.gradle.internal import com.android.build.gradle.BuildVariant -import com.android.build.gradle.internal.tasks.BaseManifestTask -import com.android.build.gradle.tasks.CompileAidlTask -import com.android.build.gradle.tasks.CrunchResourcesTask -import com.android.build.gradle.tasks.DexTask -import com.android.build.gradle.tasks.GenerateBuildConfigTask -import com.android.build.gradle.tasks.PackageApplicationTask -import com.android.build.gradle.tasks.ProcessResourcesTask -import com.android.build.gradle.tasks.RunTestsTask +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.PackageApplication +import com.android.build.gradle.tasks.ProcessImages +import com.android.build.gradle.tasks.ProcessManifest +import com.android.build.gradle.tasks.ProcessResources +import com.android.build.gradle.tasks.ZipAlign import com.android.builder.BuildType import com.android.builder.ProductFlavor import org.gradle.api.Task @@ -81,38 +81,43 @@ public class DefaultBuildVariant implements BuildVariant { } @Override + File getOutputFile() { + return variant.outputFile + } + + @Override BuildVariant getTestVariant() { return testVariant } @Override - BaseManifestTask getProcessManifestTask() { + ProcessManifest getProcessManifest() { return variant.processManifestTask } @Override - CompileAidlTask getCompileAidlTask() { - return variant.compileAidlTask + AidlCompile getAidlCompile() { + return variant.aidlCompileTask } @Override - CrunchResourcesTask getCrunchResourcesTask() { - return variant.crunchResourcesTask + ProcessImages getProcessImages() { + return variant.processImagesTask } @Override - ProcessResourcesTask getProcessResourcesTask() { + ProcessResources getProcessResources() { return variant.processResourcesTask } @Override - GenerateBuildConfigTask getGenerateBuildConfigTask() { + GenerateBuildConfig getGenerateBuildConfig() { return variant.generateBuildConfigTask } @Override - JavaCompile getCompileTask() { - return variant.compileTask + JavaCompile getJavaCompile() { + return variant.javaCompileTask } @Override @@ -121,32 +126,36 @@ public class DefaultBuildVariant implements BuildVariant { } @Override - DexTask getDexTask() { + Dex getDex() { return variant.dexTask } @Override - PackageApplicationTask getPackageApplicationTask() { + PackageApplication getPackageApplication() { return variant.packageApplicationTask } + ZipAlign getZipAlign() { + return variant.zipAlignTask + } + @Override - Task getAssembleTask() { + Task getAssemble() { return variant.assembleTask } @Override - Task getInstallTask() { + Task getInstall() { return variant.installTask } @Override - Task getUninstallTask() { + Task getUninstall() { return variant.uninstallTask } @Override - RunTestsTask getRunTestsTask() { + Task getRunTests() { return variant.runTestsTask } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/CompileAidlTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/AidlCompileTask.groovy index e15739a..f65f9ba 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/CompileAidlTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/AidlCompileTask.groovy @@ -14,16 +14,15 @@ * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks -import com.android.build.gradle.internal.tasks.BaseTask +import com.android.build.gradle.tasks.AidlCompile import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.TaskAction /** */ -public class CompileAidlTask extends BaseTask { +public class AidlCompileTask extends AidlCompile { @InputFiles List<File> sourceDirs @@ -31,9 +30,6 @@ public class CompileAidlTask extends BaseTask { @InputFiles List<File> importDirs - @OutputDirectory - File sourceOutputDir - @TaskAction void generate() { getBuilder().compileAidl(getSourceDirs(), getSourceOutputDir(), getImportDirs()) diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/AndroidDependencyTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/AndroidDependencyTask.groovy index 275286f..bb3f8c7 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/AndroidDependencyTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/AndroidDependencyTask.groovy @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks import com.android.build.gradle.internal.AndroidAsciiReportRenderer import com.android.build.gradle.internal.ApplicationVariant diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/DexTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/DexTask.groovy index 1128f8d..f62979a 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/DexTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/DexTask.groovy @@ -13,18 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks -import com.android.build.gradle.internal.tasks.BaseTask +import com.android.build.gradle.tasks.Dex import com.android.builder.DexOptions import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.Nested -import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction -public class DexTask extends BaseTask { - @OutputFile - File outputFile +public class DexTask extends Dex { @InputFiles Iterable<File> sourceFiles diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/GenerateBuildConfigTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/GenerateBuildConfigTask.groovy index 03ea974..e7bf2e6 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/GenerateBuildConfigTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/GenerateBuildConfigTask.groovy @@ -13,14 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks -import com.android.build.gradle.internal.tasks.BaseTask +import com.android.build.gradle.tasks.GenerateBuildConfig import org.gradle.api.tasks.Input -import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.TaskAction -public class GenerateBuildConfigTask extends BaseTask { +public class GenerateBuildConfigTask extends GenerateBuildConfig { @Input String packageName @@ -31,9 +30,6 @@ public class GenerateBuildConfigTask extends BaseTask { @Input List<String> javaLines; - @OutputDirectory - File sourceOutputDir - @TaskAction void generate() { getBuilder().generateBuildConfig( diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/InstallTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/InstallTask.groovy index 0b9dbdc..ec30f98 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/InstallTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/InstallTask.groovy @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks import org.gradle.api.DefaultTask import org.gradle.api.tasks.Input diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/PackageApplicationTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/PackageApplicationTask.groovy index 4a20b29..101f111 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/PackageApplicationTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/PackageApplicationTask.groovy @@ -13,34 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks -import com.android.build.gradle.internal.tasks.BaseTask +import com.android.build.gradle.tasks.PackageApplication import com.android.builder.packaging.DuplicateFileException import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputDirectory -import org.gradle.api.tasks.InputFile import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.Optional -import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction -public class PackageApplicationTask extends BaseTask { - @InputFile - File resourceFile - - @InputFile - File dexFile +public class PackageApplicationTask extends PackageApplication { @InputFiles List<File> packagedJars - @InputDirectory @Optional - File javaResourceDir - - @InputDirectory @Optional - File jniDir - @Input boolean debugSigned @@ -59,10 +45,6 @@ public class PackageApplicationTask extends BaseTask { @Input @Optional String signingKeyPassword - @OutputFile - File outputFile - - @TaskAction void generate() { diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/PrepareDependenciesTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/PrepareDependenciesTask.groovy index fb9c750..77f5182 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/PrepareDependenciesTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/PrepareDependenciesTask.groovy @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks import com.android.build.gradle.internal.DependencyChecker -import com.android.build.gradle.internal.tasks.BaseTask import com.android.utils.Pair import org.gradle.api.tasks.TaskAction diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/PrepareLibraryTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/PrepareLibraryTask.groovy index 672d093..e490a93 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/PrepareLibraryTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/PrepareLibraryTask.groovy @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks import org.gradle.api.DefaultTask import org.gradle.api.tasks.InputFile diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessImagesTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessImagesTask.groovy new file mode 100644 index 0000000..5f0a261 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessImagesTask.groovy @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.build.gradle.internal.tasks + +import com.android.build.gradle.tasks.ProcessImages +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.TaskAction + +class ProcessImagesTask extends ProcessImages { + + @InputFiles + Iterable<File> resDirectories + + @TaskAction + void generate() { + getBuilder().processImages(getOutputDir().absolutePath, getResDirectories()) + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessManifestTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessManifestTask.groovy index f584207..c829a18 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessManifestTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessManifestTask.groovy @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks -import com.android.build.gradle.internal.tasks.BaseManifestTask +import com.android.build.gradle.tasks.ProcessManifest import com.android.builder.ManifestDependency import org.gradle.api.tasks.Input import org.gradle.api.tasks.InputFile @@ -26,7 +26,7 @@ import org.gradle.api.tasks.TaskAction /** */ -public class ProcessManifestTask extends BaseManifestTask { +public class ProcessManifestTask extends ProcessManifest { @InputFile File mainManifest diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessResourcesTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessResourcesTask.groovy index 69b4679..bb4d876 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessResourcesTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessResourcesTask.groovy @@ -13,29 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks import com.android.build.gradle.internal.AaptOptionsImpl -import com.android.build.gradle.internal.tasks.BaseTask +import com.android.build.gradle.tasks.ProcessResources import com.android.builder.SymbolFileProvider import com.android.builder.VariantConfiguration import org.gradle.api.tasks.Input import org.gradle.api.tasks.InputDirectory -import org.gradle.api.tasks.InputFile import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.Nested import org.gradle.api.tasks.Optional -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction -public class ProcessResourcesTask extends BaseTask { - - @InputFile - File manifestFile - - @InputDirectory @Optional - File preprocessResDir +public class ProcessResourcesTask extends ProcessResources { @InputFiles Iterable<File> resDirectories @@ -49,18 +40,6 @@ public class ProcessResourcesTask extends BaseTask { @Input @Optional String packageOverride - @OutputDirectory @Optional - File sourceOutputDir - - @OutputDirectory @Optional - File textSymbolDir - - @OutputFile @Optional - File packageFile - - @OutputFile @Optional - File proguardFile - // this doesn't change from one build to another, so no need to annotate VariantConfiguration.Type type diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessTestManifestTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessTestManifestTask.groovy index a1f12ce..1edbe21 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessTestManifestTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessTestManifestTask.groovy @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks -import com.android.build.gradle.internal.tasks.BaseManifestTask +import com.android.build.gradle.tasks.ProcessManifest import com.android.builder.ManifestDependency import org.gradle.api.tasks.Input import org.gradle.api.tasks.Nested @@ -23,7 +23,7 @@ import org.gradle.api.tasks.TaskAction /** */ -class ProcessTestManifestTask extends BaseManifestTask { +class ProcessTestManifestTask extends ProcessManifest { @Input String testPackageName diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/RunTestsTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/RunTestsTask.groovy index 5302633..e7f605a 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/RunTestsTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/RunTestsTask.groovy @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks -import com.android.build.gradle.internal.tasks.BaseTask import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/UninstallTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/UninstallTask.groovy index 06a6259..42bb30a 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/UninstallTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/UninstallTask.groovy @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks -import com.android.build.gradle.internal.tasks.BaseTask import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/ZipAlignTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ZipAlignTask.groovy index eff7ca1..e69ce14 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/ZipAlignTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ZipAlignTask.groovy @@ -13,24 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.tasks +package com.android.build.gradle.internal.tasks -import org.gradle.api.DefaultTask +import com.android.build.gradle.tasks.ZipAlign import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputFile -import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction -public class ZipAlignTask extends DefaultTask { - @OutputFile - File outputFile +public class ZipAlignTask extends ZipAlign { @Input File sdkDir - @InputFile - File inputFile - @TaskAction void generate() { project.exec { diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/AidlCompile.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/AidlCompile.groovy new file mode 100644 index 0000000..50f938b --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/AidlCompile.groovy @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.build.gradle.tasks + +import com.android.build.gradle.internal.tasks.BaseTask +import org.gradle.api.tasks.OutputDirectory + +/** + */ +public class AidlCompile extends BaseTask { + + @OutputDirectory + File sourceOutputDir +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/BaseManifestTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/Dex.groovy index 1990f75..f5a6540 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/BaseManifestTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/Dex.groovy @@ -13,14 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.build.gradle.internal.tasks +package com.android.build.gradle.tasks +import com.android.build.gradle.internal.tasks.BaseTask import org.gradle.api.tasks.OutputFile -/** - */ -public abstract class BaseManifestTask extends BaseTask { +public class Dex extends BaseTask { @OutputFile - File outManifest + File outputFile } diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/GenerateBuildConfig.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/GenerateBuildConfig.groovy new file mode 100644 index 0000000..7f30c8b --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/GenerateBuildConfig.groovy @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.build.gradle.tasks + +import com.android.build.gradle.internal.tasks.BaseTask +import org.gradle.api.tasks.OutputDirectory + +public class GenerateBuildConfig extends BaseTask { + + @OutputDirectory + File sourceOutputDir +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/PackageApplication.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/PackageApplication.groovy new file mode 100644 index 0000000..1ebe367 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/PackageApplication.groovy @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.build.gradle.tasks + +import com.android.build.gradle.internal.tasks.BaseTask +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.Optional +import org.gradle.api.tasks.OutputFile + +public class PackageApplication extends BaseTask { + @InputFile + File resourceFile + + @InputFile + File dexFile + + @InputDirectory @Optional + File javaResourceDir + + @InputDirectory @Optional + File jniDir + + @OutputFile + File outputFile +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/CrunchResourcesTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessImages.groovy index 46af14a..b273775 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/CrunchResourcesTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessImages.groovy @@ -16,19 +16,11 @@ package com.android.build.gradle.tasks import com.android.build.gradle.internal.tasks.BaseTask -import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction -class CrunchResourcesTask extends BaseTask { +class ProcessImages extends BaseTask { + @OutputDirectory File outputDir - @InputFiles - Iterable<File> resDirectories - - @TaskAction - void generate() { - getBuilder().preprocessResources(getOutputDir().absolutePath, getResDirectories()) - } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessManifest.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessManifest.groovy new file mode 100644 index 0000000..e58cf7e --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessManifest.groovy @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.build.gradle.tasks + +import com.android.build.gradle.internal.tasks.BaseTask +import org.gradle.api.tasks.OutputFile + +/** + * A task that processes the manifest + */ +public abstract class ProcessManifest extends BaseTask { + + /** + * The processed Manifest. + */ + @OutputFile + File outManifest +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessResources.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessResources.groovy new file mode 100644 index 0000000..4482428 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessResources.groovy @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.build.gradle.tasks + +import com.android.build.gradle.internal.tasks.BaseTask +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.Optional +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.OutputFile + +public class ProcessResources extends BaseTask { + + @InputFile + File manifestFile + + @InputDirectory @Optional + File preprocessResDir + + @OutputDirectory @Optional + File sourceOutputDir + + @OutputDirectory @Optional + File textSymbolDir + + @OutputFile @Optional + File packageFile + + @OutputFile @Optional + File proguardFile + +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/ZipAlign.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/ZipAlign.groovy new file mode 100644 index 0000000..d41a981 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/ZipAlign.groovy @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.build.gradle.tasks + +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.OutputFile + +public class ZipAlign extends DefaultTask { + @OutputFile + File outputFile + + @InputFile + File inputFile +} 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 593166b..cbccfce 100644 --- a/gradle/src/test/groovy/com/android/build/gradle/AppPluginDslTest.groovy +++ b/gradle/src/test/groovy/com/android/build/gradle/AppPluginDslTest.groovy @@ -184,28 +184,36 @@ public class AppPluginDslTest extends BaseTest { } private void checkTasks(BuildVariant variant, boolean testVariant) { - assertNotNull(variant.processManifestTask) - assertNotNull(variant.compileAidlTask) - assertNotNull(variant.crunchResourcesTask) - assertNotNull(variant.processResourcesTask) - assertNotNull(variant.generateBuildConfigTask) - assertNotNull(variant.compileTask) + assertNotNull(variant.processManifest) + assertNotNull(variant.aidlCompile) + assertNotNull(variant.processImages) + assertNotNull(variant.processResources) + assertNotNull(variant.generateBuildConfig) + assertNotNull(variant.javaCompile) assertNotNull(variant.processJavaResources) - assertNotNull(variant.dexTask) - assertNotNull(variant.packageApplicationTask) - assertNotNull(variant.assembleTask) - assertNotNull(variant.uninstallTask) + assertNotNull(variant.dex) + assertNotNull(variant.packageApplication) + + assertNotNull(variant.assemble) + assertNotNull(variant.uninstall) if (variant.buildType.debugSigned || variant.mergedConfig.isSigningReady()) { - assertNotNull(variant.installTask) + assertNotNull(variant.install) + + // tested variant are never zipAligned. + if (!testVariant && variant.buildType.zipAlign) { + assertNotNull(variant.zipAlign) + } else { + assertNull(variant.zipAlign) + } } else { - assertNull(variant.installTask) + assertNull(variant.install) } if (testVariant) { - assertNotNull(variant.runTestsTask) + assertNotNull(variant.runTests) } else { - assertNull(variant.runTestsTask) + assertNull(variant.runTests) } } diff --git a/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy b/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy new file mode 100644 index 0000000..3495219 --- /dev/null +++ b/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.build.gradle + +import com.android.build.gradle.internal.BaseTest +import org.gradle.api.Project +import org.gradle.testfixtures.ProjectBuilder + +/** + * Tests for the public DSL of the App plugin ("android-library") + */ +public class LibraryPluginDslTest extends BaseTest { + + @Override + protected void setUp() throws Exception { + BasePlugin.TEST_SDK_DIR = new File("foo") + } + + public void testBasic() { + Project project = ProjectBuilder.builder().withProjectDir( + new File(testDir, "basic")).build() + + project.apply plugin: 'android-library' + + project.android { + target "android-15" + } + + Set<BuildVariant> variants = project.android.buildVariants + assertEquals(2, variants.size()) + + Set<BuildVariant> testVariants = project.android.testBuildVariants + assertEquals(1, testVariants.size()) + + checkTestedVariant("Debug", "Test", variants, testVariants) + checkNonTestedVariant("Release", variants) + } + + private void checkTestedVariant(String variantName, String testedVariantName, + Set<BuildVariant> variants, Set<BuildVariant> testVariants) { + BuildVariant variant = findVariant(variants, variantName) + assertNotNull(variant) + assertNotNull(variant.testVariant) + assertEquals(testedVariantName, variant.testVariant.name) + assertEquals(variant.testVariant, findVariant(testVariants, testedVariantName)) + checkLibraryTasks(variant) + checkTestTasks(variant.testVariant) + } + + private void checkNonTestedVariant(String variantName, Set<BuildVariant> variants) { + BuildVariant variant = findVariant(variants, variantName) + assertNotNull(variant) + assertNull(variant.testVariant) + checkLibraryTasks(variant) + } + + private void checkTestTasks(BuildVariant variant) { + assertNotNull(variant.processManifest) + assertNotNull(variant.aidlCompile) + assertNotNull(variant.processImages) + assertNotNull(variant.processResources) + assertNotNull(variant.generateBuildConfig) + assertNotNull(variant.javaCompile) + assertNotNull(variant.processJavaResources) + assertNotNull(variant.dex) + assertNotNull(variant.packageApplication) + + assertNotNull(variant.assemble) + assertNotNull(variant.uninstall) + + assertNull(variant.zipAlign) + + if (variant.buildType.debugSigned || variant.mergedConfig.isSigningReady()) { + assertNotNull(variant.install) + } else { + assertNull(variant.install) + } + + assertNotNull(variant.runTests) + } + + private void checkLibraryTasks(BuildVariant variant) { + assertNotNull(variant.processManifest) + assertNotNull(variant.aidlCompile) + assertNotNull(variant.processResources) + assertNotNull(variant.generateBuildConfig) + assertNotNull(variant.javaCompile) + assertNotNull(variant.processJavaResources) + + assertNotNull(variant.assemble) + + assertNull(variant.dex) + assertNull(variant.packageApplication) + assertNull(variant.zipAlign) + assertNull(variant.install) + assertNull(variant.uninstall) + assertNull(variant.runTests) + } + + private BuildVariant findVariant(Collection<BuildVariant> variants, String name) { + for (BuildVariant variant : variants) { + if (name.equals(variant.name)) { + return variant + } + } + + return null + } +}
\ No newline at end of file |