Loading android/apex.go +39 −6 Original line number Diff line number Diff line Loading @@ -413,34 +413,57 @@ type ApexModuleDepInfo struct { From []string // Whether the dependency belongs to the final compiled APEX. IsExternal bool // min_sdk_version of the ApexModule MinSdkVersion string } // A map of a dependency name to its ApexModuleDepInfo type DepNameToDepInfoMap map[string]ApexModuleDepInfo type ApexBundleDepsInfo struct { minSdkVersion string flatListPath OutputPath fullListPath OutputPath } type ApexDepsInfoIntf interface { MinSdkVersion() string FlatListPath() Path FullListPath() Path } func (d *ApexBundleDepsInfo) MinSdkVersion() string { return d.minSdkVersion } func (d *ApexBundleDepsInfo) FlatListPath() Path { return d.flatListPath } func (d *ApexBundleDepsInfo) FullListPath() Path { return d.fullListPath } var _ ApexDepsInfoIntf = (*ApexBundleDepsInfo)(nil) func (d *ApexBundleDepsInfo) BuildDepsInfoLists(ctx ModuleContext, depInfos DepNameToDepInfoMap) { var content strings.Builder // Generate two module out files: // 1. FullList with transitive deps and their parents in the dep graph // 2. FlatList with a flat list of transitive deps func (d *ApexBundleDepsInfo) BuildDepsInfoLists(ctx ModuleContext, minSdkVersion string, depInfos DepNameToDepInfoMap) { d.minSdkVersion = minSdkVersion var fullContent strings.Builder var flatContent strings.Builder fmt.Fprintf(&flatContent, "%s(minSdkVersion:%s):\\n", ctx.ModuleName(), minSdkVersion) for _, key := range FirstUniqueStrings(SortedStringKeys(depInfos)) { info := depInfos[key] toName := info.To toName := fmt.Sprintf("%s(minSdkVersion:%s)", info.To, info.MinSdkVersion) if info.IsExternal { toName = toName + " (external)" } fmt.Fprintf(&content, "%s <- %s\\n", toName, strings.Join(SortedUniqueStrings(info.From), ", ")) fmt.Fprintf(&fullContent, "%s <- %s\\n", toName, strings.Join(SortedUniqueStrings(info.From), ", ")) fmt.Fprintf(&flatContent, " %s\\n", toName) } d.fullListPath = PathForModuleOut(ctx, "depsinfo", "fulllist.txt").OutputPath Loading @@ -449,7 +472,17 @@ func (d *ApexBundleDepsInfo) BuildDepsInfoLists(ctx ModuleContext, depInfos DepN Description: "Full Dependency Info", Output: d.fullListPath, Args: map[string]string{ "content": content.String(), "content": fullContent.String(), }, }) d.flatListPath = PathForModuleOut(ctx, "depsinfo", "flatlist.txt").OutputPath ctx.Build(pctx, BuildParams{ Rule: WriteFile, Description: "Flat Dependency Info", Output: d.flatListPath, Args: map[string]string{ "content": flatContent.String(), }, }) } apex/apex_test.go +21 −10 Original line number Diff line number Diff line Loading @@ -504,12 +504,19 @@ func TestBasicApex(t *testing.T) { ensureListContains(t, noticeInputs, "custom_notice") ensureListContains(t, noticeInputs, "custom_notice_for_static_lib") depsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n") ensureListContains(t, depsInfo, "myjar <- myapex") ensureListContains(t, depsInfo, "mylib <- myapex") ensureListContains(t, depsInfo, "mylib2 <- mylib") ensureListContains(t, depsInfo, "myotherjar <- myjar") ensureListContains(t, depsInfo, "mysharedjar (external) <- myjar") fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n") ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex") ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex") ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib") ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar") ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar") flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n") ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)") } func TestDefaults(t *testing.T) { Loading Loading @@ -818,11 +825,15 @@ 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("depsinfo/fulllist.txt").Args["content"], "\\n") fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n") ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2") ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib") ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib") ensureListContains(t, depsInfo, "mylib <- myapex2") ensureListContains(t, depsInfo, "libbaz <- mylib") ensureListContains(t, depsInfo, "libfoo (external) <- mylib") flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n") ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)") } func TestApexWithRuntimeLibsDependency(t *testing.T) { Loading apex/builder.go +16 −5 Original line number Diff line number Diff line Loading @@ -703,10 +703,18 @@ func (a *apexBundle) buildApexDependencyInfo(ctx android.ModuleContext) { info.IsExternal = info.IsExternal && externalDep depInfos[to.Name()] = info } else { toMinSdkVersion := "(no version)" if m, ok := to.(interface{ MinSdkVersion() string }); ok { if v := m.MinSdkVersion(); v != "" { toMinSdkVersion = v } } depInfos[to.Name()] = android.ApexModuleDepInfo{ To: to.Name(), From: []string{from.Name()}, IsExternal: externalDep, MinSdkVersion: toMinSdkVersion, } } Loading @@ -714,11 +722,14 @@ func (a *apexBundle) buildApexDependencyInfo(ctx android.ModuleContext) { return !externalDep }) a.ApexBundleDepsInfo.BuildDepsInfoLists(ctx, depInfos) a.ApexBundleDepsInfo.BuildDepsInfoLists(ctx, proptools.String(a.properties.Min_sdk_version), depInfos) ctx.Build(pctx, android.BuildParams{ Rule: android.Phony, Output: android.PathForPhony(ctx, a.Name()+"-deps-info"), Inputs: []android.Path{a.ApexBundleDepsInfo.FullListPath()}, Inputs: []android.Path{ a.ApexBundleDepsInfo.FullListPath(), a.ApexBundleDepsInfo.FlatListPath(), }, }) } cc/cc.go +4 −0 Original line number Diff line number Diff line Loading @@ -581,6 +581,10 @@ func (c *Module) SdkVersion() string { return String(c.Properties.Sdk_version) } func (c *Module) MinSdkVersion() string { return String(c.Properties.Min_sdk_version) } func (c *Module) AlwaysSdk() bool { return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only) } Loading java/java.go +8 −0 Original line number Diff line number Diff line Loading @@ -600,6 +600,10 @@ func (j *Module) targetSdkVersion() sdkSpec { return j.sdkVersion() } func (j *Module) MinSdkVersion() string { return j.minSdkVersion().version.String() } func (j *Module) AvailableFor(what string) bool { if what == android.AvailableToPlatform && Bool(j.deviceProperties.Hostdex) { // Exception: for hostdex: true libraries, the platform variant is created Loading Loading @@ -2398,6 +2402,10 @@ func (j *Import) minSdkVersion() sdkSpec { return j.sdkVersion() } func (j *Import) MinSdkVersion() string { return j.minSdkVersion().version.String() } func (j *Import) Prebuilt() *android.Prebuilt { return &j.prebuilt } Loading Loading
android/apex.go +39 −6 Original line number Diff line number Diff line Loading @@ -413,34 +413,57 @@ type ApexModuleDepInfo struct { From []string // Whether the dependency belongs to the final compiled APEX. IsExternal bool // min_sdk_version of the ApexModule MinSdkVersion string } // A map of a dependency name to its ApexModuleDepInfo type DepNameToDepInfoMap map[string]ApexModuleDepInfo type ApexBundleDepsInfo struct { minSdkVersion string flatListPath OutputPath fullListPath OutputPath } type ApexDepsInfoIntf interface { MinSdkVersion() string FlatListPath() Path FullListPath() Path } func (d *ApexBundleDepsInfo) MinSdkVersion() string { return d.minSdkVersion } func (d *ApexBundleDepsInfo) FlatListPath() Path { return d.flatListPath } func (d *ApexBundleDepsInfo) FullListPath() Path { return d.fullListPath } var _ ApexDepsInfoIntf = (*ApexBundleDepsInfo)(nil) func (d *ApexBundleDepsInfo) BuildDepsInfoLists(ctx ModuleContext, depInfos DepNameToDepInfoMap) { var content strings.Builder // Generate two module out files: // 1. FullList with transitive deps and their parents in the dep graph // 2. FlatList with a flat list of transitive deps func (d *ApexBundleDepsInfo) BuildDepsInfoLists(ctx ModuleContext, minSdkVersion string, depInfos DepNameToDepInfoMap) { d.minSdkVersion = minSdkVersion var fullContent strings.Builder var flatContent strings.Builder fmt.Fprintf(&flatContent, "%s(minSdkVersion:%s):\\n", ctx.ModuleName(), minSdkVersion) for _, key := range FirstUniqueStrings(SortedStringKeys(depInfos)) { info := depInfos[key] toName := info.To toName := fmt.Sprintf("%s(minSdkVersion:%s)", info.To, info.MinSdkVersion) if info.IsExternal { toName = toName + " (external)" } fmt.Fprintf(&content, "%s <- %s\\n", toName, strings.Join(SortedUniqueStrings(info.From), ", ")) fmt.Fprintf(&fullContent, "%s <- %s\\n", toName, strings.Join(SortedUniqueStrings(info.From), ", ")) fmt.Fprintf(&flatContent, " %s\\n", toName) } d.fullListPath = PathForModuleOut(ctx, "depsinfo", "fulllist.txt").OutputPath Loading @@ -449,7 +472,17 @@ func (d *ApexBundleDepsInfo) BuildDepsInfoLists(ctx ModuleContext, depInfos DepN Description: "Full Dependency Info", Output: d.fullListPath, Args: map[string]string{ "content": content.String(), "content": fullContent.String(), }, }) d.flatListPath = PathForModuleOut(ctx, "depsinfo", "flatlist.txt").OutputPath ctx.Build(pctx, BuildParams{ Rule: WriteFile, Description: "Flat Dependency Info", Output: d.flatListPath, Args: map[string]string{ "content": flatContent.String(), }, }) }
apex/apex_test.go +21 −10 Original line number Diff line number Diff line Loading @@ -504,12 +504,19 @@ func TestBasicApex(t *testing.T) { ensureListContains(t, noticeInputs, "custom_notice") ensureListContains(t, noticeInputs, "custom_notice_for_static_lib") depsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n") ensureListContains(t, depsInfo, "myjar <- myapex") ensureListContains(t, depsInfo, "mylib <- myapex") ensureListContains(t, depsInfo, "mylib2 <- mylib") ensureListContains(t, depsInfo, "myotherjar <- myjar") ensureListContains(t, depsInfo, "mysharedjar (external) <- myjar") fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n") ensureListContains(t, fullDepsInfo, "myjar(minSdkVersion:(no version)) <- myapex") ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex") ensureListContains(t, fullDepsInfo, "mylib2(minSdkVersion:(no version)) <- mylib") ensureListContains(t, fullDepsInfo, "myotherjar(minSdkVersion:(no version)) <- myjar") ensureListContains(t, fullDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external) <- myjar") flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n") ensureListContains(t, flatDepsInfo, " myjar(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " mylib2(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " myotherjar(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external)") } func TestDefaults(t *testing.T) { Loading Loading @@ -818,11 +825,15 @@ 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("depsinfo/fulllist.txt").Args["content"], "\\n") fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n") ensureListContains(t, fullDepsInfo, "mylib(minSdkVersion:(no version)) <- myapex2") ensureListContains(t, fullDepsInfo, "libbaz(minSdkVersion:(no version)) <- mylib") ensureListContains(t, fullDepsInfo, "libfoo(minSdkVersion:(no version)) (external) <- mylib") ensureListContains(t, depsInfo, "mylib <- myapex2") ensureListContains(t, depsInfo, "libbaz <- mylib") ensureListContains(t, depsInfo, "libfoo (external) <- mylib") flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n") ensureListContains(t, flatDepsInfo, " mylib(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " libbaz(minSdkVersion:(no version))") ensureListContains(t, flatDepsInfo, " libfoo(minSdkVersion:(no version)) (external)") } func TestApexWithRuntimeLibsDependency(t *testing.T) { Loading
apex/builder.go +16 −5 Original line number Diff line number Diff line Loading @@ -703,10 +703,18 @@ func (a *apexBundle) buildApexDependencyInfo(ctx android.ModuleContext) { info.IsExternal = info.IsExternal && externalDep depInfos[to.Name()] = info } else { toMinSdkVersion := "(no version)" if m, ok := to.(interface{ MinSdkVersion() string }); ok { if v := m.MinSdkVersion(); v != "" { toMinSdkVersion = v } } depInfos[to.Name()] = android.ApexModuleDepInfo{ To: to.Name(), From: []string{from.Name()}, IsExternal: externalDep, MinSdkVersion: toMinSdkVersion, } } Loading @@ -714,11 +722,14 @@ func (a *apexBundle) buildApexDependencyInfo(ctx android.ModuleContext) { return !externalDep }) a.ApexBundleDepsInfo.BuildDepsInfoLists(ctx, depInfos) a.ApexBundleDepsInfo.BuildDepsInfoLists(ctx, proptools.String(a.properties.Min_sdk_version), depInfos) ctx.Build(pctx, android.BuildParams{ Rule: android.Phony, Output: android.PathForPhony(ctx, a.Name()+"-deps-info"), Inputs: []android.Path{a.ApexBundleDepsInfo.FullListPath()}, Inputs: []android.Path{ a.ApexBundleDepsInfo.FullListPath(), a.ApexBundleDepsInfo.FlatListPath(), }, }) }
cc/cc.go +4 −0 Original line number Diff line number Diff line Loading @@ -581,6 +581,10 @@ func (c *Module) SdkVersion() string { return String(c.Properties.Sdk_version) } func (c *Module) MinSdkVersion() string { return String(c.Properties.Min_sdk_version) } func (c *Module) AlwaysSdk() bool { return c.Properties.AlwaysSdk || Bool(c.Properties.Sdk_variant_only) } Loading
java/java.go +8 −0 Original line number Diff line number Diff line Loading @@ -600,6 +600,10 @@ func (j *Module) targetSdkVersion() sdkSpec { return j.sdkVersion() } func (j *Module) MinSdkVersion() string { return j.minSdkVersion().version.String() } func (j *Module) AvailableFor(what string) bool { if what == android.AvailableToPlatform && Bool(j.deviceProperties.Hostdex) { // Exception: for hostdex: true libraries, the platform variant is created Loading Loading @@ -2398,6 +2402,10 @@ func (j *Import) minSdkVersion() sdkSpec { return j.sdkVersion() } func (j *Import) MinSdkVersion() string { return j.minSdkVersion().version.String() } func (j *Import) Prebuilt() *android.Prebuilt { return &j.prebuilt } Loading