commandline.cpp revision 5767d0dd5ae44978b7a80ba08de32fe51822cbb4
1/* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define TRACE_TAG ADB 18 19#include "sysdeps.h" 20 21#include <assert.h> 22#include <ctype.h> 23#include <errno.h> 24#include <inttypes.h> 25#include <limits.h> 26#include <stdarg.h> 27#include <stdint.h> 28#include <stdio.h> 29#include <stdlib.h> 30#include <string.h> 31#include <sys/stat.h> 32#include <sys/types.h> 33 34#include <memory> 35#include <string> 36#include <vector> 37 38#include <android-base/logging.h> 39#include <android-base/stringprintf.h> 40#include <android-base/strings.h> 41 42#if !defined(_WIN32) 43#include <signal.h> 44#include <sys/ioctl.h> 45#include <termios.h> 46#include <unistd.h> 47#endif 48 49#include "adb.h" 50#include "adb_auth.h" 51#include "adb_client.h" 52#include "adb_io.h" 53#include "adb_utils.h" 54#include "file_sync_service.h" 55#include "services.h" 56#include "shell_service.h" 57#include "transport.h" 58 59static int install_app(TransportType t, const char* serial, int argc, const char** argv); 60static int install_multiple_app(TransportType t, const char* serial, int argc, const char** argv); 61static int uninstall_app(TransportType t, const char* serial, int argc, const char** argv); 62static int install_app_legacy(TransportType t, const char* serial, int argc, const char** argv); 63static int uninstall_app_legacy(TransportType t, const char* serial, int argc, const char** argv); 64 65static auto& gProductOutPath = *new std::string(); 66extern int gListenAll; 67 68static std::string product_file(const char *extra) { 69 if (gProductOutPath.empty()) { 70 fprintf(stderr, "adb: Product directory not specified; " 71 "use -p or define ANDROID_PRODUCT_OUT\n"); 72 exit(1); 73 } 74 75 return android::base::StringPrintf("%s%s%s", 76 gProductOutPath.c_str(), OS_PATH_SEPARATOR_STR, extra); 77} 78 79static void help() { 80 fprintf(stderr, "%s\n", adb_version().c_str()); 81 fprintf(stderr, 82 " -a - directs adb to listen on all interfaces for a connection\n" 83 " -d - directs command to the only connected USB device\n" 84 " returns an error if more than one USB device is present.\n" 85 " -e - directs command to the only running emulator.\n" 86 " returns an error if more than one emulator is running.\n" 87 " -s <specific device> - directs command to the device or emulator with the given\n" 88 " serial number or qualifier. Overrides ANDROID_SERIAL\n" 89 " environment variable.\n" 90 " -p <product name or path> - simple product name like 'sooner', or\n" 91 " a relative/absolute path to a product\n" 92 " out directory like 'out/target/product/sooner'.\n" 93 " If -p is not specified, the ANDROID_PRODUCT_OUT\n" 94 " environment variable is used, which must\n" 95 " be an absolute path.\n" 96 " -H - Name of adb server host (default: localhost)\n" 97 " -P - Port of adb server (default: 5037)\n" 98 " devices [-l] - list all connected devices\n" 99 " ('-l' will also list device qualifiers)\n" 100 " connect <host>[:<port>] - connect to a device via TCP/IP\n" 101 " Port 5555 is used by default if no port number is specified.\n" 102 " disconnect [<host>[:<port>]] - disconnect from a TCP/IP device.\n" 103 " Port 5555 is used by default if no port number is specified.\n" 104 " Using this command with no additional arguments\n" 105 " will disconnect from all connected TCP/IP devices.\n" 106 "\n" 107 "device commands:\n" 108 " adb push <local>... <remote>\n" 109 " - copy files/dirs to device\n" 110 " adb pull [-a] <remote>... <local>\n" 111 " - copy files/dirs from device\n" 112 " (-a preserves file timestamp and mode)\n" 113 " adb sync [ <directory> ] - copy host->device only if changed\n" 114 " (-l means list but don't copy)\n" 115 " adb shell [-e escape] [-n] [-Tt] [-x] [command]\n" 116 " - run remote shell command (interactive shell if no command given)\n" 117 " (-e: choose escape character, or \"none\"; default '~')\n" 118 " (-n: don't read from stdin)\n" 119 " (-T: disable PTY allocation)\n" 120 " (-t: force PTY allocation)\n" 121 " (-x: disable remote exit codes and stdout/stderr separation)\n" 122 " adb emu <command> - run emulator console command\n" 123 " adb logcat [ <filter-spec> ] - View device log\n" 124 " adb forward --list - list all forward socket connections.\n" 125 " the format is a list of lines with the following format:\n" 126 " <serial> \" \" <local> \" \" <remote> \"\\n\"\n" 127 " adb forward <local> <remote> - forward socket connections\n" 128 " forward specs are one of: \n" 129 " tcp:<port>\n" 130 " localabstract:<unix domain socket name>\n" 131 " localreserved:<unix domain socket name>\n" 132 " localfilesystem:<unix domain socket name>\n" 133 " dev:<character device name>\n" 134 " jdwp:<process pid> (remote only)\n" 135 " adb forward --no-rebind <local> <remote>\n" 136 " - same as 'adb forward <local> <remote>' but fails\n" 137 " if <local> is already forwarded\n" 138 " adb forward --remove <local> - remove a specific forward socket connection\n" 139 " adb forward --remove-all - remove all forward socket connections\n" 140 " adb reverse --list - list all reverse socket connections from device\n" 141 " adb reverse <remote> <local> - reverse socket connections\n" 142 " reverse specs are one of:\n" 143 " tcp:<port>\n" 144 " localabstract:<unix domain socket name>\n" 145 " localreserved:<unix domain socket name>\n" 146 " localfilesystem:<unix domain socket name>\n" 147 " adb reverse --no-rebind <remote> <local>\n" 148 " - same as 'adb reverse <remote> <local>' but fails\n" 149 " if <remote> is already reversed.\n" 150 " adb reverse --remove <remote>\n" 151 " - remove a specific reversed socket connection\n" 152 " adb reverse --remove-all - remove all reversed socket connections from device\n" 153 " adb jdwp - list PIDs of processes hosting a JDWP transport\n" 154 " adb install [-lrtsdg] <file>\n" 155 " - push this package file to the device and install it\n" 156 " (-l: forward lock application)\n" 157 " (-r: replace existing application)\n" 158 " (-t: allow test packages)\n" 159 " (-s: install application on sdcard)\n" 160 " (-d: allow version code downgrade (debuggable packages only))\n" 161 " (-g: grant all runtime permissions)\n" 162 " adb install-multiple [-lrtsdpg] <file...>\n" 163 " - push this package file to the device and install it\n" 164 " (-l: forward lock application)\n" 165 " (-r: replace existing application)\n" 166 " (-t: allow test packages)\n" 167 " (-s: install application on sdcard)\n" 168 " (-d: allow version code downgrade (debuggable packages only))\n" 169 " (-p: partial application install)\n" 170 " (-g: grant all runtime permissions)\n" 171 " adb uninstall [-k] <package> - remove this app package from the device\n" 172 " ('-k' means keep the data and cache directories)\n" 173 " adb bugreport - return all information from the device\n" 174 " that should be included in a bug report.\n" 175 "\n" 176 " adb backup [-f <file>] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>]\n" 177 " - write an archive of the device's data to <file>.\n" 178 " If no -f option is supplied then the data is written\n" 179 " to \"backup.ab\" in the current directory.\n" 180 " (-apk|-noapk enable/disable backup of the .apks themselves\n" 181 " in the archive; the default is noapk.)\n" 182 " (-obb|-noobb enable/disable backup of any installed apk expansion\n" 183 " (aka .obb) files associated with each application; the default\n" 184 " is noobb.)\n" 185 " (-shared|-noshared enable/disable backup of the device's\n" 186 " shared storage / SD card contents; the default is noshared.)\n" 187 " (-all means to back up all installed applications)\n" 188 " (-system|-nosystem toggles whether -all automatically includes\n" 189 " system applications; the default is to include system apps)\n" 190 " (<packages...> is the list of applications to be backed up. If\n" 191 " the -all or -shared flags are passed, then the package\n" 192 " list is optional. Applications explicitly given on the\n" 193 " command line will be included even if -nosystem would\n" 194 " ordinarily cause them to be omitted.)\n" 195 "\n" 196 " adb restore <file> - restore device contents from the <file> backup archive\n" 197 "\n" 198 " adb disable-verity - disable dm-verity checking on USERDEBUG builds\n" 199 " adb enable-verity - re-enable dm-verity checking on USERDEBUG builds\n" 200 " adb keygen <file> - generate adb public/private key. The private key is stored in <file>,\n" 201 " and the public key is stored in <file>.pub. Any existing files\n" 202 " are overwritten.\n" 203 " adb help - show this help message\n" 204 " adb version - show version num\n" 205 "\n" 206 "scripting:\n" 207 " adb wait-for[-<transport>]-<state>\n" 208 " - wait for device to be in the given state:\n" 209 " device, recovery, sideload, or bootloader\n" 210 " Transport is: usb, local or any [default=any]\n" 211 " adb start-server - ensure that there is a server running\n" 212 " adb kill-server - kill the server if it is running\n" 213 " adb get-state - prints: offline | bootloader | device\n" 214 " adb get-serialno - prints: <serial-number>\n" 215 " adb get-devpath - prints: <device-path>\n" 216 " adb remount - remounts the /system, /vendor (if present) and /oem (if present) partitions on the device read-write\n" 217 " adb reboot [bootloader|recovery]\n" 218 " - reboots the device, optionally into the bootloader or recovery program.\n" 219 " adb reboot sideload - reboots the device into the sideload mode in recovery program (adb root required).\n" 220 " adb reboot sideload-auto-reboot\n" 221 " - reboots into the sideload mode, then reboots automatically after the sideload regardless of the result.\n" 222 " adb sideload <file> - sideloads the given package\n" 223 " adb root - restarts the adbd daemon with root permissions\n" 224 " adb unroot - restarts the adbd daemon without root permissions\n" 225 " adb usb - restarts the adbd daemon listening on USB\n" 226 " adb tcpip <port> - restarts the adbd daemon listening on TCP on the specified port\n" 227 "\n" 228 "networking:\n" 229 " adb ppp <tty> [parameters] - Run PPP over USB.\n" 230 " Note: you should not automatically start a PPP connection.\n" 231 " <tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1\n" 232 " [parameters] - Eg. defaultroute debug dump local notty usepeerdns\n" 233 "\n" 234 "adb sync notes: adb sync [ <directory> ]\n" 235 " <localdir> can be interpreted in several ways:\n" 236 "\n" 237 " - If <directory> is not specified, /system, /vendor (if present), /oem (if present) and /data partitions will be updated.\n" 238 "\n" 239 " - If it is \"system\", \"vendor\", \"oem\" or \"data\", only the corresponding partition\n" 240 " is updated.\n" 241 "\n" 242 "environment variables:\n" 243 " ADB_TRACE - Print debug information. A comma separated list of the following values\n" 244 " 1 or all, adb, sockets, packets, rwx, usb, sync, sysdeps, transport, jdwp\n" 245 " ANDROID_SERIAL - The serial number to connect to. -s takes priority over this if given.\n" 246 " ANDROID_LOG_TAGS - When used with the logcat option, only these debug tags are printed.\n" 247 ); 248} 249 250static int usage() { 251 help(); 252 return 1; 253} 254 255#if defined(_WIN32) 256 257// Implemented in sysdeps_win32.cpp. 258void stdin_raw_init(); 259void stdin_raw_restore(); 260 261#else 262static termios g_saved_terminal_state; 263 264static void stdin_raw_init() { 265 if (tcgetattr(STDIN_FILENO, &g_saved_terminal_state)) return; 266 267 termios tio; 268 if (tcgetattr(STDIN_FILENO, &tio)) return; 269 270 cfmakeraw(&tio); 271 272 // No timeout but request at least one character per read. 273 tio.c_cc[VTIME] = 0; 274 tio.c_cc[VMIN] = 1; 275 276 tcsetattr(STDIN_FILENO, TCSAFLUSH, &tio); 277} 278 279static void stdin_raw_restore() { 280 tcsetattr(STDIN_FILENO, TCSAFLUSH, &g_saved_terminal_state); 281} 282#endif 283 284// Reads from |fd| and prints received data. If |use_shell_protocol| is true 285// this expects that incoming data will use the shell protocol, in which case 286// stdout/stderr are routed independently and the remote exit code will be 287// returned. 288static int read_and_dump(int fd, bool use_shell_protocol=false) { 289 int exit_code = 0; 290 std::unique_ptr<ShellProtocol> protocol; 291 int length = 0; 292 FILE* outfile = stdout; 293 294 char raw_buffer[BUFSIZ]; 295 char* buffer_ptr = raw_buffer; 296 if (use_shell_protocol) { 297 protocol.reset(new ShellProtocol(fd)); 298 if (!protocol) { 299 LOG(ERROR) << "failed to allocate memory for ShellProtocol object"; 300 return 1; 301 } 302 buffer_ptr = protocol->data(); 303 } 304 305 while (fd >= 0) { 306 if (use_shell_protocol) { 307 if (!protocol->Read()) { 308 break; 309 } 310 switch (protocol->id()) { 311 case ShellProtocol::kIdStdout: 312 outfile = stdout; 313 break; 314 case ShellProtocol::kIdStderr: 315 outfile = stderr; 316 break; 317 case ShellProtocol::kIdExit: 318 exit_code = protocol->data()[0]; 319 continue; 320 default: 321 continue; 322 } 323 length = protocol->data_length(); 324 } else { 325 D("read_and_dump(): pre adb_read(fd=%d)", fd); 326 length = adb_read(fd, raw_buffer, sizeof(raw_buffer)); 327 D("read_and_dump(): post adb_read(fd=%d): length=%d", fd, length); 328 if (length <= 0) { 329 break; 330 } 331 } 332 333 fwrite(buffer_ptr, 1, length, outfile); 334 fflush(outfile); 335 } 336 337 return exit_code; 338} 339 340static void read_status_line(int fd, char* buf, size_t count) 341{ 342 count--; 343 while (count > 0) { 344 int len = adb_read(fd, buf, count); 345 if (len <= 0) { 346 break; 347 } 348 349 buf += len; 350 count -= len; 351 } 352 *buf = '\0'; 353} 354 355static void copy_to_file(int inFd, int outFd) { 356 const size_t BUFSIZE = 32 * 1024; 357 char* buf = (char*) malloc(BUFSIZE); 358 if (buf == nullptr) fatal("couldn't allocate buffer for copy_to_file"); 359 int len; 360 long total = 0; 361#ifdef _WIN32 362 int old_stdin_mode = -1; 363 int old_stdout_mode = -1; 364#endif 365 366 D("copy_to_file(%d -> %d)", inFd, outFd); 367 368 if (inFd == STDIN_FILENO) { 369 stdin_raw_init(); 370#ifdef _WIN32 371 old_stdin_mode = _setmode(STDIN_FILENO, _O_BINARY); 372 if (old_stdin_mode == -1) { 373 fatal_errno("could not set stdin to binary"); 374 } 375#endif 376 } 377 378#ifdef _WIN32 379 if (outFd == STDOUT_FILENO) { 380 old_stdout_mode = _setmode(STDOUT_FILENO, _O_BINARY); 381 if (old_stdout_mode == -1) { 382 fatal_errno("could not set stdout to binary"); 383 } 384 } 385#endif 386 387 while (true) { 388 if (inFd == STDIN_FILENO) { 389 len = unix_read(inFd, buf, BUFSIZE); 390 } else { 391 len = adb_read(inFd, buf, BUFSIZE); 392 } 393 if (len == 0) { 394 D("copy_to_file() : read 0 bytes; exiting"); 395 break; 396 } 397 if (len < 0) { 398 D("copy_to_file(): read failed: %s", strerror(errno)); 399 break; 400 } 401 if (outFd == STDOUT_FILENO) { 402 fwrite(buf, 1, len, stdout); 403 fflush(stdout); 404 } else { 405 adb_write(outFd, buf, len); 406 } 407 total += len; 408 } 409 410 if (inFd == STDIN_FILENO) { 411 stdin_raw_restore(); 412#ifdef _WIN32 413 if (_setmode(STDIN_FILENO, old_stdin_mode) == -1) { 414 fatal_errno("could not restore stdin mode"); 415 } 416#endif 417 } 418 419#ifdef _WIN32 420 if (outFd == STDOUT_FILENO) { 421 if (_setmode(STDOUT_FILENO, old_stdout_mode) == -1) { 422 fatal_errno("could not restore stdout mode"); 423 } 424 } 425#endif 426 427 D("copy_to_file() finished after %lu bytes", total); 428 free(buf); 429} 430 431static void send_window_size_change(int fd, std::unique_ptr<ShellProtocol>& shell) { 432 // Old devices can't handle window size changes. 433 if (shell == nullptr) return; 434 435#if defined(_WIN32) 436 struct winsize { 437 unsigned short ws_row; 438 unsigned short ws_col; 439 unsigned short ws_xpixel; 440 unsigned short ws_ypixel; 441 }; 442#endif 443 444 winsize ws; 445 446#if defined(_WIN32) 447 // If stdout is redirected to a non-console, we won't be able to get the 448 // console size, but that makes sense. 449 const intptr_t intptr_handle = _get_osfhandle(STDOUT_FILENO); 450 if (intptr_handle == -1) return; 451 452 const HANDLE handle = reinterpret_cast<const HANDLE>(intptr_handle); 453 454 CONSOLE_SCREEN_BUFFER_INFO info; 455 memset(&info, 0, sizeof(info)); 456 if (!GetConsoleScreenBufferInfo(handle, &info)) return; 457 458 memset(&ws, 0, sizeof(ws)); 459 // The number of visible rows, excluding offscreen scroll-back rows which are in info.dwSize.Y. 460 ws.ws_row = info.srWindow.Bottom - info.srWindow.Top + 1; 461 // If the user has disabled "Wrap text output on resize", they can make the screen buffer wider 462 // than the window, in which case we should use the width of the buffer. 463 ws.ws_col = info.dwSize.X; 464#else 465 if (ioctl(fd, TIOCGWINSZ, &ws) == -1) return; 466#endif 467 468 // Send the new window size as human-readable ASCII for debugging convenience. 469 size_t l = snprintf(shell->data(), shell->data_capacity(), "%dx%d,%dx%d", 470 ws.ws_row, ws.ws_col, ws.ws_xpixel, ws.ws_ypixel); 471 shell->Write(ShellProtocol::kIdWindowSizeChange, l + 1); 472} 473 474// Used to pass multiple values to the stdin read thread. 475struct StdinReadArgs { 476 int stdin_fd, write_fd; 477 bool raw_stdin; 478 std::unique_ptr<ShellProtocol> protocol; 479 char escape_char; 480}; 481 482// Loops to read from stdin and push the data to the given FD. 483// The argument should be a pointer to a StdinReadArgs object. This function 484// will take ownership of the object and delete it when finished. 485static void stdin_read_thread_loop(void* x) { 486 std::unique_ptr<StdinReadArgs> args(reinterpret_cast<StdinReadArgs*>(x)); 487 488#if !defined(_WIN32) 489 // Mask SIGTTIN in case we're in a backgrounded process. 490 sigset_t sigset; 491 sigemptyset(&sigset); 492 sigaddset(&sigset, SIGTTIN); 493 pthread_sigmask(SIG_BLOCK, &sigset, nullptr); 494#endif 495 496#if defined(_WIN32) 497 // _get_interesting_input_record_uncached() causes unix_read_interruptible() 498 // to return -1 with errno == EINTR if the window size changes. 499#else 500 // Unblock SIGWINCH for this thread, so our read(2) below will be 501 // interrupted if the window size changes. 502 sigset_t mask; 503 sigemptyset(&mask); 504 sigaddset(&mask, SIGWINCH); 505 pthread_sigmask(SIG_UNBLOCK, &mask, nullptr); 506#endif 507 508 // Set up the initial window size. 509 send_window_size_change(args->stdin_fd, args->protocol); 510 511 char raw_buffer[BUFSIZ]; 512 char* buffer_ptr = raw_buffer; 513 size_t buffer_size = sizeof(raw_buffer); 514 if (args->protocol != nullptr) { 515 buffer_ptr = args->protocol->data(); 516 buffer_size = args->protocol->data_capacity(); 517 } 518 519 // If we need to parse escape sequences, make life easy. 520 if (args->raw_stdin && args->escape_char != '\0') { 521 buffer_size = 1; 522 } 523 524 enum EscapeState { kMidFlow, kStartOfLine, kInEscape }; 525 EscapeState state = kStartOfLine; 526 527 while (true) { 528 // Use unix_read_interruptible() rather than adb_read() for stdin. 529 D("stdin_read_thread_loop(): pre unix_read_interruptible(fdi=%d,...)", args->stdin_fd); 530 int r = unix_read_interruptible(args->stdin_fd, buffer_ptr, 531 buffer_size); 532 if (r == -1 && errno == EINTR) { 533 send_window_size_change(args->stdin_fd, args->protocol); 534 continue; 535 } 536 D("stdin_read_thread_loop(): post unix_read_interruptible(fdi=%d,...)", args->stdin_fd); 537 if (r <= 0) { 538 // Only devices using the shell protocol know to close subprocess 539 // stdin. For older devices we want to just leave the connection 540 // open, otherwise an unpredictable amount of return data could 541 // be lost due to the FD closing before all data has been received. 542 if (args->protocol) { 543 args->protocol->Write(ShellProtocol::kIdCloseStdin, 0); 544 } 545 break; 546 } 547 // If we made stdin raw, check input for escape sequences. In 548 // this situation signals like Ctrl+C are sent remotely rather than 549 // interpreted locally so this provides an emergency out if the remote 550 // process starts ignoring the signal. SSH also does this, see the 551 // "escape characters" section on the ssh man page for more info. 552 if (args->raw_stdin && args->escape_char != '\0') { 553 char ch = buffer_ptr[0]; 554 if (ch == args->escape_char) { 555 if (state == kStartOfLine) { 556 state = kInEscape; 557 // Swallow the escape character. 558 continue; 559 } else { 560 state = kMidFlow; 561 } 562 } else { 563 if (state == kInEscape) { 564 if (ch == '.') { 565 fprintf(stderr,"\r\n[ disconnected ]\r\n"); 566 stdin_raw_restore(); 567 exit(0); 568 } else { 569 // We swallowed an escape character that wasn't part of 570 // a valid escape sequence; time to cough it up. 571 buffer_ptr[0] = args->escape_char; 572 buffer_ptr[1] = ch; 573 ++r; 574 } 575 } 576 state = (ch == '\n' || ch == '\r') ? kStartOfLine : kMidFlow; 577 } 578 } 579 if (args->protocol) { 580 if (!args->protocol->Write(ShellProtocol::kIdStdin, r)) { 581 break; 582 } 583 } else { 584 if (!WriteFdExactly(args->write_fd, buffer_ptr, r)) { 585 break; 586 } 587 } 588 } 589} 590 591// Returns a shell service string with the indicated arguments and command. 592static std::string ShellServiceString(bool use_shell_protocol, 593 const std::string& type_arg, 594 const std::string& command) { 595 std::vector<std::string> args; 596 if (use_shell_protocol) { 597 args.push_back(kShellServiceArgShellProtocol); 598 599 const char* terminal_type = getenv("TERM"); 600 if (terminal_type != nullptr) { 601 args.push_back(std::string("TERM=") + terminal_type); 602 } 603 } 604 if (!type_arg.empty()) { 605 args.push_back(type_arg); 606 } 607 608 // Shell service string can look like: shell[,arg1,arg2,...]:[command]. 609 return android::base::StringPrintf("shell%s%s:%s", 610 args.empty() ? "" : ",", 611 android::base::Join(args, ',').c_str(), 612 command.c_str()); 613} 614 615// Connects to a shell on the device and read/writes data. 616// 617// Note: currently this function doesn't properly clean up resources; the 618// FD connected to the adb server is never closed and the stdin read thread 619// may never exit. 620// 621// On success returns the remote exit code if |use_shell_protocol| is true, 622// 0 otherwise. On failure returns 1. 623static int RemoteShell(bool use_shell_protocol, const std::string& type_arg, 624 char escape_char, 625 const std::string& command) { 626 std::string service_string = ShellServiceString(use_shell_protocol, 627 type_arg, command); 628 629 // Make local stdin raw if the device allocates a PTY, which happens if: 630 // 1. We are explicitly asking for a PTY shell, or 631 // 2. We don't specify shell type and are starting an interactive session. 632 bool raw_stdin = (type_arg == kShellServiceArgPty || 633 (type_arg.empty() && command.empty())); 634 635 std::string error; 636 int fd = adb_connect(service_string, &error); 637 if (fd < 0) { 638 fprintf(stderr,"error: %s\n", error.c_str()); 639 return 1; 640 } 641 642 StdinReadArgs* args = new StdinReadArgs; 643 if (!args) { 644 LOG(ERROR) << "couldn't allocate StdinReadArgs object"; 645 return 1; 646 } 647 args->stdin_fd = STDIN_FILENO; 648 args->write_fd = fd; 649 args->raw_stdin = raw_stdin; 650 args->escape_char = escape_char; 651 if (use_shell_protocol) { 652 args->protocol.reset(new ShellProtocol(args->write_fd)); 653 } 654 655 if (raw_stdin) stdin_raw_init(); 656 657#if !defined(_WIN32) 658 // Ensure our process is notified if the local window size changes. 659 // We use sigaction(2) to ensure that the SA_RESTART flag is not set, 660 // because the whole reason we're sending signals is to unblock the read(2)! 661 // That also means we don't need to do anything in the signal handler: 662 // the side effect of delivering the signal is all we need. 663 struct sigaction sa; 664 memset(&sa, 0, sizeof(sa)); 665 sa.sa_handler = [](int) {}; 666 sa.sa_flags = 0; 667 sigaction(SIGWINCH, &sa, nullptr); 668 669 // Now block SIGWINCH in this thread (the main thread) and all threads spawned 670 // from it. The stdin read thread will unblock this signal to ensure that it's 671 // the thread that receives the signal. 672 sigset_t mask; 673 sigemptyset(&mask); 674 sigaddset(&mask, SIGWINCH); 675 pthread_sigmask(SIG_BLOCK, &mask, nullptr); 676#endif 677 678 // TODO: combine read_and_dump with stdin_read_thread to make life simpler? 679 int exit_code = 1; 680 if (!adb_thread_create(stdin_read_thread_loop, args)) { 681 PLOG(ERROR) << "error starting stdin read thread"; 682 delete args; 683 } else { 684 exit_code = read_and_dump(fd, use_shell_protocol); 685 } 686 687 // TODO: properly exit stdin_read_thread_loop and close |fd|. 688 689 // TODO: we should probably install signal handlers for this. 690 // TODO: can we use atexit? even on Windows? 691 if (raw_stdin) stdin_raw_restore(); 692 693 return exit_code; 694} 695 696static int adb_shell(int argc, const char** argv) { 697 FeatureSet features; 698 std::string error; 699 700 if (!adb_get_feature_set(&features, &error)) { 701 fprintf(stderr, "error: %s\n", error.c_str()); 702 return 1; 703 } 704 705 bool use_shell_protocol = CanUseFeature(features, kFeatureShell2); 706 if (!use_shell_protocol) { 707 D("shell protocol not supported, using raw data transfer"); 708 } else { 709 D("using shell protocol"); 710 } 711 712 // Parse shell-specific command-line options. 713 // argv[0] is always "shell". 714 --argc; 715 ++argv; 716 int t_arg_count = 0; 717 char escape_char = '~'; 718 while (argc) { 719 if (!strcmp(argv[0], "-e")) { 720 if (argc < 2 || !(strlen(argv[1]) == 1 || strcmp(argv[1], "none") == 0)) { 721 fprintf(stderr, "error: -e requires a single-character argument or 'none'\n"); 722 return 1; 723 } 724 escape_char = (strcmp(argv[1], "none") == 0) ? 0 : argv[1][0]; 725 argc -= 2; 726 argv += 2; 727 } else if (!strcmp(argv[0], "-T") || !strcmp(argv[0], "-t")) { 728 // Like ssh, -t arguments are cumulative so that multiple -t's 729 // are needed to force a PTY. 730 if (argv[0][1] == 't') { 731 ++t_arg_count; 732 } else { 733 t_arg_count = -1; 734 } 735 --argc; 736 ++argv; 737 } else if (!strcmp(argv[0], "-x")) { 738 use_shell_protocol = false; 739 --argc; 740 ++argv; 741 } else if (!strcmp(argv[0], "-n")) { 742 close_stdin(); 743 744 --argc; 745 ++argv; 746 } else { 747 break; 748 } 749 } 750 751 // Legacy shell protocol requires a remote PTY to close the subprocess properly which creates 752 // some weird interactions with -tT. 753 if (!use_shell_protocol && t_arg_count != 0) { 754 if (!CanUseFeature(features, kFeatureShell2)) { 755 fprintf(stderr, "error: target doesn't support PTY args -Tt\n"); 756 } else { 757 fprintf(stderr, "error: PTY args -Tt cannot be used with -x\n"); 758 } 759 return 1; 760 } 761 762 std::string shell_type_arg; 763 if (CanUseFeature(features, kFeatureShell2)) { 764 if (t_arg_count < 0) { 765 shell_type_arg = kShellServiceArgRaw; 766 } else if (t_arg_count == 0) { 767 // If stdin isn't a TTY, default to a raw shell; this lets 768 // things like `adb shell < my_script.sh` work as expected. 769 // Otherwise leave |shell_type_arg| blank which uses PTY for 770 // interactive shells and raw for non-interactive. 771 if (!unix_isatty(STDIN_FILENO)) { 772 shell_type_arg = kShellServiceArgRaw; 773 } 774 } else if (t_arg_count == 1) { 775 // A single -t arg isn't enough to override implicit -T. 776 if (!unix_isatty(STDIN_FILENO)) { 777 fprintf(stderr, 778 "Remote PTY will not be allocated because stdin is not a terminal.\n" 779 "Use multiple -t options to force remote PTY allocation.\n"); 780 shell_type_arg = kShellServiceArgRaw; 781 } else { 782 shell_type_arg = kShellServiceArgPty; 783 } 784 } else { 785 shell_type_arg = kShellServiceArgPty; 786 } 787 } 788 789 std::string command; 790 if (argc) { 791 // We don't escape here, just like ssh(1). http://b/20564385. 792 command = android::base::Join(std::vector<const char*>(argv, argv + argc), ' '); 793 } 794 795 return RemoteShell(use_shell_protocol, shell_type_arg, escape_char, command); 796} 797 798static int adb_download_buffer(const char *service, const char *fn, const void* data, unsigned sz, 799 bool show_progress) 800{ 801 std::string error; 802 int fd = adb_connect(android::base::StringPrintf("%s:%d", service, sz), &error); 803 if (fd < 0) { 804 fprintf(stderr,"error: %s\n", error.c_str()); 805 return -1; 806 } 807 808 int opt = CHUNK_SIZE; 809 opt = adb_setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const void *) &opt, sizeof(opt)); 810 811 unsigned total = sz; 812 const uint8_t* ptr = reinterpret_cast<const uint8_t*>(data); 813 814 if (show_progress) { 815 const char* x = strrchr(service, ':'); 816 if (x) service = x + 1; 817 } 818 819 while (sz > 0) { 820 unsigned xfer = (sz > CHUNK_SIZE) ? CHUNK_SIZE : sz; 821 if (!WriteFdExactly(fd, ptr, xfer)) { 822 std::string error; 823 adb_status(fd, &error); 824 fprintf(stderr,"* failed to write data '%s' *\n", error.c_str()); 825 adb_close(fd); 826 return -1; 827 } 828 sz -= xfer; 829 ptr += xfer; 830 if (show_progress) { 831 printf("sending: '%s' %4d%% \r", fn, (int)(100LL - ((100LL * sz) / (total)))); 832 fflush(stdout); 833 } 834 } 835 if (show_progress) { 836 printf("\n"); 837 } 838 839 if (!adb_status(fd, &error)) { 840 fprintf(stderr,"* error response '%s' *\n", error.c_str()); 841 adb_close(fd); 842 return -1; 843 } 844 845 adb_close(fd); 846 return 0; 847} 848 849#define SIDELOAD_HOST_BLOCK_SIZE (CHUNK_SIZE) 850 851/* 852 * The sideload-host protocol serves the data in a file (given on the 853 * command line) to the client, using a simple protocol: 854 * 855 * - The connect message includes the total number of bytes in the 856 * file and a block size chosen by us. 857 * 858 * - The other side sends the desired block number as eight decimal 859 * digits (eg "00000023" for block 23). Blocks are numbered from 860 * zero. 861 * 862 * - We send back the data of the requested block. The last block is 863 * likely to be partial; when the last block is requested we only 864 * send the part of the block that exists, it's not padded up to the 865 * block size. 866 * 867 * - When the other side sends "DONEDONE" instead of a block number, 868 * we hang up. 869 */ 870static int adb_sideload_host(const char* fn) { 871 unsigned sz; 872 size_t xfer = 0; 873 int status; 874 int last_percent = -1; 875 int opt = SIDELOAD_HOST_BLOCK_SIZE; 876 877 printf("loading: '%s'", fn); 878 fflush(stdout); 879 uint8_t* data = reinterpret_cast<uint8_t*>(load_file(fn, &sz)); 880 if (data == 0) { 881 printf("\n"); 882 fprintf(stderr, "* cannot read '%s' *\n", fn); 883 return -1; 884 } 885 886 std::string service = 887 android::base::StringPrintf("sideload-host:%d:%d", sz, SIDELOAD_HOST_BLOCK_SIZE); 888 std::string error; 889 int fd = adb_connect(service, &error); 890 if (fd < 0) { 891 // Try falling back to the older sideload method. Maybe this 892 // is an older device that doesn't support sideload-host. 893 printf("\n"); 894 status = adb_download_buffer("sideload", fn, data, sz, true); 895 goto done; 896 } 897 898 opt = adb_setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const void *) &opt, sizeof(opt)); 899 900 while (true) { 901 char buf[9]; 902 if (!ReadFdExactly(fd, buf, 8)) { 903 fprintf(stderr, "* failed to read command: %s\n", strerror(errno)); 904 status = -1; 905 goto done; 906 } 907 buf[8] = '\0'; 908 909 if (strcmp("DONEDONE", buf) == 0) { 910 status = 0; 911 break; 912 } 913 914 int block = strtol(buf, NULL, 10); 915 916 size_t offset = block * SIDELOAD_HOST_BLOCK_SIZE; 917 if (offset >= sz) { 918 fprintf(stderr, "* attempt to read block %d past end\n", block); 919 status = -1; 920 goto done; 921 } 922 uint8_t* start = data + offset; 923 size_t offset_end = offset + SIDELOAD_HOST_BLOCK_SIZE; 924 size_t to_write = SIDELOAD_HOST_BLOCK_SIZE; 925 if (offset_end > sz) { 926 to_write = sz - offset; 927 } 928 929 if(!WriteFdExactly(fd, start, to_write)) { 930 adb_status(fd, &error); 931 fprintf(stderr,"* failed to write data '%s' *\n", error.c_str()); 932 status = -1; 933 goto done; 934 } 935 xfer += to_write; 936 937 // For normal OTA packages, we expect to transfer every byte 938 // twice, plus a bit of overhead (one read during 939 // verification, one read of each byte for installation, plus 940 // extra access to things like the zip central directory). 941 // This estimate of the completion becomes 100% when we've 942 // transferred ~2.13 (=100/47) times the package size. 943 int percent = (int)(xfer * 47LL / (sz ? sz : 1)); 944 if (percent != last_percent) { 945 printf("\rserving: '%s' (~%d%%) ", fn, percent); 946 fflush(stdout); 947 last_percent = percent; 948 } 949 } 950 951 printf("\rTotal xfer: %.2fx%*s\n", (double)xfer / (sz ? sz : 1), (int)strlen(fn)+10, ""); 952 953 done: 954 if (fd >= 0) adb_close(fd); 955 free(data); 956 return status; 957} 958 959/** 960 * Run ppp in "notty" mode against a resource listed as the first parameter 961 * eg: 962 * 963 * ppp dev:/dev/omap_csmi_tty0 <ppp options> 964 * 965 */ 966static int ppp(int argc, const char** argv) { 967#if defined(_WIN32) 968 fprintf(stderr, "error: adb %s not implemented on Win32\n", argv[0]); 969 return -1; 970#else 971 if (argc < 2) { 972 fprintf(stderr, "usage: adb %s <adb service name> [ppp opts]\n", 973 argv[0]); 974 975 return 1; 976 } 977 978 const char* adb_service_name = argv[1]; 979 std::string error; 980 int fd = adb_connect(adb_service_name, &error); 981 if (fd < 0) { 982 fprintf(stderr,"Error: Could not open adb service: %s. Error: %s\n", 983 adb_service_name, error.c_str()); 984 return 1; 985 } 986 987 pid_t pid = fork(); 988 989 if (pid < 0) { 990 perror("from fork()"); 991 return 1; 992 } else if (pid == 0) { 993 int err; 994 int i; 995 const char **ppp_args; 996 997 // copy args 998 ppp_args = (const char **) alloca(sizeof(char *) * argc + 1); 999 ppp_args[0] = "pppd"; 1000 for (i = 2 ; i < argc ; i++) { 1001 //argv[2] and beyond become ppp_args[1] and beyond 1002 ppp_args[i - 1] = argv[i]; 1003 } 1004 ppp_args[i-1] = NULL; 1005 1006 // child side 1007 1008 dup2(fd, STDIN_FILENO); 1009 dup2(fd, STDOUT_FILENO); 1010 adb_close(STDERR_FILENO); 1011 adb_close(fd); 1012 1013 err = execvp("pppd", (char * const *)ppp_args); 1014 1015 if (err < 0) { 1016 perror("execing pppd"); 1017 } 1018 exit(-1); 1019 } else { 1020 // parent side 1021 1022 adb_close(fd); 1023 return 0; 1024 } 1025#endif /* !defined(_WIN32) */ 1026} 1027 1028static bool check_wait_for_device_syntax(const char* service) { 1029 // TODO: when we have libc++ for Windows, use a regular expression instead. 1030 // wait-for-((any|local|usb)-)?(bootloader|device|recovery|sideload) 1031 1032 char type[20]; 1033 char state[20]; 1034 int length = 0; 1035 if (sscanf(service, "wait-for-%20[a-z]-%20[a-z]%n", type, state, &length) < 2 || 1036 length != static_cast<int>(strlen(service))) { 1037 fprintf(stderr, "adb: couldn't parse 'wait-for' command: %s\n", service); 1038 return false; 1039 } 1040 1041 if (strcmp(type, "any") != 0 && strcmp(type, "local") != 0 && strcmp(type, "usb") != 0) { 1042 fprintf(stderr, "adb: unknown type %s; expected 'any', 'local', or 'usb'\n", type); 1043 return false; 1044 } 1045 if (strcmp(state, "bootloader") != 0 && strcmp(state, "device") != 0 && 1046 strcmp(state, "recovery") != 0 && strcmp(state, "sideload") != 0) { 1047 fprintf(stderr, "adb: unknown state %s; " 1048 "expected 'bootloader', 'device', 'recovery', or 'sideload'\n", state); 1049 return false; 1050 } 1051 return true; 1052} 1053 1054static bool wait_for_device(const char* service, TransportType t, const char* serial) { 1055 // Was the caller vague about what they'd like us to wait for? 1056 // If so, check they weren't more specific in their choice of transport type. 1057 if (strcmp(service, "wait-for-device") == 0) { 1058 if (t == kTransportUsb) { 1059 service = "wait-for-usb-device"; 1060 } else if (t == kTransportLocal) { 1061 service = "wait-for-local-device"; 1062 } else { 1063 service = "wait-for-any-device"; 1064 } 1065 } 1066 1067 if (!check_wait_for_device_syntax(service)) { 1068 return false; 1069 } 1070 1071 std::string cmd = format_host_command(service, t, serial); 1072 return adb_command(cmd); 1073} 1074 1075static bool adb_root(const char* command) { 1076 std::string error; 1077 ScopedFd fd; 1078 1079 fd.Reset(adb_connect(android::base::StringPrintf("%s:", command), &error)); 1080 if (!fd.valid()) { 1081 fprintf(stderr, "adb: unable to connect for %s: %s\n", command, error.c_str()); 1082 return false; 1083 } 1084 1085 // Figure out whether we actually did anything. 1086 char buf[256]; 1087 char* cur = buf; 1088 ssize_t bytes_left = sizeof(buf); 1089 while (bytes_left > 0) { 1090 ssize_t bytes_read = adb_read(fd.fd(), cur, bytes_left); 1091 if (bytes_read == 0) { 1092 break; 1093 } else if (bytes_read < 0) { 1094 fprintf(stderr, "adb: error while reading for %s: %s\n", command, strerror(errno)); 1095 return false; 1096 } 1097 cur += bytes_read; 1098 bytes_left -= bytes_read; 1099 } 1100 1101 if (bytes_left == 0) { 1102 fprintf(stderr, "adb: unexpected output length for %s\n", command); 1103 return false; 1104 } 1105 1106 fflush(stdout); 1107 WriteFdExactly(STDOUT_FILENO, buf, sizeof(buf) - bytes_left); 1108 if (cur != buf && strstr(buf, "restarting") == nullptr) { 1109 return true; 1110 } 1111 1112 // Give adbd 500ms to kill itself, then wait-for-device for it to come back up. 1113 adb_sleep_ms(500); 1114 TransportType type; 1115 const char* serial; 1116 adb_get_transport(&type, &serial); 1117 return wait_for_device("wait-for-device", type, serial); 1118} 1119 1120// Connects to the device "shell" service with |command| and prints the 1121// resulting output. 1122static int send_shell_command(TransportType transport_type, const char* serial, 1123 const std::string& command, 1124 bool disable_shell_protocol) { 1125 int fd; 1126 bool use_shell_protocol = false; 1127 1128 while (true) { 1129 bool attempt_connection = true; 1130 1131 // Use shell protocol if it's supported and the caller doesn't explicitly disable it. 1132 if (!disable_shell_protocol) { 1133 FeatureSet features; 1134 std::string error; 1135 if (adb_get_feature_set(&features, &error)) { 1136 use_shell_protocol = CanUseFeature(features, kFeatureShell2); 1137 } else { 1138 // Device was unreachable. 1139 attempt_connection = false; 1140 } 1141 } 1142 1143 if (attempt_connection) { 1144 std::string error; 1145 std::string service_string = ShellServiceString(use_shell_protocol, "", command); 1146 1147 fd = adb_connect(service_string, &error); 1148 if (fd >= 0) { 1149 break; 1150 } 1151 } 1152 1153 fprintf(stderr,"- waiting for device -\n"); 1154 if (!wait_for_device("wait-for-device", transport_type, serial)) { 1155 return 1; 1156 } 1157 } 1158 1159 int exit_code = read_and_dump(fd, use_shell_protocol); 1160 1161 if (adb_close(fd) < 0) { 1162 PLOG(ERROR) << "failure closing FD " << fd; 1163 } 1164 1165 return exit_code; 1166} 1167 1168static int logcat(TransportType transport, const char* serial, int argc, const char** argv) { 1169 char* log_tags = getenv("ANDROID_LOG_TAGS"); 1170 std::string quoted = escape_arg(log_tags == nullptr ? "" : log_tags); 1171 1172 std::string cmd = "export ANDROID_LOG_TAGS=\"" + quoted + "\"; exec logcat"; 1173 1174 if (!strcmp(argv[0], "longcat")) { 1175 cmd += " -v long"; 1176 } 1177 1178 --argc; 1179 ++argv; 1180 while (argc-- > 0) { 1181 cmd += " " + escape_arg(*argv++); 1182 } 1183 1184 // No need for shell protocol with logcat, always disable for simplicity. 1185 return send_shell_command(transport, serial, cmd, true); 1186} 1187 1188static int backup(int argc, const char** argv) { 1189 const char* filename = "backup.ab"; 1190 1191 /* find, extract, and use any -f argument */ 1192 for (int i = 1; i < argc; i++) { 1193 if (!strcmp("-f", argv[i])) { 1194 if (i == argc-1) { 1195 fprintf(stderr, "adb: backup -f passed with no filename.\n"); 1196 return EXIT_FAILURE; 1197 } 1198 filename = argv[i+1]; 1199 for (int j = i+2; j <= argc; ) { 1200 argv[i++] = argv[j++]; 1201 } 1202 argc -= 2; 1203 argv[argc] = NULL; 1204 } 1205 } 1206 1207 // Bare "adb backup" or "adb backup -f filename" are not valid invocations --- 1208 // a list of packages is required. 1209 if (argc < 2) { 1210 fprintf(stderr, "adb: backup either needs a list of packages or -all/-shared.\n"); 1211 return EXIT_FAILURE; 1212 } 1213 1214 adb_unlink(filename); 1215 int outFd = adb_creat(filename, 0640); 1216 if (outFd < 0) { 1217 fprintf(stderr, "adb: backup unable to create file '%s': %s\n", filename, strerror(errno)); 1218 return EXIT_FAILURE; 1219 } 1220 1221 std::string cmd = "backup:"; 1222 --argc; 1223 ++argv; 1224 while (argc-- > 0) { 1225 cmd += " " + escape_arg(*argv++); 1226 } 1227 1228 D("backup. filename=%s cmd=%s", filename, cmd.c_str()); 1229 std::string error; 1230 int fd = adb_connect(cmd, &error); 1231 if (fd < 0) { 1232 fprintf(stderr, "adb: unable to connect for backup: %s\n", error.c_str()); 1233 adb_close(outFd); 1234 return EXIT_FAILURE; 1235 } 1236 1237 printf("Now unlock your device and confirm the backup operation...\n"); 1238 fflush(stdout); 1239 1240 copy_to_file(fd, outFd); 1241 1242 adb_close(fd); 1243 adb_close(outFd); 1244 return EXIT_SUCCESS; 1245} 1246 1247static int restore(int argc, const char** argv) { 1248 if (argc != 2) return usage(); 1249 1250 const char* filename = argv[1]; 1251 int tarFd = adb_open(filename, O_RDONLY); 1252 if (tarFd < 0) { 1253 fprintf(stderr, "adb: unable to open file %s: %s\n", filename, strerror(errno)); 1254 return -1; 1255 } 1256 1257 std::string error; 1258 int fd = adb_connect("restore:", &error); 1259 if (fd < 0) { 1260 fprintf(stderr, "adb: unable to connect for restore: %s\n", error.c_str()); 1261 adb_close(tarFd); 1262 return -1; 1263 } 1264 1265 printf("Now unlock your device and confirm the restore operation.\n"); 1266 copy_to_file(tarFd, fd); 1267 1268 // Wait until the other side finishes, or it'll get sent SIGHUP. 1269 copy_to_file(fd, STDOUT_FILENO); 1270 1271 adb_close(fd); 1272 adb_close(tarFd); 1273 return 0; 1274} 1275 1276/* <hint> may be: 1277 * - A simple product name 1278 * e.g., "sooner" 1279 * - A relative path from the CWD to the ANDROID_PRODUCT_OUT dir 1280 * e.g., "out/target/product/sooner" 1281 * - An absolute path to the PRODUCT_OUT dir 1282 * e.g., "/src/device/out/target/product/sooner" 1283 * 1284 * Given <hint>, try to construct an absolute path to the 1285 * ANDROID_PRODUCT_OUT dir. 1286 */ 1287static std::string find_product_out_path(const std::string& hint) { 1288 if (hint.empty()) { 1289 return ""; 1290 } 1291 1292 // If it's already absolute, don't bother doing any work. 1293 if (adb_is_absolute_host_path(hint.c_str())) { 1294 return hint; 1295 } 1296 1297 // If there are any slashes in it, assume it's a relative path; 1298 // make it absolute. 1299 if (hint.find_first_of(OS_PATH_SEPARATORS) != std::string::npos) { 1300 std::string cwd; 1301 if (!getcwd(&cwd)) { 1302 fprintf(stderr, "adb: getcwd failed: %s\n", strerror(errno)); 1303 return ""; 1304 } 1305 return android::base::StringPrintf("%s%c%s", cwd.c_str(), OS_PATH_SEPARATOR, hint.c_str()); 1306 } 1307 1308 // It's a string without any slashes. Try to do something with it. 1309 // 1310 // Try to find the root of the build tree, and build a PRODUCT_OUT 1311 // path from there. 1312 char* top = getenv("ANDROID_BUILD_TOP"); 1313 if (top == nullptr) { 1314 fprintf(stderr, "adb: ANDROID_BUILD_TOP not set!\n"); 1315 return ""; 1316 } 1317 1318 std::string path = top; 1319 path += OS_PATH_SEPARATOR_STR; 1320 path += "out"; 1321 path += OS_PATH_SEPARATOR_STR; 1322 path += "target"; 1323 path += OS_PATH_SEPARATOR_STR; 1324 path += "product"; 1325 path += OS_PATH_SEPARATOR_STR; 1326 path += hint; 1327 if (!directory_exists(path)) { 1328 fprintf(stderr, "adb: Couldn't find a product dir based on -p %s; " 1329 "\"%s\" doesn't exist\n", hint.c_str(), path.c_str()); 1330 return ""; 1331 } 1332 return path; 1333} 1334 1335static void parse_push_pull_args(const char** arg, int narg, 1336 std::vector<const char*>* srcs, 1337 const char** dst, bool* copy_attrs) { 1338 *copy_attrs = false; 1339 1340 srcs->clear(); 1341 bool ignore_flags = false; 1342 while (narg > 0) { 1343 if (ignore_flags || *arg[0] != '-') { 1344 srcs->push_back(*arg); 1345 } else { 1346 if (!strcmp(*arg, "-p")) { 1347 // Silently ignore for backwards compatibility. 1348 } else if (!strcmp(*arg, "-a")) { 1349 *copy_attrs = true; 1350 } else if (!strcmp(*arg, "--")) { 1351 ignore_flags = true; 1352 } else { 1353 fprintf(stderr, "adb: unrecognized option '%s'\n", *arg); 1354 exit(1); 1355 } 1356 } 1357 ++arg; 1358 --narg; 1359 } 1360 1361 if (srcs->size() > 1) { 1362 *dst = srcs->back(); 1363 srcs->pop_back(); 1364 } 1365} 1366 1367static int adb_connect_command(const std::string& command) { 1368 std::string error; 1369 int fd = adb_connect(command, &error); 1370 if (fd < 0) { 1371 fprintf(stderr, "error: %s\n", error.c_str()); 1372 return 1; 1373 } 1374 read_and_dump(fd); 1375 adb_close(fd); 1376 return 0; 1377} 1378 1379static int adb_query_command(const std::string& command) { 1380 std::string result; 1381 std::string error; 1382 if (!adb_query(command, &result, &error)) { 1383 fprintf(stderr, "error: %s\n", error.c_str()); 1384 return 1; 1385 } 1386 printf("%s\n", result.c_str()); 1387 return 0; 1388} 1389 1390// Disallow stdin, stdout, and stderr. 1391static bool _is_valid_ack_reply_fd(const int ack_reply_fd) { 1392#ifdef _WIN32 1393 const HANDLE ack_reply_handle = cast_int_to_handle(ack_reply_fd); 1394 return (GetStdHandle(STD_INPUT_HANDLE) != ack_reply_handle) && 1395 (GetStdHandle(STD_OUTPUT_HANDLE) != ack_reply_handle) && 1396 (GetStdHandle(STD_ERROR_HANDLE) != ack_reply_handle); 1397#else 1398 return ack_reply_fd > 2; 1399#endif 1400} 1401 1402int adb_commandline(int argc, const char **argv) { 1403 int no_daemon = 0; 1404 int is_daemon = 0; 1405 int is_server = 0; 1406 int r; 1407 TransportType transport_type = kTransportAny; 1408 int ack_reply_fd = -1; 1409 1410#if !defined(_WIN32) 1411 // We'd rather have EPIPE than SIGPIPE. 1412 signal(SIGPIPE, SIG_IGN); 1413#endif 1414 1415 // If defined, this should be an absolute path to 1416 // the directory containing all of the various system images 1417 // for a particular product. If not defined, and the adb 1418 // command requires this information, then the user must 1419 // specify the path using "-p". 1420 char* ANDROID_PRODUCT_OUT = getenv("ANDROID_PRODUCT_OUT"); 1421 if (ANDROID_PRODUCT_OUT != nullptr) { 1422 gProductOutPath = ANDROID_PRODUCT_OUT; 1423 } 1424 // TODO: also try TARGET_PRODUCT/TARGET_DEVICE as a hint 1425 1426 /* Validate and assign the server port */ 1427 const char* server_port_str = getenv("ANDROID_ADB_SERVER_PORT"); 1428 int server_port = DEFAULT_ADB_PORT; 1429 if (server_port_str && strlen(server_port_str) > 0) { 1430 server_port = strtol(server_port_str, nullptr, 0); 1431 if (server_port <= 0 || server_port > 65535) { 1432 fprintf(stderr, 1433 "adb: Env var ANDROID_ADB_SERVER_PORT must be a positive number less than 65536. Got \"%s\"\n", 1434 server_port_str); 1435 return usage(); 1436 } 1437 } 1438 1439 // We need to check for -d and -e before we look at $ANDROID_SERIAL. 1440 const char* serial = nullptr; 1441 1442 while (argc > 0) { 1443 if (!strcmp(argv[0],"server")) { 1444 is_server = 1; 1445 } else if (!strcmp(argv[0],"nodaemon")) { 1446 no_daemon = 1; 1447 } else if (!strcmp(argv[0], "fork-server")) { 1448 /* this is a special flag used only when the ADB client launches the ADB Server */ 1449 is_daemon = 1; 1450 } else if (!strcmp(argv[0], "--reply-fd")) { 1451 if (argc < 2) return usage(); 1452 const char* reply_fd_str = argv[1]; 1453 argc--; 1454 argv++; 1455 ack_reply_fd = strtol(reply_fd_str, nullptr, 10); 1456 if (!_is_valid_ack_reply_fd(ack_reply_fd)) { 1457 fprintf(stderr, "adb: invalid reply fd \"%s\"\n", reply_fd_str); 1458 return usage(); 1459 } 1460 } else if (!strncmp(argv[0], "-p", 2)) { 1461 const char* product = nullptr; 1462 if (argv[0][2] == '\0') { 1463 if (argc < 2) return usage(); 1464 product = argv[1]; 1465 argc--; 1466 argv++; 1467 } else { 1468 product = argv[0] + 2; 1469 } 1470 gProductOutPath = find_product_out_path(product); 1471 if (gProductOutPath.empty()) { 1472 fprintf(stderr, "adb: could not resolve \"-p %s\"\n", product); 1473 return usage(); 1474 } 1475 } else if (argv[0][0]=='-' && argv[0][1]=='s') { 1476 if (isdigit(argv[0][2])) { 1477 serial = argv[0] + 2; 1478 } else { 1479 if (argc < 2 || argv[0][2] != '\0') return usage(); 1480 serial = argv[1]; 1481 argc--; 1482 argv++; 1483 } 1484 } else if (!strcmp(argv[0],"-d")) { 1485 transport_type = kTransportUsb; 1486 } else if (!strcmp(argv[0],"-e")) { 1487 transport_type = kTransportLocal; 1488 } else if (!strcmp(argv[0],"-a")) { 1489 gListenAll = 1; 1490 } else if (!strncmp(argv[0], "-H", 2)) { 1491 const char *hostname = NULL; 1492 if (argv[0][2] == '\0') { 1493 if (argc < 2) return usage(); 1494 hostname = argv[1]; 1495 argc--; 1496 argv++; 1497 } else { 1498 hostname = argv[0] + 2; 1499 } 1500 adb_set_tcp_name(hostname); 1501 1502 } else if (!strncmp(argv[0], "-P", 2)) { 1503 if (argv[0][2] == '\0') { 1504 if (argc < 2) return usage(); 1505 server_port_str = argv[1]; 1506 argc--; 1507 argv++; 1508 } else { 1509 server_port_str = argv[0] + 2; 1510 } 1511 if (strlen(server_port_str) > 0) { 1512 server_port = (int) strtol(server_port_str, NULL, 0); 1513 if (server_port <= 0 || server_port > 65535) { 1514 fprintf(stderr, 1515 "adb: port number must be a positive number less than 65536. Got \"%s\"\n", 1516 server_port_str); 1517 return usage(); 1518 } 1519 } else { 1520 fprintf(stderr, 1521 "adb: port number must be a positive number less than 65536. Got empty string.\n"); 1522 return usage(); 1523 } 1524 } else { 1525 /* out of recognized modifiers and flags */ 1526 break; 1527 } 1528 argc--; 1529 argv++; 1530 } 1531 1532 // If none of -d, -e, or -s were specified, try $ANDROID_SERIAL. 1533 if (transport_type == kTransportAny && serial == nullptr) { 1534 serial = getenv("ANDROID_SERIAL"); 1535 } 1536 1537 adb_set_transport(transport_type, serial); 1538 adb_set_tcp_specifics(server_port); 1539 1540 if (is_server) { 1541 if (no_daemon || is_daemon) { 1542 if (is_daemon && (ack_reply_fd == -1)) { 1543 fprintf(stderr, "reply fd for adb server to client communication not specified.\n"); 1544 return usage(); 1545 } 1546 r = adb_server_main(is_daemon, server_port, ack_reply_fd); 1547 } else { 1548 r = launch_server(server_port); 1549 } 1550 if (r) { 1551 fprintf(stderr,"* could not start server *\n"); 1552 } 1553 return r; 1554 } 1555 1556 if (argc == 0) { 1557 return usage(); 1558 } 1559 1560 /* handle wait-for-* prefix */ 1561 if (!strncmp(argv[0], "wait-for-", strlen("wait-for-"))) { 1562 const char* service = argv[0]; 1563 1564 if (!wait_for_device(service, transport_type, serial)) { 1565 return 1; 1566 } 1567 1568 // Allow a command to be run after wait-for-device, 1569 // e.g. 'adb wait-for-device shell'. 1570 if (argc == 1) { 1571 return 0; 1572 } 1573 1574 /* Fall through */ 1575 argc--; 1576 argv++; 1577 } 1578 1579 /* adb_connect() commands */ 1580 if (!strcmp(argv[0], "devices")) { 1581 const char *listopt; 1582 if (argc < 2) { 1583 listopt = ""; 1584 } else if (argc == 2 && !strcmp(argv[1], "-l")) { 1585 listopt = argv[1]; 1586 } else { 1587 fprintf(stderr, "Usage: adb devices [-l]\n"); 1588 return 1; 1589 } 1590 1591 std::string query = android::base::StringPrintf("host:%s%s", argv[0], listopt); 1592 printf("List of devices attached\n"); 1593 return adb_query_command(query); 1594 } 1595 else if (!strcmp(argv[0], "connect")) { 1596 if (argc != 2) { 1597 fprintf(stderr, "Usage: adb connect <host>[:<port>]\n"); 1598 return 1; 1599 } 1600 1601 std::string query = android::base::StringPrintf("host:connect:%s", argv[1]); 1602 return adb_query_command(query); 1603 } 1604 else if (!strcmp(argv[0], "disconnect")) { 1605 if (argc > 2) { 1606 fprintf(stderr, "Usage: adb disconnect [<host>[:<port>]]\n"); 1607 return 1; 1608 } 1609 1610 std::string query = android::base::StringPrintf("host:disconnect:%s", 1611 (argc == 2) ? argv[1] : ""); 1612 return adb_query_command(query); 1613 } 1614 else if (!strcmp(argv[0], "emu")) { 1615 return adb_send_emulator_command(argc, argv, serial); 1616 } 1617 else if (!strcmp(argv[0], "shell")) { 1618 return adb_shell(argc, argv); 1619 } 1620 else if (!strcmp(argv[0], "exec-in") || !strcmp(argv[0], "exec-out")) { 1621 int exec_in = !strcmp(argv[0], "exec-in"); 1622 1623 std::string cmd = "exec:"; 1624 cmd += argv[1]; 1625 argc -= 2; 1626 argv += 2; 1627 while (argc-- > 0) { 1628 cmd += " " + escape_arg(*argv++); 1629 } 1630 1631 std::string error; 1632 int fd = adb_connect(cmd, &error); 1633 if (fd < 0) { 1634 fprintf(stderr, "error: %s\n", error.c_str()); 1635 return -1; 1636 } 1637 1638 if (exec_in) { 1639 copy_to_file(STDIN_FILENO, fd); 1640 } else { 1641 copy_to_file(fd, STDOUT_FILENO); 1642 } 1643 1644 adb_close(fd); 1645 return 0; 1646 } 1647 else if (!strcmp(argv[0], "kill-server")) { 1648 std::string error; 1649 int fd = _adb_connect("host:kill", &error); 1650 if (fd == -2) { 1651 // Failed to make network connection to server. Don't output the 1652 // network error since that is expected. 1653 fprintf(stderr,"* server not running *\n"); 1654 // Successful exit code because the server is already "killed". 1655 return 0; 1656 } else if (fd == -1) { 1657 // Some other error. 1658 fprintf(stderr, "error: %s\n", error.c_str()); 1659 return 1; 1660 } else { 1661 // Successfully connected, kill command sent, okay status came back. 1662 // Server should exit() in a moment, if not already. 1663 ReadOrderlyShutdown(fd); 1664 adb_close(fd); 1665 return 0; 1666 } 1667 } 1668 else if (!strcmp(argv[0], "sideload")) { 1669 if (argc != 2) return usage(); 1670 if (adb_sideload_host(argv[1])) { 1671 return 1; 1672 } else { 1673 return 0; 1674 } 1675 } 1676 else if (!strcmp(argv[0], "tcpip") && argc > 1) { 1677 return adb_connect_command(android::base::StringPrintf("tcpip:%s", argv[1])); 1678 } 1679 else if (!strcmp(argv[0], "remount") || 1680 !strcmp(argv[0], "reboot") || 1681 !strcmp(argv[0], "reboot-bootloader") || 1682 !strcmp(argv[0], "usb") || 1683 !strcmp(argv[0], "disable-verity") || 1684 !strcmp(argv[0], "enable-verity")) { 1685 std::string command; 1686 if (!strcmp(argv[0], "reboot-bootloader")) { 1687 command = "reboot:bootloader"; 1688 } else if (argc > 1) { 1689 command = android::base::StringPrintf("%s:%s", argv[0], argv[1]); 1690 } else { 1691 command = android::base::StringPrintf("%s:", argv[0]); 1692 } 1693 return adb_connect_command(command); 1694 } else if (!strcmp(argv[0], "root") || !strcmp(argv[0], "unroot")) { 1695 return adb_root(argv[0]) ? 0 : 1; 1696 } else if (!strcmp(argv[0], "bugreport")) { 1697 if (argc != 1) return usage(); 1698 // No need for shell protocol with bugreport, always disable for 1699 // simplicity. 1700 return send_shell_command(transport_type, serial, "bugreport", true); 1701 } 1702 else if (!strcmp(argv[0], "forward") || !strcmp(argv[0], "reverse")) { 1703 bool reverse = !strcmp(argv[0], "reverse"); 1704 ++argv; 1705 --argc; 1706 if (argc < 1) return usage(); 1707 1708 // Determine the <host-prefix> for this command. 1709 std::string host_prefix; 1710 if (reverse) { 1711 host_prefix = "reverse"; 1712 } else { 1713 if (serial) { 1714 host_prefix = android::base::StringPrintf("host-serial:%s", serial); 1715 } else if (transport_type == kTransportUsb) { 1716 host_prefix = "host-usb"; 1717 } else if (transport_type == kTransportLocal) { 1718 host_prefix = "host-local"; 1719 } else { 1720 host_prefix = "host"; 1721 } 1722 } 1723 1724 std::string cmd; 1725 if (strcmp(argv[0], "--list") == 0) { 1726 if (argc != 1) return usage(); 1727 return adb_query_command(host_prefix + ":list-forward"); 1728 } else if (strcmp(argv[0], "--remove-all") == 0) { 1729 if (argc != 1) return usage(); 1730 cmd = host_prefix + ":killforward-all"; 1731 } else if (strcmp(argv[0], "--remove") == 0) { 1732 // forward --remove <local> 1733 if (argc != 2) return usage(); 1734 cmd = host_prefix + ":killforward:" + argv[1]; 1735 } else if (strcmp(argv[0], "--no-rebind") == 0) { 1736 // forward --no-rebind <local> <remote> 1737 if (argc != 3) return usage(); 1738 cmd = host_prefix + ":forward:norebind:" + argv[1] + ";" + argv[2]; 1739 } else { 1740 // forward <local> <remote> 1741 if (argc != 2) return usage(); 1742 cmd = host_prefix + ":forward:" + argv[0] + ";" + argv[1]; 1743 } 1744 1745 return adb_command(cmd) ? 0 : 1; 1746 } 1747 /* do_sync_*() commands */ 1748 else if (!strcmp(argv[0], "ls")) { 1749 if (argc != 2) return usage(); 1750 return do_sync_ls(argv[1]) ? 0 : 1; 1751 } 1752 else if (!strcmp(argv[0], "push")) { 1753 bool copy_attrs = false; 1754 std::vector<const char*> srcs; 1755 const char* dst = nullptr; 1756 1757 parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, ©_attrs); 1758 if (srcs.empty() || !dst) return usage(); 1759 return do_sync_push(srcs, dst) ? 0 : 1; 1760 } 1761 else if (!strcmp(argv[0], "pull")) { 1762 bool copy_attrs = false; 1763 std::vector<const char*> srcs; 1764 const char* dst = "."; 1765 1766 parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, ©_attrs); 1767 if (srcs.empty()) return usage(); 1768 return do_sync_pull(srcs, dst, copy_attrs) ? 0 : 1; 1769 } 1770 else if (!strcmp(argv[0], "install")) { 1771 if (argc < 2) return usage(); 1772 FeatureSet features; 1773 std::string error; 1774 if (!adb_get_feature_set(&features, &error)) { 1775 fprintf(stderr, "error: %s\n", error.c_str()); 1776 return 1; 1777 } 1778 1779 if (CanUseFeature(features, kFeatureCmd)) { 1780 return install_app(transport_type, serial, argc, argv); 1781 } 1782 return install_app_legacy(transport_type, serial, argc, argv); 1783 } 1784 else if (!strcmp(argv[0], "install-multiple")) { 1785 if (argc < 2) return usage(); 1786 return install_multiple_app(transport_type, serial, argc, argv); 1787 } 1788 else if (!strcmp(argv[0], "uninstall")) { 1789 if (argc < 2) return usage(); 1790 FeatureSet features; 1791 std::string error; 1792 if (!adb_get_feature_set(&features, &error)) { 1793 fprintf(stderr, "error: %s\n", error.c_str()); 1794 return 1; 1795 } 1796 1797 if (CanUseFeature(features, kFeatureCmd)) { 1798 return uninstall_app(transport_type, serial, argc, argv); 1799 } 1800 return uninstall_app_legacy(transport_type, serial, argc, argv); 1801 } 1802 else if (!strcmp(argv[0], "sync")) { 1803 std::string src; 1804 bool list_only = false; 1805 if (argc < 2) { 1806 // No local path was specified. 1807 src = ""; 1808 } else if (argc >= 2 && strcmp(argv[1], "-l") == 0) { 1809 list_only = true; 1810 if (argc == 3) { 1811 src = argv[2]; 1812 } else { 1813 src = ""; 1814 } 1815 } else if (argc == 2) { 1816 // A local path or "android"/"data" arg was specified. 1817 src = argv[1]; 1818 } else { 1819 return usage(); 1820 } 1821 1822 if (src != "" && 1823 src != "system" && src != "data" && src != "vendor" && src != "oem") { 1824 return usage(); 1825 } 1826 1827 std::string system_src_path = product_file("system"); 1828 std::string data_src_path = product_file("data"); 1829 std::string vendor_src_path = product_file("vendor"); 1830 std::string oem_src_path = product_file("oem"); 1831 1832 bool okay = true; 1833 if (okay && (src.empty() || src == "system")) { 1834 okay = do_sync_sync(system_src_path, "/system", list_only); 1835 } 1836 if (okay && (src.empty() || src == "vendor") && directory_exists(vendor_src_path)) { 1837 okay = do_sync_sync(vendor_src_path, "/vendor", list_only); 1838 } 1839 if (okay && (src.empty() || src == "oem") && directory_exists(oem_src_path)) { 1840 okay = do_sync_sync(oem_src_path, "/oem", list_only); 1841 } 1842 if (okay && (src.empty() || src == "data")) { 1843 okay = do_sync_sync(data_src_path, "/data", list_only); 1844 } 1845 return okay ? 0 : 1; 1846 } 1847 /* passthrough commands */ 1848 else if (!strcmp(argv[0],"get-state") || 1849 !strcmp(argv[0],"get-serialno") || 1850 !strcmp(argv[0],"get-devpath")) 1851 { 1852 return adb_query_command(format_host_command(argv[0], transport_type, serial)); 1853 } 1854 /* other commands */ 1855 else if (!strcmp(argv[0],"logcat") || !strcmp(argv[0],"lolcat") || !strcmp(argv[0],"longcat")) { 1856 return logcat(transport_type, serial, argc, argv); 1857 } 1858 else if (!strcmp(argv[0],"ppp")) { 1859 return ppp(argc, argv); 1860 } 1861 else if (!strcmp(argv[0], "start-server")) { 1862 std::string error; 1863 const int result = adb_connect("host:start-server", &error); 1864 if (result < 0) { 1865 fprintf(stderr, "error: %s\n", error.c_str()); 1866 } 1867 return result; 1868 } 1869 else if (!strcmp(argv[0], "backup")) { 1870 return backup(argc, argv); 1871 } 1872 else if (!strcmp(argv[0], "restore")) { 1873 return restore(argc, argv); 1874 } 1875 else if (!strcmp(argv[0], "keygen")) { 1876 if (argc < 2) return usage(); 1877 // Always print key generation information for keygen command. 1878 adb_trace_enable(AUTH); 1879 return adb_auth_keygen(argv[1]); 1880 } 1881 else if (!strcmp(argv[0], "jdwp")) { 1882 return adb_connect_command("jdwp"); 1883 } 1884 /* "adb /?" is a common idiom under Windows */ 1885 else if (!strcmp(argv[0], "help") || !strcmp(argv[0], "/?")) { 1886 help(); 1887 return 0; 1888 } 1889 else if (!strcmp(argv[0], "version")) { 1890 fprintf(stdout, "%s", adb_version().c_str()); 1891 return 0; 1892 } 1893 else if (!strcmp(argv[0], "features")) { 1894 // Only list the features common to both the adb client and the device. 1895 FeatureSet features; 1896 std::string error; 1897 if (!adb_get_feature_set(&features, &error)) { 1898 fprintf(stderr, "error: %s\n", error.c_str()); 1899 return 1; 1900 } 1901 1902 for (const std::string& name : features) { 1903 if (CanUseFeature(features, name)) { 1904 printf("%s\n", name.c_str()); 1905 } 1906 } 1907 return 0; 1908 } 1909 1910 usage(); 1911 return 1; 1912} 1913 1914static int uninstall_app(TransportType transport, const char* serial, int argc, const char** argv) { 1915 // 'adb uninstall' takes the same arguments as 'cmd package uninstall' on device 1916 std::string cmd = "cmd package"; 1917 while (argc-- > 0) { 1918 // deny the '-k' option until the remaining data/cache can be removed with adb/UI 1919 if (strcmp(*argv, "-k") == 0) { 1920 printf( 1921 "The -k option uninstalls the application while retaining the data/cache.\n" 1922 "At the moment, there is no way to remove the remaining data.\n" 1923 "You will have to reinstall the application with the same signature, and fully uninstall it.\n" 1924 "If you truly wish to continue, execute 'adb shell cmd package uninstall -k'.\n"); 1925 return EXIT_FAILURE; 1926 } 1927 cmd += " " + escape_arg(*argv++); 1928 } 1929 1930 return send_shell_command(transport, serial, cmd, false); 1931} 1932 1933static int install_app(TransportType transport, const char* serial, int argc, const char** argv) { 1934 // The last argument must be the APK file 1935 const char* file = argv[argc - 1]; 1936 const char* dot = strrchr(file, '.'); 1937 bool found_apk = false; 1938 struct stat sb; 1939 if (dot && !strcasecmp(dot, ".apk")) { 1940 if (stat(file, &sb) == -1 || !S_ISREG(sb.st_mode)) { 1941 fprintf(stderr, "Invalid APK file: %s\n", file); 1942 return EXIT_FAILURE; 1943 } 1944 found_apk = true; 1945 } 1946 1947 if (!found_apk) { 1948 fprintf(stderr, "Missing APK file\n"); 1949 return EXIT_FAILURE; 1950 } 1951 1952 int localFd = adb_open(file, O_RDONLY); 1953 if (localFd < 0) { 1954 fprintf(stderr, "Failed to open %s: %s\n", file, strerror(errno)); 1955 return 1; 1956 } 1957 1958 std::string error; 1959 std::string cmd = "exec:cmd package"; 1960 1961 // don't copy the APK name, but, copy the rest of the arguments as-is 1962 while (argc-- > 1) { 1963 cmd += " " + escape_arg(std::string(*argv++)); 1964 } 1965 1966 // add size parameter [required for streaming installs] 1967 // do last to override any user specified value 1968 cmd += " " + android::base::StringPrintf("-S %" PRIu64, static_cast<uint64_t>(sb.st_size)); 1969 1970 int remoteFd = adb_connect(cmd, &error); 1971 if (remoteFd < 0) { 1972 fprintf(stderr, "Connect error for write: %s\n", error.c_str()); 1973 adb_close(localFd); 1974 return 1; 1975 } 1976 1977 char buf[BUFSIZ]; 1978 copy_to_file(localFd, remoteFd); 1979 read_status_line(remoteFd, buf, sizeof(buf)); 1980 1981 adb_close(localFd); 1982 adb_close(remoteFd); 1983 1984 if (strncmp("Success", buf, 7)) { 1985 fprintf(stderr, "Failed to install %s: %s", file, buf); 1986 return 1; 1987 } 1988 fputs(buf, stderr); 1989 return 0; 1990} 1991 1992static int install_multiple_app(TransportType transport, const char* serial, int argc, 1993 const char** argv) 1994{ 1995 int i; 1996 struct stat sb; 1997 uint64_t total_size = 0; 1998 1999 // Find all APK arguments starting at end. 2000 // All other arguments passed through verbatim. 2001 int first_apk = -1; 2002 for (i = argc - 1; i >= 0; i--) { 2003 const char* file = argv[i]; 2004 const char* dot = strrchr(file, '.'); 2005 if (dot && !strcasecmp(dot, ".apk")) { 2006 if (stat(file, &sb) == -1 || !S_ISREG(sb.st_mode)) { 2007 fprintf(stderr, "Invalid APK file: %s\n", file); 2008 return EXIT_FAILURE; 2009 } 2010 2011 total_size += sb.st_size; 2012 first_apk = i; 2013 } else { 2014 break; 2015 } 2016 } 2017 2018 if (first_apk == -1) { 2019 fprintf(stderr, "Missing APK file\n"); 2020 return 1; 2021 } 2022 2023 std::string cmd = android::base::StringPrintf("exec:pm install-create -S %" PRIu64, total_size); 2024 for (i = 1; i < first_apk; i++) { 2025 cmd += " " + escape_arg(argv[i]); 2026 } 2027 2028 // Create install session 2029 std::string error; 2030 int fd = adb_connect(cmd, &error); 2031 if (fd < 0) { 2032 fprintf(stderr, "Connect error for create: %s\n", error.c_str()); 2033 return EXIT_FAILURE; 2034 } 2035 char buf[BUFSIZ]; 2036 read_status_line(fd, buf, sizeof(buf)); 2037 adb_close(fd); 2038 2039 int session_id = -1; 2040 if (!strncmp("Success", buf, 7)) { 2041 char* start = strrchr(buf, '['); 2042 char* end = strrchr(buf, ']'); 2043 if (start && end) { 2044 *end = '\0'; 2045 session_id = strtol(start + 1, NULL, 10); 2046 } 2047 } 2048 if (session_id < 0) { 2049 fprintf(stderr, "Failed to create session\n"); 2050 fputs(buf, stderr); 2051 return EXIT_FAILURE; 2052 } 2053 2054 // Valid session, now stream the APKs 2055 int success = 1; 2056 for (i = first_apk; i < argc; i++) { 2057 const char* file = argv[i]; 2058 if (stat(file, &sb) == -1) { 2059 fprintf(stderr, "Failed to stat %s\n", file); 2060 success = 0; 2061 goto finalize_session; 2062 } 2063 2064 std::string cmd = android::base::StringPrintf( 2065 "exec:pm install-write -S %" PRIu64 " %d %d_%s -", 2066 static_cast<uint64_t>(sb.st_size), session_id, i, adb_basename(file).c_str()); 2067 2068 int localFd = adb_open(file, O_RDONLY); 2069 if (localFd < 0) { 2070 fprintf(stderr, "Failed to open %s: %s\n", file, strerror(errno)); 2071 success = 0; 2072 goto finalize_session; 2073 } 2074 2075 std::string error; 2076 int remoteFd = adb_connect(cmd, &error); 2077 if (remoteFd < 0) { 2078 fprintf(stderr, "Connect error for write: %s\n", error.c_str()); 2079 adb_close(localFd); 2080 success = 0; 2081 goto finalize_session; 2082 } 2083 2084 copy_to_file(localFd, remoteFd); 2085 read_status_line(remoteFd, buf, sizeof(buf)); 2086 2087 adb_close(localFd); 2088 adb_close(remoteFd); 2089 2090 if (strncmp("Success", buf, 7)) { 2091 fprintf(stderr, "Failed to write %s\n", file); 2092 fputs(buf, stderr); 2093 success = 0; 2094 goto finalize_session; 2095 } 2096 } 2097 2098finalize_session: 2099 // Commit session if we streamed everything okay; otherwise abandon 2100 std::string service = 2101 android::base::StringPrintf("exec:pm install-%s %d", 2102 success ? "commit" : "abandon", session_id); 2103 fd = adb_connect(service, &error); 2104 if (fd < 0) { 2105 fprintf(stderr, "Connect error for finalize: %s\n", error.c_str()); 2106 return EXIT_FAILURE; 2107 } 2108 read_status_line(fd, buf, sizeof(buf)); 2109 adb_close(fd); 2110 2111 if (!strncmp("Success", buf, 7)) { 2112 fputs(buf, stderr); 2113 return 0; 2114 } else { 2115 fprintf(stderr, "Failed to finalize session\n"); 2116 fputs(buf, stderr); 2117 return EXIT_FAILURE; 2118 } 2119} 2120 2121static int pm_command(TransportType transport, const char* serial, int argc, const char** argv) { 2122 std::string cmd = "pm"; 2123 2124 while (argc-- > 0) { 2125 cmd += " " + escape_arg(*argv++); 2126 } 2127 2128 return send_shell_command(transport, serial, cmd, false); 2129} 2130 2131static int uninstall_app_legacy(TransportType transport, const char* serial, int argc, const char** argv) { 2132 /* if the user choose the -k option, we refuse to do it until devices are 2133 out with the option to uninstall the remaining data somehow (adb/ui) */ 2134 int i; 2135 for (i = 1; i < argc; i++) { 2136 if (!strcmp(argv[i], "-k")) { 2137 printf( 2138 "The -k option uninstalls the application while retaining the data/cache.\n" 2139 "At the moment, there is no way to remove the remaining data.\n" 2140 "You will have to reinstall the application with the same signature, and fully uninstall it.\n" 2141 "If you truly wish to continue, execute 'adb shell pm uninstall -k'\n."); 2142 return EXIT_FAILURE; 2143 } 2144 } 2145 2146 /* 'adb uninstall' takes the same arguments as 'pm uninstall' on device */ 2147 return pm_command(transport, serial, argc, argv); 2148} 2149 2150static int delete_file(TransportType transport, const char* serial, const std::string& filename) { 2151 std::string cmd = "rm -f " + escape_arg(filename); 2152 return send_shell_command(transport, serial, cmd, false); 2153} 2154 2155static int install_app_legacy(TransportType transport, const char* serial, int argc, const char** argv) { 2156 static const char *const DATA_DEST = "/data/local/tmp/%s"; 2157 static const char *const SD_DEST = "/sdcard/tmp/%s"; 2158 const char* where = DATA_DEST; 2159 int i; 2160 struct stat sb; 2161 2162 for (i = 1; i < argc; i++) { 2163 if (!strcmp(argv[i], "-s")) { 2164 where = SD_DEST; 2165 } 2166 } 2167 2168 // Find last APK argument. 2169 // All other arguments passed through verbatim. 2170 int last_apk = -1; 2171 for (i = argc - 1; i >= 0; i--) { 2172 const char* file = argv[i]; 2173 const char* dot = strrchr(file, '.'); 2174 if (dot && !strcasecmp(dot, ".apk")) { 2175 if (stat(file, &sb) == -1 || !S_ISREG(sb.st_mode)) { 2176 fprintf(stderr, "Invalid APK file: %s\n", file); 2177 return EXIT_FAILURE; 2178 } 2179 2180 last_apk = i; 2181 break; 2182 } 2183 } 2184 2185 if (last_apk == -1) { 2186 fprintf(stderr, "Missing APK file\n"); 2187 return EXIT_FAILURE; 2188 } 2189 2190 int result = -1; 2191 std::vector<const char*> apk_file = {argv[last_apk]}; 2192 std::string apk_dest = android::base::StringPrintf( 2193 where, adb_basename(argv[last_apk]).c_str()); 2194 if (!do_sync_push(apk_file, apk_dest.c_str())) goto cleanup_apk; 2195 argv[last_apk] = apk_dest.c_str(); /* destination name, not source location */ 2196 result = pm_command(transport, serial, argc, argv); 2197 2198cleanup_apk: 2199 delete_file(transport, serial, apk_dest); 2200 return result; 2201} 2202