diff options
| -rw-r--r-- | aconfig/codegen/rust_aconfig_library.go | 1 | ||||
| -rw-r--r-- | aconfig/codegen/rust_aconfig_library_test.go | 15 | ||||
| -rw-r--r-- | android/aconfig_providers.go | 6 | ||||
| -rw-r--r-- | android/buildinfo_prop.go | 152 | ||||
| -rw-r--r-- | android/config.go | 63 | ||||
| -rw-r--r-- | android/sdk.go | 8 | ||||
| -rw-r--r-- | android/variable.go | 23 | ||||
| -rw-r--r-- | apex/aconfig_test.go | 18 | ||||
| -rw-r--r-- | apex/apex_test.go | 21 | ||||
| -rw-r--r-- | apex/builder.go | 2 | ||||
| -rw-r--r-- | cc/lto.go | 11 | ||||
| -rw-r--r-- | etc/prebuilt_etc.go | 12 | ||||
| -rw-r--r-- | etc/prebuilt_etc_test.go | 14 | ||||
| -rw-r--r-- | java/aar.go | 6 | ||||
| -rw-r--r-- | java/app_test.go | 54 | ||||
| -rw-r--r-- | java/base.go | 13 | ||||
| -rw-r--r-- | java/sdk.go | 15 | ||||
| -rw-r--r-- | java/sdk_library_test.go | 13 | ||||
| -rw-r--r-- | python/python.go | 1 | ||||
| -rw-r--r-- | python/scripts/precompile_python.py | 15 | ||||
| -rw-r--r-- | scripts/Android.bp | 11 | ||||
| -rwxr-xr-x | scripts/buildinfo.py | 156 |
22 files changed, 496 insertions, 134 deletions
diff --git a/aconfig/codegen/rust_aconfig_library.go b/aconfig/codegen/rust_aconfig_library.go index 3f7495be1..a0a2a546b 100644 --- a/aconfig/codegen/rust_aconfig_library.go +++ b/aconfig/codegen/rust_aconfig_library.go @@ -101,6 +101,7 @@ func (a *aconfigDecorator) SourceProviderDeps(ctx rust.DepsContext, deps rust.De deps = a.BaseSourceProvider.SourceProviderDeps(ctx, deps) deps.Rustlibs = append(deps.Rustlibs, "libflags_rust") deps.Rustlibs = append(deps.Rustlibs, "liblazy_static") + deps.Rustlibs = append(deps.Rustlibs, "libaconfig_storage_read_api") ctx.AddDependency(ctx.Module(), rustDeclarationsTag, a.Properties.Aconfig_declarations) return deps } diff --git a/aconfig/codegen/rust_aconfig_library_test.go b/aconfig/codegen/rust_aconfig_library_test.go index 60bc9f747..330cecd73 100644 --- a/aconfig/codegen/rust_aconfig_library_test.go +++ b/aconfig/codegen/rust_aconfig_library_test.go @@ -28,6 +28,11 @@ func TestRustAconfigLibrary(t *testing.T) { crate_name: "lazy_static", srcs: ["src/lib.rs"], } + rust_library { + name: "libaconfig_storage_read_api", // test mock + crate_name: "aconfig_storage_read_api", + srcs: ["lib.rs"], + } aconfig_declarations { name: "my_aconfig_declarations", package: "com.example.package", @@ -98,6 +103,11 @@ func testRustCodegenModeHelper(t *testing.T, bpMode string, ruleMode string) { crate_name: "lazy_static", srcs: ["src/lib.rs"], } + rust_library { + name: "libaconfig_storage_read_api", // test mock + crate_name: "aconfig_storage_read_api", + srcs: ["lib.rs"], + } aconfig_declarations { name: "my_aconfig_declarations", package: "com.example.package", @@ -145,6 +155,11 @@ func testIncorrectRustCodegenModeHelper(t *testing.T, bpMode string, err string) crate_name: "lazy_static", srcs: ["src/lib.rs"], } + rust_library { + name: "libaconfig_storage_read_api", // test mock + crate_name: "aconfig_storage_read_api", + srcs: ["lib.rs"], + } aconfig_declarations { name: "my_aconfig_declarations", package: "com.example.package", diff --git a/android/aconfig_providers.go b/android/aconfig_providers.go index fcc57e1a4..4c1782b8e 100644 --- a/android/aconfig_providers.go +++ b/android/aconfig_providers.go @@ -105,7 +105,8 @@ func CollectDependencyAconfigFiles(ctx ModuleContext, mergedAconfigFiles *map[st } }) - for container, aconfigFiles := range *mergedAconfigFiles { + for _, container := range SortedKeys(*mergedAconfigFiles) { + aconfigFiles := (*mergedAconfigFiles)[container] (*mergedAconfigFiles)[container] = mergeAconfigFiles(ctx, container, aconfigFiles, false) } @@ -172,7 +173,8 @@ func aconfigUpdateAndroidBuildActions(ctx ModuleContext) { }) // We only need to set the provider if we have aconfig files. if len(mergedAconfigFiles) > 0 { - for container, aconfigFiles := range mergedAconfigFiles { + for _, container := range SortedKeys(mergedAconfigFiles) { + aconfigFiles := mergedAconfigFiles[container] mergedAconfigFiles[container] = mergeAconfigFiles(ctx, container, aconfigFiles, true) } diff --git a/android/buildinfo_prop.go b/android/buildinfo_prop.go index 8e19ad5f4..8288fc555 100644 --- a/android/buildinfo_prop.go +++ b/android/buildinfo_prop.go @@ -54,6 +54,39 @@ func (p *buildinfoPropModule) OutputFiles(tag string) (Paths, error) { return Paths{p.outputFilePath}, nil } +func getBuildVariant(config Config) string { + if config.Eng() { + return "eng" + } else if config.Debuggable() { + return "userdebug" + } else { + return "user" + } +} + +func getBuildFlavor(config Config) string { + buildFlavor := config.DeviceProduct() + "-" + getBuildVariant(config) + if InList("address", config.SanitizeDevice()) && !strings.Contains(buildFlavor, "_asan") { + buildFlavor += "_asan" + } + return buildFlavor +} + +func shouldAddBuildThumbprint(config Config) bool { + knownOemProperties := []string{ + "ro.product.brand", + "ro.product.name", + "ro.product.device", + } + + for _, knownProp := range knownOemProperties { + if InList(knownProp, config.OemProperties()) { + return true + } + } + return false +} + func (p *buildinfoPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { p.outputFilePath = PathForModuleOut(ctx, p.Name()).OutputPath if !ctx.Config().KatiEnabled() { @@ -61,87 +94,66 @@ func (p *buildinfoPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { return } - lines := make([]string, 0) + rule := NewRuleBuilder(pctx, ctx) - writeString := func(str string) { - lines = append(lines, str) - } + config := ctx.Config() + buildVariant := getBuildVariant(config) + buildFlavor := getBuildFlavor(config) - writeString("# begin build properties") - writeString("# autogenerated by build/soong/android/buildinfo_prop.go") + cmd := rule.Command().BuiltTool("buildinfo") - writeProp := func(key, value string) { - if strings.Contains(key, "=") { - panic(fmt.Errorf("wrong property key %q: key must not contain '='", key)) - } - writeString(key + "=" + value) + if config.BoardUseVbmetaDigestInFingerprint() { + cmd.Flag("--use-vbmeta-digest-in-fingerprint") } - config := ctx.Config() - - writeProp("ro.build.version.sdk", config.PlatformSdkVersion().String()) - writeProp("ro.build.version.preview_sdk", config.PlatformPreviewSdkVersion()) - writeProp("ro.build.version.codename", config.PlatformSdkCodename()) - writeProp("ro.build.version.all_codenames", strings.Join(config.PlatformVersionActiveCodenames(), ",")) - writeProp("ro.build.version.release", config.PlatformVersionLastStable()) - writeProp("ro.build.version.release_or_codename", config.PlatformVersionName()) - writeProp("ro.build.version.security_patch", config.PlatformSecurityPatch()) - writeProp("ro.build.version.base_os", config.PlatformBaseOS()) - writeProp("ro.build.version.min_supported_target_sdk", config.PlatformMinSupportedTargetSdkVersion()) - writeProp("ro.build.version.known_codenames", config.PlatformVersionKnownCodenames()) + cmd.FlagWithArg("--build-flavor=", buildFlavor) + cmd.FlagWithInput("--build-hostname-file=", config.BuildHostnameFile(ctx)) + cmd.FlagWithArg("--build-id=", config.BuildId()) + cmd.FlagWithArg("--build-keys=", config.BuildKeys()) - if config.Eng() { - writeProp("ro.build.type", "eng") - } else if config.Debuggable() { - writeProp("ro.build.type", "userdebug") - } else { - writeProp("ro.build.type", "user") + // shouldn't depend on BuildNumberFile and BuildThumbprintFile to prevent from rebuilding + // on every incremental build. + cmd.FlagWithArg("--build-number-file=", config.BuildNumberFile(ctx).String()) + if shouldAddBuildThumbprint(config) { + cmd.FlagWithArg("--build-thumbprint-file=", config.BuildThumbprintFile(ctx).String()) } - // Currently, only a few properties are implemented to unblock microdroid use case. - // TODO(b/189164487): support below properties as well and replace build/make/tools/buildinfo.sh - /* - if $BOARD_USE_VBMETA_DIGTEST_IN_FINGERPRINT { - writeProp("ro.build.legacy.id", config.BuildID()) - } else { - writeProp("ro.build.id", config.BuildId()) - } - writeProp("ro.build.display.id", $BUILD_DISPLAY_ID) - writeProp("ro.build.version.incremental", $BUILD_NUMBER) - writeProp("ro.build.version.preview_sdk_fingerprint", $PLATFORM_PREVIEW_SDK_FINGERPRINT) - writeProp("ro.build.version.release_or_preview_display", $PLATFORM_DISPLAY_VERSION) - writeProp("ro.build.date", `$DATE`) - writeProp("ro.build.date.utc", `$DATE +%s`) - writeProp("ro.build.user", $BUILD_USERNAME) - writeProp("ro.build.host", $BUILD_HOSTNAME) - writeProp("ro.build.tags", $BUILD_VERSION_TAGS) - writeProp("ro.build.flavor", $TARGET_BUILD_FLAVOR) - // These values are deprecated, use "ro.product.cpu.abilist" - // instead (see below). - writeString("# ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete,") - writeString("# use ro.product.cpu.abilist instead.") - writeProp("ro.product.cpu.abi", $TARGET_CPU_ABI) - if [ -n "$TARGET_CPU_ABI2" ] { - writeProp("ro.product.cpu.abi2", $TARGET_CPU_ABI2) - } + cmd.FlagWithArg("--build-type=", config.BuildType()) + cmd.FlagWithArg("--build-username=", config.Getenv("BUILD_USERNAME")) + cmd.FlagWithArg("--build-variant=", buildVariant) + cmd.FlagForEachArg("--cpu-abis=", config.DeviceAbi()) - if [ -n "$PRODUCT_DEFAULT_LOCALE" ] { - writeProp("ro.product.locale", $PRODUCT_DEFAULT_LOCALE) - } - writeProp("ro.wifi.channels", $PRODUCT_DEFAULT_WIFI_CHANNELS) - writeString("# ro.build.product is obsolete; use ro.product.device") - writeProp("ro.build.product", $TARGET_DEVICE) - - writeString("# Do not try to parse description or thumbprint") - writeProp("ro.build.description", $PRIVATE_BUILD_DESC) - if [ -n "$BUILD_THUMBPRINT" ] { - writeProp("ro.build.thumbprint", $BUILD_THUMBPRINT) - } - */ + // shouldn't depend on BUILD_DATETIME_FILE to prevent from rebuilding on every incremental + // build. + cmd.FlagWithArg("--date-file=", ctx.Config().Getenv("BUILD_DATETIME_FILE")) - writeString("# end build properties") + if len(config.ProductLocales()) > 0 { + cmd.FlagWithArg("--default-locale=", config.ProductLocales()[0]) + } + + cmd.FlagForEachArg("--default-wifi-channels=", config.ProductDefaultWifiChannels()) + cmd.FlagWithArg("--device=", config.DeviceName()) + if config.DisplayBuildNumber() { + cmd.Flag("--display-build-number") + } - WriteFileRule(ctx, p.outputFilePath, strings.Join(lines, "\n")) + cmd.FlagWithArg("--platform-base-os=", config.PlatformBaseOS()) + cmd.FlagWithArg("--platform-display-version=", config.PlatformDisplayVersionName()) + cmd.FlagWithArg("--platform-min-supported-target-sdk-version=", config.PlatformMinSupportedTargetSdkVersion()) + cmd.FlagWithInput("--platform-preview-sdk-fingerprint-file=", ApiFingerprintPath(ctx)) + cmd.FlagWithArg("--platform-preview-sdk-version=", config.PlatformPreviewSdkVersion()) + cmd.FlagWithArg("--platform-sdk-version=", config.PlatformSdkVersion().String()) + cmd.FlagWithArg("--platform-security-patch=", config.PlatformSecurityPatch()) + cmd.FlagWithArg("--platform-version=", config.PlatformVersionName()) + cmd.FlagWithArg("--platform-version-codename=", config.PlatformSdkCodename()) + cmd.FlagForEachArg("--platform-version-all-codenames=", config.PlatformVersionActiveCodenames()) + cmd.FlagWithArg("--platform-version-known-codenames=", config.PlatformVersionKnownCodenames()) + cmd.FlagWithArg("--platform-version-last-stable=", config.PlatformVersionLastStable()) + cmd.FlagWithArg("--product=", config.DeviceProduct()) + + cmd.FlagWithOutput("--out=", p.outputFilePath) + + rule.Build(ctx.ModuleName(), "generating buildinfo props") if !p.installable() { p.SkipInstall() diff --git a/android/config.go b/android/config.go index 10c30d4df..2ee3b9355 100644 --- a/android/config.go +++ b/android/config.go @@ -114,6 +114,8 @@ const ( GenerateDocFile ) +const testKeyDir = "build/make/target/product/security" + // SoongOutDir returns the build output directory for the configuration. func (c Config) SoongOutDir() string { return c.soongOutDir @@ -841,6 +843,10 @@ func (c *config) BuildId() string { return String(c.productVariables.BuildId) } +func (c *config) DisplayBuildNumber() bool { + return Bool(c.productVariables.DisplayBuildNumber) +} + // BuildNumberFile returns the path to a text file containing metadata // representing the current build's number. // @@ -852,6 +858,23 @@ func (c *config) BuildNumberFile(ctx PathContext) Path { return PathForOutput(ctx, String(c.productVariables.BuildNumberFile)) } +// BuildHostnameFile returns the path to a text file containing metadata +// representing the current build's host name. +func (c *config) BuildHostnameFile(ctx PathContext) Path { + return PathForOutput(ctx, String(c.productVariables.BuildHostnameFile)) +} + +// BuildThumbprintFile returns the path to a text file containing metadata +// representing the current build's thumbprint. +// +// Rules that want to reference the build thumbprint should read from this file +// without depending on it. They will run whenever their other dependencies +// require them to run and get the current build thumbprint. This ensures they +// don't rebuild on every incremental build when the build thumbprint changes. +func (c *config) BuildThumbprintFile(ctx PathContext) Path { + return PathForArbitraryOutput(ctx, "target", "product", c.DeviceName(), String(c.productVariables.BuildThumbprintFile)) +} + // DeviceName returns the name of the current device target. // TODO: take an AndroidModuleContext to select the device name for multi-device builds func (c *config) DeviceName() string { @@ -873,6 +896,10 @@ func (c *config) HasDeviceProduct() bool { return c.productVariables.DeviceProduct != nil } +func (c *config) DeviceAbi() []string { + return c.productVariables.DeviceAbi +} + func (c *config) DeviceResourceOverlays() []string { return c.productVariables.DeviceResourceOverlays } @@ -881,6 +908,10 @@ func (c *config) ProductResourceOverlays() []string { return c.productVariables.ProductResourceOverlays } +func (c *config) PlatformDisplayVersionName() string { + return String(c.productVariables.Platform_display_version_name) +} + func (c *config) PlatformVersionName() string { return String(c.productVariables.Platform_version_name) } @@ -1038,7 +1069,7 @@ func (c *config) DefaultAppCertificateDir(ctx PathContext) SourcePath { if defaultCert != "" { return PathForSource(ctx, filepath.Dir(defaultCert)) } - return PathForSource(ctx, "build/make/target/product/security") + return PathForSource(ctx, testKeyDir) } func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) { @@ -1050,10 +1081,18 @@ func (c *config) DefaultAppCertificate(ctx PathContext) (pem, key SourcePath) { return defaultDir.Join(ctx, "testkey.x509.pem"), defaultDir.Join(ctx, "testkey.pk8") } +func (c *config) BuildKeys() string { + defaultCert := String(c.productVariables.DefaultAppCertificate) + if defaultCert == "" || defaultCert == filepath.Join(testKeyDir, "testkey") { + return "test-keys" + } + return "dev-keys" +} + func (c *config) ApexKeyDir(ctx ModuleContext) SourcePath { // TODO(b/121224311): define another variable such as TARGET_APEX_KEY_OVERRIDE defaultCert := String(c.productVariables.DefaultAppCertificate) - if defaultCert == "" || filepath.Dir(defaultCert) == "build/make/target/product/security" { + if defaultCert == "" || filepath.Dir(defaultCert) == testKeyDir { // When defaultCert is unset or is set to the testkeys path, use the APEX keys // that is under the module dir return pathForModuleSrc(ctx) @@ -1112,6 +1151,10 @@ func (c *config) Eng() bool { return Bool(c.productVariables.Eng) } +func (c *config) BuildType() string { + return String(c.productVariables.BuildType) +} + // DevicePrimaryArchType returns the ArchType for the first configured device architecture, or // Common if there are no device architectures. func (c *config) DevicePrimaryArchType() ArchType { @@ -2086,3 +2129,19 @@ func (c *config) AllApexContributions() []string { func (c *config) BuildIgnoreApexContributionContents() []string { return c.productVariables.BuildIgnoreApexContributionContents } + +func (c *config) ProductLocales() []string { + return c.productVariables.ProductLocales +} + +func (c *config) ProductDefaultWifiChannels() []string { + return c.productVariables.ProductDefaultWifiChannels +} + +func (c *config) BoardUseVbmetaDigestInFingerprint() bool { + return Bool(c.productVariables.BoardUseVbmetaDigestInFingerprint) +} + +func (c *config) OemProperties() []string { + return c.productVariables.OemProperties +} diff --git a/android/sdk.go b/android/sdk.go index 6d5293e65..121470d6e 100644 --- a/android/sdk.go +++ b/android/sdk.go @@ -868,3 +868,11 @@ type AdditionalSdkInfo struct { } var AdditionalSdkInfoProvider = blueprint.NewProvider[AdditionalSdkInfo]() + +var apiFingerprintPathKey = NewOnceKey("apiFingerprintPathKey") + +func ApiFingerprintPath(ctx PathContext) OutputPath { + return ctx.Config().Once(apiFingerprintPathKey, func() interface{} { + return PathForOutput(ctx, "api_fingerprint.txt") + }).(OutputPath) +} diff --git a/android/variable.go b/android/variable.go index 73f5bfd1f..9b630c01f 100644 --- a/android/variable.go +++ b/android/variable.go @@ -193,9 +193,13 @@ type ProductVariables struct { // Suffix to add to generated Makefiles Make_suffix *string `json:",omitempty"` - BuildId *string `json:",omitempty"` - BuildNumberFile *string `json:",omitempty"` + BuildId *string `json:",omitempty"` + BuildNumberFile *string `json:",omitempty"` + BuildHostnameFile *string `json:",omitempty"` + BuildThumbprintFile *string `json:",omitempty"` + DisplayBuildNumber *bool `json:",omitempty"` + Platform_display_version_name *string `json:",omitempty"` Platform_version_name *string `json:",omitempty"` Platform_sdk_version *int `json:",omitempty"` Platform_sdk_codename *string `json:",omitempty"` @@ -296,6 +300,8 @@ type ProductVariables struct { MinimizeJavaDebugInfo *bool `json:",omitempty"` Build_from_text_stub *bool `json:",omitempty"` + BuildType *string `json:",omitempty"` + Check_elf_files *bool `json:",omitempty"` UncompressPrivAppDex *bool `json:",omitempty"` @@ -472,9 +478,8 @@ type ProductVariables struct { AfdoProfiles []string `json:",omitempty"` - ProductManufacturer string `json:",omitempty"` - ProductBrand string `json:",omitempty"` - BuildVersionTags []string `json:",omitempty"` + ProductManufacturer string `json:",omitempty"` + ProductBrand string `json:",omitempty"` ReleaseVersion string `json:",omitempty"` ReleaseAconfigValueSets []string `json:",omitempty"` @@ -502,6 +507,14 @@ type ProductVariables struct { ExportRuntimeApis *bool `json:",omitempty"` AconfigContainerValidation string `json:",omitempty"` + + ProductLocales []string `json:",omitempty"` + + ProductDefaultWifiChannels []string `json:",omitempty"` + + BoardUseVbmetaDigestInFingerprint *bool `json:",omitempty"` + + OemProperties []string `json:",omitempty"` } type PartitionQualifiedVariablesType struct { diff --git a/apex/aconfig_test.go b/apex/aconfig_test.go index a179dbffd..515b2fdd0 100644 --- a/apex/aconfig_test.go +++ b/apex/aconfig_test.go @@ -217,6 +217,12 @@ func TestValidationAcrossContainersExportedPass(t *testing.T) { srcs: ["src/lib.rs"], apex_available: ["myapex"], } + rust_library { + name: "libaconfig_storage_read_api", // test mock + crate_name: "aconfig_storage_read_api", + srcs: ["src/lib.rs"], + apex_available: ["myapex"], + } rust_ffi_shared { name: "libmy_rust_library", srcs: ["src/lib.rs"], @@ -480,6 +486,12 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) { srcs: ["src/lib.rs"], apex_available: ["myapex"], } + rust_library { + name: "libaconfig_storage_read_api", // test mock + crate_name: "aconfig_storage_read_api", + srcs: ["src/lib.rs"], + apex_available: ["myapex"], + } rust_ffi_shared { name: "libmy_rust_library", srcs: ["src/lib.rs"], @@ -524,6 +536,12 @@ func TestValidationAcrossContainersNotExportedFail(t *testing.T) { srcs: ["src/lib.rs"], apex_available: ["myapex"], } + rust_library { + name: "libaconfig_storage_read_api", // test mock + crate_name: "aconfig_storage_read_api", + srcs: ["src/lib.rs"], + apex_available: ["myapex"], + } rust_binary { name: "my_rust_binary", srcs: ["foo/bar/MyClass.rs"], diff --git a/apex/apex_test.go b/apex/apex_test.go index 907e1f7e9..3e9f2468b 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -10901,6 +10901,15 @@ func TestAconfigFilesRustDeps(t *testing.T) { ], } + rust_library { + name: "libaconfig_storage_read_api", // test mock + crate_name: "aconfig_storage_read_api", + srcs: ["src/lib.rs"], + apex_available: [ + "myapex", + ], + } + rust_ffi_shared { name: "libmy_rust_library", srcs: ["src/lib.rs"], @@ -10985,14 +10994,14 @@ func TestAconfigFilesRustDeps(t *testing.T) { mod := ctx.ModuleForTests("myapex", "android_common_myapex") s := mod.Rule("apexRule").Args["copy_commands"] copyCmds := regexp.MustCompile(" *&& *").Split(s, -1) - if len(copyCmds) != 26 { - t.Fatalf("Expected 26 commands, got %d in:\n%s", len(copyCmds), s) + if len(copyCmds) != 28 { + t.Fatalf("Expected 28 commands, got %d in:\n%s", len(copyCmds), s) } - ensureMatches(t, copyCmds[22], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$") - ensureMatches(t, copyCmds[23], "^cp -f .*/package.map .*/image.apex/etc$") - ensureMatches(t, copyCmds[24], "^cp -f .*/flag.map .*/image.apex/etc$") - ensureMatches(t, copyCmds[25], "^cp -f .*/flag.val .*/image.apex/etc$") + ensureMatches(t, copyCmds[24], "^cp -f .*/aconfig_flags.pb .*/image.apex/etc$") + ensureMatches(t, copyCmds[25], "^cp -f .*/package.map .*/image.apex/etc$") + ensureMatches(t, copyCmds[26], "^cp -f .*/flag.map .*/image.apex/etc$") + ensureMatches(t, copyCmds[27], "^cp -f .*/flag.val .*/image.apex/etc$") inputs := []string{ "my_aconfig_declarations_foo/intermediate.pb", diff --git a/apex/builder.go b/apex/builder.go index 6ad282ab6..50db631b7 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -485,7 +485,7 @@ func markManifestTestOnly(ctx android.ModuleContext, androidManifestFile android } func isVintfFragment(fi apexFile) bool { - isVintfFragment, _ := path.Match("etc/vintf/*.xml", fi.path()) + isVintfFragment, _ := path.Match("etc/vintf/*", fi.path()) return isVintfFragment } @@ -54,9 +54,6 @@ type LTOProperties struct { // Use -fwhole-program-vtables cflag. Whole_program_vtables *bool - - // Use --lto-O0 flag. - Lto_O0 *bool } type lto struct { @@ -109,8 +106,12 @@ func (lto *lto) flags(ctx ModuleContext, flags Flags) Flags { ltoCFlags := []string{"-flto=thin", "-fsplit-lto-unit"} var ltoLdFlags []string - // Do not perform costly LTO optimizations for Eng builds. - if Bool(lto.Properties.Lto_O0) || ctx.Config().Eng() { + // The module did not explicitly turn on LTO. Only leverage LTO's + // better dead code elimination and CFG simplification, but do + // not perform costly optimizations for a balance between compile + // time, binary size and performance. + // Apply the same for Eng builds as well. + if !lto.ThinLTO() || ctx.Config().Eng() { ltoLdFlags = append(ltoLdFlags, "-Wl,--lto-O0") } diff --git a/etc/prebuilt_etc.go b/etc/prebuilt_etc.go index a42c576d5..21a18dfd4 100644 --- a/etc/prebuilt_etc.go +++ b/etc/prebuilt_etc.go @@ -57,6 +57,7 @@ func RegisterPrebuiltEtcBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("prebuilt_root_host", PrebuiltRootHostFactory) ctx.RegisterModuleType("prebuilt_usr_share", PrebuiltUserShareFactory) ctx.RegisterModuleType("prebuilt_usr_share_host", PrebuiltUserShareHostFactory) + ctx.RegisterModuleType("prebuilt_usr_hyphendata", PrebuiltUserHyphenDataFactory) ctx.RegisterModuleType("prebuilt_font", PrebuiltFontFactory) ctx.RegisterModuleType("prebuilt_firmware", PrebuiltFirmwareFactory) ctx.RegisterModuleType("prebuilt_dsp", PrebuiltDSPFactory) @@ -611,6 +612,17 @@ func PrebuiltUserShareHostFactory() android.Module { return module } +// prebuilt_usr_hyphendata is for a prebuilt artifact that is installed in +// <partition>/usr/hyphen-data/<sub_dir> directory. +func PrebuiltUserHyphenDataFactory() android.Module { + module := &PrebuiltEtc{} + InitPrebuiltEtcModule(module, "usr/hyphen-data") + // This module is device-only + android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) + android.InitDefaultableModule(module) + return module +} + // prebuilt_font installs a font in <partition>/fonts directory. func PrebuiltFontFactory() android.Module { module := &PrebuiltEtc{} diff --git a/etc/prebuilt_etc_test.go b/etc/prebuilt_etc_test.go index 1d9aa8e58..e346bd79f 100644 --- a/etc/prebuilt_etc_test.go +++ b/etc/prebuilt_etc_test.go @@ -287,6 +287,20 @@ func TestPrebuiltUserShareHostInstallDirPath(t *testing.T) { android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPath) } +func TestPrebuiltPrebuiltUserHyphenDataInstallDirPath(t *testing.T) { + result := prepareForPrebuiltEtcTest.RunTestWithBp(t, ` + prebuilt_usr_hyphendata { + name: "foo.conf", + src: "foo.conf", + sub_dir: "bar", + } + `) + + p := result.Module("foo.conf", "android_arm64_armv8-a").(*PrebuiltEtc) + expected := "out/soong/target/product/test_device/system/usr/hyphen-data/bar" + android.AssertPathRelativeToTopEquals(t, "install dir", expected, p.installDirPath) +} + func TestPrebuiltFontInstallDirPath(t *testing.T) { result := prepareForPrebuiltEtcTest.RunTestWithBp(t, ` prebuilt_font { diff --git a/java/aar.go b/java/aar.go index 1c03594be..3ac77fa44 100644 --- a/java/aar.go +++ b/java/aar.go @@ -1161,11 +1161,17 @@ func (a *AARImport) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.rTxt = extractedAARDir.Join(ctx, "R.txt") a.assetsPackage = android.PathForModuleOut(ctx, "assets.zip") a.proguardFlags = extractedAARDir.Join(ctx, "proguard.txt") + transitiveProguardFlags, transitiveUnconditionalExportedFlags := collectDepProguardSpecInfo(ctx) android.SetProvider(ctx, ProguardSpecInfoProvider, ProguardSpecInfo{ ProguardFlagsFiles: android.NewDepSet[android.Path]( android.POSTORDER, android.Paths{a.proguardFlags}, + transitiveProguardFlags, + ), + UnconditionallyExportedProguardFlags: android.NewDepSet[android.Path]( + android.POSTORDER, nil, + transitiveUnconditionalExportedFlags, ), }) diff --git a/java/app_test.go b/java/app_test.go index ca9d31704..8262777b2 100644 --- a/java/app_test.go +++ b/java/app_test.go @@ -3625,7 +3625,10 @@ func TestExportedProguardFlagFiles(t *testing.T) { android_app { name: "foo", sdk_version: "current", - static_libs: ["lib1"], + static_libs: [ + "lib1", + "lib3", + ], } android_library { @@ -3633,22 +3636,49 @@ func TestExportedProguardFlagFiles(t *testing.T) { sdk_version: "current", optimize: { proguard_flags_files: ["lib1proguard.cfg"], + }, + static_libs: ["lib2"], + } + + android_library { + name: "lib2", + sdk_version: "current", + optimize: { + proguard_flags_files: ["lib2proguard.cfg"], } } - `) - m := ctx.ModuleForTests("foo", "android_common") - hasLib1Proguard := false - for _, s := range m.Rule("java.r8").Implicits.Strings() { - if s == "lib1proguard.cfg" { - hasLib1Proguard = true - break + android_library_import { + name: "lib3", + sdk_version: "current", + aars: ["lib3.aar"], + static_libs: ["lib4"], } - } - if !hasLib1Proguard { - t.Errorf("App does not use library proguard config") - } + android_library { + name: "lib4", + sdk_version: "current", + optimize: { + proguard_flags_files: ["lib4proguard.cfg"], + } + } + + + `) + + m := ctx.ModuleForTests("foo", "android_common") + r8 := m.Rule("java.r8") + implicits := r8.Implicits.RelativeToTop().Strings() + android.AssertStringListContains(t, "r8 implicits", implicits, "lib1proguard.cfg") + android.AssertStringListContains(t, "r8 implicits", implicits, "lib2proguard.cfg") + android.AssertStringListContains(t, "r8 implicits", implicits, "lib4proguard.cfg") + android.AssertStringListContains(t, "r8 implicits", implicits, "out/soong/.intermediates/lib3/android_common/aar/proguard.txt") + + flags := r8.Args["r8Flags"] + android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib1proguard.cfg") + android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib2proguard.cfg") + android.AssertStringDoesContain(t, "r8 flags", flags, "-include lib4proguard.cfg") + android.AssertStringDoesContain(t, "r8 flags", flags, "-include out/soong/.intermediates/lib3/android_common/aar/proguard.txt") } func TestTargetSdkVersionManifestFixer(t *testing.T) { diff --git a/java/base.go b/java/base.go index be286fe33..9bb133dc3 100644 --- a/java/base.go +++ b/java/base.go @@ -804,7 +804,7 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) { // Add dependency on libraries that provide additional hidden api annotations. ctx.AddVariationDependencies(nil, hiddenApiAnnotationsTag, j.properties.Hiddenapi_additional_annotations...) - if ctx.DeviceConfig().VndkVersion() != "" && ctx.Config().EnforceInterPartitionJavaSdkLibrary() { + if ctx.Config().EnforceInterPartitionJavaSdkLibrary() { // Require java_sdk_library at inter-partition java dependency to ensure stable // interface between partitions. If inter-partition java_library dependency is detected, // raise build error because java_library doesn't have a stable interface. @@ -1757,10 +1757,7 @@ func (j *Module) useCompose() bool { return android.InList("androidx.compose.runtime_runtime", j.properties.Static_libs) } -func (j *Module) collectProguardSpecInfo(ctx android.ModuleContext) ProguardSpecInfo { - transitiveUnconditionalExportedFlags := []*android.DepSet[android.Path]{} - transitiveProguardFlags := []*android.DepSet[android.Path]{} - +func collectDepProguardSpecInfo(ctx android.ModuleContext) (transitiveProguardFlags, transitiveUnconditionalExportedFlags []*android.DepSet[android.Path]) { ctx.VisitDirectDeps(func(m android.Module) { depProguardInfo, _ := android.OtherModuleProvider(ctx, m, ProguardSpecInfoProvider) depTag := ctx.OtherModuleDependencyTag(m) @@ -1775,6 +1772,12 @@ func (j *Module) collectProguardSpecInfo(ctx android.ModuleContext) ProguardSpec } }) + return transitiveProguardFlags, transitiveUnconditionalExportedFlags +} + +func (j *Module) collectProguardSpecInfo(ctx android.ModuleContext) ProguardSpecInfo { + transitiveProguardFlags, transitiveUnconditionalExportedFlags := collectDepProguardSpecInfo(ctx) + directUnconditionalExportedFlags := android.Paths{} proguardFlagsForThisModule := android.PathsForModuleSrc(ctx, j.dexProperties.Optimize.Proguard_flags_files) exportUnconditionally := proptools.Bool(j.dexProperties.Optimize.Export_proguard_flags_files) diff --git a/java/sdk.go b/java/sdk.go index 3591ccdb6..d972c19bd 100644 --- a/java/sdk.go +++ b/java/sdk.go @@ -31,7 +31,6 @@ func init() { var sdkFrameworkAidlPathKey = android.NewOnceKey("sdkFrameworkAidlPathKey") var nonUpdatableFrameworkAidlPathKey = android.NewOnceKey("nonUpdatableFrameworkAidlPathKey") -var apiFingerprintPathKey = android.NewOnceKey("apiFingerprintPathKey") func UseApiFingerprint(ctx android.BaseModuleContext) (useApiFingerprint bool, fingerprintSdkVersion string, fingerprintDeps android.OutputPath) { if ctx.Config().UnbundledBuild() && !ctx.Config().AlwaysUsePrebuiltSdks() { @@ -45,8 +44,8 @@ func UseApiFingerprint(ctx android.BaseModuleContext) (useApiFingerprint bool, f useApiFingerprint = apiFingerprintTrue || dessertShaIsSet if apiFingerprintTrue { - fingerprintSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", ApiFingerprintPath(ctx).String()) - fingerprintDeps = ApiFingerprintPath(ctx) + fingerprintSdkVersion = ctx.Config().PlatformSdkCodename() + fmt.Sprintf(".$$(cat %s)", android.ApiFingerprintPath(ctx).String()) + fingerprintDeps = android.ApiFingerprintPath(ctx) } if dessertShaIsSet { fingerprintSdkVersion = ctx.Config().Getenv("UNBUNDLED_BUILD_TARGET_SDK_WITH_DESSERT_SHA") @@ -337,7 +336,7 @@ func nonUpdatableFrameworkAidlPath(ctx android.PathContext) android.OutputPath { // Create api_fingerprint.txt func createAPIFingerprint(ctx android.SingletonContext) { - out := ApiFingerprintPath(ctx) + out := android.ApiFingerprintPath(ctx) rule := android.NewRuleBuilder(pctx, ctx) @@ -378,17 +377,11 @@ func createAPIFingerprint(ctx android.SingletonContext) { rule.Build("api_fingerprint", "generate api_fingerprint.txt") } -func ApiFingerprintPath(ctx android.PathContext) android.OutputPath { - return ctx.Config().Once(apiFingerprintPathKey, func() interface{} { - return android.PathForOutput(ctx, "api_fingerprint.txt") - }).(android.OutputPath) -} - func sdkMakeVars(ctx android.MakeVarsContext) { if ctx.Config().AlwaysUsePrebuiltSdks() { return } ctx.Strict("FRAMEWORK_AIDL", sdkFrameworkAidlPath(ctx).String()) - ctx.Strict("API_FINGERPRINT", ApiFingerprintPath(ctx).String()) + ctx.Strict("API_FINGERPRINT", android.ApiFingerprintPath(ctx).String()) } diff --git a/java/sdk_library_test.go b/java/sdk_library_test.go index fb584c5c7..a19d3829f 100644 --- a/java/sdk_library_test.go +++ b/java/sdk_library_test.go @@ -1239,7 +1239,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType string fromPartition string toPartition string - enforceVendorInterface bool enforceProductInterface bool enforceJavaSdkLibraryCheck bool allowList []string @@ -1274,9 +1273,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { android.FixtureWithRootAndroidBp(bpFile), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { variables.EnforceProductPartitionInterface = proptools.BoolPtr(info.enforceProductInterface) - if info.enforceVendorInterface { - variables.DeviceVndkVersion = proptools.StringPtr("current") - } variables.EnforceInterPartitionJavaSdkLibrary = proptools.BoolPtr(info.enforceJavaSdkLibraryCheck) variables.InterPartitionJavaLibraryAllowList = info.allowList }), @@ -1304,7 +1300,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "product", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: false, }, "") @@ -1313,7 +1308,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "product", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: false, enforceJavaSdkLibraryCheck: true, }, "") @@ -1322,7 +1316,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "product", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, errorMessage) @@ -1331,7 +1324,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "vendor", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, errorMessage) @@ -1340,7 +1332,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "vendor", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, allowList: []string{"bar"}, @@ -1350,7 +1341,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_library", fromPartition: "vendor", toPartition: "product", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, errorMessage) @@ -1359,7 +1349,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_sdk_library", fromPartition: "product", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, "") @@ -1368,7 +1357,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_sdk_library", fromPartition: "vendor", toPartition: "system", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, "") @@ -1377,7 +1365,6 @@ func TestJavaSdkLibraryEnforce(t *testing.T) { libraryType: "java_sdk_library", fromPartition: "vendor", toPartition: "product", - enforceVendorInterface: true, enforceProductInterface: true, enforceJavaSdkLibraryCheck: true, }, "") diff --git a/python/python.go b/python/python.go index d3cbd7695..2b1974eb8 100644 --- a/python/python.go +++ b/python/python.go @@ -545,7 +545,6 @@ func (p *PythonLibraryModule) createSrcsZip(ctx android.ModuleContext, pkgPath s var stagedProtoSrcs android.Paths for _, srcFile := range protoSrcs { stagedProtoSrc := pkgPathStagingDir.Join(ctx, pkgPath, srcFile.Rel()) - rule.Command().Text("mkdir -p").Flag(filepath.Base(stagedProtoSrc.String())) rule.Command().Text("cp -f").Input(srcFile).Output(stagedProtoSrc) stagedProtoSrcs = append(stagedProtoSrcs, stagedProtoSrc) } diff --git a/python/scripts/precompile_python.py b/python/scripts/precompile_python.py index aa1a5df53..07b8fe97b 100644 --- a/python/scripts/precompile_python.py +++ b/python/scripts/precompile_python.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import print_function import argparse import py_compile import os @@ -63,11 +64,23 @@ def main(): parser.add_argument('dst_zip') args = parser.parse_args() + errors = [] with open(args.dst_zip, 'wb') as outf, open(args.src_zip, 'rb') as inf: with zipfile.ZipFile(outf, mode='w') as outzip, zipfile.ZipFile(inf, mode='r') as inzip: for name in inzip.namelist(): with inzip.open(name, mode='r') as inzipf: - process_one_file(name, inzipf, outzip) + try: + process_one_file(name, inzipf, outzip) + except py_compile.PyCompileError as e: + errors.append(e) + + if errors: + for i, error in enumerate(errors): + # Print an empty line in between each error + if i > 0: + print(file=sys.stderr) + print(str(error).strip(), file=sys.stderr) + sys.exit(1) if __name__ == "__main__": diff --git a/scripts/Android.bp b/scripts/Android.bp index f36329b1d..d039a8171 100644 --- a/scripts/Android.bp +++ b/scripts/Android.bp @@ -305,3 +305,14 @@ python_binary_host { }, }, } + +python_binary_host { + name: "buildinfo", + main: "buildinfo.py", + srcs: ["buildinfo.py"], + version: { + py3: { + embedded_launcher: true, + }, + }, +} diff --git a/scripts/buildinfo.py b/scripts/buildinfo.py new file mode 100755 index 000000000..e4fb0da09 --- /dev/null +++ b/scripts/buildinfo.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +"""A tool for generating buildinfo.prop""" + +import argparse +import contextlib +import subprocess + +def parse_args(): + """Parse commandline arguments.""" + parser = argparse.ArgumentParser() + parser.add_argument('--use-vbmeta-digest-in-fingerprint', action='store_true') + parser.add_argument('--build-flavor', required=True) + parser.add_argument('--build-hostname-file', required=True, type=argparse.FileType('r')), + parser.add_argument('--build-id', required=True) + parser.add_argument('--build-keys', required=True) + parser.add_argument('--build-number-file', required=True, type=argparse.FileType('r')) + parser.add_argument('--build-thumbprint-file', type=argparse.FileType('r')) + parser.add_argument('--build-type', required=True) + parser.add_argument('--build-username', required=True) + parser.add_argument('--build-variant', required=True) + parser.add_argument('--cpu-abis', action='append', required=True) + parser.add_argument('--date-file', required=True, type=argparse.FileType('r')) + parser.add_argument('--default-locale') + parser.add_argument('--default-wifi-channels', action='append', default=[]) + parser.add_argument('--device', required=True) + parser.add_argument("--display-build-number", action='store_true') + parser.add_argument('--platform-base-os', required=True) + parser.add_argument('--platform-display-version', required=True) + parser.add_argument('--platform-min-supported-target-sdk-version', required=True) + parser.add_argument('--platform-preview-sdk-fingerprint-file', + required=True, + type=argparse.FileType('r')) + parser.add_argument('--platform-preview-sdk-version', required=True) + parser.add_argument('--platform-sdk-version', required=True) + parser.add_argument('--platform-security-patch', required=True) + parser.add_argument('--platform-version', required=True) + parser.add_argument('--platform-version-codename',required=True) + parser.add_argument('--platform-version-all-codenames', action='append', required=True) + parser.add_argument('--platform-version-known-codenames', required=True) + parser.add_argument('--platform-version-last-stable', required=True) + parser.add_argument('--product', required=True) + + parser.add_argument('--out', required=True, type=argparse.FileType('w')) + + return parser.parse_args() + +def main(): + option = parse_args() + + build_hostname = option.build_hostname_file.read().strip() + build_number = option.build_number_file.read().strip() + build_version_tags = option.build_keys + if option.build_type == "debug": + build_version_tags = "debug," + build_version_tags + + raw_date = option.date_file.read().strip() + date = subprocess.check_output(["date", "-d", f"@{raw_date}"], text=True).strip() + date_utc = subprocess.check_output(["date", "-d", f"@{raw_date}", "+%s"], text=True).strip() + + # build_desc is human readable strings that describe this build. This has the same info as the + # build fingerprint. + # e.g. "aosp_cf_x86_64_phone-userdebug VanillaIceCream MAIN eng.20240319.143939 test-keys" + build_desc = f"{option.product}-{option.build_variant} {option.platform_version} " \ + f"{option.build_id} {build_number} {build_version_tags}" + + platform_preview_sdk_fingerprint = option.platform_preview_sdk_fingerprint_file.read().strip() + + with contextlib.redirect_stdout(option.out): + print("# begin build properties") + print("# autogenerated by buildinfo.py") + + # The ro.build.id will be set dynamically by init, by appending the unique vbmeta digest. + if option.use_vbmeta_digest_in_fingerprint: + print(f"ro.build.legacy.id={option.build_id}") + else: + print(f"ro.build.id?={option.build_id}") + + # ro.build.display.id is shown under Settings -> About Phone + if option.build_variant == "user": + # User builds should show: + # release build number or branch.buld_number non-release builds + + # Dev. branches should have DISPLAY_BUILD_NUMBER set + if option.display_build_number: + print(f"ro.build.display.id?={option.build_id} {build_number} {option.build_keys}") + else: + print(f"ro.build.display.id?={option.build_id} {option.build_keys}") + else: + # Non-user builds should show detailed build information (See build desc above) + print(f"ro.build.display.id?={build_desc}") + print(f"ro.build.version.incremental={build_number}") + print(f"ro.build.version.sdk={option.platform_sdk_version}") + print(f"ro.build.version.preview_sdk={option.platform_preview_sdk_version}") + print(f"ro.build.version.preview_sdk_fingerprint={platform_preview_sdk_fingerprint}") + print(f"ro.build.version.codename={option.platform_version_codename}") + print(f"ro.build.version.all_codenames={','.join(option.platform_version_all_codenames)}") + print(f"ro.build.version.known_codenames={option.platform_version_known_codenames}") + print(f"ro.build.version.release={option.platform_version_last_stable}") + print(f"ro.build.version.release_or_codename={option.platform_version}") + print(f"ro.build.version.release_or_preview_display={option.platform_display_version}") + print(f"ro.build.version.security_patch={option.platform_security_patch}") + print(f"ro.build.version.base_os={option.platform_base_os}") + print(f"ro.build.version.min_supported_target_sdk={option.platform_min_supported_target_sdk_version}") + print(f"ro.build.date={date}") + print(f"ro.build.date.utc={date_utc}") + print(f"ro.build.type={option.build_variant}") + print(f"ro.build.user={option.build_username}") + print(f"ro.build.host={build_hostname}") + # TODO: Remove any tag-related optional property declarations once the goals + # from go/arc-android-sigprop-changes have been achieved. + print(f"ro.build.tags?={build_version_tags}") + # ro.build.flavor are used only by the test harness to distinguish builds. + # Only add _asan for a sanitized build if it isn't already a part of the + # flavor (via a dedicated lunch config for example). + print(f"ro.build.flavor={option.build_flavor}") + + # These values are deprecated, use "ro.product.cpu.abilist" + # instead (see below). + print(f"# ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete,") + print(f"# use ro.product.cpu.abilist instead.") + print(f"ro.product.cpu.abi={option.cpu_abis[0]}") + if len(option.cpu_abis) > 1: + print(f"ro.product.cpu.abi2={option.cpu_abis[1]}") + + if option.default_locale: + print(f"ro.product.locale={option.default_locale}") + print(f"ro.wifi.channels={' '.join(option.default_wifi_channels)}") + + print(f"# ro.build.product is obsolete; use ro.product.device") + print(f"ro.build.product={option.device}") + + print(f"# Do not try to parse description or thumbprint") + print(f"ro.build.description?={build_desc}") + if option.build_thumbprint_file: + build_thumbprint = option.build_thumbprint_file.read().strip() + print(f"ro.build.thumbprint={build_thumbprint}") + + print(f"# end build properties") + +if __name__ == "__main__": + main() |