Loading init/property_service.cpp +64 −0 Original line number Diff line number Diff line Loading @@ -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<const char*, const std::string&> 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 Loading Loading @@ -972,6 +1035,7 @@ void PropertyLoadBootDefaults() { property_initialize_ro_product_props(); property_derive_build_fingerprint(); property_initialize_ro_cpu_abilist(); update_sys_usb_config(); } Loading Loading
init/property_service.cpp +64 −0 Original line number Diff line number Diff line Loading @@ -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<const char*, const std::string&> 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 Loading Loading @@ -972,6 +1035,7 @@ void PropertyLoadBootDefaults() { property_initialize_ro_product_props(); property_derive_build_fingerprint(); property_initialize_ro_cpu_abilist(); update_sys_usb_config(); } Loading