aboutsummaryrefslogtreecommitdiffstats
path: root/anttasks/src/com/android
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@android.com>2013-02-01 14:47:50 -0800
committerXavier Ducrohet <xav@android.com>2013-02-01 14:47:50 -0800
commite9310ad46b41f082518159bdab7a3a722f3f6216 (patch)
tree108c4e92b4ebb9a2d4a8051254e9c3fec28f8e38 /anttasks/src/com/android
parent641afb8bbfa8bc8e980808c22a3e9ecb45008a3c (diff)
downloadsdk-e9310ad46b41f082518159bdab7a3a722f3f6216.zip
sdk-e9310ad46b41f082518159bdab7a3a722f3f6216.tar.gz
sdk-e9310ad46b41f082518159bdab7a3a722f3f6216.tar.bz2
Fix generation of R classes for libraries to support any package name.
Change-Id: I0e4f2c0d56285b911f0210a3cddbed0f5ec05ecc
Diffstat (limited to 'anttasks/src/com/android')
-rw-r--r--anttasks/src/com/android/ant/AaptExecTask.java112
1 files changed, 37 insertions, 75 deletions
diff --git a/anttasks/src/com/android/ant/AaptExecTask.java b/anttasks/src/com/android/ant/AaptExecTask.java
index 257d1b9..a1d44c4 100644
--- a/anttasks/src/com/android/ant/AaptExecTask.java
+++ b/anttasks/src/com/android/ant/AaptExecTask.java
@@ -20,8 +20,8 @@ import com.android.SdkConstants;
import com.android.sdklib.internal.build.SymbolLoader;
import com.android.sdklib.internal.build.SymbolWriter;
import com.android.xml.AndroidXPathFactory;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
@@ -32,12 +32,10 @@ import org.xml.sax.InputSource;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
-import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
import java.util.Set;
import javax.xml.xpath.XPath;
@@ -401,6 +399,7 @@ public final class AaptExecTask extends SingleDependencyTask {
*
* @see org.apache.tools.ant.Task#execute()
*/
+ @SuppressWarnings("deprecation")
@Override
public void execute() throws BuildException {
if (mLibraryResFolderPathRefid == null) {
@@ -706,8 +705,8 @@ public final class AaptExecTask extends SingleDependencyTask {
File rFile = new File(mBinFolder, SdkConstants.FN_RESOURCE_TEXT);
if (rFile.isFile()) {
// Load the full symbols from the full R.txt file.
- SymbolLoader fullSymbols = new SymbolLoader(rFile);
- fullSymbols.load();
+ SymbolLoader fullSymbolValues = new SymbolLoader(rFile);
+ fullSymbolValues.load();
// we have two props which contains list of items. Both items represent
// 2 data of a single property.
@@ -729,66 +728,41 @@ public final class AaptExecTask extends SingleDependencyTask {
mOriginalManifestPackage = getPackageName(mManifestFile);
}
- // simpler case of a single library
- if (packages.length == 1) {
- if (!mOriginalManifestPackage.equals(packages[0])) {
- createRClass(fullSymbols, rFiles[0], packages[0]);
+ Multimap<String, SymbolLoader> libMap = ArrayListMultimap.create();
+
+ // First pass processing the libraries, collecting them by packageName,
+ // and ignoring the ones that have the same package name as the application
+ // (since that R class was already created).
+ for (int i = 0 ; i < packages.length ; i++) {
+ String libPackage = packages[i];
+
+ // skip libraries that have the same package name as the application.
+ if (mOriginalManifestPackage.equals(libPackage)) {
+ continue;
}
- } else {
-
- Map<String, String> libPackages = Maps.newHashMapWithExpectedSize(
- packages.length);
- Set<String> duplicatePackages = Sets.newHashSet();
-
- // preprocessing to figure out if there are dups in the package names of
- // the libraries
- for (int i = 0 ; i < packages.length ; i++) {
- String libPackage = packages[i];
- if (mOriginalManifestPackage.equals(libPackage)) {
- // skip libraries that have the same package name as the application.
- continue;
- }
-
- String existingPkg = libPackages.get(libPackage);
- if (existingPkg != null) {
- // record the dup package and keep going, in case there are all the same
- duplicatePackages.add(libPackage);
- continue;
- }
-
- libPackages.put(libPackage, rFiles[i]);
+
+ File rText = new File(rFiles[i]);
+ if (rText.isFile()) {
+ // load the lib symbols
+ SymbolLoader libSymbols = new SymbolLoader(rText);
+ libSymbols.load();
+
+ // store these symbols by associating them with the package name.
+ libMap.put(libPackage, libSymbols);
}
+ }
- // check if we have duplicate but all files are the same.
- if (duplicatePackages.size() > 0) {
- // possible conflict!
- // detect case of all libraries == same package.
- if (duplicatePackages.size() == 1 && libPackages.size() == 1 &&
- duplicatePackages.iterator().next().equals(libPackages.keySet().iterator().next())) {
- // this is ok, all libraries have the same package.
- // Make a copy of the full R class.
- SymbolWriter writer = new SymbolWriter(mRFolder,
- duplicatePackages.iterator().next(),
- fullSymbols, fullSymbols);
- writer.write();
- } else {
- StringBuilder sb = new StringBuilder();
- sb.append("The following packages have been found to be used by two or more libraries:");
- for (String pkg : duplicatePackages) {
- sb.append("\n\t").append(pkg);
- }
- sb.append("\nNo libraries must share the same package, unless all libraries share the same packages.");
- throw new BuildException(sb.toString());
- }
- } else {
- // no dups, all libraries have different packages.
- // Conflicts with the main package have been removed already.
- // Just process all the libraries from the list where we removed
- // libs that had the same package as the app.
- for (Entry<String, String> lib : libPackages.entrySet()) {
- createRClass(fullSymbols, lib.getValue(), lib.getKey());
- }
+ // now loop on all the package names, merge all the symbols to write,
+ // and write them
+ for (String packageName : libMap.keySet()) {
+ Collection<SymbolLoader> symbols = libMap.get(packageName);
+
+ SymbolWriter writer = new SymbolWriter(mRFolder, packageName,
+ fullSymbolValues);
+ for (SymbolLoader symbolLoader : symbols) {
+ writer.addSymbolsToWrite(symbolLoader);
}
+ writer.write();
}
}
}
@@ -803,18 +777,6 @@ public final class AaptExecTask extends SingleDependencyTask {
}
}
- private void createRClass(SymbolLoader fullSymbols, String libRTxtFile, String libPackage)
- throws IOException {
- File libSymbolFile = new File(libRTxtFile);
- if (libSymbolFile.isFile()) {
- SymbolLoader libSymbols = new SymbolLoader(libSymbolFile);
- libSymbols.load();
-
- SymbolWriter writer = new SymbolWriter(mRFolder, libPackage, libSymbols, fullSymbols);
- writer.write();
- }
- }
-
private String getPackageName(String manifest) {
XPath xpath = AndroidXPathFactory.newXPath();