| #include "package_manager.h" |
| #include <cstring> |
| #include <iostream> |
| #include <sstream> |
| |
| #include "tools/base/deploy/common/event.h" |
| #include "tools/base/deploy/installer/workspace.h" |
| |
| namespace deploy { |
| |
| namespace { |
| const char* PM_EXEC = "/system/bin/pm"; |
| } // namespace |
| |
| bool PackageManager::GetApks(const std::string& package_name, |
| std::vector<std::string>* apks, |
| std::string* error_string) const { |
| Phase p("PackageManager::GetAppBaseFolder"); |
| std::vector<std::string> parameters; |
| parameters.emplace_back("path"); |
| parameters.emplace_back(package_name); |
| std::string out; |
| std::string err; |
| bool success = workspace_.GetExecutor().Run(PM_EXEC, parameters, &out, &err); |
| if (!success) { |
| *error_string = err; |
| return false; |
| } |
| // pm returns the path to the apk. We need to parse the response: |
| // package:/data/app/net.fabiensanglard.shmup-1/base.apk |
| // into |
| // /data/app/net.fabiensanglard.shmup-1 |
| // Make sure input is well-formed. |
| std::stringstream ss(out); |
| std::string line; |
| |
| // Return path prefixed with "package:" |
| while (std::getline(ss, line, '\n')) { |
| if (!strncmp(line.c_str(), "package:", 8)) { |
| apks->push_back(std::string(line.c_str() + 8)); |
| } |
| } |
| |
| return true; |
| } |
| void PackageManager::SetPath(const char* path) { PM_EXEC = path; } |
| |
| bool PackageManager::Install(const std::string& apk_path, |
| const std::vector<std::string>& options, |
| std::string* output) const noexcept { |
| Phase p("PackageManger::Install"); |
| |
| std::vector<std::string> parameters; |
| parameters.emplace_back("install"); |
| for (const std::string& option : options) { |
| parameters.emplace_back(option); |
| } |
| parameters.emplace_back(apk_path); |
| |
| std::string err; |
| bool success = |
| workspace_.GetExecutor().Run(PM_EXEC, parameters, output, &err); |
| if (!success) { |
| *output = err; |
| return false; |
| } |
| return true; |
| } |
| |
| } // namespace deploy |