aboutsummaryrefslogtreecommitdiffstats
path: root/manifmerger
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2012-07-30 13:59:13 -0700
committerTor Norbye <tnorbye@google.com>2012-07-30 14:00:09 -0700
commit0ecd33255e76b00a45c79216c744cb624ba61756 (patch)
treed2c3beb3e42446786a1c5378a3e5ca2670fcd385 /manifmerger
parent627cba9137377a38d3523ac129f502281244b405 (diff)
downloadsdk-0ecd33255e76b00a45c79216c744cb624ba61756.zip
sdk-0ecd33255e76b00a45c79216c744cb624ba61756.tar.gz
sdk-0ecd33255e76b00a45c79216c744cb624ba61756.tar.bz2
Fix manifest merger for non-integer values
The minSdkVersion and targetSdkVersion attributes in a manifest file are allowed to contain non-numeric strings - they can contain codenames such as "JellyBean", when you're targeting a particular preview SDK. The manifest merger would fail to merge manifests where one or more of these attributes weren't numeric, which (for example) meant creating a new project and setting the minSdkVersion to a preview platform would create a non-merged manifest file. Change-Id: Idf0299f21beac003abc3bf55be657b9398c1e535
Diffstat (limited to 'manifmerger')
-rwxr-xr-xmanifmerger/src/com/android/manifmerger/ManifestMerger.java44
1 files changed, 19 insertions, 25 deletions
diff --git a/manifmerger/src/com/android/manifmerger/ManifestMerger.java b/manifmerger/src/com/android/manifmerger/ManifestMerger.java
index 229faa3..d63ecd8 100755
--- a/manifmerger/src/com/android/manifmerger/ManifestMerger.java
+++ b/manifmerger/src/com/android/manifmerger/ManifestMerger.java
@@ -36,7 +36,7 @@ import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
@@ -742,8 +742,8 @@ public class ManifestMerger {
Element destUsesSdk = findFirstElement(mMainDoc, "/manifest/uses-sdk"); //$NON-NLS-1$
Element srcUsesSdk = findFirstElement(libDoc, "/manifest/uses-sdk"); //$NON-NLS-1$
- AtomicInteger destValue = new AtomicInteger(1);
- AtomicInteger srcValue = new AtomicInteger(1);
+ AtomicReference<Object> destValue = new AtomicReference<Object>(1); // String or Integer
+ AtomicReference<Object> srcValue = new AtomicReference<Object>(1);
AtomicBoolean destImplied = new AtomicBoolean(true);
AtomicBoolean srcImplied = new AtomicBoolean(true);
@@ -756,16 +756,17 @@ public class ManifestMerger {
destValue, srcValue,
destImplied, srcImplied);
- if (result) {
+ if (result && destValue.get() instanceof Integer && srcValue.get() instanceof Integer) {
// Make it an error for an application to use a library with a greater
// minSdkVersion. This means the library code may crash unexpectedly.
// TODO it would be nice to be able to work around this in case the
// user think s/he knows what s/he's doing.
// We could define a simple XML comment flag: <!-- @NoMinSdkVersionMergeError -->
- destMinSdk = destValue.get();
+ destMinSdk = (Integer) destValue.get();
- if (destMinSdk < srcValue.get()) {
+ int srcMinSdk = (Integer) srcValue.get();
+ if (destMinSdk < srcMinSdk) {
mLog.conflict(Severity.ERROR,
xmlFileAndLine(destUsesSdk == null ? mMainDoc : destUsesSdk),
xmlFileAndLine(srcUsesSdk == null ? libDoc : srcUsesSdk),
@@ -794,13 +795,14 @@ public class ManifestMerger {
destImplied, srcImplied);
result &= result2;
- if (result2) {
+ if (result2 && destValue.get() instanceof Integer && srcValue.get() instanceof Integer) {
// Make it a warning for an application to use a library with a greater
// targetSdkVersion.
- int destTargetSdk = destImplied.get() ? destMinSdk : destValue.get();
+ int destTargetSdk = destImplied.get() ? destMinSdk : (Integer) destValue.get();
- if (destTargetSdk < srcValue.get()) {
+ int srcMinSdk = (Integer) srcValue.get();
+ if (destTargetSdk < srcMinSdk) {
mLog.conflict(Severity.WARNING,
xmlFileAndLine(destUsesSdk == null ? mMainDoc : destUsesSdk),
xmlFileAndLine(srcUsesSdk == null ? libDoc : srcUsesSdk),
@@ -831,8 +833,8 @@ public class ManifestMerger {
Element destUsesSdk,
Element srcUsesSdk,
String attr,
- AtomicInteger destValue,
- AtomicInteger srcValue,
+ AtomicReference<Object> destValue,
+ AtomicReference<Object> srcValue,
AtomicBoolean destImplied,
AtomicBoolean srcImplied) {
String s = destUsesSdk == null ? "" //$NON-NLS-1$
@@ -846,14 +848,9 @@ public class ManifestMerger {
destImplied.set(false);
}
} catch (NumberFormatException e) {
- // Note: NumberFormatException.toString() has no interesting information
- // so we don't output it.
- mLog.error(Severity.ERROR,
- xmlFileAndLine(destUsesSdk == null ? mMainDoc : destUsesSdk),
- "Failed to parse <uses-sdk %1$sSdkVersion='%2$s'>: must be an integer number.",
- attr,
- s);
- return false;
+ // Versions can contain codenames such as "JellyBean"
+ destValue.set(s);
+ destImplied.set(false);
}
s = srcUsesSdk == null ? "" //$NON-NLS-1$
@@ -866,12 +863,9 @@ public class ManifestMerger {
srcImplied.set(false);
}
} catch (NumberFormatException e) {
- mLog.error(Severity.ERROR,
- xmlFileAndLine(srcUsesSdk == null ? libDoc : srcUsesSdk),
- "Failed to parse <uses-sdk %1$sSdkVersion='%2$s'>: must be an integer number.",
- attr,
- s);
- return false;
+ // Versions can contain codenames such as "JellyBean"
+ destValue.set(s);
+ destImplied.set(false);
}
return true;