1*333d2b36SAndroid Build Coastguard Worker// Copyright 2024 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage etc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 19*333d2b36SAndroid Build Coastguard Worker 20*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 21*333d2b36SAndroid Build Coastguard Worker) 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Workerfunc init() { 24*333d2b36SAndroid Build Coastguard Worker RegisterOtacertsZipBuildComponents(android.InitRegistrationContext) 25*333d2b36SAndroid Build Coastguard Worker} 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workerfunc RegisterOtacertsZipBuildComponents(ctx android.RegistrationContext) { 28*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("otacerts_zip", otacertsZipFactory) 29*333d2b36SAndroid Build Coastguard Worker} 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Workertype otacertsZipProperties struct { 32*333d2b36SAndroid Build Coastguard Worker // Make this module available when building for recovery. 33*333d2b36SAndroid Build Coastguard Worker // Only the recovery partition is available. 34*333d2b36SAndroid Build Coastguard Worker Recovery_available *bool 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Worker // Optional subdirectory under which the zip file is installed into. 37*333d2b36SAndroid Build Coastguard Worker Relative_install_path *string 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Worker // Optional name for the installed file. If unspecified, otacerts.zip is used. 40*333d2b36SAndroid Build Coastguard Worker Filename *string 41*333d2b36SAndroid Build Coastguard Worker} 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Workertype otacertsZipModule struct { 44*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Worker properties otacertsZipProperties 47*333d2b36SAndroid Build Coastguard Worker outputPath android.Path 48*333d2b36SAndroid Build Coastguard Worker} 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Worker// otacerts_zip collects key files defined in PRODUCT_DEFAULT_DEV_CERTIFICATE 51*333d2b36SAndroid Build Coastguard Worker// and PRODUCT_EXTRA_OTA_KEYS for system or PRODUCT_EXTRA_RECOVERY_KEYS for 52*333d2b36SAndroid Build Coastguard Worker// recovery image. The output file (otacerts.zip by default) is installed into 53*333d2b36SAndroid Build Coastguard Worker// the relative_install_path directory under the etc directory of the target 54*333d2b36SAndroid Build Coastguard Worker// partition. 55*333d2b36SAndroid Build Coastguard Workerfunc otacertsZipFactory() android.Module { 56*333d2b36SAndroid Build Coastguard Worker module := &otacertsZipModule{} 57*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 58*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) 59*333d2b36SAndroid Build Coastguard Worker return module 60*333d2b36SAndroid Build Coastguard Worker} 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Workervar _ android.ImageInterface = (*otacertsZipModule)(nil) 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) ImageMutatorBegin(ctx android.ImageInterfaceContext) {} 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) VendorVariantNeeded(ctx android.ImageInterfaceContext) bool { 67*333d2b36SAndroid Build Coastguard Worker return false 68*333d2b36SAndroid Build Coastguard Worker} 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) ProductVariantNeeded(ctx android.ImageInterfaceContext) bool { 71*333d2b36SAndroid Build Coastguard Worker return false 72*333d2b36SAndroid Build Coastguard Worker} 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) CoreVariantNeeded(ctx android.ImageInterfaceContext) bool { 75*333d2b36SAndroid Build Coastguard Worker return !m.ModuleBase.InstallInRecovery() 76*333d2b36SAndroid Build Coastguard Worker} 77*333d2b36SAndroid Build Coastguard Worker 78*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) RamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 79*333d2b36SAndroid Build Coastguard Worker return false 80*333d2b36SAndroid Build Coastguard Worker} 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) VendorRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 83*333d2b36SAndroid Build Coastguard Worker return false 84*333d2b36SAndroid Build Coastguard Worker} 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) DebugRamdiskVariantNeeded(ctx android.ImageInterfaceContext) bool { 87*333d2b36SAndroid Build Coastguard Worker return false 88*333d2b36SAndroid Build Coastguard Worker} 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) RecoveryVariantNeeded(ctx android.ImageInterfaceContext) bool { 91*333d2b36SAndroid Build Coastguard Worker return proptools.Bool(m.properties.Recovery_available) || m.ModuleBase.InstallInRecovery() 92*333d2b36SAndroid Build Coastguard Worker} 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) ExtraImageVariations(ctx android.ImageInterfaceContext) []string { 95*333d2b36SAndroid Build Coastguard Worker return nil 96*333d2b36SAndroid Build Coastguard Worker} 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) SetImageVariation(ctx android.ImageInterfaceContext, variation string) { 99*333d2b36SAndroid Build Coastguard Worker} 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) InRecovery() bool { 102*333d2b36SAndroid Build Coastguard Worker return m.ModuleBase.InRecovery() || m.ModuleBase.InstallInRecovery() 103*333d2b36SAndroid Build Coastguard Worker} 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) InstallInRecovery() bool { 106*333d2b36SAndroid Build Coastguard Worker return m.InRecovery() 107*333d2b36SAndroid Build Coastguard Worker} 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) outputFileName() string { 110*333d2b36SAndroid Build Coastguard Worker // Use otacerts.zip if not specified. 111*333d2b36SAndroid Build Coastguard Worker return proptools.StringDefault(m.properties.Filename, "otacerts.zip") 112*333d2b36SAndroid Build Coastguard Worker} 113*333d2b36SAndroid Build Coastguard Worker 114*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { 115*333d2b36SAndroid Build Coastguard Worker // Read .x509.pem file defined in PRODUCT_DEFAULT_DEV_CERTIFICATE or the default test key. 116*333d2b36SAndroid Build Coastguard Worker pem, _ := ctx.Config().DefaultAppCertificate(ctx) 117*333d2b36SAndroid Build Coastguard Worker // Read .x509.pem files listed in PRODUCT_EXTRA_OTA_KEYS or PRODUCT_EXTRA_RECOVERY_KEYS. 118*333d2b36SAndroid Build Coastguard Worker extras := ctx.Config().ExtraOtaKeys(ctx, m.InRecovery()) 119*333d2b36SAndroid Build Coastguard Worker srcPaths := append([]android.SourcePath{pem}, extras...) 120*333d2b36SAndroid Build Coastguard Worker outputPath := android.PathForModuleOut(ctx, m.outputFileName()) 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 123*333d2b36SAndroid Build Coastguard Worker cmd := rule.Command().BuiltTool("soong_zip"). 124*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("-o ", outputPath). 125*333d2b36SAndroid Build Coastguard Worker Flag("-j "). 126*333d2b36SAndroid Build Coastguard Worker Flag("-symlinks=false ") 127*333d2b36SAndroid Build Coastguard Worker for _, src := range srcPaths { 128*333d2b36SAndroid Build Coastguard Worker cmd.FlagWithInput("-f ", src) 129*333d2b36SAndroid Build Coastguard Worker } 130*333d2b36SAndroid Build Coastguard Worker rule.Build(ctx.ModuleName(), "Generating the otacerts zip file") 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Worker installPath := android.PathForModuleInstall(ctx, "etc", proptools.String(m.properties.Relative_install_path)) 133*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(installPath, m.outputFileName(), outputPath) 134*333d2b36SAndroid Build Coastguard Worker m.outputPath = outputPath 135*333d2b36SAndroid Build Coastguard Worker} 136*333d2b36SAndroid Build Coastguard Worker 137*333d2b36SAndroid Build Coastguard Workerfunc (m *otacertsZipModule) AndroidMkEntries() []android.AndroidMkEntries { 138*333d2b36SAndroid Build Coastguard Worker nameSuffix := "" 139*333d2b36SAndroid Build Coastguard Worker if m.InRecovery() { 140*333d2b36SAndroid Build Coastguard Worker nameSuffix = ".recovery" 141*333d2b36SAndroid Build Coastguard Worker } 142*333d2b36SAndroid Build Coastguard Worker return []android.AndroidMkEntries{android.AndroidMkEntries{ 143*333d2b36SAndroid Build Coastguard Worker Class: "ETC", 144*333d2b36SAndroid Build Coastguard Worker SubName: nameSuffix, 145*333d2b36SAndroid Build Coastguard Worker OutputFile: android.OptionalPathForPath(m.outputPath), 146*333d2b36SAndroid Build Coastguard Worker }} 147*333d2b36SAndroid Build Coastguard Worker} 148