Loading updater/include/updater/build_info.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -51,9 +51,18 @@ class BuildInfo { // Parses the given target-file, initializes the build properties and extracts the images. // Parses the given target-file, initializes the build properties and extracts the images. bool ParseTargetFile(const std::string_view target_file_path, bool extracted_input); bool ParseTargetFile(const std::string_view target_file_path, bool extracted_input); std::string GetOemSettings() const { return oem_settings_; } void SetOemSettings(const std::string_view oem_settings) { oem_settings_ = oem_settings; } private: private: // A map to store the system properties during simulation. // A map to store the system properties during simulation. std::map<std::string, std::string, std::less<>> build_props_; std::map<std::string, std::string, std::less<>> build_props_; // A file that contains the oem properties. std::string oem_settings_; // A map from the blockdev_name to the FakeBlockDevice object, which contains the path to the // A map from the blockdev_name to the FakeBlockDevice object, which contains the path to the // temporary file. // temporary file. std::map<std::string, FakeBlockDevice, std::less<>> blockdev_map_; std::map<std::string, FakeBlockDevice, std::less<>> blockdev_map_; Loading updater/simulator_runtime.cpp +5 −1 Original line number Original line Diff line number Diff line Loading @@ -87,7 +87,11 @@ int SimulatorRuntime::WipeBlockDevice(const std::string_view filename, size_t /* } } bool SimulatorRuntime::ReadFileToString(const std::string_view filename, bool SimulatorRuntime::ReadFileToString(const std::string_view filename, std::string* /* content */) const { std::string* content) const { if (android::base::EndsWith(filename, "oem.prop")) { return android::base::ReadFileToString(source_->GetOemSettings(), content); } LOG(INFO) << "SKip reading filename " << filename; LOG(INFO) << "SKip reading filename " << filename; return true; return true; } } Loading updater/update_simulator_main.cpp +83 −9 Original line number Original line Diff line number Diff line Loading @@ -14,11 +14,18 @@ * limitations under the License. * limitations under the License. */ */ #include <getopt.h> #include <stdlib.h> #include <unistd.h> #include <string> #include <string> #include <string_view> #include <android-base/file.h> #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/logging.h> #include <android-base/strings.h> #include "edify/expr.h" #include "otautil/error_code.h" #include "otautil/error_code.h" #include "otautil/paths.h" #include "otautil/paths.h" #include "updater/blockimg.h" #include "updater/blockimg.h" Loading @@ -28,21 +35,67 @@ #include "updater/simulator_runtime.h" #include "updater/simulator_runtime.h" #include "updater/updater.h" #include "updater/updater.h" using namespace std::string_literals; void Usage(std::string_view name) { LOG(INFO) << "Usage: " << name << "[--oem_settings <oem_property_file>]" << "[--skip_functions <skip_function_file>]" << " --source <source_target_file>" << " --ota_package <ota_package>"; } Value* SimulatorPlaceHolderFn(const char* name, State* /* state */, const std::vector<std::unique_ptr<Expr>>& /* argv */) { LOG(INFO) << "Skip function " << name << " in host simulation"; return StringValue("t"); } int main(int argc, char** argv) { int main(int argc, char** argv) { // Write the logs to stdout. // Write the logs to stdout. android::base::InitLogging(argv, &android::base::StderrLogger); android::base::InitLogging(argv, &android::base::StderrLogger); if (argc != 3 && argc != 4) { std::string oem_settings; LOG(ERROR) << "unexpected number of arguments: " << argc << std::endl std::string skip_function_file; << "Usage: " << argv[0] << " <source_target-file> <ota_package>"; std::string source_target_file; std::string package_name; constexpr struct option OPTIONS[] = { { "oem_settings", required_argument, nullptr, 0 }, { "ota_package", required_argument, nullptr, 0 }, { "skip_functions", required_argument, nullptr, 0 }, { "source", required_argument, nullptr, 0 }, { nullptr, 0, nullptr, 0 }, }; int arg; int option_index; while ((arg = getopt_long(argc, argv, "", OPTIONS, &option_index)) != -1) { if (arg != 0) { LOG(ERROR) << "Invalid command argument"; Usage(argv[0]); return EXIT_FAILURE; return EXIT_FAILURE; } } auto option_name = OPTIONS[option_index].name; // The same oem property file used during OTA generation. It's needed for file_getprop() to // return the correct value for the source build. if (option_name == "oem_settings"s) { oem_settings = optarg; } else if (option_name == "skip_functions"s) { skip_function_file = optarg; } else if (option_name == "source"s) { source_target_file = optarg; } else if (option_name == "ota_package"s) { package_name = optarg; } else { Usage(argv[0]); return EXIT_FAILURE; } } // TODO(xunchang) implement a commandline parser, e.g. it can take an oem property so that the if (source_target_file.empty() || package_name.empty()) { // file_getprop() will return correct value. Usage(argv[0]); return EXIT_FAILURE; std::string source_target_file = argv[1]; } std::string package_name = argv[2]; // Configure edify's functions. // Configure edify's functions. RegisterBuiltins(); RegisterBuiltins(); Loading @@ -50,6 +103,22 @@ int main(int argc, char** argv) { RegisterBlockImageFunctions(); RegisterBlockImageFunctions(); RegisterDynamicPartitionsFunctions(); RegisterDynamicPartitionsFunctions(); if (!skip_function_file.empty()) { std::string content; if (!android::base::ReadFileToString(skip_function_file, &content)) { PLOG(ERROR) << "Failed to read " << skip_function_file; return EXIT_FAILURE; } auto lines = android::base::Split(content, "\n"); for (const auto& line : lines) { if (line.empty() || android::base::StartsWith(line, "#")) { continue; } RegisterFunction(line, SimulatorPlaceHolderFn); } } TemporaryFile temp_saved_source; TemporaryFile temp_saved_source; TemporaryFile temp_last_command; TemporaryFile temp_last_command; TemporaryDir temp_stash_base; TemporaryDir temp_stash_base; Loading @@ -67,6 +136,11 @@ int main(int argc, char** argv) { return EXIT_FAILURE; return EXIT_FAILURE; } } if (!oem_settings.empty()) { CHECK_EQ(0, access(oem_settings.c_str(), R_OK)); source_build_info.SetOemSettings(oem_settings); } Updater updater(std::make_unique<SimulatorRuntime>(&source_build_info)); Updater updater(std::make_unique<SimulatorRuntime>(&source_build_info)); if (!updater.Init(cmd_pipe.release(), package_name, false)) { if (!updater.Init(cmd_pipe.release(), package_name, false)) { return EXIT_FAILURE; return EXIT_FAILURE; Loading Loading
updater/include/updater/build_info.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -51,9 +51,18 @@ class BuildInfo { // Parses the given target-file, initializes the build properties and extracts the images. // Parses the given target-file, initializes the build properties and extracts the images. bool ParseTargetFile(const std::string_view target_file_path, bool extracted_input); bool ParseTargetFile(const std::string_view target_file_path, bool extracted_input); std::string GetOemSettings() const { return oem_settings_; } void SetOemSettings(const std::string_view oem_settings) { oem_settings_ = oem_settings; } private: private: // A map to store the system properties during simulation. // A map to store the system properties during simulation. std::map<std::string, std::string, std::less<>> build_props_; std::map<std::string, std::string, std::less<>> build_props_; // A file that contains the oem properties. std::string oem_settings_; // A map from the blockdev_name to the FakeBlockDevice object, which contains the path to the // A map from the blockdev_name to the FakeBlockDevice object, which contains the path to the // temporary file. // temporary file. std::map<std::string, FakeBlockDevice, std::less<>> blockdev_map_; std::map<std::string, FakeBlockDevice, std::less<>> blockdev_map_; Loading
updater/simulator_runtime.cpp +5 −1 Original line number Original line Diff line number Diff line Loading @@ -87,7 +87,11 @@ int SimulatorRuntime::WipeBlockDevice(const std::string_view filename, size_t /* } } bool SimulatorRuntime::ReadFileToString(const std::string_view filename, bool SimulatorRuntime::ReadFileToString(const std::string_view filename, std::string* /* content */) const { std::string* content) const { if (android::base::EndsWith(filename, "oem.prop")) { return android::base::ReadFileToString(source_->GetOemSettings(), content); } LOG(INFO) << "SKip reading filename " << filename; LOG(INFO) << "SKip reading filename " << filename; return true; return true; } } Loading
updater/update_simulator_main.cpp +83 −9 Original line number Original line Diff line number Diff line Loading @@ -14,11 +14,18 @@ * limitations under the License. * limitations under the License. */ */ #include <getopt.h> #include <stdlib.h> #include <unistd.h> #include <string> #include <string> #include <string_view> #include <android-base/file.h> #include <android-base/file.h> #include <android-base/logging.h> #include <android-base/logging.h> #include <android-base/strings.h> #include "edify/expr.h" #include "otautil/error_code.h" #include "otautil/error_code.h" #include "otautil/paths.h" #include "otautil/paths.h" #include "updater/blockimg.h" #include "updater/blockimg.h" Loading @@ -28,21 +35,67 @@ #include "updater/simulator_runtime.h" #include "updater/simulator_runtime.h" #include "updater/updater.h" #include "updater/updater.h" using namespace std::string_literals; void Usage(std::string_view name) { LOG(INFO) << "Usage: " << name << "[--oem_settings <oem_property_file>]" << "[--skip_functions <skip_function_file>]" << " --source <source_target_file>" << " --ota_package <ota_package>"; } Value* SimulatorPlaceHolderFn(const char* name, State* /* state */, const std::vector<std::unique_ptr<Expr>>& /* argv */) { LOG(INFO) << "Skip function " << name << " in host simulation"; return StringValue("t"); } int main(int argc, char** argv) { int main(int argc, char** argv) { // Write the logs to stdout. // Write the logs to stdout. android::base::InitLogging(argv, &android::base::StderrLogger); android::base::InitLogging(argv, &android::base::StderrLogger); if (argc != 3 && argc != 4) { std::string oem_settings; LOG(ERROR) << "unexpected number of arguments: " << argc << std::endl std::string skip_function_file; << "Usage: " << argv[0] << " <source_target-file> <ota_package>"; std::string source_target_file; std::string package_name; constexpr struct option OPTIONS[] = { { "oem_settings", required_argument, nullptr, 0 }, { "ota_package", required_argument, nullptr, 0 }, { "skip_functions", required_argument, nullptr, 0 }, { "source", required_argument, nullptr, 0 }, { nullptr, 0, nullptr, 0 }, }; int arg; int option_index; while ((arg = getopt_long(argc, argv, "", OPTIONS, &option_index)) != -1) { if (arg != 0) { LOG(ERROR) << "Invalid command argument"; Usage(argv[0]); return EXIT_FAILURE; return EXIT_FAILURE; } } auto option_name = OPTIONS[option_index].name; // The same oem property file used during OTA generation. It's needed for file_getprop() to // return the correct value for the source build. if (option_name == "oem_settings"s) { oem_settings = optarg; } else if (option_name == "skip_functions"s) { skip_function_file = optarg; } else if (option_name == "source"s) { source_target_file = optarg; } else if (option_name == "ota_package"s) { package_name = optarg; } else { Usage(argv[0]); return EXIT_FAILURE; } } // TODO(xunchang) implement a commandline parser, e.g. it can take an oem property so that the if (source_target_file.empty() || package_name.empty()) { // file_getprop() will return correct value. Usage(argv[0]); return EXIT_FAILURE; std::string source_target_file = argv[1]; } std::string package_name = argv[2]; // Configure edify's functions. // Configure edify's functions. RegisterBuiltins(); RegisterBuiltins(); Loading @@ -50,6 +103,22 @@ int main(int argc, char** argv) { RegisterBlockImageFunctions(); RegisterBlockImageFunctions(); RegisterDynamicPartitionsFunctions(); RegisterDynamicPartitionsFunctions(); if (!skip_function_file.empty()) { std::string content; if (!android::base::ReadFileToString(skip_function_file, &content)) { PLOG(ERROR) << "Failed to read " << skip_function_file; return EXIT_FAILURE; } auto lines = android::base::Split(content, "\n"); for (const auto& line : lines) { if (line.empty() || android::base::StartsWith(line, "#")) { continue; } RegisterFunction(line, SimulatorPlaceHolderFn); } } TemporaryFile temp_saved_source; TemporaryFile temp_saved_source; TemporaryFile temp_last_command; TemporaryFile temp_last_command; TemporaryDir temp_stash_base; TemporaryDir temp_stash_base; Loading @@ -67,6 +136,11 @@ int main(int argc, char** argv) { return EXIT_FAILURE; return EXIT_FAILURE; } } if (!oem_settings.empty()) { CHECK_EQ(0, access(oem_settings.c_str(), R_OK)); source_build_info.SetOemSettings(oem_settings); } Updater updater(std::make_unique<SimulatorRuntime>(&source_build_info)); Updater updater(std::make_unique<SimulatorRuntime>(&source_build_info)); if (!updater.Init(cmd_pipe.release(), package_name, false)) { if (!updater.Init(cmd_pipe.release(), package_name, false)) { return EXIT_FAILURE; return EXIT_FAILURE; Loading