Merge "build apexkeys.txt"

am: d8ced0f1d9

Change-Id: I3ec80caf8cc90b5fd1312d4660cad732d17da129
This commit is contained in:
Jiyong Park 2019-02-19 18:07:20 -08:00 committed by android-build-merger
commit db35d040c5
2 changed files with 83 additions and 29 deletions

View file

@ -379,6 +379,13 @@ type apexBundle struct {
outputFiles map[apexPackaging]android.WritablePath
installDir android.OutputPath
public_key_file android.Path
private_key_file android.Path
bundle_public_key bool
container_certificate_file android.Path
container_private_key_file android.Path
// list of files to be included in this apex
filesInfo []apexFile
@ -635,10 +642,6 @@ func getCopyManifestForPrebuiltEtc(prebuilt *android.PrebuiltEtc) (fileToCopy an
func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
filesInfo := []apexFile{}
var keyFile android.Path
var pubKeyFile android.Path
var certificate java.Certificate
if a.properties.Payload_type == nil || *a.properties.Payload_type == "image" {
a.apexTypes = imageApex
} else if *a.properties.Payload_type == "zip" {
@ -704,20 +707,20 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
}
case keyTag:
if key, ok := child.(*apexKey); ok {
keyFile = key.private_key_file
if !key.installable() && ctx.Config().Debuggable() {
// If the key is not installed, bundled it with the APEX.
// Note: this bundled key is valid only for non-production builds
// (eng/userdebug).
pubKeyFile = key.public_key_file
}
a.private_key_file = key.private_key_file
a.public_key_file = key.public_key_file
// If the key is not installed, bundled it with the APEX.
// Note: this bundled key is valid only for non-production builds
// (eng/userdebug).
a.bundle_public_key = !key.installable() && ctx.Config().Debuggable()
return false
} else {
ctx.PropertyErrorf("key", "%q is not an apex_key module", depName)
}
case certificateTag:
if dep, ok := child.(*java.AndroidAppCertificate); ok {
certificate = dep.Certificate
a.container_certificate_file = dep.Certificate.Pem
a.container_private_key_file = dep.Certificate.Key
return false
} else {
ctx.ModuleErrorf("certificate dependency %q must be an android_app_certificate module", depName)
@ -741,7 +744,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
})
a.flattened = ctx.Config().FlattenApex() && !ctx.Config().UnbundledBuild()
if keyFile == nil {
if a.private_key_file == nil {
ctx.PropertyErrorf("key", "private_key for %q could not be found", String(a.properties.Key))
return
}
@ -775,30 +778,28 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
a.filesInfo = filesInfo
if a.apexTypes.zip() {
a.buildUnflattenedApex(ctx, keyFile, pubKeyFile, certificate, zipApex)
a.buildUnflattenedApex(ctx, zipApex)
}
if a.apexTypes.image() {
// Build rule for unflattened APEX is created even when ctx.Config().FlattenApex()
// is true. This is to support referencing APEX via ":<module_name" syntax
// in other modules. It is in AndroidMk where the selection of flattened
// or unflattened APEX is made.
a.buildUnflattenedApex(ctx, keyFile, pubKeyFile, certificate, imageApex)
a.buildUnflattenedApex(ctx, imageApex)
a.buildFlattenedApex(ctx)
}
}
func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile android.Path,
pubKeyFile android.Path, certificate java.Certificate, apexType apexPackaging) {
func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, apexType apexPackaging) {
cert := String(a.properties.Certificate)
if cert != "" && android.SrcIsModule(cert) == "" {
defaultDir := ctx.Config().DefaultAppCertificateDir(ctx)
certificate = java.Certificate{
defaultDir.Join(ctx, cert+".x509.pem"),
defaultDir.Join(ctx, cert+".pk8"),
}
a.container_certificate_file = defaultDir.Join(ctx, cert+".x509.pem")
a.container_private_key_file = defaultDir.Join(ctx, cert+".pk8")
} else if cert == "" {
pem, key := ctx.Config().DefaultAppCertificate(ctx)
certificate = java.Certificate{pem, key}
a.container_certificate_file = pem
a.container_private_key_file = key
}
manifest := ctx.ExpandSource(proptools.StringDefault(a.properties.Manifest, "apex_manifest.json"), "manifest")
@ -886,10 +887,10 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and
optFlags := []string{}
// Additional implicit inputs.
implicitInputs = append(implicitInputs, cannedFsConfig, fileContexts, keyFile)
if pubKeyFile != nil {
implicitInputs = append(implicitInputs, pubKeyFile)
optFlags = append(optFlags, "--pubkey "+pubKeyFile.String())
implicitInputs = append(implicitInputs, cannedFsConfig, fileContexts, a.private_key_file)
if a.bundle_public_key {
implicitInputs = append(implicitInputs, a.public_key_file)
optFlags = append(optFlags, "--pubkey "+a.public_key_file.String())
}
manifestPackageName, overridden := ctx.DeviceConfig().OverrideManifestPackageNameFor(ctx.ModuleName())
@ -915,7 +916,7 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and
"manifest": manifest.String(),
"file_contexts": fileContexts.String(),
"canned_fs_config": cannedFsConfig.String(),
"key": keyFile.String(),
"key": a.private_key_file.String(),
"opt_flags": strings.Join(optFlags, " "),
},
})
@ -962,14 +963,14 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext, keyFile and
Output: a.outputFiles[apexType],
Input: unsignedOutputFile,
Args: map[string]string{
"certificates": strings.Join([]string{certificate.Pem.String(), certificate.Key.String()}, " "),
"certificates": a.container_certificate_file.String() + " " + a.container_private_key_file.String(),
"flags": "-a 4096", //alignment
},
})
// Install to $OUT/soong/{target,host}/.../apex
if a.installable() && (!ctx.Config().FlattenApex() || apexType.zip()) {
ctx.InstallFile(android.PathForModuleInstall(ctx, "apex"), ctx.ModuleName()+suffix, a.outputFiles[apexType])
ctx.InstallFile(a.installDir, ctx.ModuleName()+suffix, a.outputFiles[apexType])
}
}

