summaryrefslogtreecommitdiffstats
path: root/adb/commandline.cpp
diff options
context:
space:
mode:
authorTodd Kennedy <toddke@google.com>2016-07-20 16:22:37 -0700
committerJosh Gao <jmgao@google.com>2016-08-30 13:06:12 -0700
commit248722e7eb8d184677b2d858d3309d7ce055e532 (patch)
tree76928e13cd0ca43f1c5bae479c810eae80de8530 /adb/commandline.cpp
parentc42f1bb3e91bb7fbce893da289ea143f2dda3c6c (diff)
downloadcore-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.cpp54
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());