1*333d2b36SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*333d2b36SAndroid Build Coastguard Worker# 3*333d2b36SAndroid Build Coastguard Worker# Copyright (C) 2024 The Android Open Source Project 4*333d2b36SAndroid Build Coastguard Worker# 5*333d2b36SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*333d2b36SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*333d2b36SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*333d2b36SAndroid Build Coastguard Worker# 9*333d2b36SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*333d2b36SAndroid Build Coastguard Worker# 11*333d2b36SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*333d2b36SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*333d2b36SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*333d2b36SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*333d2b36SAndroid Build Coastguard Worker# limitations under the License. 16*333d2b36SAndroid Build Coastguard Worker# 17*333d2b36SAndroid Build Coastguard Worker"""A tool for generating {partition}/build.prop""" 18*333d2b36SAndroid Build Coastguard Worker 19*333d2b36SAndroid Build Coastguard Workerimport argparse 20*333d2b36SAndroid Build Coastguard Workerimport contextlib 21*333d2b36SAndroid Build Coastguard Workerimport json 22*333d2b36SAndroid Build Coastguard Workerimport os 23*333d2b36SAndroid Build Coastguard Workerimport subprocess 24*333d2b36SAndroid Build Coastguard Workerimport sys 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard WorkerTEST_KEY_DIR = "build/make/target/product/security" 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workerdef get_build_variant(product_config): 29*333d2b36SAndroid Build Coastguard Worker if product_config["Eng"]: 30*333d2b36SAndroid Build Coastguard Worker return "eng" 31*333d2b36SAndroid Build Coastguard Worker elif product_config["Debuggable"]: 32*333d2b36SAndroid Build Coastguard Worker return "userdebug" 33*333d2b36SAndroid Build Coastguard Worker else: 34*333d2b36SAndroid Build Coastguard Worker return "user" 35*333d2b36SAndroid Build Coastguard Worker 36*333d2b36SAndroid Build Coastguard Workerdef get_build_flavor(product_config): 37*333d2b36SAndroid Build Coastguard Worker build_flavor = product_config["DeviceProduct"] + "-" + get_build_variant(product_config) 38*333d2b36SAndroid Build Coastguard Worker if "address" in product_config.get("SanitizeDevice", []) and "_asan" not in build_flavor: 39*333d2b36SAndroid Build Coastguard Worker build_flavor += "_asan" 40*333d2b36SAndroid Build Coastguard Worker return build_flavor 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Workerdef get_build_keys(product_config): 43*333d2b36SAndroid Build Coastguard Worker default_cert = product_config.get("DefaultAppCertificate", "") 44*333d2b36SAndroid Build Coastguard Worker if default_cert == "" or default_cert == os.path.join(TEST_KEY_DIR, "testKey"): 45*333d2b36SAndroid Build Coastguard Worker return "test-keys" 46*333d2b36SAndroid Build Coastguard Worker return "dev-keys" 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Workerdef parse_args(): 49*333d2b36SAndroid Build Coastguard Worker """Parse commandline arguments.""" 50*333d2b36SAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 51*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--build-fingerprint-file", required=True, type=argparse.FileType("r")) 52*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--build-hostname-file", required=True, type=argparse.FileType("r")) 53*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--build-number-file", required=True, type=argparse.FileType("r")) 54*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--build-thumbprint-file", type=argparse.FileType("r")) 55*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--build-username", required=True) 56*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--date-file", required=True, type=argparse.FileType("r")) 57*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--platform-preview-sdk-fingerprint-file", required=True, type=argparse.FileType("r")) 58*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--prop-files", action="append", type=argparse.FileType("r"), default=[]) 59*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--product-config", required=True, type=argparse.FileType("r")) 60*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--partition", required=True) 61*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--build-broken-dup-sysprop", action="store_true", default=False) 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Worker parser.add_argument("--out", required=True, type=argparse.FileType("w")) 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker args = parser.parse_args() 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Worker # post process parse_args requiring manual handling 68*333d2b36SAndroid Build Coastguard Worker args.config = json.load(args.product_config) 69*333d2b36SAndroid Build Coastguard Worker config = args.config 70*333d2b36SAndroid Build Coastguard Worker 71*333d2b36SAndroid Build Coastguard Worker config["BuildFlavor"] = get_build_flavor(config) 72*333d2b36SAndroid Build Coastguard Worker config["BuildKeys"] = get_build_keys(config) 73*333d2b36SAndroid Build Coastguard Worker config["BuildVariant"] = get_build_variant(config) 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Worker config["BuildFingerprint"] = args.build_fingerprint_file.read().strip() 76*333d2b36SAndroid Build Coastguard Worker config["BuildHostname"] = args.build_hostname_file.read().strip() 77*333d2b36SAndroid Build Coastguard Worker config["BuildNumber"] = args.build_number_file.read().strip() 78*333d2b36SAndroid Build Coastguard Worker config["BuildUsername"] = args.build_username 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Worker build_version_tags_list = config["BuildVersionTags"] 81*333d2b36SAndroid Build Coastguard Worker if config["BuildType"] == "debug": 82*333d2b36SAndroid Build Coastguard Worker build_version_tags_list.append("debug") 83*333d2b36SAndroid Build Coastguard Worker build_version_tags_list.append(config["BuildKeys"]) 84*333d2b36SAndroid Build Coastguard Worker build_version_tags = ",".join(sorted(set(build_version_tags_list))) 85*333d2b36SAndroid Build Coastguard Worker config["BuildVersionTags"] = build_version_tags 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker raw_date = args.date_file.read().strip() 88*333d2b36SAndroid Build Coastguard Worker config["Date"] = subprocess.check_output(["date", "-d", f"@{raw_date}"], text=True).strip() 89*333d2b36SAndroid Build Coastguard Worker config["DateUtc"] = subprocess.check_output(["date", "-d", f"@{raw_date}", "+%s"], text=True).strip() 90*333d2b36SAndroid Build Coastguard Worker 91*333d2b36SAndroid Build Coastguard Worker # build_desc is human readable strings that describe this build. This has the same info as the 92*333d2b36SAndroid Build Coastguard Worker # build fingerprint. 93*333d2b36SAndroid Build Coastguard Worker # e.g. "aosp_cf_x86_64_phone-userdebug VanillaIceCream MAIN eng.20240319.143939 test-keys" 94*333d2b36SAndroid Build Coastguard Worker config["BuildDesc"] = f"{config['DeviceProduct']}-{config['BuildVariant']} " \ 95*333d2b36SAndroid Build Coastguard Worker f"{config['Platform_version_name']} {config['BuildId']} " \ 96*333d2b36SAndroid Build Coastguard Worker f"{config['BuildNumber']} {config['BuildVersionTags']}" 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Worker config["PlatformPreviewSdkFingerprint"] = args.platform_preview_sdk_fingerprint_file.read().strip() 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Worker if args.build_thumbprint_file: 101*333d2b36SAndroid Build Coastguard Worker config["BuildThumbprint"] = args.build_thumbprint_file.read().strip() 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Worker append_additional_system_props(args) 104*333d2b36SAndroid Build Coastguard Worker append_additional_vendor_props(args) 105*333d2b36SAndroid Build Coastguard Worker append_additional_product_props(args) 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Worker return args 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Workerdef generate_common_build_props(args): 110*333d2b36SAndroid Build Coastguard Worker print("####################################") 111*333d2b36SAndroid Build Coastguard Worker print("# from generate_common_build_props") 112*333d2b36SAndroid Build Coastguard Worker print("# These properties identify this partition image.") 113*333d2b36SAndroid Build Coastguard Worker print("####################################") 114*333d2b36SAndroid Build Coastguard Worker 115*333d2b36SAndroid Build Coastguard Worker config = args.config 116*333d2b36SAndroid Build Coastguard Worker build_flags = config["BuildFlags"] 117*333d2b36SAndroid Build Coastguard Worker partition = args.partition 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker if partition == "system": 120*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.{partition}.brand={config['SystemBrand']}") 121*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.{partition}.device={config['SystemDevice']}") 122*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.{partition}.manufacturer={config['SystemManufacturer']}") 123*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.{partition}.model={config['SystemModel']}") 124*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.{partition}.name={config['SystemName']}") 125*333d2b36SAndroid Build Coastguard Worker else: 126*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.{partition}.brand={config['ProductBrand']}") 127*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.{partition}.device={config['DeviceName']}") 128*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.{partition}.manufacturer={config['ProductManufacturer']}") 129*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.{partition}.model={config['ProductModel']}") 130*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.{partition}.name={config['DeviceProduct']}") 131*333d2b36SAndroid Build Coastguard Worker 132*333d2b36SAndroid Build Coastguard Worker if partition != "system": 133*333d2b36SAndroid Build Coastguard Worker if config["ProductModelForAttestation"]: 134*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.model_for_attestation={config['ProductModelForAttestation']}") 135*333d2b36SAndroid Build Coastguard Worker if config["ProductBrandForAttestation"]: 136*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.brand_for_attestation={config['ProductBrandForAttestation']}") 137*333d2b36SAndroid Build Coastguard Worker if config["ProductNameForAttestation"]: 138*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.name_for_attestation={config['ProductNameForAttestation']}") 139*333d2b36SAndroid Build Coastguard Worker if config["ProductDeviceForAttestation"]: 140*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.device_for_attestation={config['ProductDeviceForAttestation']}") 141*333d2b36SAndroid Build Coastguard Worker if config["ProductManufacturerForAttestation"]: 142*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.manufacturer_for_attestation={config['ProductManufacturerForAttestation']}") 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Worker if config["ZygoteForce64"]: 145*333d2b36SAndroid Build Coastguard Worker if partition == "vendor": 146*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.product.cpu.abilist={config['DeviceAbiList64']}") 147*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.product.cpu.abilist32=") 148*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.product.cpu.abilist64={config['DeviceAbiList64']}") 149*333d2b36SAndroid Build Coastguard Worker else: 150*333d2b36SAndroid Build Coastguard Worker if partition == "system" or partition == "vendor" or partition == "odm": 151*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.product.cpu.abilist={config['DeviceAbiList']}") 152*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.product.cpu.abilist32={config['DeviceAbiList32']}") 153*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.product.cpu.abilist64={config['DeviceAbiList64']}") 154*333d2b36SAndroid Build Coastguard Worker 155*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.build.date={config['Date']}") 156*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.build.date.utc={config['DateUtc']}") 157*333d2b36SAndroid Build Coastguard Worker # Allow optional assignments for ARC forward-declarations (b/249168657) 158*333d2b36SAndroid Build Coastguard Worker # TODO: Remove any tag-related inconsistencies once the goals from 159*333d2b36SAndroid Build Coastguard Worker # go/arc-android-sigprop-changes have been achieved. 160*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.build.fingerprint?={config['BuildFingerprint']}") 161*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.build.id?={config['BuildId']}") 162*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.build.tags?={config['BuildVersionTags']}") 163*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.build.type={config['BuildVariant']}") 164*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.build.version.incremental={config['BuildNumber']}") 165*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.build.version.release={config['Platform_version_last_stable']}") 166*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.build.version.release_or_codename={config['Platform_version_name']}") 167*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.build.version.sdk={config['Platform_sdk_version']}") 168*333d2b36SAndroid Build Coastguard Worker print(f"ro.{partition}.build.version.sdk_minor={build_flags['RELEASE_PLATFORM_SDK_MINOR_VERSION']}") 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Workerdef generate_build_info(args): 171*333d2b36SAndroid Build Coastguard Worker print() 172*333d2b36SAndroid Build Coastguard Worker print("####################################") 173*333d2b36SAndroid Build Coastguard Worker print("# from gen_build_prop.py:generate_build_info") 174*333d2b36SAndroid Build Coastguard Worker print("####################################") 175*333d2b36SAndroid Build Coastguard Worker print("# begin build properties") 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker config = args.config 178*333d2b36SAndroid Build Coastguard Worker build_flags = config["BuildFlags"] 179*333d2b36SAndroid Build Coastguard Worker 180*333d2b36SAndroid Build Coastguard Worker # The ro.build.id will be set dynamically by init, by appending the unique vbmeta digest. 181*333d2b36SAndroid Build Coastguard Worker if config["BoardUseVbmetaDigestInFingerprint"]: 182*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.legacy.id={config['BuildId']}") 183*333d2b36SAndroid Build Coastguard Worker else: 184*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.id?={config['BuildId']}") 185*333d2b36SAndroid Build Coastguard Worker 186*333d2b36SAndroid Build Coastguard Worker # ro.build.display.id is shown under Settings -> About Phone 187*333d2b36SAndroid Build Coastguard Worker if config["BuildVariant"] == "user": 188*333d2b36SAndroid Build Coastguard Worker # User builds should show: 189*333d2b36SAndroid Build Coastguard Worker # release build number or branch.buld_number non-release builds 190*333d2b36SAndroid Build Coastguard Worker 191*333d2b36SAndroid Build Coastguard Worker # Dev. branches should have DISPLAY_BUILD_NUMBER set 192*333d2b36SAndroid Build Coastguard Worker if config["DisplayBuildNumber"]: 193*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.display.id?={config['BuildId']}.{config['BuildNumber']} {config['BuildKeys']}") 194*333d2b36SAndroid Build Coastguard Worker else: 195*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.display.id?={config['BuildId']} {config['BuildKeys']}") 196*333d2b36SAndroid Build Coastguard Worker else: 197*333d2b36SAndroid Build Coastguard Worker # Non-user builds should show detailed build information (See build desc above) 198*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.display.id?={config['BuildDesc']}") 199*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.incremental={config['BuildNumber']}") 200*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.sdk={config['Platform_sdk_version']}") 201*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.sdk_minor={build_flags['RELEASE_PLATFORM_SDK_MINOR_VERSION']}") 202*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.preview_sdk={config['Platform_preview_sdk_version']}") 203*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.preview_sdk_fingerprint={config['PlatformPreviewSdkFingerprint']}") 204*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.codename={config['Platform_sdk_codename']}") 205*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.all_codenames={','.join(config['Platform_version_active_codenames'])}") 206*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.known_codenames={config['Platform_version_known_codenames']}") 207*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.release={config['Platform_version_last_stable']}") 208*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.release_or_codename={config['Platform_version_name']}") 209*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.release_or_preview_display={config['Platform_display_version_name']}") 210*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.security_patch={config['Platform_security_patch']}") 211*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.base_os={config['Platform_base_os']}") 212*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.version.min_supported_target_sdk={build_flags['RELEASE_PLATFORM_MIN_SUPPORTED_TARGET_SDK_VERSION']}") 213*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.date={config['Date']}") 214*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.date.utc={config['DateUtc']}") 215*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.type={config['BuildVariant']}") 216*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.user={config['BuildUsername']}") 217*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.host={config['BuildHostname']}") 218*333d2b36SAndroid Build Coastguard Worker # TODO: Remove any tag-related optional property declarations once the goals 219*333d2b36SAndroid Build Coastguard Worker # from go/arc-android-sigprop-changes have been achieved. 220*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.tags?={config['BuildVersionTags']}") 221*333d2b36SAndroid Build Coastguard Worker # ro.build.flavor are used only by the test harness to distinguish builds. 222*333d2b36SAndroid Build Coastguard Worker # Only add _asan for a sanitized build if it isn't already a part of the 223*333d2b36SAndroid Build Coastguard Worker # flavor (via a dedicated lunch config for example). 224*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.flavor={config['BuildFlavor']}") 225*333d2b36SAndroid Build Coastguard Worker 226*333d2b36SAndroid Build Coastguard Worker # These values are deprecated, use "ro.product.cpu.abilist" 227*333d2b36SAndroid Build Coastguard Worker # instead (see below). 228*333d2b36SAndroid Build Coastguard Worker print(f"# ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete,") 229*333d2b36SAndroid Build Coastguard Worker print(f"# use ro.product.cpu.abilist instead.") 230*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.cpu.abi={config['DeviceAbi'][0]}") 231*333d2b36SAndroid Build Coastguard Worker if len(config["DeviceAbi"]) > 1: 232*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.cpu.abi2={config['DeviceAbi'][1]}") 233*333d2b36SAndroid Build Coastguard Worker 234*333d2b36SAndroid Build Coastguard Worker if config["ProductLocales"]: 235*333d2b36SAndroid Build Coastguard Worker print(f"ro.product.locale={config['ProductLocales'][0]}") 236*333d2b36SAndroid Build Coastguard Worker print(f"ro.wifi.channels={' '.join(config['ProductDefaultWifiChannels'])}") 237*333d2b36SAndroid Build Coastguard Worker 238*333d2b36SAndroid Build Coastguard Worker print(f"# ro.build.product is obsolete; use ro.product.device") 239*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.product={config['DeviceName']}") 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Worker print(f"# Do not try to parse description or thumbprint") 242*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.description?={config['BuildDesc']}") 243*333d2b36SAndroid Build Coastguard Worker if "BuildThumbprint" in config: 244*333d2b36SAndroid Build Coastguard Worker print(f"ro.build.thumbprint={config['BuildThumbprint']}") 245*333d2b36SAndroid Build Coastguard Worker 246*333d2b36SAndroid Build Coastguard Worker print(f"# end build properties") 247*333d2b36SAndroid Build Coastguard Worker 248*333d2b36SAndroid Build Coastguard Workerdef write_properties_from_file(file): 249*333d2b36SAndroid Build Coastguard Worker print() 250*333d2b36SAndroid Build Coastguard Worker print("####################################") 251*333d2b36SAndroid Build Coastguard Worker print(f"# from {file.name}") 252*333d2b36SAndroid Build Coastguard Worker print("####################################") 253*333d2b36SAndroid Build Coastguard Worker print(file.read(), end="") 254*333d2b36SAndroid Build Coastguard Worker 255*333d2b36SAndroid Build Coastguard Workerdef write_properties_from_variable(name, props, build_broken_dup_sysprop): 256*333d2b36SAndroid Build Coastguard Worker print() 257*333d2b36SAndroid Build Coastguard Worker print("####################################") 258*333d2b36SAndroid Build Coastguard Worker print(f"# from variable {name}") 259*333d2b36SAndroid Build Coastguard Worker print("####################################") 260*333d2b36SAndroid Build Coastguard Worker 261*333d2b36SAndroid Build Coastguard Worker # Implement the legacy behavior when BUILD_BROKEN_DUP_SYSPROP is on. 262*333d2b36SAndroid Build Coastguard Worker # Optional assignments are all converted to normal assignments and 263*333d2b36SAndroid Build Coastguard Worker # when their duplicates the first one wins. 264*333d2b36SAndroid Build Coastguard Worker if build_broken_dup_sysprop: 265*333d2b36SAndroid Build Coastguard Worker processed_props = [] 266*333d2b36SAndroid Build Coastguard Worker seen_props = set() 267*333d2b36SAndroid Build Coastguard Worker for line in props: 268*333d2b36SAndroid Build Coastguard Worker line = line.replace("?=", "=") 269*333d2b36SAndroid Build Coastguard Worker key, value = line.split("=", 1) 270*333d2b36SAndroid Build Coastguard Worker if key in seen_props: 271*333d2b36SAndroid Build Coastguard Worker continue 272*333d2b36SAndroid Build Coastguard Worker seen_props.add(key) 273*333d2b36SAndroid Build Coastguard Worker processed_props.append(line) 274*333d2b36SAndroid Build Coastguard Worker props = processed_props 275*333d2b36SAndroid Build Coastguard Worker 276*333d2b36SAndroid Build Coastguard Worker for line in props: 277*333d2b36SAndroid Build Coastguard Worker print(line) 278*333d2b36SAndroid Build Coastguard Worker 279*333d2b36SAndroid Build Coastguard Workerdef append_additional_system_props(args): 280*333d2b36SAndroid Build Coastguard Worker props = [] 281*333d2b36SAndroid Build Coastguard Worker 282*333d2b36SAndroid Build Coastguard Worker config = args.config 283*333d2b36SAndroid Build Coastguard Worker 284*333d2b36SAndroid Build Coastguard Worker # Add the product-defined properties to the build properties. 285*333d2b36SAndroid Build Coastguard Worker if not config["PropertySplitEnabled"] or not config["VendorImageFileSystemType"]: 286*333d2b36SAndroid Build Coastguard Worker if "PRODUCT_PROPERTY_OVERRIDES" in config: 287*333d2b36SAndroid Build Coastguard Worker props += config["PRODUCT_PROPERTY_OVERRIDES"] 288*333d2b36SAndroid Build Coastguard Worker 289*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.treble.enabled={'true' if config['FullTreble'] else 'false'}") 290*333d2b36SAndroid Build Coastguard Worker # Set ro.llndk.api_level to show the maximum vendor API level that the LLNDK 291*333d2b36SAndroid Build Coastguard Worker # in the system partition supports. 292*333d2b36SAndroid Build Coastguard Worker if config["VendorApiLevel"]: 293*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.llndk.api_level={config['VendorApiLevel']}") 294*333d2b36SAndroid Build Coastguard Worker 295*333d2b36SAndroid Build Coastguard Worker # Sets ro.actionable_compatible_property.enabled to know on runtime whether 296*333d2b36SAndroid Build Coastguard Worker # the allowed list of actionable compatible properties is enabled or not. 297*333d2b36SAndroid Build Coastguard Worker props.append("ro.actionable_compatible_property.enabled=true") 298*333d2b36SAndroid Build Coastguard Worker 299*333d2b36SAndroid Build Coastguard Worker # Enable core platform API violation warnings on userdebug and eng builds. 300*333d2b36SAndroid Build Coastguard Worker if config["BuildVariant"] != "user": 301*333d2b36SAndroid Build Coastguard Worker props.append("persist.debug.dalvik.vm.core_platform_api_policy=just-warn") 302*333d2b36SAndroid Build Coastguard Worker 303*333d2b36SAndroid Build Coastguard Worker # Define ro.sanitize.<name> properties for all global sanitizers. 304*333d2b36SAndroid Build Coastguard Worker for sanitize_target in config["SanitizeDevice"]: 305*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.sanitize.{sanitize_target}=true") 306*333d2b36SAndroid Build Coastguard Worker 307*333d2b36SAndroid Build Coastguard Worker # Sets the default value of ro.postinstall.fstab.prefix to /system. 308*333d2b36SAndroid Build Coastguard Worker # Device board config should override the value to /product when needed by: 309*333d2b36SAndroid Build Coastguard Worker # 310*333d2b36SAndroid Build Coastguard Worker # PRODUCT_PRODUCT_PROPERTIES += ro.postinstall.fstab.prefix=/product 311*333d2b36SAndroid Build Coastguard Worker # 312*333d2b36SAndroid Build Coastguard Worker # It then uses ${ro.postinstall.fstab.prefix}/etc/fstab.postinstall to 313*333d2b36SAndroid Build Coastguard Worker # mount system_other partition. 314*333d2b36SAndroid Build Coastguard Worker props.append("ro.postinstall.fstab.prefix=/system") 315*333d2b36SAndroid Build Coastguard Worker 316*333d2b36SAndroid Build Coastguard Worker enable_target_debugging = True 317*333d2b36SAndroid Build Coastguard Worker enable_dalvik_lock_contention_logging = True 318*333d2b36SAndroid Build Coastguard Worker if config["BuildVariant"] == "user" or config["BuildVariant"] == "userdebug": 319*333d2b36SAndroid Build Coastguard Worker # Target is secure in user builds. 320*333d2b36SAndroid Build Coastguard Worker props.append("ro.secure=1") 321*333d2b36SAndroid Build Coastguard Worker props.append("security.perf_harden=1") 322*333d2b36SAndroid Build Coastguard Worker 323*333d2b36SAndroid Build Coastguard Worker if config["BuildVariant"] == "user": 324*333d2b36SAndroid Build Coastguard Worker # Disable debugging in plain user builds. 325*333d2b36SAndroid Build Coastguard Worker props.append("ro.adb.secure=1") 326*333d2b36SAndroid Build Coastguard Worker enable_target_debugging = False 327*333d2b36SAndroid Build Coastguard Worker enable_dalvik_lock_contention_logging = False 328*333d2b36SAndroid Build Coastguard Worker else: 329*333d2b36SAndroid Build Coastguard Worker # Disable debugging in userdebug builds if PRODUCT_NOT_DEBUGGABLE_IN_USERDEBUG 330*333d2b36SAndroid Build Coastguard Worker # is set. 331*333d2b36SAndroid Build Coastguard Worker if config["ProductNotDebuggableInUserdebug"]: 332*333d2b36SAndroid Build Coastguard Worker enable_target_debugging = False 333*333d2b36SAndroid Build Coastguard Worker 334*333d2b36SAndroid Build Coastguard Worker # Disallow mock locations by default for user builds 335*333d2b36SAndroid Build Coastguard Worker props.append("ro.allow.mock.location=0") 336*333d2b36SAndroid Build Coastguard Worker else: 337*333d2b36SAndroid Build Coastguard Worker # Turn on checkjni for non-user builds. 338*333d2b36SAndroid Build Coastguard Worker props.append("ro.kernel.android.checkjni=1") 339*333d2b36SAndroid Build Coastguard Worker # Set device insecure for non-user builds. 340*333d2b36SAndroid Build Coastguard Worker props.append("ro.secure=0") 341*333d2b36SAndroid Build Coastguard Worker # Allow mock locations by default for non user builds 342*333d2b36SAndroid Build Coastguard Worker props.append("ro.allow.mock.location=1") 343*333d2b36SAndroid Build Coastguard Worker 344*333d2b36SAndroid Build Coastguard Worker if enable_dalvik_lock_contention_logging: 345*333d2b36SAndroid Build Coastguard Worker # Enable Dalvik lock contention logging. 346*333d2b36SAndroid Build Coastguard Worker props.append("dalvik.vm.lockprof.threshold=500") 347*333d2b36SAndroid Build Coastguard Worker 348*333d2b36SAndroid Build Coastguard Worker if enable_target_debugging: 349*333d2b36SAndroid Build Coastguard Worker # Target is more debuggable and adbd is on by default 350*333d2b36SAndroid Build Coastguard Worker props.append("ro.debuggable=1") 351*333d2b36SAndroid Build Coastguard Worker else: 352*333d2b36SAndroid Build Coastguard Worker # Target is less debuggable and adbd is off by default 353*333d2b36SAndroid Build Coastguard Worker props.append("ro.debuggable=0") 354*333d2b36SAndroid Build Coastguard Worker 355*333d2b36SAndroid Build Coastguard Worker if config["BuildVariant"] == "eng": 356*333d2b36SAndroid Build Coastguard Worker if "ro.setupwizard.mode=ENABLED" in props: 357*333d2b36SAndroid Build Coastguard Worker # Don't require the setup wizard on eng builds 358*333d2b36SAndroid Build Coastguard Worker props = list(filter(lambda x: not x.startswith("ro.setupwizard.mode="), props)) 359*333d2b36SAndroid Build Coastguard Worker props.append("ro.setupwizard.mode=OPTIONAL") 360*333d2b36SAndroid Build Coastguard Worker 361*333d2b36SAndroid Build Coastguard Worker if not config["SdkBuild"]: 362*333d2b36SAndroid Build Coastguard Worker # To speedup startup of non-preopted builds, don't verify or compile the boot image. 363*333d2b36SAndroid Build Coastguard Worker props.append("dalvik.vm.image-dex2oat-filter=extract") 364*333d2b36SAndroid Build Coastguard Worker # b/323566535 365*333d2b36SAndroid Build Coastguard Worker props.append("init.svc_debug.no_fatal.zygote=true") 366*333d2b36SAndroid Build Coastguard Worker 367*333d2b36SAndroid Build Coastguard Worker if config["SdkBuild"]: 368*333d2b36SAndroid Build Coastguard Worker props.append("xmpp.auto-presence=true") 369*333d2b36SAndroid Build Coastguard Worker props.append("ro.config.nocheckin=yes") 370*333d2b36SAndroid Build Coastguard Worker 371*333d2b36SAndroid Build Coastguard Worker props.append("net.bt.name=Android") 372*333d2b36SAndroid Build Coastguard Worker 373*333d2b36SAndroid Build Coastguard Worker # This property is set by flashing debug boot image, so default to false. 374*333d2b36SAndroid Build Coastguard Worker props.append("ro.force.debuggable=0") 375*333d2b36SAndroid Build Coastguard Worker 376*333d2b36SAndroid Build Coastguard Worker config["ADDITIONAL_SYSTEM_PROPERTIES"] = props 377*333d2b36SAndroid Build Coastguard Worker 378*333d2b36SAndroid Build Coastguard Workerdef append_additional_vendor_props(args): 379*333d2b36SAndroid Build Coastguard Worker props = [] 380*333d2b36SAndroid Build Coastguard Worker 381*333d2b36SAndroid Build Coastguard Worker config = args.config 382*333d2b36SAndroid Build Coastguard Worker build_flags = config["BuildFlags"] 383*333d2b36SAndroid Build Coastguard Worker 384*333d2b36SAndroid Build Coastguard Worker # Add cpu properties for bionic and ART. 385*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.bionic.arch={config['DeviceArch']}") 386*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.bionic.cpu_variant={config['DeviceCpuVariantRuntime']}") 387*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.bionic.2nd_arch={config['DeviceSecondaryArch']}") 388*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.bionic.2nd_cpu_variant={config['DeviceSecondaryCpuVariantRuntime']}") 389*333d2b36SAndroid Build Coastguard Worker 390*333d2b36SAndroid Build Coastguard Worker props.append(f"persist.sys.dalvik.vm.lib.2=libart.so") 391*333d2b36SAndroid Build Coastguard Worker props.append(f"dalvik.vm.isa.{config['DeviceArch']}.variant={config['Dex2oatTargetCpuVariantRuntime']}") 392*333d2b36SAndroid Build Coastguard Worker if config["Dex2oatTargetInstructionSetFeatures"]: 393*333d2b36SAndroid Build Coastguard Worker props.append(f"dalvik.vm.isa.{config['DeviceArch']}.features={config['Dex2oatTargetInstructionSetFeatures']}") 394*333d2b36SAndroid Build Coastguard Worker 395*333d2b36SAndroid Build Coastguard Worker if config["DeviceSecondaryArch"]: 396*333d2b36SAndroid Build Coastguard Worker props.append(f"dalvik.vm.isa.{config['DeviceSecondaryArch']}.variant={config['SecondaryDex2oatCpuVariantRuntime']}") 397*333d2b36SAndroid Build Coastguard Worker if config["SecondaryDex2oatInstructionSetFeatures"]: 398*333d2b36SAndroid Build Coastguard Worker props.append(f"dalvik.vm.isa.{config['DeviceSecondaryArch']}.features={config['SecondaryDex2oatInstructionSetFeatures']}") 399*333d2b36SAndroid Build Coastguard Worker 400*333d2b36SAndroid Build Coastguard Worker # Although these variables are prefixed with TARGET_RECOVERY_, they are also needed under charger 401*333d2b36SAndroid Build Coastguard Worker # mode (via libminui). 402*333d2b36SAndroid Build Coastguard Worker if config["RecoveryDefaultRotation"]: 403*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.minui.default_rotation={config['RecoveryDefaultRotation']}") 404*333d2b36SAndroid Build Coastguard Worker 405*333d2b36SAndroid Build Coastguard Worker if config["RecoveryOverscanPercent"]: 406*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.minui.overscan_percent={config['RecoveryOverscanPercent']}") 407*333d2b36SAndroid Build Coastguard Worker 408*333d2b36SAndroid Build Coastguard Worker if config["RecoveryPixelFormat"]: 409*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.minui.pixel_format={config['RecoveryPixelFormat']}") 410*333d2b36SAndroid Build Coastguard Worker 411*333d2b36SAndroid Build Coastguard Worker if "UseDynamicPartitions" in config: 412*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.boot.dynamic_partitions={'true' if config['UseDynamicPartitions'] else 'false'}") 413*333d2b36SAndroid Build Coastguard Worker 414*333d2b36SAndroid Build Coastguard Worker if "RetrofitDynamicPartitions" in config: 415*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.boot.dynamic_partitions_retrofit={'true' if config['RetrofitDynamicPartitions'] else 'false'}") 416*333d2b36SAndroid Build Coastguard Worker 417*333d2b36SAndroid Build Coastguard Worker if config["ShippingApiLevel"]: 418*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.product.first_api_level={config['ShippingApiLevel']}") 419*333d2b36SAndroid Build Coastguard Worker 420*333d2b36SAndroid Build Coastguard Worker if config["ShippingVendorApiLevel"]: 421*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.vendor.api_level={config['ShippingVendorApiLevel']}") 422*333d2b36SAndroid Build Coastguard Worker 423*333d2b36SAndroid Build Coastguard Worker if config["BuildVariant"] != "user" and config["BuildDebugfsRestrictionsEnabled"]: 424*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.product.debugfs_restrictions.enabled=true") 425*333d2b36SAndroid Build Coastguard Worker 426*333d2b36SAndroid Build Coastguard Worker # Vendors with GRF must define BOARD_SHIPPING_API_LEVEL for the vendor API level. 427*333d2b36SAndroid Build Coastguard Worker # This must not be defined for the non-GRF devices. 428*333d2b36SAndroid Build Coastguard Worker # The values of the GRF properties will be verified by post_process_props.py 429*333d2b36SAndroid Build Coastguard Worker if config["BoardShippingApiLevel"]: 430*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.board.first_api_level={config['BoardShippingApiLevel']}") 431*333d2b36SAndroid Build Coastguard Worker 432*333d2b36SAndroid Build Coastguard Worker # Build system set BOARD_API_LEVEL to show the api level of the vendor API surface. 433*333d2b36SAndroid Build Coastguard Worker # This must not be altered outside of build system. 434*333d2b36SAndroid Build Coastguard Worker if config["VendorApiLevel"]: 435*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.board.api_level?={config['VendorApiLevel']}") 436*333d2b36SAndroid Build Coastguard Worker if config["VendorApiLevelPropOverride"]: 437*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.board.api_level={config['VendorApiLevelPropOverride']}") 438*333d2b36SAndroid Build Coastguard Worker 439*333d2b36SAndroid Build Coastguard Worker # RELEASE_BOARD_API_LEVEL_FROZEN is true when the vendor API surface is frozen. 440*333d2b36SAndroid Build Coastguard Worker if build_flags["RELEASE_BOARD_API_LEVEL_FROZEN"]: 441*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.board.api_frozen=true") 442*333d2b36SAndroid Build Coastguard Worker 443*333d2b36SAndroid Build Coastguard Worker # Set build prop. This prop is read by ota_from_target_files when generating OTA, 444*333d2b36SAndroid Build Coastguard Worker # to decide if VABC should be disabled. 445*333d2b36SAndroid Build Coastguard Worker if config["DontUseVabcOta"]: 446*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.vendor.build.dont_use_vabc=true") 447*333d2b36SAndroid Build Coastguard Worker 448*333d2b36SAndroid Build Coastguard Worker # Set the flag in vendor. So VTS would know if the new fingerprint format is in use when 449*333d2b36SAndroid Build Coastguard Worker # the system images are replaced by GSI. 450*333d2b36SAndroid Build Coastguard Worker if config["BoardUseVbmetaDigestInFingerprint"]: 451*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.vendor.build.fingerprint_has_digest=1") 452*333d2b36SAndroid Build Coastguard Worker 453*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.vendor.build.security_patch={config['VendorSecurityPatch']}") 454*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.product.board={config['BootloaderBoardName']}") 455*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.board.platform={config['BoardPlatform']}") 456*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.hwui.use_vulkan={'true' if config['UsesVulkan'] else 'false'}") 457*333d2b36SAndroid Build Coastguard Worker 458*333d2b36SAndroid Build Coastguard Worker if config["ScreenDensity"]: 459*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.sf.lcd_density={config['ScreenDensity']}") 460*333d2b36SAndroid Build Coastguard Worker 461*333d2b36SAndroid Build Coastguard Worker if "AbOtaUpdater" in config: 462*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.build.ab_update={'true' if config['AbOtaUpdater'] else 'false'}") 463*333d2b36SAndroid Build Coastguard Worker if config["AbOtaUpdater"]: 464*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.vendor.build.ab_ota_partitions={config['AbOtaPartitions']}") 465*333d2b36SAndroid Build Coastguard Worker 466*333d2b36SAndroid Build Coastguard Worker config["ADDITIONAL_VENDOR_PROPERTIES"] = props 467*333d2b36SAndroid Build Coastguard Worker 468*333d2b36SAndroid Build Coastguard Workerdef append_additional_product_props(args): 469*333d2b36SAndroid Build Coastguard Worker props = [] 470*333d2b36SAndroid Build Coastguard Worker 471*333d2b36SAndroid Build Coastguard Worker config = args.config 472*333d2b36SAndroid Build Coastguard Worker 473*333d2b36SAndroid Build Coastguard Worker # Add the system server compiler filter if they are specified for the product. 474*333d2b36SAndroid Build Coastguard Worker if config["SystemServerCompilerFilter"]: 475*333d2b36SAndroid Build Coastguard Worker props.append(f"dalvik.vm.systemservercompilerfilter={config['SystemServerCompilerFilter']}") 476*333d2b36SAndroid Build Coastguard Worker 477*333d2b36SAndroid Build Coastguard Worker # Add the 16K developer args if it is defined for the product. 478*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.product.build.16k_page.enabled={'true' if config['Product16KDeveloperOption'] else 'false'}") 479*333d2b36SAndroid Build Coastguard Worker 480*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.product.page_size={16384 if config['TargetBoots16K'] else 4096}") 481*333d2b36SAndroid Build Coastguard Worker 482*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.build.characteristics={config['AAPTCharacteristics']}") 483*333d2b36SAndroid Build Coastguard Worker 484*333d2b36SAndroid Build Coastguard Worker if "AbOtaUpdater" in config and config["AbOtaUpdater"]: 485*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.product.ab_ota_partitions={config['AbOtaPartitions']}") 486*333d2b36SAndroid Build Coastguard Worker 487*333d2b36SAndroid Build Coastguard Worker # Set this property for VTS to skip large page size tests on unsupported devices. 488*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.product.cpu.pagesize.max={config['DeviceMaxPageSizeSupported']}") 489*333d2b36SAndroid Build Coastguard Worker 490*333d2b36SAndroid Build Coastguard Worker if config["NoBionicPageSizeMacro"]: 491*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.product.build.no_bionic_page_size_macro=true") 492*333d2b36SAndroid Build Coastguard Worker 493*333d2b36SAndroid Build Coastguard Worker # This is a temporary system property that controls the ART module. The plan is 494*333d2b36SAndroid Build Coastguard Worker # to remove it by Aug 2025, at which time Mainline updates of the ART module 495*333d2b36SAndroid Build Coastguard Worker # will ignore it as well. 496*333d2b36SAndroid Build Coastguard Worker # If the value is "default", it will be mangled by post_process_props.py. 497*333d2b36SAndroid Build Coastguard Worker props.append(f"ro.dalvik.vm.enable_uffd_gc={config['EnableUffdGc']}") 498*333d2b36SAndroid Build Coastguard Worker 499*333d2b36SAndroid Build Coastguard Worker config["ADDITIONAL_PRODUCT_PROPERTIES"] = props 500*333d2b36SAndroid Build Coastguard Worker 501*333d2b36SAndroid Build Coastguard Workerdef build_system_prop(args): 502*333d2b36SAndroid Build Coastguard Worker config = args.config 503*333d2b36SAndroid Build Coastguard Worker 504*333d2b36SAndroid Build Coastguard Worker # Order matters here. When there are duplicates, the last one wins. 505*333d2b36SAndroid Build Coastguard Worker # TODO(b/117892318): don't allow duplicates so that the ordering doesn't matter 506*333d2b36SAndroid Build Coastguard Worker variables = [ 507*333d2b36SAndroid Build Coastguard Worker "ADDITIONAL_SYSTEM_PROPERTIES", 508*333d2b36SAndroid Build Coastguard Worker "PRODUCT_SYSTEM_PROPERTIES", 509*333d2b36SAndroid Build Coastguard Worker # TODO(b/117892318): deprecate this 510*333d2b36SAndroid Build Coastguard Worker "PRODUCT_SYSTEM_DEFAULT_PROPERTIES", 511*333d2b36SAndroid Build Coastguard Worker ] 512*333d2b36SAndroid Build Coastguard Worker 513*333d2b36SAndroid Build Coastguard Worker if not config["PropertySplitEnabled"]: 514*333d2b36SAndroid Build Coastguard Worker variables += [ 515*333d2b36SAndroid Build Coastguard Worker "ADDITIONAL_VENDOR_PROPERTIES", 516*333d2b36SAndroid Build Coastguard Worker "PRODUCT_VENDOR_PROPERTIES", 517*333d2b36SAndroid Build Coastguard Worker ] 518*333d2b36SAndroid Build Coastguard Worker 519*333d2b36SAndroid Build Coastguard Worker build_prop(args, gen_build_info=True, gen_common_build_props=True, variables=variables) 520*333d2b36SAndroid Build Coastguard Worker 521*333d2b36SAndroid Build Coastguard Workerdef build_system_ext_prop(args): 522*333d2b36SAndroid Build Coastguard Worker config = args.config 523*333d2b36SAndroid Build Coastguard Worker 524*333d2b36SAndroid Build Coastguard Worker # Order matters here. When there are duplicates, the last one wins. 525*333d2b36SAndroid Build Coastguard Worker # TODO(b/117892318): don't allow duplicates so that the ordering doesn't matter 526*333d2b36SAndroid Build Coastguard Worker variables = ["PRODUCT_SYSTEM_EXT_PROPERTIES"] 527*333d2b36SAndroid Build Coastguard Worker 528*333d2b36SAndroid Build Coastguard Worker build_prop(args, gen_build_info=False, gen_common_build_props=True, variables=variables) 529*333d2b36SAndroid Build Coastguard Worker 530*333d2b36SAndroid Build Coastguard Workerdef build_vendor_prop(args): 531*333d2b36SAndroid Build Coastguard Worker config = args.config 532*333d2b36SAndroid Build Coastguard Worker 533*333d2b36SAndroid Build Coastguard Worker # Order matters here. When there are duplicates, the last one wins. 534*333d2b36SAndroid Build Coastguard Worker # TODO(b/117892318): don't allow duplicates so that the ordering doesn't matter 535*333d2b36SAndroid Build Coastguard Worker variables = [] 536*333d2b36SAndroid Build Coastguard Worker if config["PropertySplitEnabled"]: 537*333d2b36SAndroid Build Coastguard Worker variables += [ 538*333d2b36SAndroid Build Coastguard Worker "ADDITIONAL_VENDOR_PROPERTIES", 539*333d2b36SAndroid Build Coastguard Worker "PRODUCT_VENDOR_PROPERTIES", 540*333d2b36SAndroid Build Coastguard Worker # TODO(b/117892318): deprecate this 541*333d2b36SAndroid Build Coastguard Worker "PRODUCT_DEFAULT_PROPERTY_OVERRIDES", 542*333d2b36SAndroid Build Coastguard Worker "PRODUCT_PROPERTY_OVERRIDES", 543*333d2b36SAndroid Build Coastguard Worker ] 544*333d2b36SAndroid Build Coastguard Worker 545*333d2b36SAndroid Build Coastguard Worker build_prop(args, gen_build_info=False, gen_common_build_props=True, variables=variables) 546*333d2b36SAndroid Build Coastguard Worker 547*333d2b36SAndroid Build Coastguard Workerdef build_product_prop(args): 548*333d2b36SAndroid Build Coastguard Worker config = args.config 549*333d2b36SAndroid Build Coastguard Worker 550*333d2b36SAndroid Build Coastguard Worker # Order matters here. When there are duplicates, the last one wins. 551*333d2b36SAndroid Build Coastguard Worker # TODO(b/117892318): don't allow duplicates so that the ordering doesn't matter 552*333d2b36SAndroid Build Coastguard Worker variables = [ 553*333d2b36SAndroid Build Coastguard Worker "ADDITIONAL_PRODUCT_PROPERTIES", 554*333d2b36SAndroid Build Coastguard Worker "PRODUCT_PRODUCT_PROPERTIES", 555*333d2b36SAndroid Build Coastguard Worker ] 556*333d2b36SAndroid Build Coastguard Worker 557*333d2b36SAndroid Build Coastguard Worker gen_common_build_props = True 558*333d2b36SAndroid Build Coastguard Worker 559*333d2b36SAndroid Build Coastguard Worker # Skip common /product properties generation if device released before R and 560*333d2b36SAndroid Build Coastguard Worker # has no product partition. This is the first part of the check. 561*333d2b36SAndroid Build Coastguard Worker if config["Shipping_api_level"] and int(config["Shipping_api_level"]) < 30: 562*333d2b36SAndroid Build Coastguard Worker gen_common_build_props = False 563*333d2b36SAndroid Build Coastguard Worker 564*333d2b36SAndroid Build Coastguard Worker # The second part of the check - always generate common properties for the 565*333d2b36SAndroid Build Coastguard Worker # devices with product partition regardless of shipping level. 566*333d2b36SAndroid Build Coastguard Worker if config["UsesProductImage"]: 567*333d2b36SAndroid Build Coastguard Worker gen_common_build_props = True 568*333d2b36SAndroid Build Coastguard Worker 569*333d2b36SAndroid Build Coastguard Worker build_prop(args, gen_build_info=False, gen_common_build_props=True, variables=variables) 570*333d2b36SAndroid Build Coastguard Worker 571*333d2b36SAndroid Build Coastguard Worker if config["OemProperties"]: 572*333d2b36SAndroid Build Coastguard Worker print("####################################") 573*333d2b36SAndroid Build Coastguard Worker print("# PRODUCT_OEM_PROPERTIES") 574*333d2b36SAndroid Build Coastguard Worker print("####################################") 575*333d2b36SAndroid Build Coastguard Worker 576*333d2b36SAndroid Build Coastguard Worker for prop in config["OemProperties"]: 577*333d2b36SAndroid Build Coastguard Worker print(f"import /oem/oem.prop {prop}") 578*333d2b36SAndroid Build Coastguard Worker 579*333d2b36SAndroid Build Coastguard Workerdef build_odm_prop(args): 580*333d2b36SAndroid Build Coastguard Worker variables = ["ADDITIONAL_ODM_PROPERTIES", "PRODUCT_ODM_PROPERTIES"] 581*333d2b36SAndroid Build Coastguard Worker build_prop(args, gen_build_info=False, gen_common_build_props=True, variables=variables) 582*333d2b36SAndroid Build Coastguard Worker 583*333d2b36SAndroid Build Coastguard Workerdef build_prop(args, gen_build_info, gen_common_build_props, variables): 584*333d2b36SAndroid Build Coastguard Worker config = args.config 585*333d2b36SAndroid Build Coastguard Worker 586*333d2b36SAndroid Build Coastguard Worker if gen_common_build_props: 587*333d2b36SAndroid Build Coastguard Worker generate_common_build_props(args) 588*333d2b36SAndroid Build Coastguard Worker 589*333d2b36SAndroid Build Coastguard Worker if gen_build_info: 590*333d2b36SAndroid Build Coastguard Worker generate_build_info(args) 591*333d2b36SAndroid Build Coastguard Worker 592*333d2b36SAndroid Build Coastguard Worker for prop_file in args.prop_files: 593*333d2b36SAndroid Build Coastguard Worker write_properties_from_file(prop_file) 594*333d2b36SAndroid Build Coastguard Worker 595*333d2b36SAndroid Build Coastguard Worker for variable in variables: 596*333d2b36SAndroid Build Coastguard Worker if variable in config: 597*333d2b36SAndroid Build Coastguard Worker write_properties_from_variable(variable, config[variable], args.build_broken_dup_sysprop) 598*333d2b36SAndroid Build Coastguard Worker 599*333d2b36SAndroid Build Coastguard Workerdef main(): 600*333d2b36SAndroid Build Coastguard Worker args = parse_args() 601*333d2b36SAndroid Build Coastguard Worker 602*333d2b36SAndroid Build Coastguard Worker with contextlib.redirect_stdout(args.out): 603*333d2b36SAndroid Build Coastguard Worker match args.partition: 604*333d2b36SAndroid Build Coastguard Worker case "system": 605*333d2b36SAndroid Build Coastguard Worker build_system_prop(args) 606*333d2b36SAndroid Build Coastguard Worker case "system_ext": 607*333d2b36SAndroid Build Coastguard Worker build_system_ext_prop(args) 608*333d2b36SAndroid Build Coastguard Worker case "odm": 609*333d2b36SAndroid Build Coastguard Worker build_odm_prop(args) 610*333d2b36SAndroid Build Coastguard Worker case "product": 611*333d2b36SAndroid Build Coastguard Worker build_product_prop(args) 612*333d2b36SAndroid Build Coastguard Worker case "vendor": 613*333d2b36SAndroid Build Coastguard Worker build_vendor_prop(args) 614*333d2b36SAndroid Build Coastguard Worker case "system_dlkm" | "vendor_dlkm" | "odm_dlkm" | "bootimage": 615*333d2b36SAndroid Build Coastguard Worker build_prop(args, gen_build_info=False, gen_common_build_props=True, variables=[]) 616*333d2b36SAndroid Build Coastguard Worker case _: 617*333d2b36SAndroid Build Coastguard Worker sys.exit(f"not supported partition {args.partition}") 618*333d2b36SAndroid Build Coastguard Worker 619*333d2b36SAndroid Build Coastguard Workerif __name__ == "__main__": 620*333d2b36SAndroid Build Coastguard Worker main() 621