diff options
author | Todd Kennedy <toddke@google.com> | 2016-07-20 16:22:37 -0700 |
---|---|---|
committer | Josh Gao <jmgao@google.com> | 2016-08-30 13:06:12 -0700 |
commit | 248722e7eb8d184677b2d858d3309d7ce055e532 (patch) | |
tree | 76928e13cd0ca43f1c5bae479c810eae80de8530 /adb/commandline.cpp | |
parent | c42f1bb3e91bb7fbce893da289ea143f2dda3c6c (diff) | |
download | core-248722e7eb8d184677b2d858d3309d7ce055e532.tar.gz core-248722e7eb8d184677b2d858d3309d7ce055e532.tar.bz2 core-248722e7eb8d184677b2d858d3309d7ce055e532.zip |
DO NOT MERGE: use 'cmd' command for install-multiple
adb install-multiple makes a minimum of 3 calls to the 'pm' command. This
causes at least 3 separate "pm" processes to be spun up. Instead, use the
'cmd' command which runs in the existing system_server process.
Bug: 27483932
Change-Id: Ia1bed405c3d7e675a1a56ff82c692aaa94388a5c
(cherry picked from commit 4838ae1ab52a6364e74c8607206f0a9ea302c80e)
Diffstat (limited to 'adb/commandline.cpp')
-rw-r--r-- | adb/commandline.cpp | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/adb/commandline.cpp b/adb/commandline.cpp index 9d5bed1c2..f6e03432a 100644 --- a/adb/commandline.cpp +++ b/adb/commandline.cpp @@ -1469,6 +1469,16 @@ static bool _is_valid_ack_reply_fd(const int ack_reply_fd) { #endif } +static bool _use_legacy_install() { + FeatureSet features; + std::string error; + if (!adb_get_feature_set(&features, &error)) { + fprintf(stderr, "error: %s\n", error.c_str()); + return true; + } + return !CanUseFeature(features, kFeatureCmd); +} + int adb_commandline(int argc, const char **argv) { int no_daemon = 0; int is_daemon = 0; @@ -1863,17 +1873,10 @@ int adb_commandline(int argc, const char **argv) { } else if (!strcmp(argv[0], "install")) { if (argc < 2) return usage(); - FeatureSet features; - std::string error; - if (!adb_get_feature_set(&features, &error)) { - fprintf(stderr, "error: %s\n", error.c_str()); - return 1; + if (_use_legacy_install()) { + return install_app_legacy(transport_type, serial, argc, argv); } - - if (CanUseFeature(features, kFeatureCmd)) { - return install_app(transport_type, serial, argc, argv); - } - return install_app_legacy(transport_type, serial, argc, argv); + return install_app(transport_type, serial, argc, argv); } else if (!strcmp(argv[0], "install-multiple")) { if (argc < 2) return usage(); @@ -1881,17 +1884,10 @@ int adb_commandline(int argc, const char **argv) { } else if (!strcmp(argv[0], "uninstall")) { if (argc < 2) return usage(); - FeatureSet features; - std::string error; - if (!adb_get_feature_set(&features, &error)) { - fprintf(stderr, "error: %s\n", error.c_str()); - return 1; + if (_use_legacy_install()) { + return uninstall_app_legacy(transport_type, serial, argc, argv); } - - if (CanUseFeature(features, kFeatureCmd)) { - return uninstall_app(transport_type, serial, argc, argv); - } - return uninstall_app_legacy(transport_type, serial, argc, argv); + return uninstall_app(transport_type, serial, argc, argv); } else if (!strcmp(argv[0], "sync")) { std::string src; @@ -2105,7 +2101,6 @@ static int install_multiple_app(TransportType transport, const char* serial, int int i; struct stat sb; uint64_t total_size = 0; - // Find all APK arguments starting at end. // All other arguments passed through verbatim. int first_apk = -1; @@ -2130,7 +2125,14 @@ static int install_multiple_app(TransportType transport, const char* serial, int return 1; } - std::string cmd = android::base::StringPrintf("exec:pm install-create -S %" PRIu64, total_size); + std::string install_cmd; + if (_use_legacy_install()) { + install_cmd = "exec:pm"; + } else { + install_cmd = "exec:cmd package"; + } + + std::string cmd = android::base::StringPrintf("%s install-create -S %" PRIu64, install_cmd.c_str(), total_size); for (i = 1; i < first_apk; i++) { cmd += " " + escape_arg(argv[i]); } @@ -2172,8 +2174,8 @@ static int install_multiple_app(TransportType transport, const char* serial, int } std::string cmd = android::base::StringPrintf( - "exec:pm install-write -S %" PRIu64 " %d %d_%s -", - static_cast<uint64_t>(sb.st_size), session_id, i, adb_basename(file).c_str()); + "%s install-write -S %" PRIu64 " %d %d_%s -", + install_cmd.c_str(), static_cast<uint64_t>(sb.st_size), session_id, i, adb_basename(file).c_str()); int localFd = adb_open(file, O_RDONLY); if (localFd < 0) { @@ -2208,8 +2210,8 @@ static int install_multiple_app(TransportType transport, const char* serial, int finalize_session: // Commit session if we streamed everything okay; otherwise abandon std::string service = - android::base::StringPrintf("exec:pm install-%s %d", - success ? "commit" : "abandon", session_id); + android::base::StringPrintf("%s install-%s %d", + install_cmd.c_str(), success ? "commit" : "abandon", session_id); fd = adb_connect(service, &error); if (fd < 0) { fprintf(stderr, "Connect error for finalize: %s\n", error.c_str()); |