Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 53eb289a authored by Hsin-Yi Chen's avatar Hsin-Yi Chen Committed by Gerrit Code Review
Browse files

Merge "Separate LLNDK ABI diff reports from the other variants" into main

parents 0fd4bb8c 362c1883
Loading
Loading
Loading
Loading
+36 −42
Original line number Diff line number Diff line
@@ -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()
@@ -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
@@ -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) {
@@ -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)),
@@ -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)
@@ -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 {
@@ -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())
		}
	}
}
+31 −7
Original line number Diff line number Diff line
@@ -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)
@@ -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() {
@@ -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