View file

@ -17,6 +17,7 @@ package apex
import (
"fmt"
"io"
"strings"
"android/soong/android"
@ -27,6 +28,8 @@ var String = proptools.String
func init() {
android.RegisterModuleType("apex_key", apexKeyFactory)
android.RegisterSingletonType("apex_keys_text", apexKeysTextFactory)
android.RegisterMakeVarsProvider(pctx, apexKeysFileProvider)
}
type apexKey struct {
@ -102,3 +105,53 @@ func (m *apexKey) AndroidMk() android.AndroidMkData {
},
}
}
////////////////////////////////////////////////////////////////////////
// apex_keys_text
type apexKeysText struct{}
func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) {
output := android.PathForOutput(ctx, "apexkeys.txt")
*apexKeysFile(ctx.Config()) = output.String()
var filecontent strings.Builder
ctx.VisitAllModules(func(module android.Module) {
if m, ok := module.(android.Module); ok && !m.Enabled() {
return
}
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",
m.Name()+".apex",
m.public_key_file.String(),
m.private_key_file.String(),
m.container_certificate_file.String(),
m.container_private_key_file.String())
}
})
ctx.Build(pctx, android.BuildParams{
Rule: android.WriteFile,
Description: "apex_keys.txt",
Output: output,
Args: map[string]string{
"content": filecontent.String(),
},
})
}
var apexKeysFileKey = android.NewOnceKey("apexKeysFile")
func apexKeysFile(config android.Config) *string {
return config.Once(apexKeysFileKey, func() interface{} {
str := ""
return &str
}).(*string)
}
func apexKeysTextFactory() android.Singleton {
return &apexKeysText{}
}
func apexKeysFileProvider(ctx android.MakeVarsContext) {
ctx.Strict("SOONG_APEX_KEYS_FILE", *apexKeysFile(ctx.Config()))
}