Loading apex/androidmk.go +1 −0 Original line number Diff line number Diff line Loading @@ -260,6 +260,7 @@ func (a *apexBundle) androidMkForType() android.AndroidMkData { fmt.Fprintln(w, "LOCAL_SOONG_INSTALL_PAIRS :=", a.outputFile.String()+":"+a.installedFile.String()) fmt.Fprintln(w, "LOCAL_SOONG_INSTALL_SYMLINKS := ", strings.Join(a.compatSymlinks.Strings(), " ")) } fmt.Fprintln(w, "LOCAL_APEX_KEY_PATH := ", a.apexKeysPath.String()) // Because apex writes .mk with Custom(), we need to write manually some common properties // which are available via data.Entries Loading apex/apex.go +4 −0 Original line number Diff line number Diff line Loading @@ -454,6 +454,9 @@ type apexBundle struct { // Path where this APEX was installed. installedFile android.InstallPath // fragment for this apex for apexkeys.txt apexKeysPath android.WritablePath // Installed locations of symlinks for backward compatibility. compatSymlinks android.InstallPaths Loading Loading @@ -1923,6 +1926,7 @@ func (a *apexBundle) ProcessBazelQueryResponse(ctx android.ModuleContext) { a.filesInfo = append(a.filesInfo, fileInfo) } a.apexKeysPath = writeApexKeys(ctx, a) } func (a *apexBundle) setCompression(ctx android.ModuleContext) { Loading apex/apex_test.go +5 −5 Original line number Diff line number Diff line Loading @@ -9089,8 +9089,8 @@ func TestApexKeysTxt(t *testing.T) { } `) apexKeysText := ctx.SingletonForTests("apex_keys_text") content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"] myapex := ctx.ModuleForTests("myapex", "android_common_myapex") content := myapex.Output("apexkeys.txt").BuildParams.Args["content"] ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`) } Loading Loading @@ -9130,10 +9130,10 @@ func TestApexKeysTxtOverrides(t *testing.T) { } `) apexKeysText := ctx.SingletonForTests("apex_keys_text") content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"] content := ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt").BuildParams.Args["content"] ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`) content = ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt").BuildParams.Args["content"] ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`) ensureContains(t, content, `name="myapex.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`) } func TestAllowedFiles(t *testing.T) { Loading apex/builder.go +2 −0 Original line number Diff line number Diff line Loading @@ -948,6 +948,8 @@ func (a *apexBundle) buildApex(ctx android.ModuleContext) { // installed-files.txt is dist'ed a.installedFilesFile = a.buildInstalledFilesFile(ctx, a.outputFile, imageDir) a.apexKeysPath = writeApexKeys(ctx, a) } // getCertificateAndPrivateKey retrieves the cert and the private key that will be used to sign Loading apex/key.go +48 −85 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package apex import ( "fmt" "sort" "strings" "android/soong/android" "android/soong/bazel" Loading @@ -33,7 +31,6 @@ func init() { func registerApexKeyBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("apex_key", ApexKeyFactory) ctx.RegisterParallelSingletonType("apex_keys_text", apexKeysTextFactory) } type apexKey struct { Loading Loading @@ -102,14 +99,6 @@ func (m *apexKey) GenerateAndroidBuildActions(ctx android.ModuleContext) { } } // ////////////////////////////////////////////////////////////////////// // apex_keys_text type apexKeysText struct { output android.OutputPath } func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) { s.output = android.PathForOutput(ctx, "apexkeys.txt") type apexKeyEntry struct { name string presigned bool Loading @@ -120,7 +109,8 @@ func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) { partition string signTool string } toString := func(e apexKeyEntry) string { func (e apexKeyEntry) String() string { signTool := "" if e.signTool != "" { signTool = fmt.Sprintf(" sign_tool=%q", e.signTool) Loading @@ -133,11 +123,11 @@ func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) { } } apexKeyMap := make(map[string]apexKeyEntry) ctx.VisitAllModules(func(module android.Module) { if m, ok := module.(*apexBundle); ok && m.Enabled() && m.installable() { func apexKeyEntryFor(ctx android.ModuleContext, module android.Module) apexKeyEntry { switch m := module.(type) { case *apexBundle: pem, key := m.getCertificateAndPrivateKey(ctx) apexKeyMap[m.Name()] = apexKeyEntry{ return apexKeyEntry{ name: m.Name() + ".apex", presigned: false, publicKey: m.publicKeyFile.String(), Loading @@ -147,54 +137,27 @@ func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) { partition: m.PartitionTag(ctx.DeviceConfig()), signTool: proptools.String(m.properties.Custom_sign_tool), } } }) // 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() { apexKeyMap[m.BaseModuleName()] = apexKeyEntry{ case *Prebuilt: return 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{ case *ApexSet: return apexKeyEntry{ name: m.InstallFilename(), presigned: true, partition: m.PartitionTag(ctx.DeviceConfig()), } apexKeyMap[m.BaseModuleName()] = entry } }) // iterating over map does not give consistent ordering in golang var moduleNames []string for key, _ := range apexKeyMap { moduleNames = append(moduleNames, key) } sort.Strings(moduleNames) var filecontent strings.Builder for _, name := range moduleNames { filecontent.WriteString(toString(apexKeyMap[name])) } android.WriteFileRule(ctx, s.output, filecontent.String()) } func apexKeysTextFactory() android.Singleton { return &apexKeysText{} panic(fmt.Errorf("unknown type(%t) for apexKeyEntry", module)) } func (s *apexKeysText) MakeVars(ctx android.MakeVarsContext) { ctx.Strict("SOONG_APEX_KEYS_FILE", s.output.String()) func writeApexKeys(ctx android.ModuleContext, module android.Module) android.WritablePath { path := android.PathForModuleOut(ctx, "apexkeys.txt") entry := apexKeyEntryFor(ctx, module) android.WriteFileRuleVerbatim(ctx, path, entry.String()) return path } // For Bazel / bp2build Loading Loading
apex/androidmk.go +1 −0 Original line number Diff line number Diff line Loading @@ -260,6 +260,7 @@ func (a *apexBundle) androidMkForType() android.AndroidMkData { fmt.Fprintln(w, "LOCAL_SOONG_INSTALL_PAIRS :=", a.outputFile.String()+":"+a.installedFile.String()) fmt.Fprintln(w, "LOCAL_SOONG_INSTALL_SYMLINKS := ", strings.Join(a.compatSymlinks.Strings(), " ")) } fmt.Fprintln(w, "LOCAL_APEX_KEY_PATH := ", a.apexKeysPath.String()) // Because apex writes .mk with Custom(), we need to write manually some common properties // which are available via data.Entries Loading
apex/apex.go +4 −0 Original line number Diff line number Diff line Loading @@ -454,6 +454,9 @@ type apexBundle struct { // Path where this APEX was installed. installedFile android.InstallPath // fragment for this apex for apexkeys.txt apexKeysPath android.WritablePath // Installed locations of symlinks for backward compatibility. compatSymlinks android.InstallPaths Loading Loading @@ -1923,6 +1926,7 @@ func (a *apexBundle) ProcessBazelQueryResponse(ctx android.ModuleContext) { a.filesInfo = append(a.filesInfo, fileInfo) } a.apexKeysPath = writeApexKeys(ctx, a) } func (a *apexBundle) setCompression(ctx android.ModuleContext) { Loading
apex/apex_test.go +5 −5 Original line number Diff line number Diff line Loading @@ -9089,8 +9089,8 @@ func TestApexKeysTxt(t *testing.T) { } `) apexKeysText := ctx.SingletonForTests("apex_keys_text") content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"] myapex := ctx.ModuleForTests("myapex", "android_common_myapex") content := myapex.Output("apexkeys.txt").BuildParams.Args["content"] ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`) } Loading Loading @@ -9130,10 +9130,10 @@ func TestApexKeysTxtOverrides(t *testing.T) { } `) apexKeysText := ctx.SingletonForTests("apex_keys_text") content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"] content := ctx.ModuleForTests("myapex", "android_common_myapex").Output("apexkeys.txt").BuildParams.Args["content"] ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system" sign_tool="sign_myapex"`) content = ctx.ModuleForTests("myapex_set", "android_common_myapex_set").Output("apexkeys.txt").BuildParams.Args["content"] ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`) ensureContains(t, content, `name="myapex.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`) } func TestAllowedFiles(t *testing.T) { Loading
apex/builder.go +2 −0 Original line number Diff line number Diff line Loading @@ -948,6 +948,8 @@ func (a *apexBundle) buildApex(ctx android.ModuleContext) { // installed-files.txt is dist'ed a.installedFilesFile = a.buildInstalledFilesFile(ctx, a.outputFile, imageDir) a.apexKeysPath = writeApexKeys(ctx, a) } // getCertificateAndPrivateKey retrieves the cert and the private key that will be used to sign Loading
apex/key.go +48 −85 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package apex import ( "fmt" "sort" "strings" "android/soong/android" "android/soong/bazel" Loading @@ -33,7 +31,6 @@ func init() { func registerApexKeyBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("apex_key", ApexKeyFactory) ctx.RegisterParallelSingletonType("apex_keys_text", apexKeysTextFactory) } type apexKey struct { Loading Loading @@ -102,14 +99,6 @@ func (m *apexKey) GenerateAndroidBuildActions(ctx android.ModuleContext) { } } // ////////////////////////////////////////////////////////////////////// // apex_keys_text type apexKeysText struct { output android.OutputPath } func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) { s.output = android.PathForOutput(ctx, "apexkeys.txt") type apexKeyEntry struct { name string presigned bool Loading @@ -120,7 +109,8 @@ func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) { partition string signTool string } toString := func(e apexKeyEntry) string { func (e apexKeyEntry) String() string { signTool := "" if e.signTool != "" { signTool = fmt.Sprintf(" sign_tool=%q", e.signTool) Loading @@ -133,11 +123,11 @@ func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) { } } apexKeyMap := make(map[string]apexKeyEntry) ctx.VisitAllModules(func(module android.Module) { if m, ok := module.(*apexBundle); ok && m.Enabled() && m.installable() { func apexKeyEntryFor(ctx android.ModuleContext, module android.Module) apexKeyEntry { switch m := module.(type) { case *apexBundle: pem, key := m.getCertificateAndPrivateKey(ctx) apexKeyMap[m.Name()] = apexKeyEntry{ return apexKeyEntry{ name: m.Name() + ".apex", presigned: false, publicKey: m.publicKeyFile.String(), Loading @@ -147,54 +137,27 @@ func (s *apexKeysText) GenerateBuildActions(ctx android.SingletonContext) { partition: m.PartitionTag(ctx.DeviceConfig()), signTool: proptools.String(m.properties.Custom_sign_tool), } } }) // 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() { apexKeyMap[m.BaseModuleName()] = apexKeyEntry{ case *Prebuilt: return 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{ case *ApexSet: return apexKeyEntry{ name: m.InstallFilename(), presigned: true, partition: m.PartitionTag(ctx.DeviceConfig()), } apexKeyMap[m.BaseModuleName()] = entry } }) // iterating over map does not give consistent ordering in golang var moduleNames []string for key, _ := range apexKeyMap { moduleNames = append(moduleNames, key) } sort.Strings(moduleNames) var filecontent strings.Builder for _, name := range moduleNames { filecontent.WriteString(toString(apexKeyMap[name])) } android.WriteFileRule(ctx, s.output, filecontent.String()) } func apexKeysTextFactory() android.Singleton { return &apexKeysText{} panic(fmt.Errorf("unknown type(%t) for apexKeyEntry", module)) } func (s *apexKeysText) MakeVars(ctx android.MakeVarsContext) { ctx.Strict("SOONG_APEX_KEYS_FILE", s.output.String()) func writeApexKeys(ctx android.ModuleContext, module android.Module) android.WritablePath { path := android.PathForModuleOut(ctx, "apexkeys.txt") entry := apexKeyEntryFor(ctx, module) android.WriteFileRuleVerbatim(ctx, path, entry.String()) return path } // For Bazel / bp2build Loading