diff --git a/cc/library.go b/cc/library.go index 5b2480906..44bbdfcaf 100644 --- a/cc/library.go +++ b/cc/library.go @@ -1261,6 +1261,18 @@ func (library *libraryDecorator) linkLlndkSAbiDumpFiles(ctx ModuleContext, "34") } +func (library *libraryDecorator) linkApexSAbiDumpFiles(ctx ModuleContext, + deps PathDeps, sAbiDumpFiles android.Paths, soFile android.Path, libFileName string, + excludeSymbolVersions, excludeSymbolTags []string, sdkVersion string) android.Path { + return transformDumpToLinkedDump(ctx, + sAbiDumpFiles, soFile, libFileName+".apex", + library.exportedIncludeDirsForAbiCheck(ctx), + android.OptionalPathForModuleSrc(ctx, library.Properties.Stubs.Symbol_file), + append([]string{"*_PLATFORM", "*_PRIVATE"}, excludeSymbolVersions...), + append([]string{"platform-only"}, excludeSymbolTags...), + sdkVersion) +} + func getRefAbiDumpFile(ctx android.ModuleInstallPathContext, versionedDumpDir, fileName string) android.OptionalPath { @@ -1276,21 +1288,21 @@ func getRefAbiDumpFile(ctx android.ModuleInstallPathContext, } // Return the previous and current SDK versions for cross-version ABI diff. -func crossVersionAbiDiffSdkVersions(ctx ModuleContext, dumpDir string) (string, string) { +func crossVersionAbiDiffSdkVersions(ctx ModuleContext, dumpDir string) (int, int) { sdkVersionInt := ctx.Config().PlatformSdkVersion().FinalInt() - sdkVersionStr := ctx.Config().PlatformSdkVersion().String() if ctx.Config().PlatformSdkFinal() { - return strconv.Itoa(sdkVersionInt - 1), sdkVersionStr + return sdkVersionInt - 1, sdkVersionInt } else { // 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. - versionedDumpDir := android.ExistentPathForSource(ctx, dumpDir, sdkVersionStr) + versionedDumpDir := android.ExistentPathForSource(ctx, + dumpDir, ctx.Config().PlatformSdkVersion().String()) if versionedDumpDir.Valid() { - return sdkVersionStr, strconv.Itoa(sdkVersionInt + 1) + return sdkVersionInt, sdkVersionInt + 1 } else { - return strconv.Itoa(sdkVersionInt - 1), sdkVersionStr + return sdkVersionInt - 1, sdkVersionInt } } } @@ -1387,7 +1399,7 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, deps PathD headerAbiChecker.Exclude_symbol_tags, currSdkVersion) - var llndkDump android.Path + var llndkDump, apexVariantDump android.Path tags := classifySourceAbiDump(ctx) for _, tag := range tags { if tag == llndkLsdumpTag { @@ -1399,6 +1411,15 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, deps PathD headerAbiChecker.Exclude_symbol_tags) } addLsdumpPath(string(tag) + ":" + llndkDump.String()) + } else if tag == apexLsdumpTag { + if apexVariantDump == nil { + apexVariantDump = library.linkApexSAbiDumpFiles(ctx, + deps, objs.sAbiDumpFiles, soFile, fileName, + headerAbiChecker.Exclude_symbol_versions, + headerAbiChecker.Exclude_symbol_tags, + currSdkVersion) + } + addLsdumpPath(string(tag) + ":" + apexVariantDump.String()) } else { addLsdumpPath(string(tag) + ":" + implDump.String()) } @@ -1412,11 +1433,14 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, deps PathD } dumpDir := filepath.Join("prebuilts", "abi-dumps", dumpDirName) isLlndk := (tag == llndkLsdumpTag) + isApex := (tag == apexLsdumpTag) isNdk := (tag == ndkLsdumpTag) binderBitness := ctx.DeviceConfig().BinderBitness() nameExt := "" if isLlndk { nameExt = "llndk" + } else if isApex { + nameExt = "apex" } // Check against the previous version. var prevVersion, currVersion string @@ -1430,7 +1454,13 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, deps PathD sourceDump = llndkDump } } else { - prevVersion, currVersion = crossVersionAbiDiffSdkVersions(ctx, dumpDir) + prevVersionInt, currVersionInt := crossVersionAbiDiffSdkVersions(ctx, dumpDir) + prevVersion = strconv.Itoa(prevVersionInt) + currVersion = strconv.Itoa(currVersionInt) + // APEX dumps are generated by different rules after trunk stable. + if isApex && prevVersionInt > 34 { + sourceDump = apexVariantDump + } } prevDumpDir := filepath.Join(dumpDir, prevVersion, binderBitness) prevDumpFile := getRefAbiDumpFile(ctx, prevDumpDir, fileName) @@ -1447,6 +1477,10 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, deps PathD } } else { currVersion = currSdkVersion + if isApex && (!ctx.Config().PlatformSdkFinal() || + ctx.Config().PlatformSdkVersion().FinalInt() > 34) { + sourceDump = apexVariantDump + } } currDumpDir := filepath.Join(dumpDir, currVersion, binderBitness) currDumpFile := getRefAbiDumpFile(ctx, currDumpDir, fileName) diff --git a/cc/sabi.go b/cc/sabi.go index ef43c8daf..cd9bf6393 100644 --- a/cc/sabi.go +++ b/cc/sabi.go @@ -29,6 +29,7 @@ var ( type lsdumpTag string const ( + apexLsdumpTag lsdumpTag = "APEX" llndkLsdumpTag lsdumpTag = "LLNDK" ndkLsdumpTag lsdumpTag = "NDK" platformLsdumpTag lsdumpTag = "PLATFORM" @@ -39,6 +40,8 @@ const ( // Return the prebuilt ABI dump directory for a tag; an empty string for an opt-in dump. func (tag *lsdumpTag) dirName() string { switch *tag { + case apexLsdumpTag: + return "platform" case ndkLsdumpTag: return "ndk" case llndkLsdumpTag: @@ -134,11 +137,13 @@ func classifySourceAbiDump(ctx android.BaseModuleContext) []lsdumpTag { if m.isImplementationForLLNDKPublic() { result = append(result, llndkLsdumpTag) } - // Return NDK if the library is both NDK and APEX. - // TODO(b/309880485): Split NDK and APEX ABI. if m.IsNdk(ctx.Config()) { result = append(result, ndkLsdumpTag) - } else if m.library.hasStubsVariants() || headerAbiChecker.enabled() { + } + // APEX and opt-in platform dumps are placed in the same directory. + if m.library.hasStubsVariants() { + result = append(result, apexLsdumpTag) + } else if headerAbiChecker.enabled() { result = append(result, platformLsdumpTag) } } else if headerAbiChecker.enabled() {