diff options
author | 2025-03-06 15:51:48 -0800 | |
---|---|---|
committer | 2025-03-06 15:51:48 -0800 | |
commit | 236e276404e1111a672a315e5463ed88cf13f691 (patch) | |
tree | 94ef1e89f0de6200fd483ff9b25eb88d0b500785 | |
parent | 6a0416f424e99eff880bad3919c36756d3142907 (diff) | |
parent | 87f1f1ee088097fa1ed16304d6ffeee32b58bdd5 (diff) |
Merge "Create apkcerts.txt using Soong" into main am: 87f1f1ee08
Original change: https://android-review.googlesource.com/c/platform/build/soong/+/3529491
Change-Id: Ie10cc144bcc90a65b9cb547e58e9fc3aebc96218
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | apex/apex.go | 6 | ||||
-rw-r--r-- | filesystem/android_device.go | 51 | ||||
-rw-r--r-- | filesystem/filesystem.go | 3 | ||||
-rw-r--r-- | java/app.go | 4 |
4 files changed, 64 insertions, 0 deletions
diff --git a/apex/apex.go b/apex/apex.go index 196f389d2..38ab012d8 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -550,6 +550,9 @@ type apexBundle struct { // Required modules, filled out during GenerateAndroidBuildActions and used in AndroidMk required []string + + // appinfo of the apk-in-apex of this module + appInfos java.AppInfos } // apexFileClass represents a type of file that can be included in APEX. @@ -1931,6 +1934,7 @@ func (a *apexBundle) depVisitor(vctx *visitorContext, ctx android.ModuleContext, } case androidAppTag: if appInfo, ok := android.OtherModuleProvider(ctx, child, java.AppInfoProvider); ok { + a.appInfos = append(a.appInfos, *appInfo) if appInfo.AppSet { appDir := "app" if appInfo.Privileged { @@ -2267,6 +2271,8 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { }) android.SetProvider(ctx, filesystem.ApexKeyPathInfoProvider, filesystem.ApexKeyPathInfo{a.apexKeysPath}) + + android.SetProvider(ctx, java.AppInfosProvider, a.appInfos) } // Set prebuiltInfoProvider. This will be used by `apex_prebuiltinfo_singleton` to print out a metadata file diff --git a/filesystem/android_device.go b/filesystem/android_device.go index 3d306e365..17209ed4a 100644 --- a/filesystem/android_device.go +++ b/filesystem/android_device.go @@ -114,6 +114,7 @@ type androidDevice struct { miscInfo android.Path rootDirForFsConfig string rootDirForFsConfigTimestamp android.Path + apkCertsInfo android.Path } func AndroidDeviceFactory() android.Module { @@ -188,6 +189,7 @@ func (a *androidDevice) GenerateAndroidBuildActions(ctx android.ModuleContext) { allInstalledModules := a.allInstalledModules(ctx) + a.apkCertsInfo = a.buildApkCertsInfo(ctx, allInstalledModules) a.kernelConfig, a.kernelVersion = a.extractKernelVersionAndConfigs(ctx) a.miscInfo = a.addMiscInfo(ctx) a.buildTargetFilesZip(ctx, allInstalledModules) @@ -651,6 +653,9 @@ func (a *androidDevice) copyMetadataToTargetZip(ctx android.ModuleContext, build } installedApexKeys = android.SortedUniquePaths(installedApexKeys) // Sort by keypath to match make builder.Command().Text("cat").Inputs(installedApexKeys).Textf(" >> %s/META/apexkeys.txt", targetFilesDir.String()) + // apkcerts.txt + builder.Command().Textf("cp").Input(a.apkCertsInfo).Textf(" %s/META/", targetFilesDir.String()) + // Copy fastboot-info.txt if fastbootInfo := android.PathForModuleSrc(ctx, proptools.String(a.deviceProps.FastbootInfo)); fastbootInfo != nil { // TODO (b/399788523): Autogenerate fastboot-info.txt if there is no source fastboot-info.txt @@ -864,3 +869,49 @@ func (a *androidDevice) extractKernelVersionAndConfigs(ctx android.ModuleContext return extractedVersionFile, extractedConfigsFile } + +func (a *androidDevice) buildApkCertsInfo(ctx android.ModuleContext, allInstalledModules []android.Module) android.Path { + // TODO (spandandas): Add compressed + formatLine := func(cert java.Certificate, name, partition string) string { + pem := cert.AndroidMkString() + var key string + if cert.Key == nil { + key = "" + } else { + key = cert.Key.String() + } + return fmt.Sprintf(`name="%s" certificate="%s" private_key="%s" partition="%s"`, name, pem, key, partition) + } + + apkCerts := []string{} + for _, installedModule := range allInstalledModules { + partition := "" + if commonInfo, ok := android.OtherModuleProvider(ctx, installedModule, android.CommonModuleInfoKey); ok { + partition = commonInfo.PartitionTag + } else { + ctx.ModuleErrorf("%s does not set CommonModuleInfoKey", installedModule.Name()) + } + if info, ok := android.OtherModuleProvider(ctx, installedModule, java.AppInfoProvider); ok { + apkCerts = append(apkCerts, formatLine(info.Certificate, info.InstallApkName+".apk", partition)) + } else if info, ok := android.OtherModuleProvider(ctx, installedModule, java.AppInfosProvider); ok { + for _, certInfo := range info { + apkCerts = append(apkCerts, formatLine(certInfo.Certificate, certInfo.InstallApkName+".apk", partition)) + } + } else if info, ok := android.OtherModuleProvider(ctx, installedModule, java.RuntimeResourceOverlayInfoProvider); ok { + apkCerts = append(apkCerts, formatLine(info.Certificate, info.OutputFile.Base(), partition)) + } + } + slices.Sort(apkCerts) // sort by name + fsInfos := a.getFsInfos(ctx) + if fsInfos["system"].HasFsverity { + defaultPem, defaultKey := ctx.Config().DefaultAppCertificate(ctx) + apkCerts = append(apkCerts, formatLine(java.Certificate{Pem: defaultPem, Key: defaultKey}, "BuildManifest.apk", "system")) + if info, ok := fsInfos["system_ext"]; ok && info.HasFsverity { + apkCerts = append(apkCerts, formatLine(java.Certificate{Pem: defaultPem, Key: defaultKey}, "BuildManifestSystemExt.apk", "system_ext")) + } + } + + apkCertsInfo := android.PathForModuleOut(ctx, "apkcerts.txt") + android.WriteFileRuleVerbatim(ctx, apkCertsInfo, strings.Join(apkCerts, "\n")+"\n") + return apkCertsInfo +} diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index 35fdd00a3..8b3b51e89 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -438,6 +438,8 @@ type FilesystemInfo struct { Owners []InstalledModuleInfo UseAvb bool + + HasFsverity bool } // FullInstallPathInfo contains information about the "full install" paths of all the files @@ -683,6 +685,7 @@ func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) { FilesystemConfig: f.generateFilesystemConfig(ctx, rootDir, rebasedDir), Owners: f.gatherOwners(specs), UseAvb: proptools.Bool(f.properties.Use_avb), + HasFsverity: f.properties.Fsverity.Inputs.GetOrDefault(ctx, nil) != nil, } android.SetProvider(ctx, FilesystemProvider, fsInfo) diff --git a/java/app.go b/java/app.go index fe5eec32d..65ccc686c 100644 --- a/java/app.go +++ b/java/app.go @@ -2209,3 +2209,7 @@ func setCommonAppInfo(appInfo *AppInfo, m androidApp) { appInfo.Certificate = m.Certificate() appInfo.PrivAppAllowlist = m.PrivAppAllowlist() } + +type AppInfos []AppInfo + +var AppInfosProvider = blueprint.NewProvider[AppInfos]() |