summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apex/apex.go6
-rw-r--r--filesystem/android_device.go51
-rw-r--r--filesystem/filesystem.go3
-rw-r--r--java/app.go4
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]()