diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:29:09 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 19:29:09 -0800 |
commit | 55a2c71f27d3e0b8344597c7f281e687cb7aeb1b (patch) | |
tree | ecd18b995aea8eeeb8b3823266280d41245bf0f7 /anttasks/src/com/android/ant/AaptExecLoopTask.java | |
parent | 82ea7a177797b844b252effea5c7c7c5d63ea4ac (diff) | |
download | sdk-55a2c71f27d3e0b8344597c7f281e687cb7aeb1b.zip sdk-55a2c71f27d3e0b8344597c7f281e687cb7aeb1b.tar.gz sdk-55a2c71f27d3e0b8344597c7f281e687cb7aeb1b.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'anttasks/src/com/android/ant/AaptExecLoopTask.java')
-rw-r--r-- | anttasks/src/com/android/ant/AaptExecLoopTask.java | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/anttasks/src/com/android/ant/AaptExecLoopTask.java b/anttasks/src/com/android/ant/AaptExecLoopTask.java new file mode 100644 index 0000000..d2c7162 --- /dev/null +++ b/anttasks/src/com/android/ant/AaptExecLoopTask.java @@ -0,0 +1,218 @@ +/* + * Copyright (C) 2009 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.ant; + +import com.android.sdklib.project.ApkConfigurationHelper; +import com.android.sdklib.project.ProjectProperties; +import com.android.sdklib.project.ProjectProperties.PropertyType; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.taskdefs.ExecTask; +import org.apache.tools.ant.types.Path; + +import java.io.File; +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; + +/** + * Task able to run an Exec task on aapt several times. + * It does not follow the exec task format, instead it has its own parameters, which maps + * directly to aapt. + * + */ +public final class AaptExecLoopTask extends Task { + + private String mExecutable; + private String mCommand; + private String mManifest; + private String mResources; + private String mAssets; + private String mAndroidJar; + private String mOutFolder; + private String mBaseName; + + /** + * Sets the value of the "executable" attribute. + * @param executable the value. + */ + public void setExecutable(String executable) { + mExecutable = executable; + } + + /** + * Sets the value of the "command" attribute. + * @param command the value. + */ + public void setCommand(String command) { + mCommand = command; + } + + /** + * Sets the value of the "manifest" attribute. + * @param manifest the value. + */ + public void setManifest(Path manifest) { + mManifest = manifest.toString(); + } + + /** + * Sets the value of the "resources" attribute. + * @param resources the value. + */ + public void setResources(Path resources) { + mResources = resources.toString(); + } + + /** + * Sets the value of the "assets" attribute. + * @param assets the value. + */ + public void setAssets(Path assets) { + mAssets = assets.toString(); + } + + /** + * Sets the value of the "androidjar" attribute. + * @param androidJar the value. + */ + public void setAndroidjar(Path androidJar) { + mAndroidJar = androidJar.toString(); + } + + /** + * Sets the value of the "outfolder" attribute. + * @param outFolder the value. + */ + public void setOutfolder(Path outFolder) { + mOutFolder = outFolder.toString(); + } + + /** + * Sets the value of the "basename" attribute. + * @param baseName the value. + */ + public void setBasename(String baseName) { + mBaseName = baseName; + } + + /* + * (non-Javadoc) + * + * Executes the loop. Based on the values inside default.properties, this will + * create alternate temporary ap_ files. + * + * @see org.apache.tools.ant.Task#execute() + */ + @Override + public void execute() throws BuildException { + Project taskProject = getProject(); + + // first do a full resource package + createPackage(null /*configName*/, null /*resourceFilter*/); + + // now see if we need to create file with filtered resources. + // Get the project base directory. + File baseDir = taskProject.getBaseDir(); + ProjectProperties properties = ProjectProperties.load(baseDir.getAbsolutePath(), + PropertyType.DEFAULT); + + Map<String, String> apkConfigs = ApkConfigurationHelper.getConfigs(properties); + if (apkConfigs.size() > 0) { + Set<Entry<String, String>> entrySet = apkConfigs.entrySet(); + for (Entry<String, String> entry : entrySet) { + createPackage(entry.getKey(), entry.getValue()); + } + } + } + + /** + * Creates a resource package. + * @param configName the name of the filter config. Can be null in which case a full resource + * package will be generated. + * @param resourceFilter the resource configuration filter to pass to aapt (if configName is + * non null) + */ + private void createPackage(String configName, String resourceFilter) { + Project taskProject = getProject(); + + if (configName == null || resourceFilter == null) { + System.out.println("Creating full resource package..."); + } else { + System.out.println(String.format( + "Creating resource package for config '%1$s' (%2$s)...", + configName, resourceFilter)); + } + + // create a task for the default apk. + ExecTask task = new ExecTask(); + task.setExecutable(mExecutable); + task.setFailonerror(true); + + // aapt command. Only "package" is supported at this time really. + task.createArg().setValue(mCommand); + + // filters if needed + if (configName != null && resourceFilter != null) { + task.createArg().setValue("-c"); + task.createArg().setValue(resourceFilter); + } + + // force flag + task.createArg().setValue("-f"); + + // manifest location + task.createArg().setValue("-M"); + task.createArg().setValue(mManifest); + + // resources location + task.createArg().setValue("-S"); + task.createArg().setValue(mResources); + + // assets location. this may not exists, and aapt doesn't like it, so we check first. + File assets = new File(mAssets); + if (assets.isDirectory()) { + task.createArg().setValue("-A"); + task.createArg().setValue(mAssets); + } + + // android.jar + task.createArg().setValue("-I"); + task.createArg().setValue(mAndroidJar); + + // out file. This is based on the outFolder, baseName, and the configName (if applicable) + String filename; + if (configName != null && resourceFilter != null) { + filename = mBaseName + "-" + configName + ".ap_"; + } else { + filename = mBaseName + ".ap_"; + } + + File file = new File(mOutFolder, filename); + task.createArg().setValue("-F"); + task.createArg().setValue(file.getAbsolutePath()); + + // final setup of the task + task.setProject(taskProject); + task.setOwningTarget(getOwningTarget()); + + // execute it. + task.execute(); + } +} |