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/java/AnnotationProcessor.cpp b/tools/aapt2/java/AnnotationProcessor.cpp
index b7e7f90..23ff8ab 100644
--- a/tools/aapt2/java/AnnotationProcessor.cpp
+++ b/tools/aapt2/java/AnnotationProcessor.cpp
@@ -47,23 +47,13 @@
     mComment << "\n * " << std::move(comment);
 }
 
-void AnnotationProcessor::appendComment(const StringPiece16& comment) {
-    // We need to process line by line to clean-up whitespace and append prefixes.
-    for (StringPiece16 line : util::tokenize(comment, u'\n')) {
-        line = util::trimWhitespace(line);
-        if (!line.empty()) {
-            std::string utf8Line = util::utf16ToUtf8(line);
-            appendCommentLine(utf8Line);
-        }
-    }
-}
-
 void AnnotationProcessor::appendComment(const StringPiece& comment) {
+    // We need to process line by line to clean-up whitespace and append prefixes.
     for (StringPiece line : util::tokenize(comment, '\n')) {
         line = util::trimWhitespace(line);
         if (!line.empty()) {
-            std::string utf8Line = line.toString();
-            appendCommentLine(utf8Line);
+            std::string lineCopy = line.toString();
+            appendCommentLine(lineCopy);
         }
     }
 }
