From 0061d4da0190851523009db18810f18f44b9da37 Mon Sep 17 00:00:00 2001 From: SzuWei Lin Date: Thu, 31 Dec 2020 16:52:39 +0800 Subject: [PATCH] Make ro.product.cpu.abilist* to be fetched dynamically Basically, ro.product.cpu.abilist* are defined by ro.vendor.cpu.abilist*. And they can be overried by ro.odm.cpu.abilist* and ro.product.cpu.abilist*. ro.system.cpu.abilist* are for fallback if others are no defined. Bug: 176520383 Test: check the result by flashing aosp_arm64-userdebug on Test: aosp_blueline-user and aosp_blueline-user hacked by Test: 64-bits-only Change-Id: I01ae01af099a4ec8fe3d4525edecc233a477ff60 --- init/property_service.cpp | 64 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/init/property_service.cpp b/init/property_service.cpp index e71c38656..7e218adc4 100644 --- a/init/property_service.cpp +++ b/init/property_service.cpp @@ -890,6 +890,69 @@ static void property_derive_build_fingerprint() { } } +// If the ro.product.cpu.abilist* properties have not been explicitly +// set, derive them from ro.${partition}.product.cpu.abilist* properties. +static void property_initialize_ro_cpu_abilist() { + // From high to low priority. + const char* kAbilistSources[] = { + "product", + "odm", + "vendor", + "system", + }; + const std::string EMPTY = ""; + const char* kAbilistProp = "ro.product.cpu.abilist"; + const char* kAbilist32Prop = "ro.product.cpu.abilist32"; + const char* kAbilist64Prop = "ro.product.cpu.abilist64"; + + // If the properties are defined explicitly, just use them. + if (GetProperty(kAbilistProp, EMPTY) != EMPTY) { + return; + } + + // Find the first source defining these properties by order. + std::string abilist32_prop_val; + std::string abilist64_prop_val; + for (const auto& source : kAbilistSources) { + const auto abilist32_prop = std::string("ro.") + source + ".product.cpu.abilist32"; + const auto abilist64_prop = std::string("ro.") + source + ".product.cpu.abilist64"; + abilist32_prop_val = GetProperty(abilist32_prop, EMPTY); + abilist64_prop_val = GetProperty(abilist64_prop, EMPTY); + // The properties could be empty on 32-bit-only or 64-bit-only devices, + // but we cannot identify a property is empty or undefined by GetProperty(). + // So, we assume both of these 2 properties are empty as undefined. + if (abilist32_prop_val != EMPTY || abilist64_prop_val != EMPTY) { + break; + } + } + + // Merge ABI lists for ro.product.cpu.abilist + auto abilist_prop_val = abilist64_prop_val; + if (abilist32_prop_val != EMPTY) { + if (abilist_prop_val != EMPTY) { + abilist_prop_val += ","; + } + abilist_prop_val += abilist32_prop_val; + } + + // Set these properties + const std::pair set_prop_list[] = { + {kAbilistProp, abilist_prop_val}, + {kAbilist32Prop, abilist32_prop_val}, + {kAbilist64Prop, abilist64_prop_val}, + }; + for (const auto& [prop, prop_val] : set_prop_list) { + LOG(INFO) << "Setting property '" << prop << "' to '" << prop_val << "'"; + + std::string error; + uint32_t res = PropertySet(prop, prop_val, &error); + if (res != PROP_SUCCESS) { + LOG(ERROR) << "Error setting property '" << prop << "': err=" << res << " (" << error + << ")"; + } + } +} + void PropertyLoadBootDefaults() { // We read the properties and their values into a map, in order to always allow properties // loaded in the later property files to override the properties in loaded in the earlier @@ -974,6 +1037,7 @@ void PropertyLoadBootDefaults() { property_initialize_ro_product_props(); property_derive_build_fingerprint(); + property_initialize_ro_cpu_abilist(); update_sys_usb_config(); }