Esempio n. 1
0
def reset_usb():
  """Reset USB bus for a device serial."""
  if environment.is_android_cuttlefish() or environment.is_android_emulator():
    # Nothing to do here.
    return True

  # App Engine does not let us import this.
  import fcntl

  # We need to get latest device path since it could be changed in reboots or
  # adb root restarts.
  try:
    device_path = get_device_path()
  except IOError:
    # We may reach this state if the device is no longer available.
    device_path = None

  if not device_path:
    # Try pulling from cache (if available).
    device_path = environment.get_value('DEVICE_PATH')
  if not device_path:
    logs.log_warn('No device path found, unable to reset usb.')
    return False

  try:
    with open(device_path, 'w') as f:
      fcntl.ioctl(f, USBDEVFS_RESET)
  except:
    logs.log_warn('Failed to reset usb.')
    return False

  # Wait for usb to recover.
  wait_for_device(recover=False)
  return True
Esempio n. 2
0
def hard_reset():
  """Perform a hard reset of the device."""
  if environment.is_android_cuttlefish() or environment.is_android_emulator():
    # There is no recovery step at this point for a cuttlefish bot, so just exit
    # and wait for reimage on next iteration.
    bad_state_reached()

  # For physical device.
  # Try hard-reset via sysrq-trigger (requires root).
  hard_reset_sysrq_cmd = get_adb_command_line(
      'shell echo b \\> /proc/sysrq-trigger')
  execute_command(hard_reset_sysrq_cmd, timeout=RECOVERY_CMD_TIMEOUT)

  # Try soft-reset now (does not require root).
  soft_reset_cmd = get_adb_command_line('reboot')
  execute_command(soft_reset_cmd, timeout=RECOVERY_CMD_TIMEOUT)
Esempio n. 3
0
def run_command(cmd,
                log_output=False,
                log_error=True,
                timeout=None,
                recover=True):
    """Run a command in adb shell."""
    if isinstance(cmd, list):
        cmd = ' '.join([str(i) for i in cmd])
    if log_output:
        logs.log('Running: adb %s' % cmd)
    if not timeout:
        timeout = ADB_TIMEOUT

    output = execute_command(get_adb_command_line(cmd), timeout, log_error)
    if not recover or environment.is_android_emulator():
        if log_output:
            logs.log('Output: (%s)' % output)
        return output

    device_not_found_string_with_serial = DEVICE_NOT_FOUND_STRING.format(
        serial=environment.get_value('ANDROID_SERIAL'))
    if (output in [
            DEVICE_HANG_STRING, DEVICE_OFFLINE_STRING,
            device_not_found_string_with_serial
    ]):
        logs.log_warn('Unable to query device, resetting device connection.')
        if reset_device_connection():
            # Device has successfully recovered, re-run command to get output.
            # Continue execution and validate output next for |None| condition.
            output = execute_command(get_adb_command_line(cmd), timeout,
                                     log_error)
        else:
            output = DEVICE_HANG_STRING

    if output is DEVICE_HANG_STRING:
        # Handle the case where our command execution hung. This is usually when
        # device goes into a bad state and only way to recover is to restart it.
        logs.log_warn('Unable to query device, restarting device to recover.')
        hard_reset()

        # Wait until we've booted and try the command again.
        wait_until_fully_booted()
        output = execute_command(get_adb_command_line(cmd), timeout, log_error)

    if log_output:
        logs.log('Output: (%s)' % output)
    return output
def linkify_kernel_or_lkl_stacktrace_if_needed(crash_info):
    """Linkify Android Kernel or lkl stacktrace."""
    kernel_prefix = ''
    kernel_hash = ''
    if (environment.is_android() and not environment.is_android_emulator() and
        (crash_info.found_android_kernel_crash or crash_info.is_kasan)):
        kernel_prefix, kernel_hash = \
          android_kernel.get_kernel_prefix_and_full_hash()

    elif (environment.is_lkl_job() and crash_info.is_lkl
          and crash_info.lkl_kernel_build_id):
        kernel_prefix, kernel_hash = \
          lkl_kernel.get_kernel_prefix_and_full_hash(crash_info.lkl_kernel_build_id)

    if kernel_prefix and kernel_hash:
        _linkify_android_kernel_stacktrace(crash_info, kernel_prefix,
                                           kernel_hash)
Esempio n. 5
0
def factory_reset():
  """Reset device to factory state."""
  if environment.is_android_cuttlefish() or environment.is_android_emulator():
    # We cannot recover from this since there can be cases like userdata image
    # corruption in /data/data. Till the bug is fixed, we just need to wait
    # for reimage in next iteration.
    bad_state_reached()

  # A device can be stuck in a boot loop due to a bad clang library update.
  # Reverting that can bring a device back to good state.
  revert_asan_device_setup_if_needed()

  run_as_root()
  run_shell_command([
      'am', 'broadcast', '-a', 'android.intent.action.MASTER_CLEAR', '-n',
      'android/com.android.server.MasterClearReceiver'
  ])

  # Wait until the reset is complete.
  time.sleep(FACTORY_RESET_WAIT)
Esempio n. 6
0
def run_platform_init_scripts():
  """Run platform specific initialization scripts."""
  logs.log('Running platform initialization scripts.')

  plt = environment.platform()
  if environment.is_android_emulator():
    # Nothing to do here since emulator is not started yet.
    pass
  elif environment.is_android():
    android_init.run()
  elif plt == 'CHROMEOS':
    chromeos_init.run()
  elif plt == 'FUCHSIA':
    fuchsia_init.run()
  elif plt == 'LINUX':
    linux_init.run()
  elif plt == 'MAC':
    mac_init.run()
  elif plt == 'WINDOWS':
    windows_init.run()
  else:
    raise RuntimeError('Unsupported platform')

  logs.log('Completed running platform initialization scripts.')