1// Copyright 2022 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package android 16 17import ( 18 "fmt" 19 "strings" 20 21 "github.com/google/blueprint/proptools" 22) 23 24func init() { 25 ctx := InitRegistrationContext 26 ctx.RegisterSingletonModuleType("buildinfo_prop", buildinfoPropFactory) 27} 28 29type buildinfoPropProperties struct { 30 // Whether this module is directly installable to one of the partitions. Default: true. 31 Installable *bool 32} 33 34type buildinfoPropModule struct { 35 SingletonModuleBase 36 37 properties buildinfoPropProperties 38 39 outputFilePath OutputPath 40 installPath InstallPath 41} 42 43var _ OutputFileProducer = (*buildinfoPropModule)(nil) 44 45func (p *buildinfoPropModule) installable() bool { 46 return proptools.BoolDefault(p.properties.Installable, true) 47} 48 49// OutputFileProducer 50func (p *buildinfoPropModule) OutputFiles(tag string) (Paths, error) { 51 if tag != "" { 52 return nil, fmt.Errorf("unsupported tag %q", tag) 53 } 54 return Paths{p.outputFilePath}, nil 55} 56 57func (p *buildinfoPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { 58 p.outputFilePath = PathForModuleOut(ctx, p.Name()).OutputPath 59 if !ctx.Config().KatiEnabled() { 60 WriteFileRule(ctx, p.outputFilePath, "# no buildinfo.prop if kati is disabled") 61 return 62 } 63 64 lines := make([]string, 0) 65 66 writeString := func(str string) { 67 lines = append(lines, str) 68 } 69 70 writeString("# begin build properties") 71 writeString("# autogenerated by build/soong/android/buildinfo_prop.go") 72 73 writeProp := func(key, value string) { 74 if strings.Contains(key, "=") { 75 panic(fmt.Errorf("wrong property key %q: key must not contain '='", key)) 76 } 77 writeString(key + "=" + value) 78 } 79 80 config := ctx.Config() 81 82 writeProp("ro.build.version.sdk", config.PlatformSdkVersion().String()) 83 writeProp("ro.build.version.preview_sdk", config.PlatformPreviewSdkVersion()) 84 writeProp("ro.build.version.codename", config.PlatformSdkCodename()) 85 writeProp("ro.build.version.all_codenames", strings.Join(config.PlatformVersionActiveCodenames(), ",")) 86 writeProp("ro.build.version.release", config.PlatformVersionLastStable()) 87 writeProp("ro.build.version.release_or_codename", config.PlatformVersionName()) 88 writeProp("ro.build.version.security_patch", config.PlatformSecurityPatch()) 89 writeProp("ro.build.version.base_os", config.PlatformBaseOS()) 90 writeProp("ro.build.version.min_supported_target_sdk", config.PlatformMinSupportedTargetSdkVersion()) 91 writeProp("ro.build.version.known_codenames", config.PlatformVersionKnownCodenames()) 92 93 if config.Eng() { 94 writeProp("ro.build.type", "eng") 95 } else if config.Debuggable() { 96 writeProp("ro.build.type", "userdebug") 97 } else { 98 writeProp("ro.build.type", "user") 99 } 100 101 // Currently, only a few properties are implemented to unblock microdroid use case. 102 // TODO(b/189164487): support below properties as well and replace build/make/tools/buildinfo.sh 103 /* 104 if $BOARD_USE_VBMETA_DIGTEST_IN_FINGERPRINT { 105 writeProp("ro.build.legacy.id", config.BuildID()) 106 } else { 107 writeProp("ro.build.id", config.BuildId()) 108 } 109 writeProp("ro.build.display.id", $BUILD_DISPLAY_ID) 110 writeProp("ro.build.version.incremental", $BUILD_NUMBER) 111 writeProp("ro.build.version.preview_sdk_fingerprint", $PLATFORM_PREVIEW_SDK_FINGERPRINT) 112 writeProp("ro.build.version.release_or_preview_display", $PLATFORM_DISPLAY_VERSION) 113 writeProp("ro.build.date", `$DATE`) 114 writeProp("ro.build.date.utc", `$DATE +%s`) 115 writeProp("ro.build.user", $BUILD_USERNAME) 116 writeProp("ro.build.host", $BUILD_HOSTNAME) 117 writeProp("ro.build.tags", $BUILD_VERSION_TAGS) 118 writeProp("ro.build.flavor", $TARGET_BUILD_FLAVOR) 119 // These values are deprecated, use "ro.product.cpu.abilist" 120 // instead (see below). 121 writeString("# ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete,") 122 writeString("# use ro.product.cpu.abilist instead.") 123 writeProp("ro.product.cpu.abi", $TARGET_CPU_ABI) 124 if [ -n "$TARGET_CPU_ABI2" ] { 125 writeProp("ro.product.cpu.abi2", $TARGET_CPU_ABI2) 126 } 127 128 if [ -n "$PRODUCT_DEFAULT_LOCALE" ] { 129 writeProp("ro.product.locale", $PRODUCT_DEFAULT_LOCALE) 130 } 131 writeProp("ro.wifi.channels", $PRODUCT_DEFAULT_WIFI_CHANNELS) 132 writeString("# ro.build.product is obsolete; use ro.product.device") 133 writeProp("ro.build.product", $TARGET_DEVICE) 134 135 writeString("# Do not try to parse description or thumbprint") 136 writeProp("ro.build.description", $PRIVATE_BUILD_DESC) 137 if [ -n "$BUILD_THUMBPRINT" ] { 138 writeProp("ro.build.thumbprint", $BUILD_THUMBPRINT) 139 } 140 */ 141 142 writeString("# end build properties") 143 144 WriteFileRule(ctx, p.outputFilePath, strings.Join(lines, "\n")) 145 146 if !p.installable() { 147 p.SkipInstall() 148 } 149 150 p.installPath = PathForModuleInstall(ctx) 151 ctx.InstallFile(p.installPath, p.Name(), p.outputFilePath) 152} 153 154func (f *buildinfoPropModule) GenerateSingletonBuildActions(ctx SingletonContext) { 155 // does nothing; buildinfo_prop is a singeton because two buildinfo modules don't make sense. 156} 157 158func (p *buildinfoPropModule) AndroidMkEntries() []AndroidMkEntries { 159 return []AndroidMkEntries{AndroidMkEntries{ 160 Class: "ETC", 161 OutputFile: OptionalPathForPath(p.outputFilePath), 162 ExtraEntries: []AndroidMkExtraEntriesFunc{ 163 func(ctx AndroidMkExtraEntriesContext, entries *AndroidMkEntries) { 164 entries.SetString("LOCAL_MODULE_PATH", p.installPath.String()) 165 entries.SetString("LOCAL_INSTALLED_MODULE_STEM", p.outputFilePath.Base()) 166 entries.SetBoolIfTrue("LOCAL_UNINSTALLABLE_MODULE", !p.installable()) 167 }, 168 }, 169 }} 170} 171 172// buildinfo_prop module generates a build.prop file, which contains a set of common 173// system/build.prop properties, such as ro.build.version.*. Not all properties are implemented; 174// currently this module is only for microdroid. 175func buildinfoPropFactory() SingletonModule { 176 module := &buildinfoPropModule{} 177 module.AddProperties(&module.properties) 178 InitAndroidModule(module) 179 return module 180} 181