Added support for merging <meta-data> elements from <application> in AndroidManifest.

Summary:
ManifestMerger didn't merge <meta-data> elements that were direct children
of <application>. This diff adds support for this scenario.

Test Plan: Unit tests.
diff --git a/third-party/java/aosp/README.txt b/third-party/java/aosp/README.txt
index a419dbf..7a85f29 100644
--- a/third-party/java/aosp/README.txt
+++ b/third-party/java/aosp/README.txt
@@ -9,3 +9,5 @@
 3) In the Android SDK's source code manifmerger, sdklib and utils are separate modules. These are
 copied into a single module which alters certain package paths. For example,
 com.android.SDKConstants becomes com.android.common.SDKConstants.
+4) Added support for re-ordering <activity-alias> so they always go after <activity> elements.
+5) Added support for merging <meta-data> elements of <application>.
\ No newline at end of file
diff --git a/third-party/java/aosp/src/com/android/manifmerger/ManifestMerger.java b/third-party/java/aosp/src/com/android/manifmerger/ManifestMerger.java
index 4a82980..a912c5a 100755
--- a/third-party/java/aosp/src/com/android/manifmerger/ManifestMerger.java
+++ b/third-party/java/aosp/src/com/android/manifmerger/ManifestMerger.java
@@ -56,7 +56,7 @@
  *          except: application:agentBackup if defined, it must match.
  *          (these represent class names and we don't want a lib to assume their app or backup
  *           classes are being used when that will never be the case.)
- *      C- activity / activity-alias / service / receiver / provider
+ *      C- activity / activity-alias / service / receiver / provider / meta-data
  *          => Merge as-is. Error if exists in the destination (same {@code @name})
  *             unless the definitions are exactly the same.
  *             New elements are always merged at the end of the application element.
@@ -290,6 +290,11 @@
 
     // Strategy C
     err |= !mergeNewOrEqual(
+        "/manifest/application/meta-data",                              //$NON-NLS-1$
+        "name",                                                         //$NON-NLS-1$
+        libDoc,
+        true);
+    err |= !mergeNewOrEqual(
         "/manifest/application/activity",                               //$NON-NLS-1$
         "name",                                                         //$NON-NLS-1$
         libDoc,
diff --git a/third-party/java/aosp/tests/src/com/android/manifmerger/ManifestMergerTest.java b/third-party/java/aosp/tests/src/com/android/manifmerger/ManifestMergerTest.java
index 2f7e19d..44f3016 100755
--- a/third-party/java/aosp/tests/src/com/android/manifmerger/ManifestMergerTest.java
+++ b/third-party/java/aosp/tests/src/com/android/manifmerger/ManifestMergerTest.java
@@ -149,4 +149,17 @@
   public void test57_activity_alias() throws Exception {
     processTestFiles();
   }
+
+  public void test58_meta_data() throws Exception {
+    processTestFiles();
+  }
+
+  public void test59_meta_data_conflict() throws Exception {
+    processTestFiles();
+  }
+
+  public void test60_meta_data_dup() throws Exception {
+    processTestFiles();
+  }
 }
