/* * Copyright (C) 2023 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. */ // This binary is run on boot as a oneshot service. It should not be run at any // other point. #include #include "android-base/logging.h" #include "android-base/properties.h" static void SetPropertyAndLog(const std::string& key, const std::string& value, const std::string& message = "") { if (android::base::SetProperty(key, value)) { LOG(INFO) << "Set property " << key << " to " << value << " " << message; } else { LOG(ERROR) << "Failed to set property " << key << " to " << value << " " << message; } } // Copies the value of one system property to another if it isn't empty and // passes the predicate test_fn. static void CopyPropertyIf(const char* src, const char* dst, bool (*test_fn)(const std::string&)) { std::string prop = android::base::GetProperty(src, ""); if (prop.empty()) { LOG(INFO) << "Property " << src << " not set"; } else if (!test_fn(prop)) { LOG(INFO) << "Property " << src << " has ignored value " << prop; } else { SetPropertyAndLog(dst, prop, std::string("from ") + src); } } int main(int, char** argv) { android::base::InitLogging(argv); // Copy properties that must only be set at boot and not change value later. // Note that P/H can change the properties in the experiment namespaces at any // time. CopyPropertyIf("persist.device_config.runtime_native_boot.useartservice", "dalvik.vm.useartservice", // If an OEM has set dalvik.vm.useartservice to false we // shouldn't override it to true from the P/H property. [](const std::string& prop) { return prop == "false"; }); return 0; }