diff options
author | Xavier Ducrohet <xav@android.com> | 2012-12-07 18:50:44 -0800 |
---|---|---|
committer | Xavier Ducrohet <xav@android.com> | 2012-12-10 17:01:07 -0800 |
commit | cd3aa604316fa5c6c9486f2cb9caa3eaccd74476 (patch) | |
tree | 38455d4e69fb7dd84b1a8647b8f6289a61c60486 /gradle/src | |
parent | 3b49b176fcbfe1bbae0f63f769a39a3cb41c79ef (diff) | |
download | build-cd3aa604316fa5c6c9486f2cb9caa3eaccd74476.tar.gz |
Use the ResourceMerger to handle overlay.
This creates a merged res folder that is then fed to aapt.
Right now the merged folder does not have its image
crunched, nor is it incremental.
This means the build will be slower (previously crunching was
incremental). Next step is to change aapt to be able to crunch
single images and then make the merging itself incremental.
Details:
The processImage task is replaced by mergeResourceTask.
It is also used for library project that had to merge their
resources before bundling, so the previous copy task is removed
and the merge is done directly in the bundle folder.
The API for AndroidBuilder is changed to reflect those changes.
processResource now only takes one res folder which is meant to
be the merged one. The getResourceInputs on VariantConfig
is changed to return a list of ResourceSets (except not actual
ResourceSet since this would load the resources, so instead
a list of list of files).
Also changed build.gradle for the gradle plugin to have
the integration test first deploy the plugin locally in order
to use the right one.
Change-Id: Ide96f733be835d94518b831baee7ee77b9a61dec
Diffstat (limited to 'gradle/src')
13 files changed, 113 insertions, 86 deletions
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 d777023..d9dffd5 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy @@ -419,8 +419,8 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements org.gradl // Add a task to process the manifest(s) createProcessManifestTask(variant, "manifests") - // Add a task to crunch resource files - createProcessImagesTask(variant) + // Add a task to merge the resource folders + createMergeResourcesTask(variant) // Add a task to create the BuildConfig class createBuildConfigTask(variant) 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 e285403..0c9dd45 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy @@ -34,7 +34,7 @@ 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.MergeResourcesTask import com.android.build.gradle.internal.tasks.ProcessManifestTask import com.android.build.gradle.internal.tasks.ProcessResourcesTask import com.android.build.gradle.internal.tasks.ProcessTestManifestTask @@ -303,16 +303,25 @@ public abstract class BasePlugin { } } - protected void createProcessImagesTask(ApplicationVariant variant) { - def processImagesTask = project.tasks.add("process${variant.name}Images", ProcessImagesTask) - variant.processImagesTask = processImagesTask + protected void createMergeResourcesTask(ApplicationVariant variant) { + createMergeResourcesTask(variant, "$project.buildDir/res/$variant.dirName") + } + + protected void createMergeResourcesTask(ApplicationVariant variant, String location) { + def mergeResourcesTask = project.tasks.add("merge${variant.name}Resources", + MergeResourcesTask) + variant.mergeResourcesTask = mergeResourcesTask - processImagesTask.plugin = this - processImagesTask.variant = variant + mergeResourcesTask.plugin = this + mergeResourcesTask.variant = variant + + mergeResourcesTask.conventionMapping.inputResourceSets = { variant.config.resourceSets } + mergeResourcesTask.conventionMapping.rawInputFolders = { + MergeResourcesTask.inlineInputs(variant.config.resourceSets) + } - processImagesTask.conventionMapping.resDirectories = { variant.config.resourceInputs } - processImagesTask.conventionMapping.outputDir = { - project.file("$project.buildDir/res/$variant.dirName") + mergeResourcesTask.conventionMapping.outputDir = { + project.file(location) } } @@ -347,9 +356,10 @@ public abstract class BasePlugin { } protected void createProcessResTask(ApplicationVariant variant) { - def processResources = project.tasks.add("process${variant.name}Res", ProcessResourcesTask) + def processResources = project.tasks.add("process${variant.name}Resources", + ProcessResourcesTask) variant.processResourcesTask = processResources - processResources.dependsOn variant.processManifestTask + processResources.dependsOn variant.processManifestTask, variant.mergeResourcesTask processResources.plugin = this processResources.variant = variant @@ -360,17 +370,8 @@ public abstract class BasePlugin { variant.processManifestTask.outManifest } - if (variant.processImagesTask != null) { - processResources.dependsOn variant.processImagesTask - - processResources.conventionMapping.preprocessResDir = { - variant.processImagesTask.outputDir - } - processResources.conventionMapping.resDirectories = { - variant.processImagesTask.resDirectories - } - } else { - processResources.conventionMapping.resDirectories = { config.resourceInputs } + processResources.conventionMapping.mergedResFolder = { + variant.mergeResourcesTask.outputDir } processResources.conventionMapping.assetsDir = { @@ -520,14 +521,14 @@ public abstract class BasePlugin { // Add a task to process the manifest createProcessTestManifestTask(variant, "manifests") - // Add a task to crunch resource files - createProcessImagesTask(variant) + // Add a task to merge the resource folders + createMergeResourcesTask(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.processImagesTask.dependsOn testedVariant.assembleTask + variant.mergeResourcesTask.dependsOn testedVariant.assembleTask } } 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 ebcef1c..71f79c1 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BuildVariant.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BuildVariant.groovy @@ -22,7 +22,7 @@ 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.MergeResources import com.android.build.gradle.tasks.ProcessManifest import com.android.build.gradle.tasks.ProcessResources import com.android.build.gradle.tasks.ZipAlign @@ -122,7 +122,7 @@ public interface BuildVariant { * Returns the image processing task. */ @Nullable - ProcessImages getProcessImages() + MergeResources getMergeResources() /** * Returns the Android Resources processing task. 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 8f6d6cf..de13955 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/LibraryPlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/LibraryPlugin.groovy @@ -153,6 +153,9 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { // Add a task to process the manifest(s) createProcessManifestTask(variant, DIR_BUNDLES) + // Add a task to merge the resource folders + createMergeResourcesTask(variant, "$project.buildDir/$DIR_BUNDLES/${variant.dirName}/res") + // Add a task to create the BuildConfig class createBuildConfigTask(variant) @@ -179,14 +182,6 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { jar.exclude(packageName + "/R.class") jar.exclude(packageName + "/R\$*.class") - // package the android resources into the bundle folder - Copy packageRes = project.tasks.add("package${variant.name}Res", Copy) - // packageRes from 3 sources. the order is important to make sure the override works well. - // TODO: fix the case of values -- need to merge the XML! - packageRes.from(defaultConfigData.sourceSet.res.directory, - buildTypeData.sourceSet.res.directory) - packageRes.into(project.file("$project.buildDir/$DIR_BUNDLES/${variant.dirName}/res")) - // package the aidl files into the bundle folder Copy packageAidl = project.tasks.add("package${variant.name}Aidl", Copy) // packageAidl from 3 sources. the order is important to make sure the override works well. @@ -201,7 +196,7 @@ public class LibraryPlugin extends BasePlugin implements Plugin<Project> { packageSymbol.into(project.file("$project.buildDir/$DIR_BUNDLES/${variant.dirName}")) Zip bundle = project.tasks.add("bundle${variant.name}", Zip) - bundle.dependsOn jar, packageRes, packageAidl, packageSymbol + bundle.dependsOn jar, packageAidl, packageSymbol bundle.setDescription("Assembles a bundle containing the library in ${variant.name}."); bundle.destinationDir = project.file("$project.buildDir/libs") bundle.extension = BuilderConstants.EXT_LIB_ARCHIVE 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 c8d869a..b5c7cc1 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 @@ -21,7 +21,7 @@ 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.MergeResourcesTask import com.android.build.gradle.internal.tasks.ProcessResourcesTask import com.android.build.gradle.internal.tasks.RunTestsTask import com.android.build.gradle.internal.tasks.ZipAlignTask @@ -45,7 +45,7 @@ public abstract class ApplicationVariant { ProcessManifest processManifestTask AidlCompileTask aidlCompileTask - ProcessImagesTask processImagesTask + MergeResourcesTask mergeResourcesTask ProcessResourcesTask processResourcesTask GenerateBuildConfigTask generateBuildConfigTask 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 790f7b7..96686bb 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 @@ -20,7 +20,7 @@ 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.MergeResources import com.android.build.gradle.tasks.ProcessManifest import com.android.build.gradle.tasks.ProcessResources import com.android.build.gradle.tasks.ZipAlign @@ -102,8 +102,8 @@ public class DefaultBuildVariant implements BuildVariant { } @Override - ProcessImages getProcessImages() { - return variant.processImagesTask + MergeResources getMergeResources() { + return variant.mergeResourcesTask } @Override diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/MergeResourcesTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/MergeResourcesTask.groovy new file mode 100644 index 0000000..c51cb77 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/MergeResourcesTask.groovy @@ -0,0 +1,68 @@ +/* + * 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.MergeResources +import com.google.common.collect.Lists +import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.TaskAction + +class MergeResourcesTask extends MergeResources { + + // fake input to detect changes. Not actually used by the task + @InputFiles + Iterable<File> rawInputFolders + + // actual inputs + List<List<File>> inputResourceSets + + @TaskAction + void generate() { + // this is not yet incremental. Need to clean up the previous merge result. + File destinationDir = getOutputDir() + + deleteFolder(destinationDir) + destinationDir.mkdir() + + getBuilder().mergeResources(destinationDir.absolutePath, getInputResourceSets()) + } + + static Iterable<File> inlineInputs(List<List<File>> inputs) { + List<File> list = Lists.newArrayList(); + + for (List<File> folders : inputs) { + for (File folder : folders) { + list.add(folder); + } + } + + return list; + } + + private static void deleteFolder(File folder) { + File[] files = folder.listFiles() + if (files != null && files.length > 0) { + for (File file : files) { + if (file.isDirectory()) { + deleteFolder(file) + } + file.delete(); + } + } + + folder.delete() + } +} 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 deleted file mode 100644 index 5f0a261..0000000 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessImagesTask.groovy +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.build.gradle.internal.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/internal/tasks/ProcessResourcesTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessResourcesTask.groovy index bb4d876..af53b65 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessResourcesTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/ProcessResourcesTask.groovy @@ -14,23 +14,18 @@ * limitations under the License. */ package com.android.build.gradle.internal.tasks - import com.android.build.gradle.internal.AaptOptionsImpl 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.InputFiles import org.gradle.api.tasks.Nested import org.gradle.api.tasks.Optional import org.gradle.api.tasks.TaskAction public class ProcessResourcesTask extends ProcessResources { - @InputFiles - Iterable<File> resDirectories - @InputDirectory @Optional File assetsDir @@ -54,8 +49,7 @@ public class ProcessResourcesTask extends ProcessResources { getBuilder().processResources( getManifestFile(), - getPreprocessResDir(), - getResDirectories(), + getMergedResFolder(), getAssetsDir(), getLibraries(), getPackageOverride(), diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessImages.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/MergeResources.groovy index b273775..0ed64ea 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessImages.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/MergeResources.groovy @@ -18,7 +18,7 @@ package com.android.build.gradle.tasks import com.android.build.gradle.internal.tasks.BaseTask import org.gradle.api.tasks.OutputDirectory -class ProcessImages extends BaseTask { +class MergeResources extends BaseTask { @OutputDirectory File outputDir 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 index 4482428..da4ab76 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessResources.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/ProcessResources.groovy @@ -27,8 +27,8 @@ public class ProcessResources extends BaseTask { @InputFile File manifestFile - @InputDirectory @Optional - File preprocessResDir + @InputDirectory + File mergedResFolder @OutputDirectory @Optional File sourceOutputDir 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 cbccfce..b8f994e 100644 --- a/gradle/src/test/groovy/com/android/build/gradle/AppPluginDslTest.groovy +++ b/gradle/src/test/groovy/com/android/build/gradle/AppPluginDslTest.groovy @@ -186,7 +186,7 @@ public class AppPluginDslTest extends BaseTest { private void checkTasks(BuildVariant variant, boolean testVariant) { assertNotNull(variant.processManifest) assertNotNull(variant.aidlCompile) - assertNotNull(variant.processImages) + assertNotNull(variant.mergeResources) assertNotNull(variant.processResources) assertNotNull(variant.generateBuildConfig) assertNotNull(variant.javaCompile) 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 3495219..25f6a65 100644 --- a/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy +++ b/gradle/src/test/groovy/com/android/build/gradle/LibraryPluginDslTest.groovy @@ -70,7 +70,7 @@ public class LibraryPluginDslTest extends BaseTest { private void checkTestTasks(BuildVariant variant) { assertNotNull(variant.processManifest) assertNotNull(variant.aidlCompile) - assertNotNull(variant.processImages) + assertNotNull(variant.mergeResources) assertNotNull(variant.processResources) assertNotNull(variant.generateBuildConfig) assertNotNull(variant.javaCompile) |