apex_sets is added to apexkeys.txt
apex_sets is a new module type that can be used to deliver pre-signed
APEXes, which previously could be done only via prebuilt_apex.
Soon gnow understands apex_sets module types and emits the signing info
of the modules to apexkeys.txt
Bug: 158729168
Test: m
Change-Id: I9507375342ec053309660d94c931a79bf4f21218
diff --git a/apex/key.go b/apex/key.go
index 607cac5..a68f6e1 100644
--- a/apex/key.go
+++ b/apex/key.go
@@ -106,10 +106,36 @@
func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) {
s.output = android.PathForOutput(ctx, "apexkeys.txt")
- apexModulesMap := make(map[string]android.Module)
+ type apexKeyEntry struct {
+ name string
+ presigned bool
+ public_key string
+ private_key string
+ container_certificate string
+ container_private_key string
+ partition string
+ }
+ toString := func(e apexKeyEntry) string {
+ format := "name=%q public_key=%q private_key=%q container_certificate=%q container_private_key=%q partition=%q\\n"
+ if e.presigned {
+ return fmt.Sprintf(format, e.name, "PRESIGNED", "PRESIGNED", "PRESIGNED", "PRESIGNED", e.partition)
+ } else {
+ return fmt.Sprintf(format, e.name, e.public_key, e.private_key, e.container_certificate, e.container_private_key, e.partition)
+ }
+ }
+
+ apexKeyMap := make(map[string]apexKeyEntry)
ctx.VisitAllModules(func(module android.Module) {
if m, ok := module.(*apexBundle); ok && m.Enabled() && m.installable() {
- apexModulesMap[m.Name()] = m
+ apexKeyMap[m.Name()] = apexKeyEntry{
+ name: m.Name() + ".apex",
+ presigned: false,
+ public_key: m.public_key_file.String(),
+ private_key: m.private_key_file.String(),
+ container_certificate: m.container_certificate_file.String(),
+ container_private_key: m.container_private_key_file.String(),
+ partition: m.PartitionTag(ctx.DeviceConfig()),
+ }
}
})
@@ -117,35 +143,43 @@
ctx.VisitAllModules(func(module android.Module) {
if m, ok := module.(*Prebuilt); ok && m.Enabled() && m.installable() &&
m.Prebuilt().UsePrebuilt() {
- apexModulesMap[m.BaseModuleName()] = m
+ apexKeyMap[m.BaseModuleName()] = apexKeyEntry{
+ name: m.InstallFilename(),
+ presigned: true,
+ partition: m.PartitionTag(ctx.DeviceConfig()),
+ }
+ }
+ })
+
+ // Find apex_set and let them override apexBundle or prebuilts. This is done in a separate pass
+ // so that apex_set are not overridden by prebuilts.
+ ctx.VisitAllModules(func(module android.Module) {
+ if m, ok := module.(*ApexSet); ok && m.Enabled() {
+ entry := apexKeyEntry{
+ name: m.InstallFilename(),
+ presigned: true,
+ partition: m.PartitionTag(ctx.DeviceConfig()),
+ }
+
+ for _, om := range m.Overrides() {
+ if _, ok := apexKeyMap[om]; ok {
+ delete(apexKeyMap, om)
+ }
+ }
+ apexKeyMap[m.BaseModuleName()] = entry
}
})
// iterating over map does not give consistent ordering in golang
var moduleNames []string
- for key, _ := range apexModulesMap {
+ for key, _ := range apexKeyMap {
moduleNames = append(moduleNames, key)
}
sort.Strings(moduleNames)
var filecontent strings.Builder
- for _, key := range moduleNames {
- module := apexModulesMap[key]
- if m, ok := module.(*apexBundle); ok {
- fmt.Fprintf(&filecontent,
- "name=%q public_key=%q private_key=%q container_certificate=%q container_private_key=%q partition=%q\\n",
- m.Name()+".apex",
- m.public_key_file.String(),
- m.private_key_file.String(),
- m.container_certificate_file.String(),
- m.container_private_key_file.String(),
- m.PartitionTag(ctx.DeviceConfig()))
- } else if m, ok := module.(*Prebuilt); ok {
- fmt.Fprintf(&filecontent,
- "name=%q public_key=%q private_key=%q container_certificate=%q container_private_key=%q partition=%q\\n",
- m.InstallFilename(),
- "PRESIGNED", "PRESIGNED", "PRESIGNED", "PRESIGNED", m.PartitionTag(ctx.DeviceConfig()))
- }
+ for _, name := range moduleNames {
+ fmt.Fprintf(&filecontent, "%s", toString(apexKeyMap[name]))
}
ctx.Build(pctx, android.BuildParams{