aboutsummaryrefslogtreecommitdiffstats
path: root/manifmerger
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2012-10-25 12:13:28 -0700
committerTor Norbye <tnorbye@google.com>2012-10-25 12:14:08 -0700
commitea762f7cd0714854f72eb30d61fb0eced01dd628 (patch)
tree5f7896ca9282ae210f544bac3d9c191832be2dc6 /manifmerger
parent1506fc5ab1fc54f8bcfc6d28382907f5b39843f8 (diff)
downloadsdk-ea762f7cd0714854f72eb30d61fb0eced01dd628.zip
sdk-ea762f7cd0714854f72eb30d61fb0eced01dd628.tar.gz
sdk-ea762f7cd0714854f72eb30d61fb0eced01dd628.tar.bz2
Avoid inlining the package prefix when adding activities
Change-Id: Ie4d5d0faa26d554e683d10392db306fc619914e6
Diffstat (limited to 'manifmerger')
-rwxr-xr-xmanifmerger/src/com/android/manifmerger/ManifestMerger.java67
-rwxr-xr-xmanifmerger/tests/src/com/android/manifmerger/ManifestMergerTest.java8
-rwxr-xr-xmanifmerger/tests/src/com/android/manifmerger/ManifestMergerTestCase.java5
-rwxr-xr-xmanifmerger/tests/src/com/android/manifmerger/data/70_expand_fqcns.xml84
-rwxr-xr-xmanifmerger/tests/src/com/android/manifmerger/data/71_prefixes_enable_extractprefix.xml84
5 files changed, 248 insertions, 0 deletions
diff --git a/manifmerger/src/com/android/manifmerger/ManifestMerger.java b/manifmerger/src/com/android/manifmerger/ManifestMerger.java
index ded4eac..073c768 100755
--- a/manifmerger/src/com/android/manifmerger/ManifestMerger.java
+++ b/manifmerger/src/com/android/manifmerger/ManifestMerger.java
@@ -128,6 +128,8 @@ public class ManifestMerger {
private final ICallback mCallback;
private XPath mXPath;
private Document mMainDoc;
+ /** Option to extract our package prefixes in the merged manifest */
+ private boolean mExtractPackagePrefix;
/** Namespace for Android attributes in an AndroidManifest.xml */
private static final String NS_URI = SdkConstants.NS_RESOURCES;
@@ -172,6 +174,17 @@ public class ManifestMerger {
}
/**
+ * Sets whether the manifest merger should extract package prefixes
+ *
+ * @param extract if true, extract package prefixes
+ * @return this, for constructor chaining
+ */
+ public ManifestMerger setExtractPackagePrefix(boolean extract) {
+ mExtractPackagePrefix = extract;
+ return this;
+ }
+
+ /**
* Performs the merge operation.
* <p/>
* This does NOT stop on errors, in an attempt to accumulate as much
@@ -250,6 +263,11 @@ public class ManifestMerger {
}
cleanupToolsAttributes(mainDoc);
+
+ if (mExtractPackagePrefix) {
+ extractFqcns(mainDoc);
+ }
+
mXPath = null;
mMainDoc = null;
return success;
@@ -456,6 +474,55 @@ public class ManifestMerger {
}
/**
+ * Extracts the fully qualified class names from the manifest and uses the
+ * prefix notation relative to the manifest package. This basically reverses
+ * the effects of {@link #expandFqcns(Document)}, though of course it may
+ * also remove prefixes which were inlined in the original documents.
+ *
+ * @param doc the document in which to extract the FQCNs.
+ */
+ private void extractFqcns(Document doc) {
+ // Find the package attribute of the manifest.
+ String pkg = null;
+ Element manifest = findFirstElement(doc, "/manifest");
+ if (manifest != null) {
+ pkg = manifest.getAttribute("package");
+ }
+
+ if (pkg == null || pkg.length() == 0) {
+ return;
+ }
+
+ int pkgLength = pkg.length();
+ for (String elementAttr : sClassAttributes) {
+ String[] names = elementAttr.split("/");
+ if (names.length != 2) {
+ continue;
+ }
+ String elemName = names[0];
+ String attrName = names[1];
+ NodeList elements = doc.getElementsByTagName(elemName);
+ for (int i = 0; i < elements.getLength(); i++) {
+ Node elem = elements.item(i);
+ if (elem instanceof Element) {
+ Attr attr = ((Element) elem).getAttributeNodeNS(NS_URI, attrName);
+ if (attr != null) {
+ String value = attr.getNodeValue();
+
+ // We know it's a shortened FQCN if it starts with a dot
+ // or does not contain any dot.
+ if (value != null && value.length() > pkgLength &&
+ value.startsWith(pkg) && value.charAt(pkgLength) == '.') {
+ value = value.substring(pkgLength);
+ attr.setNodeValue(value);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
* Checks (but does not merge) the application attributes using the following rules:
* <pre>
* - {@code @name}: Ignore if empty. Warning if its expanded FQCN doesn't match the main doc.
diff --git a/manifmerger/tests/src/com/android/manifmerger/ManifestMergerTest.java b/manifmerger/tests/src/com/android/manifmerger/ManifestMergerTest.java
index 717533a..6da0bb9 100755
--- a/manifmerger/tests/src/com/android/manifmerger/ManifestMergerTest.java
+++ b/manifmerger/tests/src/com/android/manifmerger/ManifestMergerTest.java
@@ -177,4 +177,12 @@ public class ManifestMergerTest extends ManifestMergerTestCase {
public void test69_remove_uses() throws Exception {
processTestFiles();
}
+
+ public void test70_expand_fqcns() throws Exception {
+ processTestFiles();
+ }
+
+ public void test71_prefixes_enable_extractprefix() throws Exception {
+ processTestFiles();
+ }
}
diff --git a/manifmerger/tests/src/com/android/manifmerger/ManifestMergerTestCase.java b/manifmerger/tests/src/com/android/manifmerger/ManifestMergerTestCase.java
index b044c3a..eb3a215 100755
--- a/manifmerger/tests/src/com/android/manifmerger/ManifestMergerTestCase.java
+++ b/manifmerger/tests/src/com/android/manifmerger/ManifestMergerTestCase.java
@@ -410,6 +410,11 @@ abstract class ManifestMergerTestCase extends TestCase {
return ICallback.UNKNOWN_CODENAME;
}
});
+
+ // Test name contains "enable_extractprefix" to enable manifest extract prefix
+ if (getName().contains("enable_extractprefix")) {
+ merger.setExtractPackagePrefix(true);
+ }
boolean processOK = merger.process(testFiles.getActualResult(),
testFiles.getMain(),
testFiles.getLibs(),
diff --git a/manifmerger/tests/src/com/android/manifmerger/data/70_expand_fqcns.xml b/manifmerger/tests/src/com/android/manifmerger/data/70_expand_fqcns.xml
new file mode 100755
index 0000000..5864345
--- /dev/null
+++ b/manifmerger/tests/src/com/android/manifmerger/data/70_expand_fqcns.xml
@@ -0,0 +1,84 @@
+#
+# Test the option to extract prefixes
+#
+
+@main
+
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.blankactivity5"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="11"
+ android:targetSdkVersion="16" />
+
+ <application
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme" >
+ <activity
+ android:name=".MainActivity"
+ android:label="@string/app_name" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
+
+@lib1
+
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.blankactivity5" >
+
+ <application>
+ <activity
+ android:name=".FooActivity"
+ android:label="@string/title_activity_foo" >
+ </activity>
+ </application>
+
+</manifest>
+
+@result
+
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.blankactivity5"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="11"
+ android:targetSdkVersion="16" />
+
+ <application
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme" >
+ <activity
+ android:name="com.example.blankactivity5.MainActivity"
+ android:label="@string/app_name" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity
+ android:name="com.example.blankactivity5.FooActivity"
+ android:label="@string/title_activity_foo" >
+ </activity>
+ </application>
+
+</manifest>
+
+@errors
+
+
diff --git a/manifmerger/tests/src/com/android/manifmerger/data/71_prefixes_enable_extractprefix.xml b/manifmerger/tests/src/com/android/manifmerger/data/71_prefixes_enable_extractprefix.xml
new file mode 100755
index 0000000..dd11dcc
--- /dev/null
+++ b/manifmerger/tests/src/com/android/manifmerger/data/71_prefixes_enable_extractprefix.xml
@@ -0,0 +1,84 @@
+#
+# Test the option to extract prefixes
+#
+
+@main
+
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.blankactivity5"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="11"
+ android:targetSdkVersion="16" />
+
+ <application
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme" >
+ <activity
+ android:name=".MainActivity"
+ android:label="@string/app_name" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
+
+@lib1
+
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.blankactivity5" >
+
+ <application>
+ <activity
+ android:name=".FooActivity"
+ android:label="@string/title_activity_foo" >
+ </activity>
+ </application>
+
+</manifest>
+
+@result
+
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.blankactivity5"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="11"
+ android:targetSdkVersion="16" />
+
+ <application
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme" >
+ <activity
+ android:name=".MainActivity"
+ android:label="@string/app_name" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity
+ android:name=".FooActivity"
+ android:label="@string/title_activity_foo" >
+ </activity>
+ </application>
+
+</manifest>
+
+@errors
+
+