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