+
diff --git a/third-party/java/aosp/tests/src/com/android/manifmerger/data/58_meta_data.xml b/third-party/java/aosp/tests/src/com/android/manifmerger/data/58_meta_data.xml
new file mode 100755
index 0000000..c9f5064
--- /dev/null
+++ b/third-party/java/aosp/tests/src/com/android/manifmerger/data/58_meta_data.xml
@@ -0,0 +1,189 @@
+#
+# Test:
+# - Verifies that <meta-data> elements from <application> are being merged.
+#
+
+@main
+
+<!--
+  This is a canonical manifest that has some uses-permissions,
+  the usual uses-sdk and supports-screens, an app with an activity,
+  customer receiver & service and a widget.
+-->
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.app1"
+    android:versionCode="100"
+    android:versionName="1.0.0">
+
+    <application
+        android:label="@string/app_name"
+        android:icon="@drawable/app_icon"
+        android:name="com.example.TheApp" >
+
+        <meta-data android:name="main.app" android:value="ok" />
+
+        <activity android:name="com.example.MainActivity" >
+            <meta-data android:name="main.activity" android:value="ok" />
+        </activity>
+
+        <service android:name="com.example.MainService">
+            <meta-data android:name="main.service" android:value="ok" />
+        </service>
+
+        <receiver android:name="com.example.MainReceiver">
+            <meta-data android:name="main.receiver" android:value="ok" />
+        </receiver>
+
+        <provider android:name="com.example.MainProvider"
+            android:authorities="com.example.android">
+            <meta-data android:name="main.provider" android:value="ok" />
+        </provider>
+
+    </application>
+
+</manifest>
+
+@lib1
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.lib1">
+
+    <application>
+
+        <meta-data android:name="lib1.app" android:value="ok" />
+
+        <activity android:name="com.example.Lib1Activity" >
+            <meta-data android:name="lib1.activity" android:value="ok" />
+        </activity>
+
+        <service android:name="com.example.Lib1Service">
+            <meta-data android:name="lib1.service" android:value="ok" />
+        </service>
+
+        <receiver android:name="com.example.Lib1Receiver">
+            <meta-data android:name="lib1.receiver" android:value="ok" />
+        </receiver>
+
+        <provider android:name="com.example.Lib1Provider"
+                  android:authorities="com.example.android">
+            <meta-data android:name="lib1.provider" android:value="ok" />
+        </provider>
+
+    </application>
+
+</manifest>
+
+
+@lib2
+
+<manifest
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.example.lib1">
+
+    <application>
+
+        <meta-data android:name="lib2.app" android:value="ok" />
+
+        <activity android:name="com.example.Lib2Activity" >
+            <meta-data android:name="lib2.activity" android:value="ok" />
+        </activity>
+
+        <service android:name="com.example.Lib2Service">
+            <meta-data android:name="lib2.service" android:value="ok" />
+        </service>
+
+        <receiver android:name="com.example.Lib2Receiver">
+            <meta-data android:name="lib2.receiver" android:value="ok" />
+        </receiver>
+
+        <provider android:name="com.example.Lib2Provider"
+                  android:authorities="com.example.android">
+            <meta-data android:name="lib2.provider" android:value="ok" />
+        </provider>
+
+    </application>
+
+</manifest>
+
+@result
+
+<!--
+  This is a canonical manifest that has some uses-permissions,
+  the usual uses-sdk and supports-screens, an app with an activity,
+  customer receiver & service and a widget.
+-->
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.app1"
+    android:versionCode="100"
+    android:versionName="1.0.0">
+
+    <application
+        android:label="@string/app_name"
+        android:icon="@drawable/app_icon"
+        android:name="com.example.TheApp" >
+
+        <meta-data android:name="main.app" android:value="ok" />
+
+        <activity android:name="com.example.MainActivity" >
+            <meta-data android:name="main.activity" android:value="ok" />
+        </activity>
+
+        <service android:name="com.example.MainService">
+            <meta-data android:name="main.service" android:value="ok" />
+        </service>
+
+        <receiver android:name="com.example.MainReceiver">
+            <meta-data android:name="main.receiver" android:value="ok" />
+        </receiver>
+
+        <provider android:name="com.example.MainProvider"
+                  android:authorities="com.example.android">
+            <meta-data android:name="main.provider" android:value="ok" />
+        </provider>
+
+        <meta-data android:name="lib1.app" android:value="ok" />
+
+        <activity android:name="com.example.Lib1Activity" >
+            <meta-data android:name="lib1.activity" android:value="ok" />
+        </activity>
+
+        <service android:name="com.example.Lib1Service">
+            <meta-data android:name="lib1.service" android:value="ok" />
+        </service>
+
+        <receiver android:name="com.example.Lib1Receiver">
+            <meta-data android:name="lib1.receiver" android:value="ok" />
+        </receiver>
+
+        <provider android:name="com.example.Lib1Provider"
+                  android:authorities="com.example.android">
+            <meta-data android:name="lib1.provider" android:value="ok" />
+        </provider>
+
+        <meta-data android:name="lib2.app" android:value="ok" />
+
+        <activity android:name="com.example.Lib2Activity" >
+            <meta-data android:name="lib2.activity" android:value="ok" />
+        </activity>
+
+        <service android:name="com.example.Lib2Service">
+            <meta-data android:name="lib2.service" android:value="ok" />
+        </service>
+
+        <receiver android:name="com.example.Lib2Receiver">
+            <meta-data android:name="lib2.receiver" android:value="ok" />
+        </receiver>
+
+        <provider android:name="com.example.Lib2Provider"
+                  android:authorities="com.example.android">
+            <meta-data android:name="lib2.provider" android:value="ok" />
+        </provider>
+
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/third-party/java/aosp/tests/src/com/android/manifmerger/data/59_meta_data_conflict.xml b/third-party/java/aosp/tests/src/com/android/manifmerger/data/59_meta_data_conflict.xml
new file mode 100755
index 0000000..6f89e72
--- /dev/null
+++ b/third-party/java/aosp/tests/src/com/android/manifmerger/data/59_meta_data_conflict.xml
@@ -0,0 +1,79 @@
+#
+# Test:
+# - Verifies that <meta-data> elements from <application> are being merged.
+#
+
+@fails
+
+@main
+
+<!--
+  This is a canonical manifest that has some uses-permissions,
+  the usual uses-sdk and supports-screens, an app with an activity,
+  customer receiver & service and a widget.
+-->
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.app1"
+    android:versionCode="100"
+    android:versionName="1.0.0">
+
+    <application
+        android:label="@string/app_name"
+        android:icon="@drawable/app_icon"
+        android:name="com.example.TheApp" >
+
+        <meta-data android:name="conflicting.name" android:value="ok" />
+
+    </application>
+
+</manifest>
+
+@lib1
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.lib1">
+
+    <application>
+
+        <meta-data android:name="conflicting.name" android:value="not-ok" />
+
+    </application>
+
+</manifest>
+
+
+@result
+
+<!--
+  This is a canonical manifest that has some uses-permissions,
+  the usual uses-sdk and supports-screens, an app with an activity,
+  customer receiver & service and a widget.
+-->
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.app1"
+    android:versionCode="100"
+    android:versionName="1.0.0">
+
+    <application
+        android:label="@string/app_name"
+        android:icon="@drawable/app_icon"
+        android:name="com.example.TheApp" >
+
+        <meta-data android:name="conflicting.name" android:value="ok" />
+
+    </application>
+
+</manifest>
+
+@errors
+
+E [ManifestMergerTest0_main.xml:5, ManifestMergerTest1_lib1.xml:5] Trying to merge incompatible /manifest/application/meta-data[@name=conflicting.name] element:
+  <meta-data android:name=conflicting.name>
+      @android:name = conflicting.name
+--    @android:value = not-ok
+++    @android:value = ok
\ No newline at end of file
diff --git a/third-party/java/aosp/tests/src/com/android/manifmerger/data/60_meta_data_dup.xml b/third-party/java/aosp/tests/src/com/android/manifmerger/data/60_meta_data_dup.xml
new file mode 100755
index 0000000..07c0ad9
--- /dev/null
+++ b/third-party/java/aosp/tests/src/com/android/manifmerger/data/60_meta_data_dup.xml
@@ -0,0 +1,72 @@
+#
+# Test:
+# - Verifies that <meta-data> elements from <application> are being merged.
+#
+
+@main
+
+<!--
+  This is a canonical manifest that has some uses-permissions,
+  the usual uses-sdk and supports-screens, an app with an activity,
+  customer receiver & service and a widget.
+-->
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.app1"
+    android:versionCode="100"
+    android:versionName="1.0.0">
+
+    <application
+        android:label="@string/app_name"
+        android:icon="@drawable/app_icon"
+        android:name="com.example.TheApp" >
+
+        <meta-data android:name="dup.value" android:value="ok" />
+
+    </application>
+
+</manifest>
+
+@lib1
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.lib1">
+
+    <application>
+
+        <meta-data android:name="dup.value" android:value="ok" />
+
+    </application>
+
+</manifest>
+
+@result
+
+<!--
+  This is a canonical manifest that has some uses-permissions,
+  the usual uses-sdk and supports-screens, an app with an activity,
+  customer receiver & service and a widget.
+-->
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.app1"
+    android:versionCode="100"
+    android:versionName="1.0.0">
+
+    <application
+        android:label="@string/app_name"
+        android:icon="@drawable/app_icon"
+        android:name="com.example.TheApp" >
+
+        <meta-data android:name="dup.value" android:value="ok" />
+
+    </application>
+
+</manifest>
+
+@errors
+
+P [ManifestMergerTest0_main.xml:5, ManifestMergerTest1_lib1.xml:5] Skipping identical /manifest/application/meta-data[@name=dup.value] element.
\ No newline at end of file