From 03f1aa064a5c920465f6bce819db637c1914ad23 Mon Sep 17 00:00:00 2001 From: Jihoon Kang Date: Tue, 26 Sep 2023 22:32:08 +0000 Subject: [PATCH 1/2] Add soong config variable Release_expose_flagged_api The variable is a release config variable which will be used to determine whether if the api marked @FlaggedApi is exposed or not. Test: m nothing Bug: 299570421 Change-Id: I5647608065543cf5059836f6d6e8906a23145541 --- android/config.go | 4 ++++ android/variable.go | 2 ++ 2 files changed, 6 insertions(+) diff --git a/android/config.go b/android/config.go index b3ff86b49..9f5ce5f4f 100644 --- a/android/config.go +++ b/android/config.go @@ -2084,3 +2084,7 @@ func (c *deviceConfig) CheckVendorSeappViolations() bool { func (c *deviceConfig) NextReleaseHideFlaggedApi() bool { return Bool(c.config.productVariables.NextReleaseHideFlaggedApi) } + +func (c *deviceConfig) ReleaseExposeFlaggedApi() bool { + return Bool(c.config.productVariables.ReleaseExposeFlaggedApi) +} diff --git a/android/variable.go b/android/variable.go index 44a8fd7f3..516e69c08 100644 --- a/android/variable.go +++ b/android/variable.go @@ -490,6 +490,8 @@ type ProductVariables struct { PartitionVarsForBazelMigrationOnlyDoNotUse PartitionVariables `json:",omitempty"` NextReleaseHideFlaggedApi *bool `json:",omitempty"` + + ReleaseExposeFlaggedApi *bool `json:",omitempty"` } type PartitionVariables struct { From d91a8e806a832eb3d97862b9baf3fec24485a64a Mon Sep 17 00:00:00 2001 From: Jihoon Kang Date: Wed, 20 Sep 2023 00:54:47 +0000 Subject: [PATCH 2/2] Add flagged api hide conditional to droidstubs APIs annotated with @FlaggedApi should not be included in the artifact when building sdk target products in the "next" release configuration. This change adds such logic by passing additional flag to metalava in droidstubs. The flag does not need to be passed to metalava invocation done in java_api_library, as java_api_library generates stubs using api signature files (i.e. *-current.txt files), and they will not contain apis marked @FlaggedApi. The metalava invocation in droidstubs is responsible for removing such apis. Test: go test ./java && m TARGET_PRODUCT=sdk TESTING_TARGET_RELEASE_NEXT=true nothing and inspect ninja command for generating stubs and verify the flag is included Bug: 299570421 Change-Id: Ia4b699b6e3ff6324f050eecc9ff5b622fdc04621 --- android/config.go | 4 ++++ java/droidstubs.go | 4 ++++ java/droidstubs_test.go | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/android/config.go b/android/config.go index 9f5ce5f4f..769d257f6 100644 --- a/android/config.go +++ b/android/config.go @@ -2088,3 +2088,7 @@ func (c *deviceConfig) NextReleaseHideFlaggedApi() bool { func (c *deviceConfig) ReleaseExposeFlaggedApi() bool { return Bool(c.config.productVariables.ReleaseExposeFlaggedApi) } + +func (c *deviceConfig) HideFlaggedApis() bool { + return c.NextReleaseHideFlaggedApi() && !c.ReleaseExposeFlaggedApi() +} diff --git a/java/droidstubs.go b/java/droidstubs.go index 67a55bd49..b059c0abf 100644 --- a/java/droidstubs.go +++ b/java/droidstubs.go @@ -540,6 +540,10 @@ func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersi // See b/285312164 for more information. cmd.FlagWithArg("--format-defaults ", "overloaded-method-order=source") + if ctx.DeviceConfig().HideFlaggedApis() { + cmd.FlagWithArg("--hide-annotation ", "android.annotation.FlaggedApi") + } + return cmd } diff --git a/java/droidstubs_test.go b/java/droidstubs_test.go index 7a04d7326..3c2580105 100644 --- a/java/droidstubs_test.go +++ b/java/droidstubs_test.go @@ -22,6 +22,8 @@ import ( "testing" "android/soong/android" + + "github.com/google/blueprint/proptools" ) func TestDroidstubs(t *testing.T) { @@ -403,3 +405,35 @@ func TestGeneratedApiContributionVisibilityTest(t *testing.T) { ctx.ModuleForTests("bar", "android_common") } + +func TestDroidstubsHideFlaggedApi(t *testing.T) { + result := android.GroupFixturePreparers( + prepareForJavaTest, + android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + variables.NextReleaseHideFlaggedApi = proptools.BoolPtr(true) + variables.ReleaseExposeFlaggedApi = proptools.BoolPtr(false) + }), + android.FixtureMergeMockFs(map[string][]byte{ + "a/A.java": nil, + "a/current.txt": nil, + "a/removed.txt": nil, + }), + ).RunTestWithBp(t, ` + droidstubs { + name: "foo", + srcs: ["a/A.java"], + api_surface: "public", + check_api: { + current: { + api_file: "a/current.txt", + removed_api_file: "a/removed.txt", + } + }, + } + `) + + m := result.ModuleForTests("foo", "android_common") + manifest := m.Output("metalava.sbox.textproto") + cmdline := String(android.RuleBuilderSboxProtoForTests(t, manifest).Commands[0].Command) + android.AssertStringDoesContain(t, "flagged api hide command not included", cmdline, "--hide-annotation android.annotation.FlaggedApi") +}