@@ -75,7 +65,7 @@
 void AnnotationProcessor::writeToStream(std::ostream* out, const StringPiece& prefix) const {
     if (mHasComments) {
         std::string result = mComment.str();
-        for (StringPiece line : util::tokenize<char>(result, '\n')) {
+        for (StringPiece line : util::tokenize(result, '\n')) {
            *out << prefix << line << "\n";
         }
         *out << prefix << " */" << "\n";
diff --git a/tools/aapt2/java/AnnotationProcessor.h b/tools/aapt2/java/AnnotationProcessor.h
index 8309dd9..cfc32f3 100644
--- a/tools/aapt2/java/AnnotationProcessor.h
+++ b/tools/aapt2/java/AnnotationProcessor.h
@@ -57,7 +57,6 @@
      * Adds more comments. Since resources can have various values with different configurations,
      * we need to collect all the comments.
      */
-    void appendComment(const StringPiece16& comment);
     void appendComment(const StringPiece& comment);
 
     void appendNewLine();
diff --git a/tools/aapt2/java/JavaClassGenerator.cpp b/tools/aapt2/java/JavaClassGenerator.cpp
index 84df0b4..fbaefb1 100644
--- a/tools/aapt2/java/JavaClassGenerator.cpp
+++ b/tools/aapt2/java/JavaClassGenerator.cpp
@@ -19,7 +19,6 @@
 #include "ResourceTable.h"
 #include "ResourceValues.h"
 #include "ValueVisitor.h"
-
 #include "java/AnnotationProcessor.h"
 #include "java/ClassDefinition.h"
 #include "java/JavaClassGenerator.h"
@@ -39,20 +38,20 @@
         mContext(context), mTable(table), mOptions(options) {
 }
 
-static const std::set<StringPiece16> sJavaIdentifiers = {
-    u"abstract", u"assert", u"boolean", u"break", u"byte",
-    u"case", u"catch", u"char", u"class", u"const", u"continue",
-    u"default", u"do", u"double", u"else", u"enum", u"extends",
-    u"final", u"finally", u"float", u"for", u"goto", u"if",
-    u"implements", u"import", u"instanceof", u"int", u"interface",
-    u"long", u"native", u"new", u"package", u"private", u"protected",
-    u"public", u"return", u"short", u"static", u"strictfp", u"super",
-    u"switch", u"synchronized", u"this", u"throw", u"throws",
-    u"transient", u"try", u"void", u"volatile", u"while", u"true",
-    u"false", u"null"
+static const std::set<StringPiece> sJavaIdentifiers = {
+    "abstract", "assert", "boolean", "break", "byte",
+    "case", "catch", "char", "class", "const", "continue",
+    "default", "do", "double", "else", "enum", "extends",
+    "final", "finally", "float", "for", "goto", "if",
+    "implements", "import", "instanceof", "int", "interface",
+    "long", "native", "new", "package", "private", "protected",
+    "public", "return", "short", "static", "strictfp", "super",
+    "switch", "synchronized", "this", "throw", "throws",
+    "transient", "try", "void", "volatile", "while", "true",
+    "false", "null"
 };
 
-static bool isValidSymbol(const StringPiece16& symbol) {
+static bool isValidSymbol(const StringPiece& symbol) {
     return sJavaIdentifiers.find(symbol) == sJavaIdentifiers.end();
 }
 
@@ -60,8 +59,8 @@
  * Java symbols can not contain . or -, but those are valid in a resource name.
  * Replace those with '_'.
  */
-static std::string transform(const StringPiece16& symbol) {
-    std::string output = util::utf16ToUtf8(symbol);
+static std::string transform(const StringPiece& symbol) {
+    std::string output = symbol.toString();
     for (char& c : output) {
         if (c == '.' || c == '-') {
             c = '_';
@@ -83,7 +82,7 @@
  */
 static std::string transformNestedAttr(const ResourceNameRef& attrName,
                                        const std::string& styleableClassName,
-                                       const StringPiece16& packageNameToGenerate) {
+                                       const StringPiece& packageNameToGenerate) {
     std::string output = styleableClassName;
 
     // We may reference IDs from other packages, so prefix the entry name with
@@ -204,8 +203,8 @@
     }
 }
 
-void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& packageNameToGenerate,
-                                                    const std::u16string& entryName,
+void JavaClassGenerator::addMembersToStyleableClass(const StringPiece& packageNameToGenerate,
+                                                    const std::string& entryName,
                                                     const Styleable* styleable,
                                                     ClassDefinition* outStyleableClassDef) {
     const std::string className = transform(entryName);
@@ -284,8 +283,8 @@
                 continue;
             }
 
-            StringPiece16 attrCommentLine = entry.symbol->attribute->getComment();
-            if (attrCommentLine.contains(StringPiece16(u"@removed"))) {
+            StringPiece attrCommentLine = entry.symbol->attribute->getComment();
+            if (attrCommentLine.contains("@removed")) {
                 // Removed attributes are public but hidden from the documentation, so don't emit
                 // them as part of the class documentation.
                 continue;
@@ -354,12 +353,12 @@
             continue;
         }
 
-        StringPiece16 comment = styleableAttr.attrRef->getComment();
+        StringPiece comment = styleableAttr.attrRef->getComment();
         if (styleableAttr.symbol->attribute && comment.empty()) {
             comment = styleableAttr.symbol->attribute->getComment();
         }
 
-        if (comment.contains(StringPiece16(u"@removed"))) {
+        if (comment.contains("@removed")) {
             // Removed attributes are public but hidden from the documentation, so don't emit them
             // as part of the class documentation.
             continue;
@@ -367,7 +366,7 @@
 
         const ResourceName& attrName = styleableAttr.attrRef->name.value();
 
-        StringPiece16 packageName = attrName.package;
+        StringPiece packageName = attrName.package;
         if (packageName.empty()) {
             packageName = mContext->getCompilationPackage();
         }
@@ -403,7 +402,7 @@
     }
 }
 
-bool JavaClassGenerator::addMembersToTypeClass(const StringPiece16& packageNameToGenerate,
+bool JavaClassGenerator::addMembersToTypeClass(const StringPiece& packageNameToGenerate,
                                                const ResourceTablePackage* package,
                                                const ResourceTableType* type,
                                                ClassDefinition* outTypeClassDef) {
@@ -418,8 +417,8 @@
             id = ResourceId(package->id.value(), type->id.value(), entry->id.value());
         }
 
-        std::u16string unmangledPackage;
-        std::u16string unmangledName = entry->name;
+        std::string unmangledPackage;
+        std::string unmangledName = entry->name;
         if (NameMangler::unmangle(&unmangledName, &unmangledPackage)) {
             // The entry name was mangled, and we successfully unmangled it.
             // Check that we want to emit this symbol.
@@ -481,7 +480,7 @@
     return true;
 }
 
-bool JavaClassGenerator::generate(const StringPiece16& packageNameToGenerate, std::ostream* out) {
+bool JavaClassGenerator::generate(const StringPiece& packageNameToGenerate, std::ostream* out) {
     return generate(packageNameToGenerate, packageNameToGenerate, out);
 }
 
@@ -494,8 +493,8 @@
     }
 }
 
-bool JavaClassGenerator::generate(const StringPiece16& packageNameToGenerate,
-                                  const StringPiece16& outPackageName, std::ostream* out) {
+bool JavaClassGenerator::generate(const StringPiece& packageNameToGenerate,
+                                  const StringPiece& outPackageName, std::ostream* out) {
 
     ClassDefinition rClass("R", ClassQualifier::None, true);
 
@@ -509,8 +508,7 @@
                     (mOptions.types == JavaClassGeneratorOptions::SymbolTypes::kPublic);
 
             std::unique_ptr<ClassDefinition> classDef = util::make_unique<ClassDefinition>(
-                    util::utf16ToUtf8(toString(type->type)), ClassQualifier::Static,
-                    forceCreationIfEmpty);
+                    toString(type->type), ClassQualifier::Static, forceCreationIfEmpty);
 
             bool result = addMembersToTypeClass(packageNameToGenerate, package.get(), type.get(),
                                                 classDef.get());
@@ -545,8 +543,7 @@
 
     appendJavaDocAnnotations(mOptions.javadocAnnotations, rClass.getCommentBuilder());
 
-    if (!ClassDefinition::writeJavaFile(&rClass, util::utf16ToUtf8(outPackageName),
-                                        mOptions.useFinal, out)) {
+    if (!ClassDefinition::writeJavaFile(&rClass, outPackageName, mOptions.useFinal, out)) {
         return false;
     }
 
diff --git a/tools/aapt2/java/JavaClassGenerator.h b/tools/aapt2/java/JavaClassGenerator.h
index 77e0ed7..901a86e 100644
--- a/tools/aapt2/java/JavaClassGenerator.h
+++ b/tools/aapt2/java/JavaClassGenerator.h
@@ -66,22 +66,22 @@
      * We need to generate these symbols in a separate file.
      * Returns true on success.
      */
-    bool generate(const StringPiece16& packageNameToGenerate, std::ostream* out);
+    bool generate(const StringPiece& packageNameToGenerate, std::ostream* out);
 
-    bool generate(const StringPiece16& packageNameToGenerate,
-                  const StringPiece16& outputPackageName,
+    bool generate(const StringPiece& packageNameToGenerate,
+                  const StringPiece& outputPackageName,
                   std::ostream* out);
 
     const std::string& getError() const;
 
 private:
-    bool addMembersToTypeClass(const StringPiece16& packageNameToGenerate,
+    bool addMembersToTypeClass(const StringPiece& packageNameToGenerate,
                                const ResourceTablePackage* package,
                                const ResourceTableType* type,
                                ClassDefinition* outTypeClassDef);
 
-    void addMembersToStyleableClass(const StringPiece16& packageNameToGenerate,
-                                    const std::u16string& entryName,
+    void addMembersToStyleableClass(const StringPiece& packageNameToGenerate,
+                                    const std::string& entryName,
                                     const Styleable* styleable,
                                     ClassDefinition* outStyleableClassDef);
 
diff --git a/tools/aapt2/java/JavaClassGenerator_test.cpp b/tools/aapt2/java/JavaClassGenerator_test.cpp
index 46266b3..57a8047 100644
--- a/tools/aapt2/java/JavaClassGenerator_test.cpp
+++ b/tools/aapt2/java/JavaClassGenerator_test.cpp
@@ -25,40 +25,40 @@
 
 TEST(JavaClassGeneratorTest, FailWhenEntryIsJavaKeyword) {
     std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId(u"android", 0x01)
-            .addSimple(u"@android:id/class", ResourceId(0x01020000))
+            .setPackageId("android", 0x01)
+            .addSimple("@android:id/class", ResourceId(0x01020000))
             .build();
 
     std::unique_ptr<IAaptContext> context = test::ContextBuilder()
             .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
+            .setNameManglerPolicy(NameManglerPolicy{ "android" })
             .build();
     JavaClassGenerator generator(context.get(), table.get(), {});
 
     std::stringstream out;
-    EXPECT_FALSE(generator.generate(u"android", &out));
+    EXPECT_FALSE(generator.generate("android", &out));
 }
 
 TEST(JavaClassGeneratorTest, TransformInvalidJavaIdentifierCharacter) {
     std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId(u"android", 0x01)
-            .addSimple(u"@android:id/hey-man", ResourceId(0x01020000))
-            .addValue(u"@android:attr/cool.attr", ResourceId(0x01010000),
+            .setPackageId("android", 0x01)
+            .addSimple("@android:id/hey-man", ResourceId(0x01020000))
+            .addValue("@android:attr/cool.attr", ResourceId(0x01010000),
                       test::AttributeBuilder(false).build())
-            .addValue(u"@android:styleable/hey.dude", ResourceId(0x01030000),
+            .addValue("@android:styleable/hey.dude", ResourceId(0x01030000),
                       test::StyleableBuilder()
-                              .addItem(u"@android:attr/cool.attr", ResourceId(0x01010000))
+                              .addItem("@android:attr/cool.attr", ResourceId(0x01010000))
                               .build())
             .build();
 
     std::unique_ptr<IAaptContext> context = test::ContextBuilder()
             .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
+            .setNameManglerPolicy(NameManglerPolicy{ "android" })
             .build();
     JavaClassGenerator generator(context.get(), table.get(), {});
 
     std::stringstream out;
-    EXPECT_TRUE(generator.generate(u"android", &out));
+    EXPECT_TRUE(generator.generate("android", &out));
 
     std::string output = out.str();
 
@@ -74,18 +74,18 @@
 
 TEST(JavaClassGeneratorTest, CorrectPackageNameIsUsed) {
     std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId(u"android", 0x01)
-            .addSimple(u"@android:id/one", ResourceId(0x01020000))
-            .addSimple(u"@android:id/com.foo$two", ResourceId(0x01020001))
+            .setPackageId("android", 0x01)
+            .addSimple("@android:id/one", ResourceId(0x01020000))
+            .addSimple("@android:id/com.foo$two", ResourceId(0x01020001))
             .build();
 
     std::unique_ptr<IAaptContext> context = test::ContextBuilder()
             .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
+            .setNameManglerPolicy(NameManglerPolicy{ "android" })
             .build();
     JavaClassGenerator generator(context.get(), table.get(), {});
     std::stringstream out;
-    ASSERT_TRUE(generator.generate(u"android", u"com.android.internal", &out));
+    ASSERT_TRUE(generator.generate("android", "com.android.internal", &out));
 
     std::string output = out.str();
     EXPECT_NE(std::string::npos, output.find("package com.android.internal;"));
@@ -96,18 +96,18 @@
 
 TEST(JavaClassGeneratorTest, AttrPrivateIsWrittenAsAttr) {
     std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId(u"android", 0x01)
-            .addSimple(u"@android:attr/two", ResourceId(0x01010001))
-            .addSimple(u"@android:^attr-private/one", ResourceId(0x01010000))
+            .setPackageId("android", 0x01)
+            .addSimple("@android:attr/two", ResourceId(0x01010001))
+            .addSimple("@android:^attr-private/one", ResourceId(0x01010000))
             .build();
 
     std::unique_ptr<IAaptContext> context = test::ContextBuilder()
             .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
+            .setNameManglerPolicy(NameManglerPolicy{ "android" })
             .build();
     JavaClassGenerator generator(context.get(), table.get(), {});
     std::stringstream out;
-    ASSERT_TRUE(generator.generate(u"android", &out));
+    ASSERT_TRUE(generator.generate("android", &out));
 
     std::string output = out.str();
     EXPECT_NE(std::string::npos, output.find("public static final class attr"));
@@ -117,17 +117,17 @@
 TEST(JavaClassGeneratorTest, OnlyWritePublicResources) {
     StdErrDiagnostics diag;
     std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId(u"android", 0x01)
-            .addSimple(u"@android:id/one", ResourceId(0x01020000))
-            .addSimple(u"@android:id/two", ResourceId(0x01020001))
-            .addSimple(u"@android:id/three", ResourceId(0x01020002))
-            .setSymbolState(u"@android:id/one", ResourceId(0x01020000), SymbolState::kPublic)
-            .setSymbolState(u"@android:id/two", ResourceId(0x01020001), SymbolState::kPrivate)
+            .setPackageId("android", 0x01)
+            .addSimple("@android:id/one", ResourceId(0x01020000))
+            .addSimple("@android:id/two", ResourceId(0x01020001))
+            .addSimple("@android:id/three", ResourceId(0x01020002))
+            .setSymbolState("@android:id/one", ResourceId(0x01020000), SymbolState::kPublic)
+            .setSymbolState("@android:id/two", ResourceId(0x01020001), SymbolState::kPrivate)
             .build();
 
     std::unique_ptr<IAaptContext> context = test::ContextBuilder()
             .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
+            .setNameManglerPolicy(NameManglerPolicy{ "android" })
             .build();
 
     JavaClassGeneratorOptions options;
@@ -135,7 +135,7 @@
     {
         JavaClassGenerator generator(context.get(), table.get(), options);
         std::stringstream out;
-        ASSERT_TRUE(generator.generate(u"android", &out));
+        ASSERT_TRUE(generator.generate("android", &out));
         std::string output = out.str();
         EXPECT_NE(std::string::npos, output.find("public static final int one=0x01020000;"));
         EXPECT_EQ(std::string::npos, output.find("two"));
@@ -146,7 +146,7 @@
     {
         JavaClassGenerator generator(context.get(), table.get(), options);
         std::stringstream out;
-        ASSERT_TRUE(generator.generate(u"android", &out));
+        ASSERT_TRUE(generator.generate("android", &out));
         std::string output = out.str();
         EXPECT_NE(std::string::npos, output.find("public static final int one=0x01020000;"));
         EXPECT_NE(std::string::npos, output.find("public static final int two=0x01020001;"));
@@ -157,7 +157,7 @@
     {
         JavaClassGenerator generator(context.get(), table.get(), options);
         std::stringstream out;
-        ASSERT_TRUE(generator.generate(u"android", &out));
+        ASSERT_TRUE(generator.generate("android", &out));
         std::string output = out.str();
         EXPECT_NE(std::string::npos, output.find("public static final int one=0x01020000;"));
         EXPECT_NE(std::string::npos, output.find("public static final int two=0x01020001;"));
@@ -198,27 +198,27 @@
 
 TEST(JavaClassGeneratorTest, EmitOtherPackagesAttributesInStyleable) {
     std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-                .setPackageId(u"android", 0x01)
-                .setPackageId(u"com.lib", 0x02)
-                .addValue(u"@android:attr/bar", ResourceId(0x01010000),
+                .setPackageId("android", 0x01)
+                .setPackageId("com.lib", 0x02)
+                .addValue("@android:attr/bar", ResourceId(0x01010000),
                           test::AttributeBuilder(false).build())
-                .addValue(u"@com.lib:attr/bar", ResourceId(0x02010000),
+                .addValue("@com.lib:attr/bar", ResourceId(0x02010000),
                            test::AttributeBuilder(false).build())
-                .addValue(u"@android:styleable/foo", ResourceId(0x01030000),
+                .addValue("@android:styleable/foo", ResourceId(0x01030000),
                           test::StyleableBuilder()
-                                  .addItem(u"@android:attr/bar", ResourceId(0x01010000))
-                                  .addItem(u"@com.lib:attr/bar", ResourceId(0x02010000))
+                                  .addItem("@android:attr/bar", ResourceId(0x01010000))
+                                  .addItem("@com.lib:attr/bar", ResourceId(0x02010000))
                                   .build())
                 .build();
 
     std::unique_ptr<IAaptContext> context = test::ContextBuilder()
             .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
+            .setNameManglerPolicy(NameManglerPolicy{ "android" })
             .build();
     JavaClassGenerator generator(context.get(), table.get(), {});
 
     std::stringstream out;
-    EXPECT_TRUE(generator.generate(u"android", &out));
+    EXPECT_TRUE(generator.generate("android", &out));
 
     std::string output = out.str();
     EXPECT_NE(std::string::npos, output.find("int foo_bar="));
@@ -227,19 +227,19 @@
 
 TEST(JavaClassGeneratorTest, CommentsForSimpleResourcesArePresent) {
     std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId(u"android", 0x01)
-            .addSimple(u"@android:id/foo", ResourceId(0x01010000))
+            .setPackageId("android", 0x01)
+            .addSimple("@android:id/foo", ResourceId(0x01010000))
             .build();
-    test::getValue<Id>(table.get(), u"@android:id/foo")
-            ->setComment(std::u16string(u"This is a comment\n@deprecated"));
+    test::getValue<Id>(table.get(), "@android:id/foo")
+            ->setComment(std::string("This is a comment\n@deprecated"));
 
     std::unique_ptr<IAaptContext> context = test::ContextBuilder()
             .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
+            .setNameManglerPolicy(NameManglerPolicy{ "android" })
             .build();
     JavaClassGenerator generator(context.get(), table.get(), {});
     std::stringstream out;
-    ASSERT_TRUE(generator.generate(u"android", &out));
+    ASSERT_TRUE(generator.generate("android", &out));
     std::string actual = out.str();
 
     const char* expectedText =
@@ -259,59 +259,56 @@
 
 TEST(JavaClassGeneratorTest, CommentsForStyleablesAndNestedAttributesArePresent) {
     Attribute attr(false);
-    attr.setComment(StringPiece16(u"This is an attribute"));
+    attr.setComment(StringPiece("This is an attribute"));
 
     Styleable styleable;
-    styleable.entries.push_back(Reference(test::parseNameOrDie(u"@android:attr/one")));
-    styleable.setComment(StringPiece16(u"This is a styleable"));
+    styleable.entries.push_back(Reference(test::parseNameOrDie("@android:attr/one")));
+    styleable.setComment(StringPiece("This is a styleable"));
 
     std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId(u"android", 0x01)
-            .addValue(u"@android:attr/one", util::make_unique<Attribute>(attr))
-            .addValue(u"@android:styleable/Container",
+            .setPackageId("android", 0x01)
+            .addValue("@android:attr/one", util::make_unique<Attribute>(attr))
+            .addValue("@android:styleable/Container",
                       std::unique_ptr<Styleable>(styleable.clone(nullptr)))
             .build();
 
     std::unique_ptr<IAaptContext> context = test::ContextBuilder()
             .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
+            .setNameManglerPolicy(NameManglerPolicy{ "android" })
             .build();
     JavaClassGeneratorOptions options;
     options.useFinal = false;
     JavaClassGenerator generator(context.get(), table.get(), options);
     std::stringstream out;
-    ASSERT_TRUE(generator.generate(u"android", &out));
+    ASSERT_TRUE(generator.generate("android", &out));
     std::string actual = out.str();
 
     EXPECT_NE(std::string::npos, actual.find("@attr name android:one"));
     EXPECT_NE(std::string::npos, actual.find("@attr description"));
-    EXPECT_NE(std::string::npos, actual.find(util::utf16ToUtf8(attr.getComment())));
-    EXPECT_NE(std::string::npos, actual.find(util::utf16ToUtf8(styleable.getComment())));
+    EXPECT_NE(std::string::npos, actual.find(attr.getComment().data()));
+    EXPECT_NE(std::string::npos, actual.find(styleable.getComment().data()));
 }
 
 TEST(JavaClassGeneratorTest, CommentsForRemovedAttributesAreNotPresentInClass) {
     Attribute attr(false);
-    attr.setComment(StringPiece16(u"@removed"));
-
+    attr.setComment(StringPiece("@removed"));
 
     std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
-            .setPackageId(u"android", 0x01)
-            .addValue(u"@android:attr/one", util::make_unique<Attribute>(attr))
+            .setPackageId("android", 0x01)
+            .addValue("@android:attr/one", util::make_unique<Attribute>(attr))
             .build();
 
     std::unique_ptr<IAaptContext> context = test::ContextBuilder()
             .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
-            .setNameManglerPolicy(NameManglerPolicy{ u"android" })
+            .setNameManglerPolicy(NameManglerPolicy{ "android" })
             .build();
     JavaClassGeneratorOptions options;
     options.useFinal = false;
     JavaClassGenerator generator(context.get(), table.get(), options);
     std::stringstream out;
-    ASSERT_TRUE(generator.generate(u"android", &out));
+    ASSERT_TRUE(generator.generate("android", &out));
     std::string actual = out.str();
 
-    std::cout << actual << std::endl;
-
     EXPECT_EQ(std::string::npos, actual.find("@attr name android:one"));
     EXPECT_EQ(std::string::npos, actual.find("@attr description"));
 
diff --git a/tools/aapt2/java/ManifestClassGenerator.cpp b/tools/aapt2/java/ManifestClassGenerator.cpp
index be8955e..5ff11b1 100644
--- a/tools/aapt2/java/ManifestClassGenerator.cpp
+++ b/tools/aapt2/java/ManifestClassGenerator.cpp
@@ -25,12 +25,12 @@
 
 namespace aapt {
 
-static Maybe<StringPiece16> extractJavaIdentifier(IDiagnostics* diag, const Source& source,
-                                                  const StringPiece16& value) {
-    const StringPiece16 sep = u".";
+static Maybe<StringPiece> extractJavaIdentifier(IDiagnostics* diag, const Source& source,
+                                                const StringPiece& value) {
+    const StringPiece sep = ".";
     auto iter = std::find_end(value.begin(), value.end(), sep.begin(), sep.end());
 
-    StringPiece16 result;
+    StringPiece result;
     if (iter != value.end()) {
         result.assign(iter + sep.size(), value.end() - (iter + sep.size()));
     } else {
@@ -42,15 +42,15 @@
         return {};
     }
 
-    iter = util::findNonAlphaNumericAndNotInSet(result, u"_");
+    iter = util::findNonAlphaNumericAndNotInSet(result, "_");
     if (iter != result.end()) {
         diag->error(DiagMessage(source)
-                    << "invalid character '" << StringPiece16(iter, 1)
+                    << "invalid character '" << StringPiece(iter, 1)
                     << "' in '" << result << "'");
         return {};
     }
 
-    if (*result.begin() >= u'0' && *result.begin() <= u'9') {
+    if (*result.begin() >= '0' && *result.begin() <= '9') {
         diag->error(DiagMessage(source) << "symbol can not start with a digit");
         return {};
     }
@@ -60,20 +60,20 @@
 
 static bool writeSymbol(const Source& source, IDiagnostics* diag, xml::Element* el,
                         ClassDefinition* classDef) {
-    xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, u"name");
+    xml::Attribute* attr = el->findAttribute(xml::kSchemaAndroid, "name");
     if (!attr) {
         diag->error(DiagMessage(source) << "<" << el->name << "> must define 'android:name'");
         return false;
     }
 
-    Maybe<StringPiece16> result = extractJavaIdentifier(diag, source.withLine(el->lineNumber),
-                                                        attr->value);
+    Maybe<StringPiece> result = extractJavaIdentifier(diag, source.withLine(el->lineNumber),
+                                                      attr->value);
     if (!result) {
         return false;
     }
 
     std::unique_ptr<StringMember> stringMember = util::make_unique<StringMember>(
-            util::utf16ToUtf8(result.value()), util::utf16ToUtf8(attr->value));
+            result.value(), attr->value);
     stringMember->getCommentBuilder()->appendComment(el->comment);
 
     classDef->addMember(std::move(stringMember));
@@ -87,7 +87,7 @@
         return {};
     }
 
-    if (el->name != u"manifest" && !el->namespaceUri.empty()) {
+    if (el->name != "manifest" && !el->namespaceUri.empty()) {
         diag->error(DiagMessage(res->file.source) << "no <manifest> root tag defined");
         return {};
     }
@@ -102,9 +102,9 @@
     std::vector<xml::Element*> children = el->getChildElements();
     for (xml::Element* childEl : children) {
         if (childEl->namespaceUri.empty()) {
-            if (childEl->name == u"permission") {
+            if (childEl->name == "permission") {
                 error |= !writeSymbol(res->file.source, diag, childEl, permissionClass.get());
-            } else if (childEl->name == u"permission-group") {
+            } else if (childEl->name == "permission-group") {
                 error |= !writeSymbol(res->file.source, diag, childEl, permissionGroupClass.get());
             }
         }
diff --git a/tools/aapt2/java/ManifestClassGenerator_test.cpp b/tools/aapt2/java/ManifestClassGenerator_test.cpp
index d3bca70..eecb544 100644
--- a/tools/aapt2/java/ManifestClassGenerator_test.cpp
+++ b/tools/aapt2/java/ManifestClassGenerator_test.cpp
@@ -15,10 +15,7 @@
  */
 
 #include "java/ManifestClassGenerator.h"
-#include "test/Builders.h"
-#include "test/Context.h"
-
-#include <gtest/gtest.h>
+#include "test/Test.h"
 
 namespace aapt {
 
diff --git a/tools/aapt2/java/ProguardRules.cpp b/tools/aapt2/java/ProguardRules.cpp
index 53ff961..9061660 100644
--- a/tools/aapt2/java/ProguardRules.cpp
+++ b/tools/aapt2/java/ProguardRules.cpp
@@ -43,7 +43,7 @@
                     node->namespaceUri);
             if (maybePackage) {
                 // This is a custom view, let's figure out the class name from this.
-                std::u16string package = maybePackage.value().package + u"." + node->name;
+                std::string package = maybePackage.value().package + "." + node->name;
                 if (util::isJavaClassName(package)) {
                     addClass(node->lineNumber, package);
                 }
@@ -58,11 +58,11 @@
     }
 
 protected:
-    void addClass(size_t lineNumber, const std::u16string& className) {
+    void addClass(size_t lineNumber, const std::string& className) {
         mKeepSet->addClass(Source(mSource.path, lineNumber), className);
     }
 
-    void addMethod(size_t lineNumber, const std::u16string& methodName) {
+    void addMethod(size_t lineNumber, const std::string& methodName) {
         mKeepSet->addMethod(Source(mSource.path, lineNumber), methodName);
     }
 
@@ -79,19 +79,19 @@
         bool checkClass = false;
         bool checkName = false;
         if (node->namespaceUri.empty()) {
-            checkClass = node->name == u"view" || node->name == u"fragment";
+            checkClass = node->name == "view" || node->name == "fragment";
         } else if (node->namespaceUri == xml::kSchemaAndroid) {
-            checkName = node->name == u"fragment";
+            checkName = node->name == "fragment";
         }
 
         for (const auto& attr : node->attributes) {
-            if (checkClass && attr.namespaceUri.empty() && attr.name == u"class" &&
+            if (checkClass && attr.namespaceUri.empty() && attr.name == "class" &&
                     util::isJavaClassName(attr.value)) {
                 addClass(node->lineNumber, attr.value);
             } else if (checkName && attr.namespaceUri == xml::kSchemaAndroid &&
-                    attr.name == u"name" && util::isJavaClassName(attr.value)) {
+                    attr.name == "name" && util::isJavaClassName(attr.value)) {
                 addClass(node->lineNumber, attr.value);
-            } else if (attr.namespaceUri == xml::kSchemaAndroid && attr.name == u"onClick") {
+            } else if (attr.namespaceUri == xml::kSchemaAndroid && attr.name == "onClick") {
                 addMethod(node->lineNumber, attr.value);
             }
         }
@@ -107,11 +107,11 @@
     virtual void visit(xml::Element* node) override {
         bool checkFragment = false;
         if (node->namespaceUri.empty()) {
-            checkFragment = node->name == u"PreferenceScreen" || node->name == u"header";
+            checkFragment = node->name == "PreferenceScreen" || node->name == "header";
         }
 
         if (checkFragment) {
-            xml::Attribute* attr = node->findAttribute(xml::kSchemaAndroid, u"fragment");
+            xml::Attribute* attr = node->findAttribute(xml::kSchemaAndroid, "fragment");
             if (attr && util::isJavaClassName(attr->value)) {
                 addClass(node->lineNumber, attr->value);
             }
@@ -127,9 +127,9 @@
 
     virtual void visit(xml::Element* node) override {
         bool checkClass = node->namespaceUri.empty() &&
-                (node->name == u"transition" || node->name == u"pathMotion");
+                (node->name == "transition" || node->name == "pathMotion");
         if (checkClass) {
-            xml::Attribute* attr = node->findAttribute({}, u"class");
+            xml::Attribute* attr = node->findAttribute({}, "class");
             if (attr && util::isJavaClassName(attr->value)) {
                 addClass(node->lineNumber, attr->value);
             }
@@ -147,50 +147,50 @@
     virtual void visit(xml::Element* node) override {
         if (node->namespaceUri.empty()) {
             bool getName = false;
-            if (node->name == u"manifest") {
-                xml::Attribute* attr = node->findAttribute({}, u"package");
+            if (node->name == "manifest") {
+                xml::Attribute* attr = node->findAttribute({}, "package");
                 if (attr) {
                     mPackage = attr->value;
                 }
-            } else if (node->name == u"application") {
+            } else if (node->name == "application") {
                 getName = true;
-                xml::Attribute* attr = node->findAttribute(xml::kSchemaAndroid, u"backupAgent");
+                xml::Attribute* attr = node->findAttribute(xml::kSchemaAndroid, "backupAgent");
                 if (attr) {
-                    Maybe<std::u16string> result = util::getFullyQualifiedClassName(mPackage,
-                                                                                    attr->value);
+                    Maybe<std::string> result = util::getFullyQualifiedClassName(mPackage,
+                                                                                 attr->value);
                     if (result) {
                         addClass(node->lineNumber, result.value());
                     }
                 }
                 if (mMainDexOnly) {
                     xml::Attribute* defaultProcess = node->findAttribute(xml::kSchemaAndroid,
-                                                                         u"process");
+                                                                         "process");
                     if (defaultProcess) {
                         mDefaultProcess = defaultProcess->value;
                     }
                 }
-            } else if (node->name == u"activity" || node->name == u"service" ||
-                    node->name == u"receiver" || node->name == u"provider" ||
-                    node->name == u"instrumentation") {
+            } else if (node->name == "activity" || node->name == "service" ||
+                    node->name == "receiver" || node->name == "provider" ||
+                    node->name == "instrumentation") {
                 getName = true;
             }
 
             if (getName) {
-                xml::Attribute* attr = node->findAttribute(xml::kSchemaAndroid, u"name");
+                xml::Attribute* attr = node->findAttribute(xml::kSchemaAndroid, "name");
                 getName = attr != nullptr;
 
                 if (getName && mMainDexOnly) {
                     xml::Attribute* componentProcess = node->findAttribute(xml::kSchemaAndroid,
-                                                                           u"process");
+                                                                           "process");
 
-                    const std::u16string& process = componentProcess ? componentProcess->value
-                                                                     : mDefaultProcess;
-                    getName = !process.empty() && process[0] != u':';
+                    const std::string& process = componentProcess ? componentProcess->value
+                            : mDefaultProcess;
+                    getName = !process.empty() && process[0] != ':';
                 }
 
                 if (getName) {
-                    Maybe<std::u16string> result = util::getFullyQualifiedClassName(mPackage,
-                                                                                    attr->value);
+                    Maybe<std::string> result = util::getFullyQualifiedClassName(mPackage,
+                                                                                 attr->value);
                     if (result) {
                         addClass(node->lineNumber, result.value());
                     }
@@ -201,9 +201,9 @@
     }
 
 private:
-    std::u16string mPackage;
+    std::string mPackage;
     const bool mMainDexOnly;
-    std::u16string mDefaultProcess;
+    std::string mDefaultProcess;
 };
 
 bool collectProguardRulesForManifest(const Source& source, xml::XmlResource* res,
diff --git a/tools/aapt2/java/ProguardRules.h b/tools/aapt2/java/ProguardRules.h
index 744ae5b..c2d2bd9 100644
--- a/tools/aapt2/java/ProguardRules.h
+++ b/tools/aapt2/java/ProguardRules.h
@@ -31,19 +31,19 @@
 
 class KeepSet {
 public:
-    inline void addClass(const Source& source, const std::u16string& className) {
+    inline void addClass(const Source& source, const std::string& className) {
         mKeepSet[className].insert(source);
     }
 
-    inline void addMethod(const Source& source, const std::u16string& methodName) {
+    inline void addMethod(const Source& source, const std::string& methodName) {
         mKeepMethodSet[methodName].insert(source);
     }
 
 private:
     friend bool writeKeepSet(std::ostream* out, const KeepSet& keepSet);
 
-    std::map<std::u16string, std::set<Source>> mKeepSet;
-    std::map<std::u16string, std::set<Source>> mKeepMethodSet;
+    std::map<std::string, std::set<Source>> mKeepSet;
+    std::map<std::string, std::set<Source>> mKeepMethodSet;
 };
 
 bool collectProguardRulesForManifest(const Source& source, xml::XmlResource* res, KeepSet* keepSet,