AAPT2: Remove usage of u16string

For legacy reasons, we kept around the use of UTF-16 internally
in AAPT2. We don't need this and this CL removes all instances of
std::u16string and StringPiece16. The only places still needed
are when interacting with the ResTable APIs that only operate in
UTF16.

Change-Id: I492475b84bb9014fa13bf992cff447ee7a5fe588
diff --git a/tools/aapt2/xml/XmlActionExecutor.cpp b/tools/aapt2/xml/XmlActionExecutor.cpp
index 0ef67ea..745079c 100644
--- a/tools/aapt2/xml/XmlActionExecutor.cpp
+++ b/tools/aapt2/xml/XmlActionExecutor.cpp
@@ -57,8 +57,7 @@
 
     for (Element* childEl : el->getChildElements()) {
         if (childEl->namespaceUri.empty()) {
-            std::map<std::u16string, XmlNodeAction>::const_iterator iter =
-                    mMap.find(childEl->name);
+            std::map<std::string, XmlNodeAction>::const_iterator iter = mMap.find(childEl->name);
             if (iter != mMap.end()) {
                 error |= !iter->second.execute(policy, diag, childEl);
                 continue;
@@ -91,7 +90,7 @@
     }
 
     if (el->namespaceUri.empty()) {
-        std::map<std::u16string, XmlNodeAction>::const_iterator iter = mMap.find(el->name);
+        std::map<std::string, XmlNodeAction>::const_iterator iter = mMap.find(el->name);
         if (iter != mMap.end()) {
             return iter->second.execute(policy, &sourceDiag, el);
         }
diff --git a/tools/aapt2/xml/XmlActionExecutor.h b/tools/aapt2/xml/XmlActionExecutor.h
index 36b94db..cad508c 100644
--- a/tools/aapt2/xml/XmlActionExecutor.h
+++ b/tools/aapt2/xml/XmlActionExecutor.h
@@ -55,7 +55,7 @@
      * Find or create a child XmlNodeAction that will be performed for the child element
      * with the name `name`.
      */
-    XmlNodeAction& operator[](const std::u16string& name) {
+    XmlNodeAction& operator[](const std::string& name) {
         return mMap[name];
     }
 
@@ -70,7 +70,7 @@
 
     bool execute(XmlActionExecutorPolicy policy, SourcePathDiagnostics* diag, Element* el) const;
 
-    std::map<std::u16string, XmlNodeAction> mMap;
+    std::map<std::string, XmlNodeAction> mMap;
     std::vector<ActionFuncWithDiag> mActions;
 };
 
@@ -86,7 +86,7 @@
      * Find or create a root XmlNodeAction that will be performed for the root XML element
      * with the name `name`.
      */
-    XmlNodeAction& operator[](const std::u16string& name) {
+    XmlNodeAction& operator[](const std::string& name) {
         return mMap[name];
     }
 
@@ -97,7 +97,7 @@
     bool execute(XmlActionExecutorPolicy policy, IDiagnostics* diag, XmlResource* doc) const;
 
 private:
-    std::map<std::u16string, XmlNodeAction> mMap;
+    std::map<std::string, XmlNodeAction> mMap;
 
     DISALLOW_COPY_AND_ASSIGN(XmlActionExecutor);
 };
diff --git a/tools/aapt2/xml/XmlActionExecutor_test.cpp b/tools/aapt2/xml/XmlActionExecutor_test.cpp
index ebf287a..106e856 100644
--- a/tools/aapt2/xml/XmlActionExecutor_test.cpp
+++ b/tools/aapt2/xml/XmlActionExecutor_test.cpp
@@ -22,8 +22,8 @@
 
 TEST(XmlActionExecutorTest, BuildsAccessibleNestedPattern) {
     XmlActionExecutor executor;
-    XmlNodeAction& manifestAction = executor[u"manifest"];
-    XmlNodeAction& applicationAction = manifestAction[u"application"];
+    XmlNodeAction& manifestAction = executor["manifest"];
+    XmlNodeAction& applicationAction = manifestAction["application"];
 
     Element* manifestEl = nullptr;
     manifestAction.action([&](Element* manifest) -> bool {
@@ -42,15 +42,15 @@
     StdErrDiagnostics diag;
     ASSERT_TRUE(executor.execute(XmlActionExecutorPolicy::None, &diag, doc.get()));
     ASSERT_NE(nullptr, manifestEl);
-    EXPECT_EQ(std::u16string(u"manifest"), manifestEl->name);
+    EXPECT_EQ(std::string("manifest"), manifestEl->name);
 
     ASSERT_NE(nullptr, applicationEl);
-    EXPECT_EQ(std::u16string(u"application"), applicationEl->name);
+    EXPECT_EQ(std::string("application"), applicationEl->name);
 }
 
 TEST(XmlActionExecutorTest, FailsWhenUndefinedHierarchyExists) {
     XmlActionExecutor executor;
-    executor[u"manifest"][u"application"];
+    executor["manifest"]["application"];
 
     std::unique_ptr<XmlResource> doc = test::buildXmlDom(
             "<manifest><application /><activity /></manifest>");
diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp
index 0ce333a..39bd5bf 100644
--- a/tools/aapt2/xml/XmlDom.cpp
+++ b/tools/aapt2/xml/XmlDom.cpp
@@ -33,13 +33,13 @@
 struct Stack {
     std::unique_ptr<xml::Node> root;
     std::stack<xml::Node*> nodeStack;
-    std::u16string pendingComment;
+    std::string pendingComment;
 };
 
 /**
  * Extracts the namespace and name of an expanded element or attribute name.
  */
-static void splitName(const char* name, std::u16string* outNs, std::u16string* outName) {
+static void splitName(const char* name, std::string* outNs, std::string* outName) {
     const char* p = name;
     while (*p != 0 && *p != kXmlNamespaceSep) {
         p++;
@@ -47,10 +47,10 @@
 
     if (*p == 0) {
         outNs->clear();
-        *outName = util::utf8ToUtf16(name);
+        *outName = StringPiece(name).toString();
     } else {
-        *outNs = util::utf8ToUtf16(StringPiece(name, (p - name)));
-        *outName = util::utf8ToUtf16(p + 1);
+        *outNs = StringPiece(name, (p - name)).toString();
+        *outName = StringPiece(p + 1).toString();
     }
 }
 
@@ -76,11 +76,11 @@
 
     std::unique_ptr<Namespace> ns = util::make_unique<Namespace>();
     if (prefix) {
-        ns->namespacePrefix = util::utf8ToUtf16(prefix);
+        ns->namespacePrefix = StringPiece(prefix).toString();
     }
 
     if (uri) {
-        ns->namespaceUri = util::utf8ToUtf16(uri);
+        ns->namespaceUri = StringPiece(uri).toString();
     }
 
     addToStack(stack, parser, std::move(ns));
@@ -109,7 +109,7 @@
     while (*attrs) {
         Attribute attribute;
         splitName(*attrs++, &attribute.namespaceUri, &attribute.name);
-        attribute.value = util::utf8ToUtf16(*attrs++);
+        attribute.value = StringPiece(*attrs++).toString();
 
         // Insert in sorted order.
         auto iter = std::lower_bound(el->attributes.begin(), el->attributes.end(), attribute,
@@ -144,14 +144,14 @@
         if (!currentParent->children.empty()) {
             Node* lastChild = currentParent->children.back().get();
             if (Text* text = nodeCast<Text>(lastChild)) {
-                text->text += util::utf8ToUtf16(StringPiece(s, len));
+                text->text += StringPiece(s, len).toString();
                 return;
             }
         }
     }
 
     std::unique_ptr<Text> text = util::make_unique<Text>();
-    text->text = util::utf8ToUtf16(StringPiece(s, len));
+    text->text = StringPiece(s, len).toString();
     addToStack(stack, parser, std::move(text));
 }
 
@@ -162,7 +162,7 @@
     if (!stack->pendingComment.empty()) {
         stack->pendingComment += '\n';
     }
-    stack->pendingComment += util::utf8ToUtf16(comment);
+    stack->pendingComment += comment;
 }
 
 std::unique_ptr<XmlResource> inflate(std::istream* in, IDiagnostics* diag, const Source& source) {
@@ -209,17 +209,17 @@
             size_t len;
             const char16_t* str16 = parser->getAttributeNamespace(i, &len);
             if (str16) {
-                attr.namespaceUri.assign(str16, len);
+                attr.namespaceUri = util::utf16ToUtf8(StringPiece16(str16, len));
             }
 
             str16 = parser->getAttributeName(i, &len);
             if (str16) {
-                attr.name.assign(str16, len);
+                attr.name = util::utf16ToUtf8(StringPiece16(str16, len));
             }
 
             str16 = parser->getAttributeStringValue(i, &len);
             if (str16) {
-                attr.value.assign(str16, len);
+                attr.value = util::utf16ToUtf8(StringPiece16(str16, len));
             }
             el->attributes.push_back(std::move(attr));
         }
@@ -250,12 +250,12 @@
                 size_t len;
                 const char16_t* str16 = tree.getNamespacePrefix(&len);
                 if (str16) {
-                    node->namespacePrefix.assign(str16, len);
+                    node->namespacePrefix = util::utf16ToUtf8(StringPiece16(str16, len));
                 }
 
                 str16 = tree.getNamespaceUri(&len);
                 if (str16) {
-                    node->namespaceUri.assign(str16, len);
+                    node->namespaceUri = util::utf16ToUtf8(StringPiece16(str16, len));
                 }
                 newNode = std::move(node);
                 break;
@@ -266,12 +266,12 @@
                 size_t len;
                 const char16_t* str16 = tree.getElementNamespace(&len);
                 if (str16) {
-                    node->namespaceUri.assign(str16, len);
+                    node->namespaceUri = util::utf16ToUtf8(StringPiece16(str16, len));
                 }
 
                 str16 = tree.getElementName(&len);
                 if (str16) {
-                    node->name.assign(str16, len);
+                    node->name = util::utf16ToUtf8(StringPiece16(str16, len));
                 }
 
                 copyAttributes(node.get(), &tree);
@@ -285,7 +285,7 @@
                 size_t len;
                 const char16_t* str16 = tree.getText(&len);
                 if (str16) {
-                    node->text.assign(str16, len);
+                    node->text = util::utf16ToUtf8(StringPiece16(str16, len));
                 }
                 newNode = std::move(node);
                 break;
@@ -347,7 +347,7 @@
     children.push_back(std::move(child));
 }
 
-Attribute* Element::findAttribute(const StringPiece16& ns, const StringPiece16& name) {
+Attribute* Element::findAttribute(const StringPiece& ns, const StringPiece& name) {
     for (auto& attr : attributes) {
         if (ns == attr.namespaceUri && name == attr.name) {
             return &attr;
@@ -356,13 +356,13 @@
     return nullptr;
 }
 
-Element* Element::findChild(const StringPiece16& ns, const StringPiece16& name) {
+Element* Element::findChild(const StringPiece& ns, const StringPiece& name) {
     return findChildWithAttribute(ns, name, {}, {}, {});
 }
 
-Element* Element::findChildWithAttribute(const StringPiece16& ns, const StringPiece16& name,
-                                         const StringPiece16& attrNs, const StringPiece16& attrName,
-                                         const StringPiece16& attrValue) {
+Element* Element::findChildWithAttribute(const StringPiece& ns, const StringPiece& name,
+                                         const StringPiece& attrNs, const StringPiece& attrName,
+                                         const StringPiece& attrValue) {
     for (auto& childNode : children) {
         Node* child = childNode.get();
         while (nodeCast<Namespace>(child)) {
@@ -422,7 +422,7 @@
 }
 
 Maybe<ExtractedPackage> PackageAwareVisitor::transformPackageAlias(
-       const StringPiece16& alias, const StringPiece16& localPackage) const {
+       const StringPiece& alias, const StringPiece& localPackage) const {
    if (alias.empty()) {
        return ExtractedPackage{ localPackage.toString(), false /* private */ };
    }
diff --git a/tools/aapt2/xml/XmlDom.h b/tools/aapt2/xml/XmlDom.h
index b374d20..d083d82 100644
--- a/tools/aapt2/xml/XmlDom.h
+++ b/tools/aapt2/xml/XmlDom.h
@@ -41,7 +41,7 @@
     Node* parent = nullptr;
     size_t lineNumber = 0;
     size_t columnNumber = 0;
-    std::u16string comment;
+    std::string comment;
     std::vector<std::unique_ptr<Node>> children;
 
     virtual ~Node() = default;
@@ -63,8 +63,8 @@
  * A Namespace XML node. Can only have one child.
  */
 struct Namespace : public BaseNode<Namespace> {
-    std::u16string namespacePrefix;
-    std::u16string namespaceUri;
+    std::string namespacePrefix;
+    std::string namespaceUri;
 };
 
 struct AaptAttribute {
@@ -76,9 +76,9 @@
  * An XML attribute.
  */
 struct Attribute {
-    std::u16string namespaceUri;
-    std::u16string name;
-    std::u16string value;
+    std::string namespaceUri;
+    std::string name;
+    std::string value;
 
     Maybe<AaptAttribute> compiledAttribute;
     std::unique_ptr<Item> compiledValue;
@@ -88,16 +88,16 @@
  * An Element XML node.
  */
 struct Element : public BaseNode<Element> {
-    std::u16string namespaceUri;
-    std::u16string name;
+    std::string namespaceUri;
+    std::string name;
     std::vector<Attribute> attributes;
 
-    Attribute* findAttribute(const StringPiece16& ns, const StringPiece16& name);
-    xml::Element* findChild(const StringPiece16& ns, const StringPiece16& name);
-    xml::Element* findChildWithAttribute(const StringPiece16& ns, const StringPiece16& name,
-                                         const StringPiece16& attrNs,
-                                         const StringPiece16& attrName,
-                                         const StringPiece16& attrValue);
+    Attribute* findAttribute(const StringPiece& ns, const StringPiece& name);
+    xml::Element* findChild(const StringPiece& ns, const StringPiece& name);
+    xml::Element* findChildWithAttribute(const StringPiece& ns, const StringPiece& name,
+                                         const StringPiece& attrNs,
+                                         const StringPiece& attrName,
+                                         const StringPiece& attrValue);
     std::vector<xml::Element*> getChildElements();
 };
 
@@ -105,7 +105,7 @@
  * A Text (CDATA) XML node. Can not have any children.
  */
 struct Text : public BaseNode<Text> {
-    std::u16string text;
+    std::string text;
 };
 
 /**
@@ -175,7 +175,7 @@
 class PackageAwareVisitor : public Visitor, public IPackageDeclStack {
 private:
     struct PackageDecl {
-        std::u16string prefix;
+        std::string prefix;
         ExtractedPackage package;
     };
 
@@ -186,7 +186,7 @@
 
     void visit(Namespace* ns) override;
     Maybe<ExtractedPackage> transformPackageAlias(
-            const StringPiece16& alias, const StringPiece16& localPackage) const override;
+            const StringPiece& alias, const StringPiece& localPackage) const override;
 };
 
 // Implementations
diff --git a/tools/aapt2/xml/XmlDom_test.cpp b/tools/aapt2/xml/XmlDom_test.cpp
index 431ee2c..1909f75 100644
--- a/tools/aapt2/xml/XmlDom_test.cpp
+++ b/tools/aapt2/xml/XmlDom_test.cpp
@@ -43,8 +43,8 @@
 
     xml::Namespace* ns = xml::nodeCast<xml::Namespace>(doc->root.get());
     ASSERT_NE(ns, nullptr);
-    EXPECT_EQ(ns->namespaceUri, u"http://schemas.android.com/apk/res/android");
-    EXPECT_EQ(ns->namespacePrefix, u"android");
+    EXPECT_EQ(ns->namespaceUri, xml::kSchemaAndroid);
+    EXPECT_EQ(ns->namespacePrefix, "android");
 }
 
 } // namespace aapt
diff --git a/tools/aapt2/xml/XmlPullParser.cpp b/tools/aapt2/xml/XmlPullParser.cpp
index 323ec05..4a944f1 100644
--- a/tools/aapt2/xml/XmlPullParser.cpp
+++ b/tools/aapt2/xml/XmlPullParser.cpp
@@ -98,7 +98,7 @@
     return mLastError;
 }
 
-const std::u16string& XmlPullParser::getComment() const {
+const std::string& XmlPullParser::getComment() const {
     return mEventQueue.front().data1;
 }
 
@@ -110,14 +110,14 @@
     return mEventQueue.front().depth;
 }
 
-const std::u16string& XmlPullParser::getText() const {
+const std::string& XmlPullParser::getText() const {
     if (getEvent() != Event::kText) {
         return mEmpty;
     }
     return mEventQueue.front().data1;
 }
 
-const std::u16string& XmlPullParser::getNamespacePrefix() const {
+const std::string& XmlPullParser::getNamespacePrefix() const {
     const Event currentEvent = getEvent();
     if (currentEvent != Event::kStartNamespace && currentEvent != Event::kEndNamespace) {
         return mEmpty;
@@ -125,7 +125,7 @@
     return mEventQueue.front().data1;
 }
 
-const std::u16string& XmlPullParser::getNamespaceUri() const {
+const std::string& XmlPullParser::getNamespaceUri() const {
     const Event currentEvent = getEvent();
     if (currentEvent != Event::kStartNamespace && currentEvent != Event::kEndNamespace) {
         return mEmpty;
@@ -134,7 +134,7 @@
 }
 
 Maybe<ExtractedPackage> XmlPullParser::transformPackageAlias(
-        const StringPiece16& alias, const StringPiece16& localPackage) const {
+        const StringPiece& alias, const StringPiece& localPackage) const {
     if (alias.empty()) {
         return ExtractedPackage{ localPackage.toString(), false /* private */ };
     }
@@ -152,7 +152,7 @@
     return {};
 }
 
-const std::u16string& XmlPullParser::getElementNamespace() const {
+const std::string& XmlPullParser::getElementNamespace() const {
     const Event currentEvent = getEvent();
     if (currentEvent != Event::kStartElement && currentEvent != Event::kEndElement) {
         return mEmpty;
@@ -160,7 +160,7 @@
     return mEventQueue.front().data1;
 }
 
-const std::u16string& XmlPullParser::getElementName() const {
+const std::string& XmlPullParser::getElementName() const {
     const Event currentEvent = getEvent();
     if (currentEvent != Event::kStartElement && currentEvent != Event::kEndElement) {
         return mEmpty;
@@ -186,31 +186,31 @@
 /**
  * Extracts the namespace and name of an expanded element or attribute name.
  */
-static void splitName(const char* name, std::u16string& outNs, std::u16string& outName) {
+static void splitName(const char* name, std::string& outNs, std::string& outName) {
     const char* p = name;
     while (*p != 0 && *p != kXmlNamespaceSep) {
         p++;
     }
 
     if (*p == 0) {
-        outNs = std::u16string();
-        outName = util::utf8ToUtf16(name);
+        outNs = std::string();
+        outName = name;
     } else {
-        outNs = util::utf8ToUtf16(StringPiece(name, (p - name)));
-        outName = util::utf8ToUtf16(p + 1);
+        outNs = StringPiece(name, (p - name)).toString();
+        outName = p + 1;
     }
 }
 
 void XMLCALL XmlPullParser::startNamespaceHandler(void* userData, const char* prefix,
         const char* uri) {
     XmlPullParser* parser = reinterpret_cast<XmlPullParser*>(userData);
-    std::u16string namespaceUri = uri != nullptr ? util::utf8ToUtf16(uri) : std::u16string();
+    std::string namespaceUri = uri != nullptr ? uri : std::string();
     parser->mNamespaceUris.push(namespaceUri);
     parser->mEventQueue.push(EventData{
             Event::kStartNamespace,
             XML_GetCurrentLineNumber(parser->mParser),
             parser->mDepth++,
-            prefix != nullptr ? util::utf8ToUtf16(prefix) : std::u16string(),
+            prefix != nullptr ? prefix : std::string(),
             namespaceUri
     });
 }
@@ -227,7 +227,7 @@
     while (*attrs) {
         Attribute attribute;
         splitName(*attrs++, attribute.namespaceUri, attribute.name);
-        attribute.value = util::utf8ToUtf16(*attrs++);
+        attribute.value = *attrs++;
 
         // Insert in sorted order.
         auto iter = std::lower_bound(data.attributes.begin(), data.attributes.end(), attribute);
@@ -245,7 +245,7 @@
             Event::kText,
             XML_GetCurrentLineNumber(parser->mParser),
             parser->mDepth,
-            util::utf8ToUtf16(StringPiece(s, len))
+            StringPiece(s, len).toString()
     });
 }
 
@@ -268,7 +268,7 @@
             Event::kEndNamespace,
             XML_GetCurrentLineNumber(parser->mParser),
             --(parser->mDepth),
-            prefix != nullptr ? util::utf8ToUtf16(prefix) : std::u16string(),
+            prefix != nullptr ? prefix : std::string(),
             parser->mNamespaceUris.top()
     });
     parser->mNamespaceUris.pop();
@@ -281,22 +281,22 @@
             Event::kComment,
             XML_GetCurrentLineNumber(parser->mParser),
             parser->mDepth,
-            util::utf8ToUtf16(comment)
+            comment
     });
 }
 
-Maybe<StringPiece16> findAttribute(const XmlPullParser* parser, const StringPiece16& name) {
-    auto iter = parser->findAttribute(u"", name);
+Maybe<StringPiece> findAttribute(const XmlPullParser* parser, const StringPiece& name) {
+    auto iter = parser->findAttribute("", name);
     if (iter != parser->endAttributes()) {
-        return StringPiece16(util::trimWhitespace(iter->value));
+        return StringPiece(util::trimWhitespace(iter->value));
     }
     return {};
 }
 
-Maybe<StringPiece16> findNonEmptyAttribute(const XmlPullParser* parser, const StringPiece16& name) {
-    auto iter = parser->findAttribute(u"", name);
+Maybe<StringPiece> findNonEmptyAttribute(const XmlPullParser* parser, const StringPiece& name) {
+    auto iter = parser->findAttribute("", name);
     if (iter != parser->endAttributes()) {
-        StringPiece16 trimmed = util::trimWhitespace(iter->value);
+        StringPiece trimmed = util::trimWhitespace(iter->value);
         if (!trimmed.empty()) {
             return trimmed;
         }
diff --git a/tools/aapt2/xml/XmlPullParser.h b/tools/aapt2/xml/XmlPullParser.h
index 7e7070e..ee51b36 100644
--- a/tools/aapt2/xml/XmlPullParser.h
+++ b/tools/aapt2/xml/XmlPullParser.h
@@ -80,28 +80,28 @@
     // These are available for all nodes.
     //
 
-    const std::u16string& getComment() const;
+    const std::string& getComment() const;
     size_t getLineNumber() const;
     size_t getDepth() const;
 
     /**
      * Returns the character data for a Text event.
      */
-    const std::u16string& getText() const;
+    const std::string& getText() const;
 
     //
     // Namespace prefix and URI are available for StartNamespace and EndNamespace.
     //
 
-    const std::u16string& getNamespacePrefix() const;
-    const std::u16string& getNamespaceUri() const;
+    const std::string& getNamespacePrefix() const;
+    const std::string& getNamespaceUri() const;
 
     //
     // These are available for StartElement and EndElement.
     //
 
-    const std::u16string& getElementNamespace() const;
-    const std::u16string& getElementName() const;
+    const std::string& getElementNamespace() const;
+    const std::string& getElementName() const;
 
     /*
      * Uses the current stack of namespaces to resolve the package. Eg:
@@ -115,7 +115,7 @@
      * 'package' will be set to 'defaultPackage'.
      */
     Maybe<ExtractedPackage> transformPackageAlias(
-            const StringPiece16& alias, const StringPiece16& localPackage) const override;
+            const StringPiece& alias, const StringPiece& localPackage) const override;
 
     //
     // Remaining methods are for retrieving information about attributes
@@ -126,9 +126,9 @@
     //
 
     struct Attribute {
-        std::u16string namespaceUri;
-        std::u16string name;
-        std::u16string value;
+        std::string namespaceUri;
+        std::string name;
+        std::string value;
 
         int compare(const Attribute& rhs) const;
         bool operator<(const Attribute& rhs) const;
@@ -141,7 +141,7 @@
     const_iterator beginAttributes() const;
     const_iterator endAttributes() const;
     size_t getAttributeCount() const;
-    const_iterator findAttribute(StringPiece16 namespaceUri, StringPiece16 name) const;
+    const_iterator findAttribute(StringPiece namespaceUri, StringPiece name) const;
 
 private:
     static void XMLCALL startNamespaceHandler(void* userData, const char* prefix, const char* uri);
@@ -155,8 +155,8 @@
         Event event;
         size_t lineNumber;
         size_t depth;
-        std::u16string data1;
-        std::u16string data2;
+        std::string data1;
+        std::string data2;
         std::vector<Attribute> attributes;
     };
 
@@ -165,12 +165,12 @@
     char mBuffer[16384];
     std::queue<EventData> mEventQueue;
     std::string mLastError;
-    const std::u16string mEmpty;
+    const std::string mEmpty;
     size_t mDepth;
-    std::stack<std::u16string> mNamespaceUris;
+    std::stack<std::string> mNamespaceUris;
 
     struct PackageDecl {
-        std::u16string prefix;
+        std::string prefix;
         ExtractedPackage package;
     };
     std::vector<PackageDecl> mPackageAliases;
@@ -179,13 +179,13 @@
 /**
  * Finds the attribute in the current element within the global namespace.
  */
-Maybe<StringPiece16> findAttribute(const XmlPullParser* parser, const StringPiece16& name);
+Maybe<StringPiece> findAttribute(const XmlPullParser* parser, const StringPiece& name);
 
 /**
  * Finds the attribute in the current element within the global namespace. The attribute's value
  * must not be the empty string.
  */
-Maybe<StringPiece16> findNonEmptyAttribute(const XmlPullParser* parser, const StringPiece16& name);
+Maybe<StringPiece> findNonEmptyAttribute(const XmlPullParser* parser, const StringPiece& name);
 
 //
 // Implementation
@@ -270,12 +270,12 @@
     return compare(rhs) != 0;
 }
 
-inline XmlPullParser::const_iterator XmlPullParser::findAttribute(StringPiece16 namespaceUri,
-                                                                  StringPiece16 name) const {
+inline XmlPullParser::const_iterator XmlPullParser::findAttribute(StringPiece namespaceUri,
+                                                                  StringPiece name) const {
     const auto endIter = endAttributes();
     const auto iter = std::lower_bound(beginAttributes(), endIter,
-            std::pair<StringPiece16, StringPiece16>(namespaceUri, name),
-            [](const Attribute& attr, const std::pair<StringPiece16, StringPiece16>& rhs) -> bool {
+            std::pair<StringPiece, StringPiece>(namespaceUri, name),
+            [](const Attribute& attr, const std::pair<StringPiece, StringPiece>& rhs) -> bool {
                 int cmp = attr.namespaceUri.compare(0, attr.namespaceUri.size(),
                         rhs.first.data(), rhs.first.size());
                 if (cmp < 0) return true;
diff --git a/tools/aapt2/xml/XmlPullParser_test.cpp b/tools/aapt2/xml/XmlPullParser_test.cpp
index 8fa2c6d..2c1fdc7 100644
--- a/tools/aapt2/xml/XmlPullParser_test.cpp
+++ b/tools/aapt2/xml/XmlPullParser_test.cpp
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
+#include "test/Test.h"
 #include "util/StringPiece.h"
 #include "xml/XmlPullParser.h"
 
-#include <gtest/gtest.h>
 #include <sstream>
 
 namespace aapt {
@@ -32,21 +32,21 @@
     ASSERT_TRUE(xml::XmlPullParser::nextChildNode(&parser, depthOuter));
 
     EXPECT_EQ(xml::XmlPullParser::Event::kStartElement, parser.getEvent());
-    EXPECT_EQ(StringPiece16(u"a"), StringPiece16(parser.getElementName()));
+    EXPECT_EQ(StringPiece("a"), StringPiece(parser.getElementName()));
 
     const size_t depthA = parser.getDepth();
     ASSERT_TRUE(xml::XmlPullParser::nextChildNode(&parser, depthA));
     EXPECT_EQ(xml::XmlPullParser::Event::kStartElement, parser.getEvent());
-    EXPECT_EQ(StringPiece16(u"b"), StringPiece16(parser.getElementName()));
+    EXPECT_EQ(StringPiece("b"), StringPiece(parser.getElementName()));
 
     const size_t depthB = parser.getDepth();
     ASSERT_TRUE(xml::XmlPullParser::nextChildNode(&parser, depthB));
     EXPECT_EQ(xml::XmlPullParser::Event::kStartElement, parser.getEvent());
-    EXPECT_EQ(StringPiece16(u"c"), StringPiece16(parser.getElementName()));
+    EXPECT_EQ(StringPiece("c"), StringPiece(parser.getElementName()));
 
     ASSERT_TRUE(xml::XmlPullParser::nextChildNode(&parser, depthB));
     EXPECT_EQ(xml::XmlPullParser::Event::kStartElement, parser.getEvent());
-    EXPECT_EQ(StringPiece16(u"e"), StringPiece16(parser.getElementName()));
+    EXPECT_EQ(StringPiece("e"), StringPiece(parser.getElementName()));
 
     ASSERT_FALSE(xml::XmlPullParser::nextChildNode(&parser, depthOuter));
     EXPECT_EQ(xml::XmlPullParser::Event::kEndDocument, parser.getEvent());
diff --git a/tools/aapt2/xml/XmlUtil.cpp b/tools/aapt2/xml/XmlUtil.cpp
index ab9f544..0e9d005 100644
--- a/tools/aapt2/xml/XmlUtil.cpp
+++ b/tools/aapt2/xml/XmlUtil.cpp
@@ -23,19 +23,25 @@
 namespace aapt {
 namespace xml {
 
-Maybe<ExtractedPackage> extractPackageFromNamespace(const std::u16string& namespaceUri) {
-    if (util::stringStartsWith<char16_t>(namespaceUri, kSchemaPublicPrefix)) {
-        StringPiece16 schemaPrefix = kSchemaPublicPrefix;
-        StringPiece16 package = namespaceUri;
+std::string buildPackageNamespace(const StringPiece& package) {
+    std::string result = kSchemaPublicPrefix;
+    result.append(package.data(), package.size());
+    return result;
+}
+
+Maybe<ExtractedPackage> extractPackageFromNamespace(const std::string& namespaceUri) {
+    if (util::stringStartsWith(namespaceUri, kSchemaPublicPrefix)) {
+        StringPiece schemaPrefix = kSchemaPublicPrefix;
+        StringPiece package = namespaceUri;
         package = package.substr(schemaPrefix.size(), package.size() - schemaPrefix.size());
         if (package.empty()) {
             return {};
         }
         return ExtractedPackage{ package.toString(), false /* isPrivate */ };
 
-    } else if (util::stringStartsWith<char16_t>(namespaceUri, kSchemaPrivatePrefix)) {
-        StringPiece16 schemaPrefix = kSchemaPrivatePrefix;
-        StringPiece16 package = namespaceUri;
+    } else if (util::stringStartsWith(namespaceUri, kSchemaPrivatePrefix)) {
+        StringPiece schemaPrefix = kSchemaPrivatePrefix;
+        StringPiece package = namespaceUri;
         package = package.substr(schemaPrefix.size(), package.size() - schemaPrefix.size());
         if (package.empty()) {
             return {};
@@ -43,13 +49,13 @@
         return ExtractedPackage{ package.toString(), true /* isPrivate */ };
 
     } else if (namespaceUri == kSchemaAuto) {
-        return ExtractedPackage{ std::u16string(), true /* isPrivate */ };
+        return ExtractedPackage{ std::string(), true /* isPrivate */ };
     }
     return {};
 }
 
 void transformReferenceFromNamespace(IPackageDeclStack* declStack,
-                                     const StringPiece16& localPackage, Reference* inRef) {
+                                     const StringPiece& localPackage, Reference* inRef) {
     if (inRef->name) {
         if (Maybe<ExtractedPackage> transformedPackage =
                    declStack->transformPackageAlias(inRef->name.value().package, localPackage)) {
diff --git a/tools/aapt2/xml/XmlUtil.h b/tools/aapt2/xml/XmlUtil.h
index 98e5520..f0d59b7 100644
--- a/tools/aapt2/xml/XmlUtil.h
+++ b/tools/aapt2/xml/XmlUtil.h
@@ -25,10 +25,10 @@
 namespace aapt {
 namespace xml {
 
-constexpr const char16_t* kSchemaAuto = u"http://schemas.android.com/apk/res-auto";
-constexpr const char16_t* kSchemaPublicPrefix = u"http://schemas.android.com/apk/res/";
-constexpr const char16_t* kSchemaPrivatePrefix = u"http://schemas.android.com/apk/prv/res/";
-constexpr const char16_t* kSchemaAndroid = u"http://schemas.android.com/apk/res/android";
+constexpr const char* kSchemaAuto = "http://schemas.android.com/apk/res-auto";
+constexpr const char* kSchemaPublicPrefix = "http://schemas.android.com/apk/res/";
+constexpr const char* kSchemaPrivatePrefix = "http://schemas.android.com/apk/prv/res/";
+constexpr const char* kSchemaAndroid = "http://schemas.android.com/apk/res/android";
 
 /**
  * Result of extracting a package name from a namespace URI declaration.
@@ -38,7 +38,7 @@
      * The name of the package. This can be the empty string, which means that the package
      * should be assumed to be the package being compiled.
      */
-    std::u16string package;
+    std::string package;
 
     /**
      * True if the package's private namespace was declared. This means that private resources
@@ -55,7 +55,14 @@
  * Special case: if namespaceUri is http://schemas.android.com/apk/res-auto,
  * returns an empty package name.
  */
-Maybe<ExtractedPackage> extractPackageFromNamespace(const std::u16string& namespaceUri);
+Maybe<ExtractedPackage> extractPackageFromNamespace(const std::string& namespaceUri);
+
+/**
+ * Returns an XML Android namespace for the given package of the form:
+ *
+ * http://schemas.android.com/apk/res/<package>
+ */
+std::string buildPackageNamespace(const StringPiece& package);
 
 /**
  * Interface representing a stack of XML namespace declarations. When looking up the package
@@ -68,7 +75,7 @@
      * Returns an ExtractedPackage struct if the alias given corresponds with a package declaration.
      */
     virtual Maybe<ExtractedPackage> transformPackageAlias(
-            const StringPiece16& alias, const StringPiece16& localPackage) const = 0;
+            const StringPiece& alias, const StringPiece& localPackage) const = 0;
 };
 
 /**
@@ -77,7 +84,7 @@
  * the package declaration was private.
  */
 void transformReferenceFromNamespace(IPackageDeclStack* declStack,
-                                     const StringPiece16& localPackage, Reference* inRef);
+                                     const StringPiece& localPackage, Reference* inRef);
 
 } // namespace xml
 } // namespace aapt
diff --git a/tools/aapt2/xml/XmlUtil_test.cpp b/tools/aapt2/xml/XmlUtil_test.cpp
index 319e770..cbeb8bc 100644
--- a/tools/aapt2/xml/XmlUtil_test.cpp
+++ b/tools/aapt2/xml/XmlUtil_test.cpp
@@ -14,40 +14,37 @@
  * limitations under the License.
  */
 
-#include "test/Common.h"
+#include "test/Test.h"
 #include "xml/XmlUtil.h"
 
-#include <gtest/gtest.h>
-
 namespace aapt {
 
 TEST(XmlUtilTest, ExtractPackageFromNamespace) {
-    AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace(u"com.android"));
-    AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace(u"http://schemas.android.com/apk"));
-    AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/res"));
-    AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/res/"));
-    AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace(
-            u"http://schemas.android.com/apk/prv/res/"));
+    AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace("com.android"));
+    AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace("http://schemas.android.com/apk"));
+    AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace("http://schemas.android.com/apk/res"));
+    AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace("http://schemas.android.com/apk/res/"));
+    AAPT_ASSERT_FALSE(xml::extractPackageFromNamespace("http://schemas.android.com/apk/prv/res/"));
 
     Maybe<xml::ExtractedPackage> p =
-            xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/res/a");
+            xml::extractPackageFromNamespace("http://schemas.android.com/apk/res/a");
     AAPT_ASSERT_TRUE(p);
-    EXPECT_EQ(std::u16string(u"a"), p.value().package);
+    EXPECT_EQ(std::string("a"), p.value().package);
     EXPECT_FALSE(p.value().privateNamespace);
 
-    p = xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/prv/res/android");
+    p = xml::extractPackageFromNamespace("http://schemas.android.com/apk/prv/res/android");
     AAPT_ASSERT_TRUE(p);
-    EXPECT_EQ(std::u16string(u"android"), p.value().package);
+    EXPECT_EQ(std::string("android"), p.value().package);
     EXPECT_TRUE(p.value().privateNamespace);
 
-    p = xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/prv/res/com.test");
+    p = xml::extractPackageFromNamespace("http://schemas.android.com/apk/prv/res/com.test");
     AAPT_ASSERT_TRUE(p);
-    EXPECT_EQ(std::u16string(u"com.test"), p.value().package);
+    EXPECT_EQ(std::string("com.test"), p.value().package);
     EXPECT_TRUE(p.value().privateNamespace);
 
-    p = xml::extractPackageFromNamespace(u"http://schemas.android.com/apk/res-auto");
+    p = xml::extractPackageFromNamespace("http://schemas.android.com/apk/res-auto");
     AAPT_ASSERT_TRUE(p);
-    EXPECT_EQ(std::u16string(), p.value().package);
+    EXPECT_EQ(std::string(), p.value().package);
     EXPECT_TRUE(p.value().privateNamespace);
 }