Loading cc/library.go +36 −42 Original line number Diff line number Diff line Loading @@ -1354,18 +1354,6 @@ func getRefAbiDumpFile(ctx android.ModuleInstallPathContext, fileName+".lsdump") } func getRefAbiDumpDir(isNdk, isLlndk bool) string { var dirName string if isNdk { dirName = "ndk" } else if isLlndk { dirName = "vndk" } else { dirName = "platform" } return filepath.Join("prebuilts", "abi-dumps", dirName) } func prevRefAbiDumpVersion(ctx ModuleContext, dumpDir string) int { sdkVersionInt := ctx.Config().PlatformSdkVersion().FinalInt() sdkVersionStr := ctx.Config().PlatformSdkVersion().String() Loading Loading @@ -1435,17 +1423,17 @@ func (library *libraryDecorator) crossVersionAbiDiff(ctx android.ModuleContext, } func (library *libraryDecorator) sameVersionAbiDiff(ctx android.ModuleContext, referenceDump android.Path, baseName string, isLlndkOrNdk bool) { baseName, nameExt string, isLlndkOrNdk bool) { libName := strings.TrimSuffix(baseName, filepath.Ext(baseName)) errorMessage := "error: Please update ABI references with: $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l " + libName library.sourceAbiDiff(ctx, referenceDump, baseName, "", library.sourceAbiDiff(ctx, referenceDump, baseName, nameExt, isLlndkOrNdk, false /* allowExtensions */, "current", errorMessage) } func (library *libraryDecorator) optInAbiDiff(ctx android.ModuleContext, referenceDump android.Path, baseName, nameExt string, isLlndkOrNdk bool, refDumpDir string) { baseName, nameExt string, refDumpDir string) { libName := strings.TrimSuffix(baseName, filepath.Ext(baseName)) errorMessage := "error: Please update ABI references with: $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l " + libName + " -ref-dump-dir $$ANDROID_BUILD_TOP/" + refDumpDir Loading @@ -1455,7 +1443,7 @@ func (library *libraryDecorator) optInAbiDiff(ctx android.ModuleContext, referen } library.sourceAbiDiff(ctx, referenceDump, baseName, nameExt, isLlndkOrNdk, false /* allowExtensions */, "current", errorMessage) false /* isLlndkOrNdk */, false /* allowExtensions */, "current", errorMessage) } func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objects, fileName string, soFile android.Path) { Loading @@ -1470,9 +1458,6 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec } exportedHeaderFlags := strings.Join(SourceAbiFlags, " ") headerAbiChecker := library.getHeaderAbiCheckerProperties(ctx) // The logic must be consistent with classifySourceAbiDump. isNdk := ctx.isNdk(ctx.Config()) isLlndk := ctx.isImplementationForLLNDKPublic() currVersion := currRefAbiDumpVersion(ctx) library.sAbiOutputFile = transformDumpToLinkedDump(ctx, objs.sAbiDumpFiles, soFile, fileName, exportedHeaderFlags, android.OptionalPathForModuleSrc(ctx, library.symbolFileForAbiCheck(ctx)), Loading @@ -1481,11 +1466,20 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec currVersion) for _, tag := range classifySourceAbiDump(ctx) { addLsdumpPath(tag + ":" + library.sAbiOutputFile.String()) } addLsdumpPath(string(tag) + ":" + library.sAbiOutputFile.String()) dumpDir := getRefAbiDumpDir(isNdk, isLlndk) dumpDirName := tag.dirName() if dumpDirName == "" { continue } dumpDir := filepath.Join("prebuilts", "abi-dumps", dumpDirName) isLlndk := (tag == llndkLsdumpTag) isNdk := (tag == ndkLsdumpTag) binderBitness := ctx.DeviceConfig().BinderBitness() nameExt := "" if isLlndk { nameExt = "llndk" } // Check against the previous version. prevVersionInt := prevRefAbiDumpVersion(ctx, dumpDir) prevVersion := strconv.Itoa(prevVersionInt) Loading @@ -1494,14 +1488,15 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec if prevDumpFile.Valid() { library.crossVersionAbiDiff(ctx, prevDumpFile.Path(), fileName, isLlndk || isNdk, strconv.Itoa(prevVersionInt+1), prevVersion) strconv.Itoa(prevVersionInt+1), nameExt+prevVersion) } // Check against the current version. currDumpDir := filepath.Join(dumpDir, currVersion, binderBitness) currDumpFile := getRefAbiDumpFile(ctx, currDumpDir, fileName) if currDumpFile.Valid() { library.sameVersionAbiDiff(ctx, currDumpFile.Path(), fileName, isLlndk || isNdk) fileName, nameExt, isLlndk || isNdk) } } // Check against the opt-in reference dumps. for i, optInDumpDir := range headerAbiChecker.Ref_dump_dirs { Loading @@ -1513,8 +1508,7 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec continue } library.optInAbiDiff(ctx, optInDumpFile.Path(), fileName, "opt"+strconv.Itoa(i), isLlndk || isNdk, optInDumpDirPath.String()) fileName, "opt"+strconv.Itoa(i), optInDumpDirPath.String()) } } } Loading cc/sabi.go +31 −7 Original line number Diff line number Diff line Loading @@ -26,6 +26,30 @@ var ( lsdumpPathsLock sync.Mutex ) type lsdumpTag string const ( llndkLsdumpTag lsdumpTag = "LLNDK" ndkLsdumpTag lsdumpTag = "NDK" platformLsdumpTag lsdumpTag = "PLATFORM" productLsdumpTag lsdumpTag = "PRODUCT" vendorLsdumpTag lsdumpTag = "VENDOR" ) // 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 ndkLsdumpTag: return "ndk" case llndkLsdumpTag: return "vndk" case platformLsdumpTag: return "platform" default: return "" } } // Properties for ABI compatibility checker in Android.bp. type headerAbiCheckerProperties struct { // Enable ABI checks (even if this is not an LLNDK/VNDK lib) Loading Loading @@ -98,8 +122,8 @@ func (sabi *sabi) shouldCreateSourceAbiDump() bool { } // Returns a slice of strings that represent the ABI dumps generated for this module. func classifySourceAbiDump(ctx android.BaseModuleContext) []string { result := []string{} func classifySourceAbiDump(ctx android.BaseModuleContext) []lsdumpTag { result := []lsdumpTag{} m := ctx.Module().(*Module) headerAbiChecker := m.library.getHeaderAbiCheckerProperties(ctx) if headerAbiChecker.explicitlyDisabled() { Loading @@ -107,21 +131,21 @@ func classifySourceAbiDump(ctx android.BaseModuleContext) []string { } if !m.InProduct() && !m.InVendor() { if m.isImplementationForLLNDKPublic() { result = append(result, "LLNDK") 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, "NDK") result = append(result, ndkLsdumpTag) } else if m.library.hasStubsVariants() || headerAbiChecker.enabled() { result = append(result, "PLATFORM") result = append(result, platformLsdumpTag) } } else if headerAbiChecker.enabled() { if m.InProduct() { result = append(result, "PRODUCT") result = append(result, productLsdumpTag) } if m.InVendor() { result = append(result, "VENDOR") result = append(result, vendorLsdumpTag) } } return result Loading Loading
cc/library.go +36 −42 Original line number Diff line number Diff line Loading @@ -1354,18 +1354,6 @@ func getRefAbiDumpFile(ctx android.ModuleInstallPathContext, fileName+".lsdump") } func getRefAbiDumpDir(isNdk, isLlndk bool) string { var dirName string if isNdk { dirName = "ndk" } else if isLlndk { dirName = "vndk" } else { dirName = "platform" } return filepath.Join("prebuilts", "abi-dumps", dirName) } func prevRefAbiDumpVersion(ctx ModuleContext, dumpDir string) int { sdkVersionInt := ctx.Config().PlatformSdkVersion().FinalInt() sdkVersionStr := ctx.Config().PlatformSdkVersion().String() Loading Loading @@ -1435,17 +1423,17 @@ func (library *libraryDecorator) crossVersionAbiDiff(ctx android.ModuleContext, } func (library *libraryDecorator) sameVersionAbiDiff(ctx android.ModuleContext, referenceDump android.Path, baseName string, isLlndkOrNdk bool) { baseName, nameExt string, isLlndkOrNdk bool) { libName := strings.TrimSuffix(baseName, filepath.Ext(baseName)) errorMessage := "error: Please update ABI references with: $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l " + libName library.sourceAbiDiff(ctx, referenceDump, baseName, "", library.sourceAbiDiff(ctx, referenceDump, baseName, nameExt, isLlndkOrNdk, false /* allowExtensions */, "current", errorMessage) } func (library *libraryDecorator) optInAbiDiff(ctx android.ModuleContext, referenceDump android.Path, baseName, nameExt string, isLlndkOrNdk bool, refDumpDir string) { baseName, nameExt string, refDumpDir string) { libName := strings.TrimSuffix(baseName, filepath.Ext(baseName)) errorMessage := "error: Please update ABI references with: $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l " + libName + " -ref-dump-dir $$ANDROID_BUILD_TOP/" + refDumpDir Loading @@ -1455,7 +1443,7 @@ func (library *libraryDecorator) optInAbiDiff(ctx android.ModuleContext, referen } library.sourceAbiDiff(ctx, referenceDump, baseName, nameExt, isLlndkOrNdk, false /* allowExtensions */, "current", errorMessage) false /* isLlndkOrNdk */, false /* allowExtensions */, "current", errorMessage) } func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objects, fileName string, soFile android.Path) { Loading @@ -1470,9 +1458,6 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec } exportedHeaderFlags := strings.Join(SourceAbiFlags, " ") headerAbiChecker := library.getHeaderAbiCheckerProperties(ctx) // The logic must be consistent with classifySourceAbiDump. isNdk := ctx.isNdk(ctx.Config()) isLlndk := ctx.isImplementationForLLNDKPublic() currVersion := currRefAbiDumpVersion(ctx) library.sAbiOutputFile = transformDumpToLinkedDump(ctx, objs.sAbiDumpFiles, soFile, fileName, exportedHeaderFlags, android.OptionalPathForModuleSrc(ctx, library.symbolFileForAbiCheck(ctx)), Loading @@ -1481,11 +1466,20 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec currVersion) for _, tag := range classifySourceAbiDump(ctx) { addLsdumpPath(tag + ":" + library.sAbiOutputFile.String()) } addLsdumpPath(string(tag) + ":" + library.sAbiOutputFile.String()) dumpDir := getRefAbiDumpDir(isNdk, isLlndk) dumpDirName := tag.dirName() if dumpDirName == "" { continue } dumpDir := filepath.Join("prebuilts", "abi-dumps", dumpDirName) isLlndk := (tag == llndkLsdumpTag) isNdk := (tag == ndkLsdumpTag) binderBitness := ctx.DeviceConfig().BinderBitness() nameExt := "" if isLlndk { nameExt = "llndk" } // Check against the previous version. prevVersionInt := prevRefAbiDumpVersion(ctx, dumpDir) prevVersion := strconv.Itoa(prevVersionInt) Loading @@ -1494,14 +1488,15 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec if prevDumpFile.Valid() { library.crossVersionAbiDiff(ctx, prevDumpFile.Path(), fileName, isLlndk || isNdk, strconv.Itoa(prevVersionInt+1), prevVersion) strconv.Itoa(prevVersionInt+1), nameExt+prevVersion) } // Check against the current version. currDumpDir := filepath.Join(dumpDir, currVersion, binderBitness) currDumpFile := getRefAbiDumpFile(ctx, currDumpDir, fileName) if currDumpFile.Valid() { library.sameVersionAbiDiff(ctx, currDumpFile.Path(), fileName, isLlndk || isNdk) fileName, nameExt, isLlndk || isNdk) } } // Check against the opt-in reference dumps. for i, optInDumpDir := range headerAbiChecker.Ref_dump_dirs { Loading @@ -1513,8 +1508,7 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec continue } library.optInAbiDiff(ctx, optInDumpFile.Path(), fileName, "opt"+strconv.Itoa(i), isLlndk || isNdk, optInDumpDirPath.String()) fileName, "opt"+strconv.Itoa(i), optInDumpDirPath.String()) } } } Loading
cc/sabi.go +31 −7 Original line number Diff line number Diff line Loading @@ -26,6 +26,30 @@ var ( lsdumpPathsLock sync.Mutex ) type lsdumpTag string const ( llndkLsdumpTag lsdumpTag = "LLNDK" ndkLsdumpTag lsdumpTag = "NDK" platformLsdumpTag lsdumpTag = "PLATFORM" productLsdumpTag lsdumpTag = "PRODUCT" vendorLsdumpTag lsdumpTag = "VENDOR" ) // 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 ndkLsdumpTag: return "ndk" case llndkLsdumpTag: return "vndk" case platformLsdumpTag: return "platform" default: return "" } } // Properties for ABI compatibility checker in Android.bp. type headerAbiCheckerProperties struct { // Enable ABI checks (even if this is not an LLNDK/VNDK lib) Loading Loading @@ -98,8 +122,8 @@ func (sabi *sabi) shouldCreateSourceAbiDump() bool { } // Returns a slice of strings that represent the ABI dumps generated for this module. func classifySourceAbiDump(ctx android.BaseModuleContext) []string { result := []string{} func classifySourceAbiDump(ctx android.BaseModuleContext) []lsdumpTag { result := []lsdumpTag{} m := ctx.Module().(*Module) headerAbiChecker := m.library.getHeaderAbiCheckerProperties(ctx) if headerAbiChecker.explicitlyDisabled() { Loading @@ -107,21 +131,21 @@ func classifySourceAbiDump(ctx android.BaseModuleContext) []string { } if !m.InProduct() && !m.InVendor() { if m.isImplementationForLLNDKPublic() { result = append(result, "LLNDK") 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, "NDK") result = append(result, ndkLsdumpTag) } else if m.library.hasStubsVariants() || headerAbiChecker.enabled() { result = append(result, "PLATFORM") result = append(result, platformLsdumpTag) } } else if headerAbiChecker.enabled() { if m.InProduct() { result = append(result, "PRODUCT") result = append(result, productLsdumpTag) } if m.InVendor() { result = append(result, "VENDOR") result = append(result, vendorLsdumpTag) } } return result Loading