From a41f12a6fa05a030b426fe68dc0f5d6203a73c79 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Tue, 23 Apr 2019 18:00:10 +0900 Subject: [PATCH] Prebuilt APEXes are recoreded in apexkeys.txt apexkeys.txt now correctly lists prebuilt APEXes with keys specified as PRESIGNED. This change also fixes a bug that non-installable APEXes are listed in the file. Bug: 131130235 Test: m out/soong/apexkeys.txt and check that com.android.apex.cts.shim.apex is listed there with PRESIGNED keys. Change-Id: Ib6d391a82864714743a1cc59cd655bea917b5073 --- android/prebuilt.go | 4 ++++ apex/apex.go | 6 +++++- apex/key.go | 34 ++++++++++++++++++++++++++++++---- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/android/prebuilt.go b/android/prebuilt.go index df25a89fa..2556770de 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -74,6 +74,10 @@ func (p *Prebuilt) SingleSourcePath(ctx ModuleContext) Path { } } +func (p *Prebuilt) UsePrebuilt() bool { + return p.properties.UsePrebuilt +} + func InitPrebuiltModule(module PrebuiltInterface, srcs *[]string) { p := module.Prebuilt() module.AddProperties(&p.properties) diff --git a/apex/apex.go b/apex/apex.go index 004de86c7..178927da6 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1362,11 +1362,15 @@ func (p *Prebuilt) Srcs() android.Paths { return android.Paths{p.outputApex} } +func (p *Prebuilt) InstallFilename() string { + return proptools.StringDefault(p.properties.Filename, p.BaseModuleName()+imageApexSuffix) +} + func (p *Prebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) { // TODO(jungjw): Check the key validity. p.inputApex = p.Prebuilt().SingleSourcePath(ctx) p.installDir = android.PathForModuleInstall(ctx, "apex") - p.installFilename = proptools.StringDefault(p.properties.Filename, ctx.ModuleName()+imageApexSuffix) + p.installFilename = p.InstallFilename() if !strings.HasSuffix(p.installFilename, imageApexSuffix) { ctx.ModuleErrorf("filename should end in %s for prebuilt_apex", imageApexSuffix) } diff --git a/apex/key.go b/apex/key.go index a627e4bc6..6ee3dca3f 100644 --- a/apex/key.go +++ b/apex/key.go @@ -16,6 +16,7 @@ package apex import ( "fmt" + "sort" "strings" "android/soong/android" @@ -106,12 +107,31 @@ type apexKeysText struct { func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) { s.output = android.PathForOutput(ctx, "apexkeys.txt") - var filecontent strings.Builder + apexModulesMap := make(map[string]android.Module) ctx.VisitAllModules(func(module android.Module) { - if m, ok := module.(android.Module); ok && !m.Enabled() { - return + if m, ok := module.(*apexBundle); ok && m.Enabled() && m.installable() { + apexModulesMap[m.Name()] = m } + }) + // Find prebuilts and let them override apexBundle if they are preferred + ctx.VisitAllModules(func(module android.Module) { + if m, ok := module.(*Prebuilt); ok && m.Enabled() && m.installable() && + m.Prebuilt().UsePrebuilt() { + apexModulesMap[m.BaseModuleName()] = m + } + }) + + // iterating over map does not give consistent ordering in golang + var moduleNames []string + for key, _ := range apexModulesMap { + 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\\n", @@ -120,8 +140,14 @@ func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) { m.private_key_file.String(), m.container_certificate_file.String(), m.container_private_key_file.String()) + } 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\\n", + m.InstallFilename(), + "PRESIGNED", "PRESIGNED", "PRESIGNED", "PRESIGNED") } - }) + } + ctx.Build(pctx, android.BuildParams{ Rule: android.WriteFile, Description: "apexkeys.txt",