def install_multiple_app(self, filepath, replace=False, install_options=None): """ Perform `adb install-multiple` command Args: filepath: full path to file to be installed on the device replace: force to replace existing application, default is False install_options: list of options e.g.["-t", # allow test packages "-l", # forward lock application, "-s", # install application on sdcard, "-d", # allow version code downgrade (debuggable packages only) "-g", # grant all runtime permissions "-p", # partial application install (install-multiple only) ] Returns: command output """ if isinstance(filepath, str): filepath = decode_path(filepath) if not os.path.isfile(filepath): raise RuntimeError("file: %s does not exists" % (repr(filepath))) if not install_options or type(install_options) != list: install_options = [] if replace: install_options.append("-r") cmds = [ "install-multiple", ] + install_options + [ filepath, ] try: out = self.cmd(cmds) except AdbError as err: if "Failed to finalize session".lower() in err.stderr.lower(): return "Success" else: return self.install_app(filepath, replace) if re.search(r"Failure \[.*?\]", out): raise AdbShellError("Installation Failure", repr(out)) return out
def shell(self, cmd): """ Run the `adb shell` command on the device Args: cmd: a command to be run Raises: AdbShellError: if command return value is non-zero or if any other `AdbError` occurred Returns: command output """ if self.sdk_version < SDK_VERISON_NEW: # for sdk_version < 25, adb shell do not raise error # https://stackoverflow.com/questions/9379400/adb-error-codes cmd = split_cmd(cmd) + [";", "echo", "---$?---"] out = self.raw_shell(cmd).rstrip() m = re.match("(.*)---(\d+)---$", out, re.DOTALL) if not m: warnings.warn("return code not matched") stdout = out returncode = 0 else: stdout = m.group(1) returncode = int(m.group(2)) if returncode > 0: raise AdbShellError("", stdout) return stdout else: try: out = self.raw_shell(cmd) except AdbError as err: raise AdbShellError(err.stdout, err.stderr) else: return out
def install_app(self, filepath, replace=False, install_options=None): """ Perform `adb install` command Args: filepath: full path to file to be installed on the device replace: force to replace existing application, default is False e.g.["-t", # allow test packages "-l", # forward lock application, "-s", # install application on sdcard, "-d", # allow version code downgrade (debuggable packages only) "-g", # grant all runtime permissions ] Returns: command output """ if isinstance(filepath, str): filepath = decode_path(filepath) if not os.path.isfile(filepath): raise RuntimeError("file: %s does not exists" % (repr(filepath))) if not install_options or type(install_options) != list: install_options = [] if replace: install_options.append("-r") cmds = [ "install", ] + install_options + [ filepath, ] out = self.cmd(cmds) if re.search(r"Failure \[.*?\]", out): raise AdbShellError("Installation Failure", repr(out)) return out