summaryrefslogtreecommitdiffstats
path: root/tools/android/adb_remote_setup.sh
blob: 06280fe2fdd112f158c2ec9d54df699153cde01d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/bin/bash
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# URL from which the latest version of this script can be downloaded.
# Gitiles returns the result as base64 formatted, so the result needs to be
# decoded. See https://code.google.com/p/gitiles/issues/detail?id=7 for
# more information about this security precaution.
script_url="https://chromium.googlesource.com/chromium/src.git/+/master"
script_url+="/tools/android/adb_remote_setup.sh"
script_url+="?format=TEXT"

# Replaces this file with the latest version of the script and runs it.
update-self() {
  local script="${BASH_SOURCE[0]}"
  local new_script="${script}.new"
  local updater_script="${script}.updater"
  curl -sSf "$script_url" | base64 --decode > "$new_script" || return
  chmod +x "$new_script" || return

  # Replace this file with the newly downloaded script.
  cat > "$updater_script" << EOF
#!/bin/bash
if mv "$new_script" "$script"; then
  rm -- "$updater_script"
else
  echo "Note: script update failed."
fi
ADB_REMOTE_SETUP_NO_UPDATE=1 exec /bin/bash "$script" $@
EOF
  exec /bin/bash "$updater_script" "$@"
}

if [[ "$ADB_REMOTE_SETUP_NO_UPDATE" -ne 1 ]]; then
  update-self "$@" || echo 'Note: script update failed'
fi

if [[ $# -ne 1 && $# -ne 2 ]]; then
  cat <<'EOF'
Usage: adb_remote_setup.sh REMOTE_HOST [REMOTE_ADB]

Configures adb on a remote machine to communicate with a device attached to the
local machine. This is useful for installing APKs, running tests, etc while
working remotely.

Arguments:
  REMOTE_HOST  hostname of remote machine
  REMOTE_ADB   path to adb on the remote machine (you can omit this if adb is in
               the remote host's path)
EOF
  exit 1
fi

remote_host="$1"
remote_adb="${2:-adb}"

# Ensure adb is in the local machine's path.
if ! which adb >/dev/null; then
  echo "error: adb must be in your local machine's path."
  exit 1
fi

# Ensure local and remote versions of adb are the same.
remote_adb_version=$(ssh "$remote_host" "$remote_adb version" \
    | grep -v "^Revision")
local_adb_version=$(adb version | grep -v "^Revision")
if [[ "$local_adb_version" != "$remote_adb_version" ]]; then
  echo >&2
  echo "WARNING: local adb is not the same version as remote adb." >&2
  echo "This should be fixed since it may result in protocol errors." >&2
  echo "  local adb:  $local_adb_version" >&2
  echo "  remote adb: $remote_adb_version" >&2
  echo >&2
  sleep 5
fi

# Kill the adb server on the remote host.
ssh "$remote_host" "$remote_adb kill-server"

# Start the adb server locally.
adb start-server

# Forward various ports from the remote host to the local host:
#   5037: adb
#   8001: http server
#   9031: sync server
#   9041: search by image server
#   9051: policy server
#   10000: net unittests
#   10201: net unittests
ssh -4 -C \
    -R 5037:localhost:5037 \
    -L 8001:localhost:8001 \
    -L 9031:localhost:9031 \
    -L 9041:localhost:9041 \
    -L 9051:localhost:9051 \
    -R 10000:localhost:10000 \
    -R 10201:localhost:10201 \
    "$remote_host"