xref: /aosp_15_r20/build/soong/scripts/gen_build_prop.py (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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