From 0a9005eaad1690a9bdcf31e492a4f94ca56fa2fd Mon Sep 17 00:00:00 2001 From: Mu-Le Lee Date: Tue, 5 Jul 2022 09:49:50 +0000 Subject: [PATCH] Diff source dump and previous version dump for Cross-Version ABI Check Created a function to determine the current finalization stage by environment variable and the existence of a version folder prebuilt/abi-dumps///. Assign the corresponding prevVersion with the current stage and generate mk commands to diff source and previous dump to {fileName}.{prevVersion}.abidiff with diff flag --allow-extension and --advice-only The test is verified in all stages. lsdumps should be prepared in advance. For stage 1: current/ and PLATFORM_SDK_VERSION/ For stage 2: current/ and {PLATFORM_SDK_VERSION-1}/ For stage 3: PLATFORM_SDK_VERSION/ and {PLATFORM_SDK_VERSION-1}/ The definition of stages could be found at "go/cross-version-abi-check#bookmark=id.vpflkul2z968" Test: make libbinder_ndk Bug: 238387082 Change-Id: Ic29456113a541650c75fa38c5c4f2d6d2e76a877 --- cc/androidmk.go | 22 ++++++++++++++++------ cc/builder.go | 18 ++++++++++++++---- cc/library.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 77 insertions(+), 12 deletions(-) diff --git a/cc/androidmk.go b/cc/androidmk.go index ff5ba4576..47fb919d0 100644 --- a/cc/androidmk.go +++ b/cc/androidmk.go @@ -226,17 +226,27 @@ func (library *libraryDecorator) androidMkWriteExportedFlags(entries *android.An } } -func (library *libraryDecorator) androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries *android.AndroidMkEntries) { - if library.sAbiDiff.Valid() && !library.static() { - entries.AddStrings("LOCAL_ADDITIONAL_DEPENDENCIES", library.sAbiDiff.String()) +func (library *libraryDecorator) getAbiDiffsForAndroidMkDeps() []string { + if library.static() { + return nil } + var abiDiffs []string + if library.sAbiDiff.Valid() { + abiDiffs = append(abiDiffs, library.sAbiDiff.String()) + } + if library.prevSAbiDiff.Valid() { + abiDiffs = append(abiDiffs, library.prevSAbiDiff.String()) + } + return abiDiffs +} + +func (library *libraryDecorator) androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries *android.AndroidMkEntries) { + entries.AddStrings("LOCAL_ADDITIONAL_DEPENDENCIES", library.getAbiDiffsForAndroidMkDeps()...) } // TODO(ccross): remove this once apex/androidmk.go is converted to AndroidMkEntries func (library *libraryDecorator) androidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) { - if library.sAbiDiff.Valid() && !library.static() { - fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES +=", library.sAbiDiff.String()) - } + fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES +=", strings.Join(library.getAbiDiffsForAndroidMkDeps(), " ")) } func (library *libraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { diff --git a/cc/builder.go b/cc/builder.go index ab2b80a49..f3faca801 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -920,10 +920,15 @@ func unzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseNam // sourceAbiDiff registers a build statement to compare linked sAbi dump files (.lsdump). func sourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path, - baseName, exportedHeaderFlags string, diffFlags []string, - checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath { + baseName, prevVersion, exportedHeaderFlags string, diffFlags []string, + checkAllApis, isLlndk, isNdk, isVndkExt, previousVersionDiff bool) android.OptionalPath { - outputFile := android.PathForModuleOut(ctx, baseName+".abidiff") + var outputFile android.ModuleOutPath + if prevVersion == "" { + outputFile = android.PathForModuleOut(ctx, baseName+".abidiff") + } else { + outputFile = android.PathForModuleOut(ctx, baseName+"."+prevVersion+".abidiff") + } libName := strings.TrimSuffix(baseName, filepath.Ext(baseName)) var extraFlags []string @@ -935,10 +940,15 @@ func sourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceD "-allow-unreferenced-elf-symbol-changes") } + // TODO(b/241496591): Remove -advice-only after b/239792343 and b/239790286 are reolved. + if previousVersionDiff { + extraFlags = append(extraFlags, "-advice-only") + } + if isLlndk || isNdk { extraFlags = append(extraFlags, "-consider-opaque-types-different") } - if isVndkExt { + if isVndkExt || previousVersionDiff { extraFlags = append(extraFlags, "-allow-extensions") } // TODO(b/232891473): Simplify the above logic with diffFlags. diff --git a/cc/library.go b/cc/library.go index ff485cfde..28cdc8586 100644 --- a/cc/library.go +++ b/cc/library.go @@ -613,6 +613,9 @@ type libraryDecorator struct { // Source Abi Diff sAbiDiff android.OptionalPath + // Source Abi Diff against previous SDK version + prevSAbiDiff android.OptionalPath + // Location of the static library in the sysroot. Empty if the library is // not included in the NDK. ndkSysrootPath android.Path @@ -1614,9 +1617,39 @@ func getRefAbiDumpFile(ctx ModuleContext, vndkVersion, fileName string) android. return nil } +func prevDumpRefVersion(ctx ModuleContext) string { + sdkVersionInt := ctx.Config().PlatformSdkVersion().FinalInt() + sdkVersionStr := ctx.Config().PlatformSdkVersion().String() + + if ctx.Config().PlatformSdkFinal() { + return strconv.Itoa(sdkVersionInt - 1) + } else { + var dirName string + + isNdk := ctx.isNdk(ctx.Config()) + if isNdk { + dirName = "ndk" + } else { + dirName = "platform" + } + + // The platform SDK version can be upgraded before finalization while the corresponding abi dumps hasn't + // been generated. Thus the Cross-Version Check chooses PLATFORM_SDK_VERION - 1 as previous version. + // This situation could be identified by checking the existence of the PLATFORM_SDK_VERION dump directory. + refDumpDir := android.ExistentPathForSource(ctx, "prebuilts", "abi-dumps", dirName, sdkVersionStr) + if refDumpDir.Valid() { + return sdkVersionStr + } else { + return strconv.Itoa(sdkVersionInt - 1) + } + } +} + func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objects, fileName string, soFile android.Path) { if library.sabi.shouldCreateSourceAbiDump() { var version string + var prevVersion string + if ctx.useVndk() { // For modules linking against vndk, follow its vndk version version = ctx.Module().(*Module).VndkVersion() @@ -1628,6 +1661,7 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec } else { version = "current" } + prevVersion = prevDumpRefVersion(ctx) } exportIncludeDirs := library.flagExporter.exportedIncludes(ctx) @@ -1646,13 +1680,24 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec addLsdumpPath(classifySourceAbiDump(ctx) + ":" + library.sAbiOutputFile.String()) + if prevVersion != "" { + prevRefAbiDumpFile := getRefAbiDumpFile(ctx, prevVersion, fileName) + if prevRefAbiDumpFile != nil { + library.prevSAbiDiff = sourceAbiDiff(ctx, library.sAbiOutputFile.Path(), + prevRefAbiDumpFile, fileName, prevVersion, exportedHeaderFlags, + library.Properties.Header_abi_checker.Diff_flags, + Bool(library.Properties.Header_abi_checker.Check_all_apis), + ctx.IsLlndk(), ctx.isNdk(ctx.Config()), ctx.IsVndkExt(), true) + } + } + refAbiDumpFile := getRefAbiDumpFile(ctx, version, fileName) if refAbiDumpFile != nil { library.sAbiDiff = sourceAbiDiff(ctx, library.sAbiOutputFile.Path(), - refAbiDumpFile, fileName, exportedHeaderFlags, + refAbiDumpFile, fileName, "", exportedHeaderFlags, library.Properties.Header_abi_checker.Diff_flags, Bool(library.Properties.Header_abi_checker.Check_all_apis), - ctx.IsLlndk(), ctx.isNdk(ctx.Config()), ctx.IsVndkExt()) + ctx.IsLlndk(), ctx.isNdk(ctx.Config()), ctx.IsVndkExt(), false) } } }