diff options
Diffstat (limited to 'tools/aapt2/java')
-rw-r--r-- | tools/aapt2/java/AnnotationProcessor.cpp | 18 | ||||
-rw-r--r-- | tools/aapt2/java/AnnotationProcessor.h | 1 | ||||
-rw-r--r-- | tools/aapt2/java/JavaClassGenerator.cpp | 63 | ||||
-rw-r--r-- | tools/aapt2/java/JavaClassGenerator.h | 12 | ||||
-rw-r--r-- | tools/aapt2/java/JavaClassGenerator_test.cpp | 125 | ||||
-rw-r--r-- | tools/aapt2/java/ManifestClassGenerator.cpp | 28 | ||||
-rw-r--r-- | tools/aapt2/java/ManifestClassGenerator_test.cpp | 5 | ||||
-rw-r--r-- | tools/aapt2/java/ProguardRules.cpp | 80 | ||||
-rw-r--r-- | tools/aapt2/java/ProguardRules.h | 11 |
9 files changed, 173 insertions, 170 deletions
diff --git a/tools/aapt2/java/AnnotationProcessor.cpp b/tools/aapt2/java/AnnotationProcessor.cpp index b7e7f903a2b1..23ff8abf8950 100644 --- a/tools/aapt2/java/AnnotationProcessor.cpp +++ b/tools/aapt2/java/AnnotationProcessor.cpp @@ -47,23 +47,13 @@ void AnnotationProcessor::appendCommentLine(std::string& comment) { 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::appendNewLine() { 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 8309dd978175..cfc32f3c6477 100644 --- a/tools/aapt2/java/AnnotationProcessor.h +++ b/tools/aapt2/java/AnnotationProcessor.h @@ -57,7 +57,6 @@ public: * 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 84df0b429fc5..fbaefb1f0c80 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 @@ JavaClassGenerator::JavaClassGenerator(IAaptContext* context, ResourceTable* tab 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 @@ static bool isValidSymbol(const StringPiece16& symbol) { * 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 transform(const StringPiece16& symbol) { */ 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 @@ static bool lessStyleableAttr(const StyleableAttr& lhs, const StyleableAttr& rhs } } -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 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package 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 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package 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 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package 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 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package } } -bool JavaClassGenerator::addMembersToTypeClass(const StringPiece16& packageNameToGenerate, +bool JavaClassGenerator::addMembersToTypeClass(const StringPiece& packageNameToGenerate, const ResourceTablePackage* package, const ResourceTableType* type, ClassDefinition* outTypeClassDef) { @@ -418,8 +417,8 @@ bool JavaClassGenerator::addMembersToTypeClass(const StringPiece16& packageNameT 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 @@ bool JavaClassGenerator::addMembersToTypeClass(const StringPiece16& packageNameT 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 @@ static void appendJavaDocAnnotations(const std::vector<std::string>& annotations } } -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 @@ bool JavaClassGenerator::generate(const StringPiece16& packageNameToGenerate, (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 @@ bool JavaClassGenerator::generate(const StringPiece16& packageNameToGenerate, 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 77e0ed76143a..901a86ed5b1d 100644 --- a/tools/aapt2/java/JavaClassGenerator.h +++ b/tools/aapt2/java/JavaClassGenerator.h @@ -66,22 +66,22 @@ public: * 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 46266b3f3e89..57a8047a6f40 100644 --- a/tools/aapt2/java/JavaClassGenerator_test.cpp +++ b/tools/aapt2/java/JavaClassGenerator_test.cpp @@ -25,40 +25,40 @@ namespace aapt { 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, TransformInvalidJavaIdentifierCharacter) { 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, CorrectPackageNameIsUsed) { 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, AttrPrivateIsWrittenAsAttr) { 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 @@ TEST(JavaClassGeneratorTest, OnlyWritePublicResources) { { 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 @@ TEST(JavaClassGeneratorTest, OnlyWritePublicResources) { { 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 @@ TEST(JavaClassGeneratorTest, OnlyWritePublicResources) { { 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, OnlyWritePublicResources) { 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, EmitOtherPackagesAttributesInStyleable) { 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, CommentsForEnumAndFlagAttributesArePresent) { 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 be8955ecdf83..5ff11b1303d3 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 @@ static Maybe<StringPiece16> extractJavaIdentifier(IDiagnostics* diag, const Sour 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 Maybe<StringPiece16> extractJavaIdentifier(IDiagnostics* diag, const Sour 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 @@ std::unique_ptr<ClassDefinition> generateManifestClass(IDiagnostics* diag, xml:: 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::unique_ptr<ClassDefinition> generateManifestClass(IDiagnostics* diag, xml:: 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 d3bca7068cb2..eecb54464d40 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 c610bb0f2ff2..90616605b7aa 100644 --- a/tools/aapt2/java/ProguardRules.cpp +++ b/tools/aapt2/java/ProguardRules.cpp @@ -43,7 +43,7 @@ public: 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 @@ public: } 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 @@ struct LayoutVisitor : public BaseVisitor { 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 @@ struct XmlResourceVisitor : public BaseVisitor { 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 @@ struct TransitionVisitor : public BaseVisitor { 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); } @@ -140,38 +140,57 @@ struct TransitionVisitor : public BaseVisitor { }; struct ManifestVisitor : public BaseVisitor { - ManifestVisitor(const Source& source, KeepSet* keepSet) : BaseVisitor(source, keepSet) { + ManifestVisitor(const Source& source, KeepSet* keepSet, bool mainDexOnly) + : BaseVisitor(source, keepSet), mMainDexOnly(mainDexOnly) { } 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()); } } - } else if (node->name == u"activity" || node->name == u"service" || - node->name == u"receiver" || node->name == u"provider" || - node->name == u"instrumentation") { + if (mMainDexOnly) { + xml::Attribute* defaultProcess = node->findAttribute(xml::kSchemaAndroid, + "process"); + if (defaultProcess) { + mDefaultProcess = defaultProcess->value; + } + } + } 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"); - if (attr) { - Maybe<std::u16string> result = util::getFullyQualifiedClassName(mPackage, - attr->value); + xml::Attribute* attr = node->findAttribute(xml::kSchemaAndroid, "name"); + getName = attr != nullptr; + + if (getName && mMainDexOnly) { + xml::Attribute* componentProcess = node->findAttribute(xml::kSchemaAndroid, + "process"); + + const std::string& process = componentProcess ? componentProcess->value + : mDefaultProcess; + getName = !process.empty() && process[0] != ':'; + } + + if (getName) { + Maybe<std::string> result = util::getFullyQualifiedClassName(mPackage, + attr->value); if (result) { addClass(node->lineNumber, result.value()); } @@ -181,12 +200,15 @@ struct ManifestVisitor : public BaseVisitor { BaseVisitor::visit(node); } - std::u16string mPackage; +private: + std::string mPackage; + const bool mMainDexOnly; + std::string mDefaultProcess; }; bool collectProguardRulesForManifest(const Source& source, xml::XmlResource* res, - KeepSet* keepSet) { - ManifestVisitor visitor(source, keepSet); + KeepSet* keepSet, bool mainDexOnly) { + ManifestVisitor visitor(source, keepSet, mainDexOnly); if (res->root) { res->root->accept(&visitor); return true; diff --git a/tools/aapt2/java/ProguardRules.h b/tools/aapt2/java/ProguardRules.h index aafffd39d84e..c2d2bd928f90 100644 --- a/tools/aapt2/java/ProguardRules.h +++ b/tools/aapt2/java/ProguardRules.h @@ -31,22 +31,23 @@ namespace proguard { 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); +bool collectProguardRulesForManifest(const Source& source, xml::XmlResource* res, KeepSet* keepSet, + bool mainDexOnly = false); bool collectProguardRules(const Source& source, xml::XmlResource* res, KeepSet* keepSet); bool writeKeepSet(std::ostream* out, const KeepSet& keepSet); |