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

Commit 956305c6 authored by Jiyong Park's avatar Jiyong Park
Browse files

Reland "m <apex_name>-deps-info prints the internal/external deps of the APEX""

This reverts commit 4513f703.

Bug: 1190898
Test: m
Test: EMMA_INSTRUMENT=true EMMA_INSTRUMENT_FRAMEWORK=true NATIVE_COVERAGE=true  m dist

Change-Id: I50fdccabb43e4751694db83ee451d388657257e0
parent ccfffda2
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -216,8 +216,8 @@ func (a *apexBundle) androidMkForType() android.AndroidMkData {
				if len(moduleNames) > 0 {
					fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES +=", strings.Join(moduleNames, " "))
				}
				if len(a.externalDeps) > 0 {
					fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES +=", strings.Join(a.externalDeps, " "))
				if len(a.requiredDeps) > 0 {
					fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES +=", strings.Join(a.requiredDeps, " "))
				}
				a.writeRequiredModules(w)
				var postInstallCommands []string
+26 −5
Original line number Diff line number Diff line
@@ -341,6 +341,8 @@ type apexBundleProperties struct {
	// Whether this APEX should support Android10. Default is false. If this is set true, then apex_manifest.json is bundled as well
	// because Android10 requires legacy apex_manifest.json instead of apex_manifest.pb
	Legacy_android10_support *bool

	IsCoverageVariant bool `blueprint:"mutated"`
}

type apexTargetBundleProperties struct {
@@ -520,8 +522,13 @@ type apexBundle struct {
	// list of files to be included in this apex
	filesInfo []apexFile

	// list of module names that this APEX is depending on
	// list of module names that should be installed along with this APEX
	requiredDeps []string

	// list of module names that this APEX is depending on (to be shown via *-deps-info target)
	externalDeps []string
	// list of module names that this APEX is including (to be shown via *-deps-info target)
	internalDeps []string

	testApex        bool
	vndkApex        bool
@@ -817,6 +824,10 @@ func (a *apexBundle) HideFromMake() {
	a.properties.HideFromMake = true
}

func (a *apexBundle) MarkAsCoverageVariant(coverage bool) {
	a.properties.IsCoverageVariant = coverage
}

// TODO(jiyong) move apexFileFor* close to the apexFile type definition
func apexFileForNativeLibrary(ctx android.BaseModuleContext, ccMod *cc.Module, handleSpecialLibs bool) apexFile {
	// Decide the APEX-local directory by the multilib of the library
@@ -945,7 +956,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
			a.primaryApexType = true

			if ctx.Config().InstallExtraFlattenedApexes() {
				a.externalDeps = append(a.externalDeps, a.Name()+flattenedSuffix)
				a.requiredDeps = append(a.requiredDeps, a.Name()+flattenedSuffix)
			}
		}
	case zipApex:
@@ -1004,6 +1015,9 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
		depTag := ctx.OtherModuleDependencyTag(child)
		depName := ctx.OtherModuleName(child)
		if _, isDirectDep := parent.(*apexBundle); isDirectDep {
			if depTag != keyTag && depTag != certificateTag {
				a.internalDeps = append(a.internalDeps, depName)
			}
			switch depTag {
			case sharedLibTag:
				if cc, ok := child.(*cc.Module); ok {
@@ -1134,9 +1148,10 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
							//
							// Always include if we are a host-apex however since those won't have any
							// system libraries.
							if !android.DirectlyInAnyApex(ctx, cc.Name()) && !android.InList(cc.Name(), a.externalDeps) {
								a.externalDeps = append(a.externalDeps, cc.Name())
							if !android.DirectlyInAnyApex(ctx, cc.Name()) && !android.InList(cc.Name(), a.requiredDeps) {
								a.requiredDeps = append(a.requiredDeps, cc.Name())
							}
							a.externalDeps = append(a.externalDeps, depName)
							requireNativeLibs = append(requireNativeLibs, cc.OutputFile().Path().Base())
							// Don't track further
							return false
@@ -1144,6 +1159,8 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
						af := apexFileForNativeLibrary(ctx, cc, handleSpecialLibs)
						af.transitiveDep = true
						filesInfo = append(filesInfo, af)
						a.internalDeps = append(a.internalDeps, depName)
						a.internalDeps = append(a.internalDeps, cc.AllStaticDeps()...)
						return true // track transitive dependencies
					}
				} else if cc.IsTestPerSrcDepTag(depTag) {
@@ -1159,8 +1176,10 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
						return true // track transitive dependencies
					}
				} else if java.IsJniDepTag(depTag) {
					// Do nothing for JNI dep. JNI libraries are always embedded in APK-in-APEX.
					a.externalDeps = append(a.externalDeps, depName)
					return true
				} else if java.IsStaticLibDepTag(depTag) {
					a.internalDeps = append(a.internalDeps, depName)
				} else if am.CanHaveApexVariants() && am.IsInstallableToApex() {
					ctx.ModuleErrorf("unexpected tag %q for indirect dependency %q", depTag, depName)
				}
@@ -1257,6 +1276,8 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
	}

	a.compatSymlinks = makeCompatSymlinks(a.BaseModuleName(), ctx)

	a.buildApexDependencyInfo(ctx)
}

func newApexBundle() *apexBundle {
+19 −6
Original line number Diff line number Diff line
@@ -219,6 +219,7 @@ func testApexContext(t *testing.T, bp string, handlers ...testCustomizer) (*andr
		"apex_manifest.json":                                  nil,
		"AndroidManifest.xml":                                 nil,
		"system/sepolicy/apex/myapex-file_contexts":           nil,
		"system/sepolicy/apex/myapex2-file_contexts":          nil,
		"system/sepolicy/apex/otherapex-file_contexts":        nil,
		"system/sepolicy/apex/commonapex-file_contexts":       nil,
		"system/sepolicy/apex/com.android.vndk-file_contexts": nil,
@@ -520,6 +521,12 @@ func TestBasicApex(t *testing.T) {
	}
	ensureListContains(t, noticeInputs, "NOTICE")
	ensureListContains(t, noticeInputs, "custom_notice")

	depsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("myapex-deps-info.txt").Args["content"], "\\n")
	ensureListContains(t, depsInfo, "internal myjar")
	ensureListContains(t, depsInfo, "internal mylib")
	ensureListContains(t, depsInfo, "internal mylib2")
	ensureListContains(t, depsInfo, "internal myotherjar")
}

func TestDefaults(t *testing.T) {
@@ -740,13 +747,13 @@ func TestApexWithStubs(t *testing.T) {
func TestApexWithExplicitStubsDependency(t *testing.T) {
	ctx, _ := testApex(t, `
		apex {
			name: "myapex",
			key: "myapex.key",
			name: "myapex2",
			key: "myapex2.key",
			native_shared_libs: ["mylib"],
		}

		apex_key {
			name: "myapex.key",
			name: "myapex2.key",
			public_key: "testkey.avbpubkey",
			private_key: "testkey.pem",
		}
@@ -779,7 +786,7 @@ func TestApexWithExplicitStubsDependency(t *testing.T) {

	`)

	apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
	apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
	copyCmds := apexRule.Args["copy_commands"]

	// Ensure that direct non-stubs dep is always included
@@ -791,7 +798,7 @@ func TestApexWithExplicitStubsDependency(t *testing.T) {
	// Ensure that dependency of stubs is not included
	ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")

	mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex").Rule("ld").Args["libFlags"]
	mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_myapex2").Rule("ld").Args["libFlags"]

	// Ensure that mylib is linking with version 10 of libfoo
	ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
@@ -802,6 +809,12 @@ func TestApexWithExplicitStubsDependency(t *testing.T) {

	// Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
	ensureNotContains(t, libFooStubsLdFlags, "libbar.so")

	depsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("myapex2-deps-info.txt").Args["content"], "\\n")
	ensureListContains(t, depsInfo, "internal mylib")
	ensureListContains(t, depsInfo, "external libfoo")
	ensureListNotContains(t, depsInfo, "internal libfoo")
	ensureListNotContains(t, depsInfo, "external mylib")
}

func TestApexWithRuntimeLibsDependency(t *testing.T) {
@@ -2652,7 +2665,7 @@ func TestInstallExtraFlattenedApexes(t *testing.T) {
		config.TestProductVariables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
	})
	ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
	ensureListContains(t, ab.externalDeps, "myapex.flattened")
	ensureListContains(t, ab.requiredDeps, "myapex.flattened")
	mk := android.AndroidMkDataForTest(t, config, "", ab)
	var builder strings.Builder
	mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
+43 −0
Original line number Diff line number Diff line
@@ -554,3 +554,46 @@ func (a *apexBundle) getOverrideManifestPackageName(ctx android.ModuleContext) s
	}
	return ""
}

func (a *apexBundle) buildApexDependencyInfo(ctx android.ModuleContext) {
	if !a.primaryApexType {
		return
	}

	if a.properties.IsCoverageVariant {
		// Otherwise, we will have duplicated rules for coverage and
		// non-coverage variants of the same APEX
		return
	}

	internalDeps := a.internalDeps
	externalDeps := a.externalDeps

	internalDeps = android.SortedUniqueStrings(internalDeps)
	externalDeps = android.SortedUniqueStrings(externalDeps)
	externalDeps = android.RemoveListFromList(externalDeps, internalDeps)

	var content strings.Builder
	for _, name := range internalDeps {
		fmt.Fprintf(&content, "internal %s\\n", name)
	}
	for _, name := range externalDeps {
		fmt.Fprintf(&content, "external %s\\n", name)
	}

	depsInfoFile := android.PathForOutput(ctx, a.Name()+"-deps-info.txt")
	ctx.Build(pctx, android.BuildParams{
		Rule:        android.WriteFile,
		Description: "Dependency Info",
		Output:      depsInfoFile,
		Args: map[string]string{
			"content": content.String(),
		},
	})

	ctx.Build(pctx, android.BuildParams{
		Rule:   android.Phony,
		Output: android.PathForPhony(ctx, a.Name()+"-deps-info"),
		Inputs: []android.Path{depsInfoFile},
	})
}
+25 −0
Original line number Diff line number Diff line
@@ -398,6 +398,13 @@ func IsSharedDepTag(depTag blueprint.DependencyTag) bool {
	return ok && ccDepTag.Shared
}

func IsStaticDepTag(depTag blueprint.DependencyTag) bool {
	ccDepTag, ok := depTag.(DependencyTag)
	return ok && (ccDepTag == staticExportDepTag ||
		ccDepTag == lateStaticDepTag ||
		ccDepTag == wholeStaticDepTag)
}

func IsRuntimeDepTag(depTag blueprint.DependencyTag) bool {
	ccDepTag, ok := depTag.(DependencyTag)
	return ok && ccDepTag == runtimeDepTag
@@ -463,6 +470,9 @@ type Module struct {
	makeLinkType string
	// Kythe (source file indexer) paths for this compilation module
	kytheFiles android.Paths

	// name of the modules that are direct or indirect static deps of this module
	allStaticDeps []string
}

func (c *Module) Toc() android.OptionalPath {
@@ -1258,6 +1268,15 @@ func orderStaticModuleDeps(module LinkableInterface, staticDeps []LinkableInterf
	return results
}

func gatherTransitiveStaticDeps(staticDeps []LinkableInterface) []string {
	var ret []string
	for _, dep := range staticDeps {
		ret = append(ret, dep.Module().Name())
		ret = append(ret, dep.AllStaticDeps()...)
	}
	return android.FirstUniqueStrings(ret)
}

func (c *Module) IsTestPerSrcAllTestsVariation() bool {
	test, ok := c.linker.(testPerSrc)
	return ok && test.isAllTestsVariation()
@@ -2328,6 +2347,8 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
		c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)
	}

	c.allStaticDeps = gatherTransitiveStaticDeps(directStaticDeps)

	return depPaths
}

@@ -2463,6 +2484,10 @@ func (c *Module) installable() bool {
	return c.installer != nil && !c.Properties.PreventInstall && c.IsForPlatform() && c.outputFile.Valid()
}

func (c *Module) AllStaticDeps() []string {
	return c.allStaticDeps
}

func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
	if c.linker != nil {
		if library, ok := c.linker.(*libraryDecorator); ok {
Loading