aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Ducrohet <xav@android.com>2010-04-21 14:29:47 -0700
committerAndroid Code Review <code-review@android.com>2010-04-21 14:29:47 -0700
commit353e797d2ffed5a653c0eab0d0756d59c1945d1e (patch)
tree1989bbb026b91682570f79ad184e99a2e1ef43e5
parent5b81653318e8cd08af87ab75b31abaedc6324ebb (diff)
parente9e7e1ecf6c21cff2a55dc62c43fc175a5d0be92 (diff)
downloadsdk-353e797d2ffed5a653c0eab0d0756d59c1945d1e.zip
sdk-353e797d2ffed5a653c0eab0d0756d59c1945d1e.tar.gz
sdk-353e797d2ffed5a653c0eab0d0756d59c1945d1e.tar.bz2
Merge "Supporting configurable ADB port in ddms and ddmlib."
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/AndroidDebugBridge.java92
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/Device.java14
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/DeviceMonitor.java4
3 files changed, 89 insertions, 21 deletions
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/AndroidDebugBridge.java b/ddms/libs/ddmlib/src/com/android/ddmlib/AndroidDebugBridge.java
index 6b9dccc..c62ce42 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/AndroidDebugBridge.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/AndroidDebugBridge.java
@@ -51,23 +51,14 @@ public final class AndroidDebugBridge {
private final static String ADB = "adb"; //$NON-NLS-1$
private final static String DDMS = "ddms"; //$NON-NLS-1$
+ private final static String SERVER_PORT_ENV_VAR = "ANDROID_ADB_SERVER_PORT"; //$NON-NLS-1$
// Where to find the ADB bridge.
final static String ADB_HOST = "127.0.0.1"; //$NON-NLS-1$
final static int ADB_PORT = 5037;
- static InetAddress sHostAddr;
- static InetSocketAddress sSocketAddr;
-
- static {
- // built-in local address/port for ADB.
- try {
- sHostAddr = InetAddress.getByName(ADB_HOST);
- sSocketAddr = new InetSocketAddress(sHostAddr, ADB_PORT);
- } catch (UnknownHostException e) {
-
- }
- }
+ private static InetAddress sHostAddr;
+ private static InetSocketAddress sSocketAddr;
private static AndroidDebugBridge sThis;
private static boolean sClientSupport;
@@ -185,6 +176,9 @@ public final class AndroidDebugBridge {
public static void init(boolean clientSupport) {
sClientSupport = clientSupport;
+ // Determine port and instantiate socket address.
+ initAdbSocketAddr();
+
MonitorThread monitorThread = MonitorThread.createInstance();
monitorThread.start();
@@ -222,6 +216,13 @@ public final class AndroidDebugBridge {
}
/**
+ * Returns the socket address of the ADB server on the host.
+ */
+ public static InetSocketAddress getSocketAddress() {
+ return sSocketAddr;
+ }
+
+ /**
* Creates a {@link AndroidDebugBridge} that is not linked to any particular executable.
* <p/>This bridge will expect adb to be running. It will not be able to start/stop/restart
* adb.
@@ -1049,4 +1050,71 @@ public final class AndroidDebugBridge {
static Object getLock() {
return sLock;
}
+
+ /**
+ * Instantiates sSocketAddr with the address of the host's adb process.
+ */
+ private static void initAdbSocketAddr() {
+ try {
+ int adb_port = determineAndValidateAdbPort();
+ sHostAddr = InetAddress.getByName(ADB_HOST);
+ sSocketAddr = new InetSocketAddress(sHostAddr, adb_port);
+ } catch (UnknownHostException e) {
+ // localhost should always be known.
+ }
+ }
+
+ /**
+ * Determines port where ADB is expected by looking at an env variable.
+ * <p/>
+ * The value for the environment variable ANDROID_ADB_SERVER_PORT is validated,
+ * IllegalArgumentException is thrown on illegal values.
+ * <p/>
+ * @return The port number where the host's adb should be expected or started.
+ * @throws IllegalArgumentException if ANDROID_ADB_SERVER_PORT has a non-numeric value.
+ */
+ private static int determineAndValidateAdbPort() {
+ String adb_env_var;
+ int result = ADB_PORT;
+ try {
+ adb_env_var = System.getenv(SERVER_PORT_ENV_VAR);
+
+ if (adb_env_var != null) {
+ adb_env_var = adb_env_var.trim();
+ }
+
+ if (adb_env_var != null && adb_env_var.length() > 0) {
+ // C tools (adb, emulator) accept hex and octal port numbers, so need to accept
+ // them too.
+ result = Integer.decode(adb_env_var);
+
+ if (result <= 0) {
+ String errMsg = "env var " + SERVER_PORT_ENV_VAR //$NON-NLS-1$
+ + ": must be >=0, got " //$NON-NLS-1$
+ + System.getenv(SERVER_PORT_ENV_VAR);
+ throw new IllegalArgumentException(errMsg);
+ }
+ }
+ } catch (NumberFormatException nfEx) {
+ String errMsg = "env var " + SERVER_PORT_ENV_VAR //$NON-NLS-1$
+ + ": illegal value '" //$NON-NLS-1$
+ + System.getenv(SERVER_PORT_ENV_VAR) + "'"; //$NON-NLS-1$
+ throw new IllegalArgumentException(errMsg);
+ } catch (SecurityException secEx) {
+ // A security manager has been installed that doesn't allow access to env vars.
+ // So an environment variable might have been set, but we can't tell.
+ // Let's log a warning and continue with ADB's default port.
+ // The issue is that adb would be started (by the forked process having access
+ // to the env vars) on the desired port, but within this process, we can't figure out
+ // what that port is. However, a security manager not granting access to env vars
+ // but allowing to fork is a rare and interesting configuration, so the right
+ // thing seems to be to continue using the default port, as forking is likely to
+ // fail later on in the scenario of the security manager.
+ Log.w(DDMS,
+ "No access to env variables allowed by current security manager. " //$NON-NLS-1$
+ + "If you've set ANDROID_ADB_SERVER_PORT: it's being ignored."); //$NON-NLS-1$
+ }
+ return result;
+ }
+
}
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/Device.java b/ddms/libs/ddmlib/src/com/android/ddmlib/Device.java
index 8d14d00..4223248 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/Device.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/Device.java
@@ -247,7 +247,7 @@ final class Device implements IDevice {
* @see com.android.ddmlib.IDevice#getSyncService()
*/
public SyncService getSyncService() throws IOException {
- SyncService syncService = new SyncService(AndroidDebugBridge.sSocketAddr, this);
+ SyncService syncService = new SyncService(AndroidDebugBridge.getSocketAddress(), this);
if (syncService.openSync()) {
return syncService;
}
@@ -268,7 +268,7 @@ final class Device implements IDevice {
* @see com.android.ddmlib.IDevice#getScreenshot()
*/
public RawImage getScreenshot() throws IOException {
- return AdbHelper.getFrameBuffer(AndroidDebugBridge.sSocketAddr, this);
+ return AdbHelper.getFrameBuffer(AndroidDebugBridge.getSocketAddress(), this);
}
/*
@@ -277,7 +277,7 @@ final class Device implements IDevice {
*/
public void executeShellCommand(String command, IShellOutputReceiver receiver)
throws IOException {
- AdbHelper.executeRemoteCommand(AndroidDebugBridge.sSocketAddr, command, this,
+ AdbHelper.executeRemoteCommand(AndroidDebugBridge.getSocketAddress(), command, this,
receiver);
}
@@ -286,7 +286,7 @@ final class Device implements IDevice {
* @see com.android.ddmlib.IDevice#runEventLogService(com.android.ddmlib.log.LogReceiver)
*/
public void runEventLogService(LogReceiver receiver) throws IOException {
- AdbHelper.runEventLogService(AndroidDebugBridge.sSocketAddr, this, receiver);
+ AdbHelper.runEventLogService(AndroidDebugBridge.getSocketAddress(), this, receiver);
}
/*
@@ -295,7 +295,7 @@ final class Device implements IDevice {
*/
public void runLogService(String logname,
LogReceiver receiver) throws IOException {
- AdbHelper.runLogService(AndroidDebugBridge.sSocketAddr, this, logname, receiver);
+ AdbHelper.runLogService(AndroidDebugBridge.getSocketAddress(), this, logname, receiver);
}
/*
@@ -304,7 +304,7 @@ final class Device implements IDevice {
*/
public boolean createForward(int localPort, int remotePort) {
try {
- return AdbHelper.createForward(AndroidDebugBridge.sSocketAddr, this,
+ return AdbHelper.createForward(AndroidDebugBridge.getSocketAddress(), this,
localPort, remotePort);
} catch (IOException e) {
Log.e("adb-forward", e); //$NON-NLS-1$
@@ -318,7 +318,7 @@ final class Device implements IDevice {
*/
public boolean removeForward(int localPort, int remotePort) {
try {
- return AdbHelper.removeForward(AndroidDebugBridge.sSocketAddr, this,
+ return AdbHelper.removeForward(AndroidDebugBridge.getSocketAddress(), this,
localPort, remotePort);
} catch (IOException e) {
Log.e("adb-remove-forward", e); //$NON-NLS-1$
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/DeviceMonitor.java b/ddms/libs/ddmlib/src/com/android/ddmlib/DeviceMonitor.java
index 0fd0651..175b657 100644
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/DeviceMonitor.java
+++ b/ddms/libs/ddmlib/src/com/android/ddmlib/DeviceMonitor.java
@@ -232,7 +232,7 @@ final class DeviceMonitor {
SocketChannel adbChannel = null;
try {
- adbChannel = SocketChannel.open(AndroidDebugBridge.sSocketAddr);
+ adbChannel = SocketChannel.open(AndroidDebugBridge.getSocketAddress());
adbChannel.socket().setTcpNoDelay(true);
} catch (IOException e) {
}
@@ -732,7 +732,7 @@ final class DeviceMonitor {
SocketChannel clientSocket;
try {
clientSocket = AdbHelper.createPassThroughConnection(
- AndroidDebugBridge.sSocketAddr, device, pid);
+ AndroidDebugBridge.getSocketAddress(), device, pid);
// required for Selector
clientSocket.configureBlocking(false);