diff options
| -rw-r--r-- | android/apex.go | 45 | ||||
| -rw-r--r-- | android/apex_test.go | 23 | ||||
| -rw-r--r-- | android/container.go | 2 | ||||
| -rw-r--r-- | android/variable.go | 1 | ||||
| -rw-r--r-- | apex/apex.go | 1 | ||||
| -rw-r--r-- | apex/prebuilt.go | 1 | ||||
| -rw-r--r-- | fsgen/boot_imgs.go | 61 | ||||
| -rw-r--r-- | fsgen/filesystem_creator.go | 6 | ||||
| -rw-r--r-- | ui/status/log.go | 56 |
9 files changed, 117 insertions, 79 deletions
diff --git a/android/apex.go b/android/apex.go index 414d4e140..fb2ad6cd8 100644 --- a/android/apex.go +++ b/android/apex.go @@ -16,7 +16,6 @@ package android import ( "fmt" - "reflect" "slices" "sort" "strconv" @@ -62,14 +61,6 @@ type ApexInfo struct { // that are merged together. InApexVariants []string - // List of APEX Soong module names that this module is part of. Note that the list includes - // different variations of the same APEX. For example, if module `foo` is included in the - // apex `com.android.foo`, and also if there is an override_apex module - // `com.mycompany.android.foo` overriding `com.android.foo`, then this list contains both - // `com.android.foo` and `com.mycompany.android.foo`. If the APEX Soong module is a - // prebuilt, the name here doesn't have the `prebuilt_` prefix. - InApexModules []string - // True if this is for a prebuilt_apex. // // If true then this will customize the apex processing to make it suitable for handling @@ -100,7 +91,6 @@ func (i ApexInfo) AddJSONData(d *map[string]interface{}) { (*d)["Apex"] = map[string]interface{}{ "ApexVariationName": i.ApexVariationName, "MinSdkVersion": i.MinSdkVersion, - "InApexModules": i.InApexModules, "InApexVariants": i.InApexVariants, "ForPrebuiltApex": i.ForPrebuiltApex, } @@ -135,15 +125,6 @@ func (i ApexInfo) InApexVariant(apexVariant string) bool { return false } -func (i ApexInfo) InApexModule(apexModuleName string) bool { - for _, a := range i.InApexModules { - if a == apexModuleName { - return true - } - } - return false -} - // To satisfy the comparable interface func (i ApexInfo) Equal(other any) bool { otherApexInfo, ok := other.(ApexInfo) @@ -151,8 +132,7 @@ func (i ApexInfo) Equal(other any) bool { i.MinSdkVersion == otherApexInfo.MinSdkVersion && i.Updatable == otherApexInfo.Updatable && i.UsePlatformApis == otherApexInfo.UsePlatformApis && - reflect.DeepEqual(i.InApexVariants, otherApexInfo.InApexVariants) && - reflect.DeepEqual(i.InApexModules, otherApexInfo.InApexModules) + slices.Equal(i.InApexVariants, otherApexInfo.InApexVariants) } // ApexBundleInfo contains information about the dependencies of an apex @@ -361,23 +341,10 @@ func (m *ApexModuleBase) ApexAvailable() []string { func (m *ApexModuleBase) BuildForApex(apex ApexInfo) { m.apexInfosLock.Lock() defer m.apexInfosLock.Unlock() - for i, v := range m.apexInfos { - if v.ApexVariationName == apex.ApexVariationName { - if len(apex.InApexModules) != 1 { - panic(fmt.Errorf("Newly created apexInfo must be for a single APEX")) - } - // Even when the ApexVariantNames are the same, the given ApexInfo might - // actually be for different APEX. This can happen when an APEX is - // overridden via override_apex. For example, there can be two apexes - // `com.android.foo` (from the `apex` module type) and - // `com.mycompany.android.foo` (from the `override_apex` module type), both - // of which has the same ApexVariantName `com.android.foo`. Add the apex - // name to the list so that it's not lost. - if !InList(apex.InApexModules[0], v.InApexModules) { - m.apexInfos[i].InApexModules = append(m.apexInfos[i].InApexModules, apex.InApexModules[0]) - } - return - } + if slices.ContainsFunc(m.apexInfos, func(existing ApexInfo) bool { + return existing.ApexVariationName == apex.ApexVariationName + }) { + return } m.apexInfos = append(m.apexInfos, apex) } @@ -546,7 +513,6 @@ func mergeApexVariations(apexInfos []ApexInfo) (merged []ApexInfo, aliases [][2] if index, exists := seen[mergedName]; exists { // Variants having the same mergedName are deduped merged[index].InApexVariants = append(merged[index].InApexVariants, variantName) - merged[index].InApexModules = append(merged[index].InApexModules, apexInfo.InApexModules...) merged[index].Updatable = merged[index].Updatable || apexInfo.Updatable // Platform APIs is allowed for this module only when all APEXes containing // the module are with `use_platform_apis: true`. @@ -556,7 +522,6 @@ func mergeApexVariations(apexInfos []ApexInfo) (merged []ApexInfo, aliases [][2] seen[mergedName] = len(merged) apexInfo.ApexVariationName = mergedName apexInfo.InApexVariants = CopyOf(apexInfo.InApexVariants) - apexInfo.InApexModules = CopyOf(apexInfo.InApexModules) apexInfo.TestApexes = CopyOf(apexInfo.TestApexes) merged = append(merged, apexInfo) } diff --git a/android/apex_test.go b/android/apex_test.go index 347bf7d98..78597b234 100644 --- a/android/apex_test.go +++ b/android/apex_test.go @@ -37,7 +37,6 @@ func Test_mergeApexVariations(t *testing.T) { ApexVariationName: "foo", MinSdkVersion: FutureApiLevel, InApexVariants: []string{"foo"}, - InApexModules: []string{"foo"}, ForPrebuiltApex: NotForPrebuiltApex, }, }, @@ -46,7 +45,6 @@ func Test_mergeApexVariations(t *testing.T) { ApexVariationName: "apex10000", MinSdkVersion: FutureApiLevel, InApexVariants: []string{"foo"}, - InApexModules: []string{"foo"}, ForPrebuiltApex: NotForPrebuiltApex, }, }, @@ -61,14 +59,12 @@ func Test_mergeApexVariations(t *testing.T) { ApexVariationName: "foo", MinSdkVersion: FutureApiLevel, InApexVariants: []string{"foo"}, - InApexModules: []string{"foo"}, ForPrebuiltApex: NotForPrebuiltApex, }, { ApexVariationName: "bar", MinSdkVersion: FutureApiLevel, InApexVariants: []string{"bar"}, - InApexModules: []string{"bar"}, ForPrebuiltApex: NotForPrebuiltApex, }, }, @@ -77,7 +73,6 @@ func Test_mergeApexVariations(t *testing.T) { ApexVariationName: "apex10000", MinSdkVersion: FutureApiLevel, InApexVariants: []string{"foo", "bar"}, - InApexModules: []string{"foo", "bar"}, }}, wantAliases: [][2]string{ {"foo", "apex10000"}, @@ -91,14 +86,12 @@ func Test_mergeApexVariations(t *testing.T) { ApexVariationName: "foo", MinSdkVersion: FutureApiLevel, InApexVariants: []string{"foo"}, - InApexModules: []string{"foo"}, ForPrebuiltApex: NotForPrebuiltApex, }, { ApexVariationName: "bar", MinSdkVersion: uncheckedFinalApiLevel(30), InApexVariants: []string{"bar"}, - InApexModules: []string{"bar"}, ForPrebuiltApex: NotForPrebuiltApex, }, }, @@ -107,14 +100,12 @@ func Test_mergeApexVariations(t *testing.T) { ApexVariationName: "apex10000", MinSdkVersion: FutureApiLevel, InApexVariants: []string{"foo"}, - InApexModules: []string{"foo"}, ForPrebuiltApex: NotForPrebuiltApex, }, { ApexVariationName: "apex30", MinSdkVersion: uncheckedFinalApiLevel(30), InApexVariants: []string{"bar"}, - InApexModules: []string{"bar"}, ForPrebuiltApex: NotForPrebuiltApex, }, }, @@ -130,7 +121,6 @@ func Test_mergeApexVariations(t *testing.T) { ApexVariationName: "foo", MinSdkVersion: FutureApiLevel, InApexVariants: []string{"foo"}, - InApexModules: []string{"foo"}, ForPrebuiltApex: NotForPrebuiltApex, }, { @@ -138,7 +128,6 @@ func Test_mergeApexVariations(t *testing.T) { MinSdkVersion: FutureApiLevel, Updatable: true, InApexVariants: []string{"bar"}, - InApexModules: []string{"bar"}, ForPrebuiltApex: NotForPrebuiltApex, }, }, @@ -148,7 +137,6 @@ func Test_mergeApexVariations(t *testing.T) { MinSdkVersion: FutureApiLevel, Updatable: true, InApexVariants: []string{"foo", "bar"}, - InApexModules: []string{"foo", "bar"}, ForPrebuiltApex: NotForPrebuiltApex, }, }, @@ -164,7 +152,6 @@ func Test_mergeApexVariations(t *testing.T) { ApexVariationName: "foo", MinSdkVersion: FutureApiLevel, InApexVariants: []string{"foo"}, - InApexModules: []string{"foo"}, ForPrebuiltApex: NotForPrebuiltApex, }, { @@ -172,7 +159,6 @@ func Test_mergeApexVariations(t *testing.T) { MinSdkVersion: FutureApiLevel, Updatable: true, InApexVariants: []string{"bar"}, - InApexModules: []string{"bar"}, ForPrebuiltApex: NotForPrebuiltApex, }, // This one should not be merged in with the others because it is for @@ -182,7 +168,6 @@ func Test_mergeApexVariations(t *testing.T) { MinSdkVersion: FutureApiLevel, Updatable: true, InApexVariants: []string{"baz"}, - InApexModules: []string{"baz"}, ForPrebuiltApex: ForPrebuiltApex, }, }, @@ -192,7 +177,6 @@ func Test_mergeApexVariations(t *testing.T) { MinSdkVersion: FutureApiLevel, Updatable: true, InApexVariants: []string{"foo", "bar"}, - InApexModules: []string{"foo", "bar"}, ForPrebuiltApex: NotForPrebuiltApex, }, { @@ -200,7 +184,6 @@ func Test_mergeApexVariations(t *testing.T) { MinSdkVersion: FutureApiLevel, Updatable: true, InApexVariants: []string{"baz"}, - InApexModules: []string{"baz"}, ForPrebuiltApex: ForPrebuiltApex, }, }, @@ -216,7 +199,6 @@ func Test_mergeApexVariations(t *testing.T) { ApexVariationName: "foo", MinSdkVersion: FutureApiLevel, InApexVariants: []string{"foo"}, - InApexModules: []string{"foo"}, ForPrebuiltApex: NotForPrebuiltApex, }, { @@ -224,7 +206,6 @@ func Test_mergeApexVariations(t *testing.T) { MinSdkVersion: FutureApiLevel, UsePlatformApis: true, InApexVariants: []string{"bar"}, - InApexModules: []string{"bar"}, ForPrebuiltApex: NotForPrebuiltApex, }, }, @@ -233,7 +214,6 @@ func Test_mergeApexVariations(t *testing.T) { ApexVariationName: "apex10000", MinSdkVersion: FutureApiLevel, InApexVariants: []string{"foo", "bar"}, - InApexModules: []string{"foo", "bar"}, ForPrebuiltApex: NotForPrebuiltApex, }, }, @@ -250,7 +230,6 @@ func Test_mergeApexVariations(t *testing.T) { MinSdkVersion: FutureApiLevel, UsePlatformApis: true, InApexVariants: []string{"foo"}, - InApexModules: []string{"foo"}, ForPrebuiltApex: NotForPrebuiltApex, }, { @@ -258,7 +237,6 @@ func Test_mergeApexVariations(t *testing.T) { MinSdkVersion: FutureApiLevel, UsePlatformApis: true, InApexVariants: []string{"bar"}, - InApexModules: []string{"bar"}, ForPrebuiltApex: NotForPrebuiltApex, }, }, @@ -268,7 +246,6 @@ func Test_mergeApexVariations(t *testing.T) { MinSdkVersion: FutureApiLevel, UsePlatformApis: true, InApexVariants: []string{"foo", "bar"}, - InApexModules: []string{"foo", "bar"}, ForPrebuiltApex: NotForPrebuiltApex, }, }, diff --git a/android/container.go b/android/container.go index 2a3777b30..775436a51 100644 --- a/android/container.go +++ b/android/container.go @@ -382,7 +382,7 @@ func (c *ContainersInfo) BelongingContainers() []*container { func (c *ContainersInfo) ApexNames() (ret []string) { for _, apex := range c.belongingApexes { - ret = append(ret, apex.InApexModules...) + ret = append(ret, apex.InApexVariants...) } slices.Sort(ret) return ret diff --git a/android/variable.go b/android/variable.go index e66653096..6eb8a2229 100644 --- a/android/variable.go +++ b/android/variable.go @@ -627,6 +627,7 @@ type PartitionVariables struct { BoardUsesGenericKernelImage bool `json:",omitempty"` BootSecurityPatch string `json:",omitempty"` InitBootSecurityPatch string `json:",omitempty"` + BoardIncludeDtbInBootimg bool `json:",omitempty"` // Avb (android verified boot) stuff BoardAvbEnable bool `json:",omitempty"` diff --git a/apex/apex.go b/apex/apex.go index ed9e58a63..0b56bf890 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1020,7 +1020,6 @@ func (a *apexBundle) ApexInfoMutator(mctx android.TopDownMutatorContext) { Updatable: a.Updatable(), UsePlatformApis: a.UsePlatformApis(), InApexVariants: []string{apexVariationName}, - InApexModules: []string{a.Name()}, // could be com.mycompany.android.foo TestApexes: testApexes, BaseApexName: mctx.ModuleName(), ApexAvailableName: proptools.String(a.properties.Apex_available_name), diff --git a/apex/prebuilt.go b/apex/prebuilt.go index 2bef0cccf..f93eada8b 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -356,7 +356,6 @@ func (p *prebuiltCommon) apexInfoMutator(mctx android.TopDownMutatorContext) { apexInfo := android.ApexInfo{ ApexVariationName: apexVariationName, InApexVariants: []string{apexVariationName}, - InApexModules: []string{p.BaseModuleName()}, // BaseModuleName() to avoid the prebuilt_ prefix. ForPrebuiltApex: true, } diff --git a/fsgen/boot_imgs.go b/fsgen/boot_imgs.go index 6647a9a4d..4ccc90ac2 100644 --- a/fsgen/boot_imgs.go +++ b/fsgen/boot_imgs.go @@ -6,11 +6,12 @@ import ( "fmt" "path/filepath" "strconv" + "strings" "github.com/google/blueprint/proptools" ) -func createBootImage(ctx android.LoadHookContext) bool { +func createBootImage(ctx android.LoadHookContext, dtbImg dtbImg) bool { partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse if partitionVariables.TargetKernelPath == "" { @@ -55,6 +56,11 @@ func createBootImage(ctx android.LoadHookContext) bool { bootImageName := generatedModuleNameForPartition(ctx.Config(), "boot") + var dtbPrebuilt *string + if dtbImg.include && dtbImg.imgType == "boot" { + dtbPrebuilt = proptools.StringPtr(":" + dtbImg.name) + } + ctx.CreateModule( filesystem.BootimgFactory, &filesystem.BootimgProperties{ @@ -67,6 +73,7 @@ func createBootImage(ctx android.LoadHookContext) bool { Avb_rollback_index: avbInfo.avbRollbackIndex, Avb_algorithm: avbInfo.avbAlgorithm, Security_patch: securityPatch, + Dtb_prebuilt: dtbPrebuilt, }, &struct { Name *string @@ -77,13 +84,18 @@ func createBootImage(ctx android.LoadHookContext) bool { return true } -func createVendorBootImage(ctx android.LoadHookContext) bool { +func createVendorBootImage(ctx android.LoadHookContext, dtbImg dtbImg) bool { partitionVariables := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse bootImageName := generatedModuleNameForPartition(ctx.Config(), "vendor_boot") avbInfo := getAvbInfo(ctx.Config(), "vendor_boot") + var dtbPrebuilt *string + if dtbImg.include && dtbImg.imgType == "vendor_boot" { + dtbPrebuilt = proptools.StringPtr(":" + dtbImg.name) + } + ctx.CreateModule( filesystem.BootimgFactory, &filesystem.BootimgProperties{ @@ -95,6 +107,7 @@ func createVendorBootImage(ctx android.LoadHookContext) bool { Avb_private_key: avbInfo.avbkeyFilegroup, Avb_rollback_index: avbInfo.avbRollbackIndex, Avb_algorithm: avbInfo.avbAlgorithm, + Dtb_prebuilt: dtbPrebuilt, }, &struct { Name *string @@ -217,3 +230,47 @@ func boardBootHeaderVersion(partitionVars android.PartitionVariables) (int, bool } return int(v), true } + +type dtbImg struct { + // whether to include the dtb image in boot image + include bool + + // name of the generated dtb image filegroup name + name string + + // type of the boot image that the dtb image argument should be specified + imgType string +} + +func createDtbImgFilegroup(ctx android.LoadHookContext) dtbImg { + partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse + if !partitionVars.BoardIncludeDtbInBootimg { + return dtbImg{include: false} + } + for _, copyFilePair := range partitionVars.ProductCopyFiles { + srcDestList := strings.Split(copyFilePair, ":") + if len(srcDestList) < 2 { + ctx.ModuleErrorf("PRODUCT_COPY_FILES must follow the format \"src:dest\", got: %s", copyFilePair) + } + if srcDestList[1] == "dtb.img" { + moduleName := generatedModuleName(ctx.Config(), "dtb_img_filegroup") + ctx.CreateModuleInDirectory( + android.FileGroupFactory, + filepath.Dir(srcDestList[0]), + &struct { + Name *string + Srcs []string + }{ + Name: proptools.StringPtr(moduleName), + Srcs: []string{filepath.Base(srcDestList[1])}, + }, + ) + imgType := "vendor_boot" + if !buildingVendorBootImage(partitionVars) { + imgType = "boot" + } + return dtbImg{include: true, name: moduleName, imgType: imgType} + } + } + return dtbImg{include: false} +} diff --git a/fsgen/filesystem_creator.go b/fsgen/filesystem_creator.go index cca856727..e8b0a4fb7 100644 --- a/fsgen/filesystem_creator.go +++ b/fsgen/filesystem_creator.go @@ -124,15 +124,17 @@ func (f *filesystemCreator) createInternalModules(ctx android.LoadHookContext) { } partitionVars := ctx.Config().ProductVariables().PartitionVarsForSoongMigrationOnlyDoNotUse + dtbImg := createDtbImgFilegroup(ctx) + if buildingBootImage(partitionVars) { - if createBootImage(ctx) { + if createBootImage(ctx, dtbImg) { f.properties.Boot_image = ":" + generatedModuleNameForPartition(ctx.Config(), "boot") } else { f.properties.Unsupported_partition_types = append(f.properties.Unsupported_partition_types, "boot") } } if buildingVendorBootImage(partitionVars) { - if createVendorBootImage(ctx) { + if createVendorBootImage(ctx, dtbImg) { f.properties.Vendor_boot_image = ":" + generatedModuleNameForPartition(ctx.Config(), "vendor_boot") } else { f.properties.Unsupported_partition_types = append(f.properties.Unsupported_partition_types, "vendor_boot") diff --git a/ui/status/log.go b/ui/status/log.go index 14df346de..7bfd39641 100644 --- a/ui/status/log.go +++ b/ui/status/log.go @@ -22,6 +22,8 @@ import ( "io/ioutil" "os" "strings" + "sync" + "time" "google.golang.org/protobuf/proto" @@ -31,7 +33,10 @@ import ( ) type verboseLog struct { - w io.WriteCloser + w *gzip.Writer + lock *sync.Mutex + data chan []string + stop chan bool } func NewVerboseLog(log logger.Logger, filename string) StatusOutput { @@ -47,9 +52,42 @@ func NewVerboseLog(log logger.Logger, filename string) StatusOutput { w := gzip.NewWriter(f) - return &verboseLog{ - w: w, + l := &verboseLog{ + w: w, + lock: &sync.Mutex{}, + data: make(chan []string), + stop: make(chan bool), } + l.startWriter() + return l +} + +func (v *verboseLog) startWriter() { + go func() { + tick := time.Tick(time.Second) + for { + select { + case <-v.stop: + close(v.data) + v.w.Close() + return + case <-tick: + v.w.Flush() + case dataList := <-v.data: + for _, data := range dataList { + fmt.Fprint(v.w, data) + } + } + } + }() +} + +func (v *verboseLog) stopWriter() { + v.stop <- true +} + +func (v *verboseLog) queueWrite(s ...string) { + v.data <- s } func (v *verboseLog) StartAction(action *Action, counts Counts) {} @@ -60,27 +98,27 @@ func (v *verboseLog) FinishAction(result ActionResult, counts Counts) { cmd = result.Description } - fmt.Fprintf(v.w, "[%d/%d] %s\n", counts.FinishedActions, counts.TotalActions, cmd) + v.queueWrite(fmt.Sprintf("[%d/%d] ", counts.FinishedActions, counts.TotalActions), cmd, "\n") if result.Error != nil { - fmt.Fprintf(v.w, "FAILED: %s\n", strings.Join(result.Outputs, " ")) + v.queueWrite("FAILED: ", strings.Join(result.Outputs, " "), "\n") } if result.Output != "" { - fmt.Fprintln(v.w, result.Output) + v.queueWrite(result.Output, "\n") } } func (v *verboseLog) Flush() { - v.w.Close() + v.stopWriter() } func (v *verboseLog) Message(level MsgLevel, message string) { - fmt.Fprintf(v.w, "%s%s\n", level.Prefix(), message) + v.queueWrite(level.Prefix(), message, "\n") } func (v *verboseLog) Write(p []byte) (int, error) { - fmt.Fprint(v.w, string(p)) + v.queueWrite(string(p)) return len(p), nil } |