From 472f73fdac5c2b9a11b85ffe32ceb55222aa1d9b Mon Sep 17 00:00:00 2001 From: Jihoon Kang Date: Thu, 28 Mar 2024 20:59:29 +0000 Subject: [PATCH] Add API compatilibility flags to the exportable stubs The API compatibility flags allow the APIs that have moved between API surfaces to be correctly represented in the stub artifacts by passing the previously released set of APIs and removed APIs. These information should be passed to metalava when generating the exportable stubs, so that the APIs that move between the API surfaces are not blocked in the hiddenapi flags. Test: patch to 24Q3-beta-release, lunch sdk-trunk_staging-eng && m sdk dist and ensure that the expected methods are not blocked in the hiddenapi flags Bug: 330753520 Change-Id: I030b0a46b09f0cea026fedc879f10d4edfd38ac3 --- java/droidstubs.go | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/java/droidstubs.go b/java/droidstubs.go index 9556e956a..02b81a4fe 100644 --- a/java/droidstubs.go +++ b/java/droidstubs.go @@ -687,6 +687,23 @@ func (d *Droidstubs) apiLevelsGenerationFlags(ctx android.ModuleContext, cmd *an } } +func (d *Droidstubs) apiCompatibilityFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsType StubsType) { + if len(d.Javadoc.properties.Out) > 0 { + ctx.PropertyErrorf("out", "out property may not be combined with check_api") + } + + apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Api_file)) + removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Removed_api_file)) + + cmd.FlagWithInput("--check-compatibility:api:released ", apiFile) + cmd.FlagWithInput("--check-compatibility:removed:released ", removedApiFile) + + baselineFile := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Last_released.Baseline_file) + if baselineFile.Valid() { + cmd.FlagWithInput("--baseline:compatibility:released ", baselineFile.Path()) + } +} + func metalavaUseRbe(ctx android.ModuleContext) bool { return ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_METALAVA") } @@ -831,6 +848,10 @@ func (d *Droidstubs) commonMetalavaStubCmd(ctx android.ModuleContext, rule *andr d.inclusionAnnotationsFlags(ctx, cmd) d.apiLevelsAnnotationsFlags(ctx, cmd, params.stubConfig.stubsType, params.apiVersionsXml) + if params.stubConfig.doCheckReleased { + d.apiCompatibilityFlags(ctx, cmd, params.stubConfig.stubsType) + } + d.expandArgs(ctx, cmd) for _, o := range d.Javadoc.properties.Out { @@ -989,25 +1010,12 @@ func (d *Droidstubs) everythingOptionalCmd(ctx android.ModuleContext, cmd *andro // Add "check released" options. (Detect incompatible API changes from the last public release) if doCheckReleased { - if len(d.Javadoc.properties.Out) > 0 { - ctx.PropertyErrorf("out", "out property may not be combined with check_api") - } - - apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Api_file)) - removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Removed_api_file)) baselineFile := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Last_released.Baseline_file) - updatedBaselineOutput := android.PathForModuleOut(ctx, Everything.String(), "last_released_baseline.txt") - d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, Everything.String(), "check_last_released_api.timestamp") - - cmd.FlagWithInput("--check-compatibility:api:released ", apiFile) - cmd.FlagWithInput("--check-compatibility:removed:released ", removedApiFile) - if baselineFile.Valid() { - cmd.FlagWithInput("--baseline:compatibility:released ", baselineFile.Path()) + updatedBaselineOutput := android.PathForModuleOut(ctx, Everything.String(), "last_released_baseline.txt") cmd.FlagWithOutput("--update-baseline:compatibility:released ", updatedBaselineOutput) } - // Note this string includes quote ($' ... '), which decodes the "\n"s. msg := `$'\n******************************\n` + `You have tried to change the API from what has been previously released in\n` +