diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp index 740a401f9b57c..e6bf3a6f9f562 100644 --- a/tools/aapt2/cmd/Link.cpp +++ b/tools/aapt2/cmd/Link.cpp @@ -989,7 +989,8 @@ class LinkCommand { manifest_class->GetCommentBuilder()->AppendComment(proper_annotation); } - const std::string& package_utf8 = context_->GetCompilationPackage(); + const std::string package_utf8 = + options_.custom_java_package.value_or_default(context_->GetCompilationPackage()); std::string out_path = options_.generate_java_class_path.value(); file::AppendPath(&out_path, file::PackageToPath(package_utf8)); diff --git a/tools/aapt2/java/ManifestClassGenerator_test.cpp b/tools/aapt2/java/ManifestClassGenerator_test.cpp index 5ebf508807e8a..9f6ec210a6a74 100644 --- a/tools/aapt2/java/ManifestClassGenerator_test.cpp +++ b/tools/aapt2/java/ManifestClassGenerator_test.cpp @@ -18,10 +18,101 @@ #include "test/Test.h" +using ::testing::HasSubstr; +using ::testing::Not; + namespace aapt { -static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, - xml::XmlResource* res, +static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xml::XmlResource* res, + std::string* out_str); + +TEST(ManifestClassGeneratorTest, NameIsProperlyGeneratedFromSymbol) { + std::unique_ptr context = test::ContextBuilder().Build(); + std::unique_ptr manifest = test::BuildXmlDom(R"( + + + + + + )"); + + std::string actual; + ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); + + ASSERT_THAT(actual, HasSubstr("public static final class permission {")); + ASSERT_THAT(actual, HasSubstr("public static final class permission_group {")); + + const size_t permission_start_pos = actual.find("public static final class permission {"); + const size_t permission_group_start_pos = + actual.find("public static final class permission_group {"); + + // + // Make sure these permissions are in the permission class. + // + const std::string permission_class = + actual.substr(permission_start_pos, permission_group_start_pos - permission_start_pos); + + EXPECT_THAT( + permission_class, + HasSubstr( + "public static final String ACCESS_INTERNET=\"android.permission.ACCESS_INTERNET\";")); + EXPECT_THAT( + permission_class, + HasSubstr("public static final String DO_DANGEROUS_THINGS=\"android.DO_DANGEROUS_THINGS\";")); + EXPECT_THAT(permission_class, + HasSubstr("public static final String HUH=\"com.test.sample.permission.HUH\";")); + + // + // Make sure these permissions are in the permission_group class + // + const std::string permission_group_class = actual.substr(permission_group_start_pos); + + EXPECT_THAT(permission_group_class, + HasSubstr("public static final String PERMISSION=\"foo.bar.PERMISSION\";")); +} + +TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) { + std::unique_ptr context = test::ContextBuilder().Build(); + std::unique_ptr manifest = test::BuildXmlDom(R"( + + + + + + + + )"); + + std::string actual; + ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); + + const char* expected_access_internet = R"( /** + * Required to access the internet. + * Added in API 1. + */ + public static final String ACCESS_INTERNET="android.permission.ACCESS_INTERNET";)"; + EXPECT_THAT(actual, HasSubstr(expected_access_internet)); + + const char* expected_play_outside = R"( /** + * @deprecated This permission is for playing outside. + */ + @Deprecated + public static final String PLAY_OUTSIDE="android.permission.PLAY_OUTSIDE";)"; + EXPECT_THAT(actual, HasSubstr(expected_play_outside)); + + const char* expected_secret = R"( /** + * This is a private permission for system only! + * @hide + */ + @android.annotation.SystemApi + public static final String SECRET="android.permission.SECRET";)"; + EXPECT_THAT(actual, HasSubstr(expected_secret)); +} + +static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xml::XmlResource* res, std::string* out_str) { std::unique_ptr manifest_class = GenerateManifestClass(context->GetDiagnostics(), res); @@ -30,8 +121,7 @@ static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, } std::stringstream out; - if (!manifest_class->WriteJavaFile(manifest_class.get(), "android", true, - &out)) { + if (!manifest_class->WriteJavaFile(manifest_class.get(), "android", true, &out)) { return ::testing::AssertionFailure() << "failed to write java file"; } @@ -39,103 +129,4 @@ static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, return ::testing::AssertionSuccess(); } -TEST(ManifestClassGeneratorTest, NameIsProperlyGeneratedFromSymbol) { - std::unique_ptr context = test::ContextBuilder().Build(); - std::unique_ptr manifest = test::BuildXmlDom(R"EOF( - - - - - - )EOF"); - - std::string actual; - ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); - - const size_t permission_class_pos = - actual.find("public static final class permission {"); - const size_t permission_croup_class_pos = - actual.find("public static final class permission_group {"); - ASSERT_NE(std::string::npos, permission_class_pos); - ASSERT_NE(std::string::npos, permission_croup_class_pos); - - // - // Make sure these permissions are in the permission class. - // - - size_t pos = actual.find( - "public static final String ACCESS_INTERNET=" - "\"android.permission.ACCESS_INTERNET\";"); - EXPECT_GT(pos, permission_class_pos); - EXPECT_LT(pos, permission_croup_class_pos); - - pos = actual.find( - "public static final String DO_DANGEROUS_THINGS=" - "\"android.DO_DANGEROUS_THINGS\";"); - EXPECT_GT(pos, permission_class_pos); - EXPECT_LT(pos, permission_croup_class_pos); - - pos = actual.find( - "public static final String HUH=\"com.test.sample.permission.HUH\";"); - EXPECT_GT(pos, permission_class_pos); - EXPECT_LT(pos, permission_croup_class_pos); - - // - // Make sure these permissions are in the permission_group class - // - - pos = actual.find( - "public static final String PERMISSION=" - "\"foo.bar.PERMISSION\";"); - EXPECT_GT(pos, permission_croup_class_pos); - EXPECT_LT(pos, std::string::npos); -} - -TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) { - std::unique_ptr context = test::ContextBuilder().Build(); - std::unique_ptr manifest = test::BuildXmlDom(R"EOF( - - - - - - - - )EOF"); - - std::string actual; - ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); - - const char* expected_access_internet = - R"EOF( /** - * Required to access the internet. - * Added in API 1. - */ - public static final String ACCESS_INTERNET="android.permission.ACCESS_INTERNET";)EOF"; - - EXPECT_NE(std::string::npos, actual.find(expected_access_internet)); - - const char* expected_play_outside = - R"EOF( /** - * @deprecated This permission is for playing outside. - */ - @Deprecated - public static final String PLAY_OUTSIDE="android.permission.PLAY_OUTSIDE";)EOF"; - - EXPECT_NE(std::string::npos, actual.find(expected_play_outside)); - - const char* expected_secret = - R"EOF( /** - * This is a private permission for system only! - * @hide - */ - @android.annotation.SystemApi - public static final String SECRET="android.permission.SECRET";)EOF"; - - EXPECT_NE(std::string::npos, actual.find(expected_secret)); -} - } // namespace aapt diff --git a/tools/aapt2/readme.md b/tools/aapt2/readme.md index d6483ec1c0e86..9b2e0a49aa538 100644 --- a/tools/aapt2/readme.md +++ b/tools/aapt2/readme.md @@ -4,6 +4,7 @@ ### `aapt2 ...` - Fixed issue where enum values were interpreted as integers and range checked. (bug 62358540) - Fixed issue where ints and floats with trailing whitespace would not be parsed. (bug 62902869) +- Fixed issue where `--custom-package` was not honored when writing Manifest.java. (bug 62826426) ## Version 2.17 ### `aapt2 ...`