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

Commit 8f744183 authored by Mu-Le Lee's avatar Mu-Le Lee Committed by Gerrit Code Review
Browse files

Merge "Diff source dump and previous version dump for Cross-Version ABI Check"

parents 90fbcf1c 0a9005ea
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -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) {
+14 −4
Original line number Diff line number Diff line
@@ -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.
+47 −2
Original line number Diff line number Diff line
@@ -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
@@ -1620,9 +1623,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()
@@ -1634,6 +1667,7 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec
			} else {
				version = "current"
			}
			prevVersion = prevDumpRefVersion(ctx)
		}

		exportIncludeDirs := library.flagExporter.exportedIncludes(ctx)
@@ -1652,13 +1686,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)
		}
	}
}