Wifi连接Android真机调试

一向使用真机调试,数据线用久了有些接触不良,动作幅度一大,adb就断开链接。再买一根数据线是下下策,干脆买了个360随身Wifi,将手机通过Wifi连上电脑进行调试。没有数据线的牵绊轻松了许多。

电脑与手机用其他方式连在同一个局域网中也可以使用下面的方法。


手动方法

1.在手机上安装终端类App,开启Root权限,打开App,输入以下命令:

su
setprop service.adb.tcp.port 5555
stop adbd
start adbd

其中,su表示获取root权限

2.查看手机的Wifi连接,获取手机IP地址。

3.电脑上打开CMD,输入如下命令:

adb connect 手机IP地址

命令行输入adb devices或者Eclipse的DDMS都可以看到已连接的设备,可以直接进行真机调试


APP

每次连电脑都要在手机上输一大串终端命令实在太繁琐,干脆写了个APP代劳。必须给该APP开启Root权限。连上Wifi后打开APP点击按钮:
APP2.png

Github:loveNight/AndroidTerminal

Eclipse + ADT插件写的。导入工程后直接用USB调试装到自己手机上使用。

核心代码

手机上运行终端命令的代码如下:

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
101
102
103
104
105
106
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* CMD 命令行执行工具
*/

public class CmdUtils {
public static final String COMMAND_SU = "su"; // 表示获取root权限(APP必须已root)
public static final String COMMAND_LINE_END = "\n";
public static final String COMMAND_EXIT = "exit\n";

/**
* Android手机用Wifi连上电脑ADB调试
* 须在手机终端输入如下命令
* 此终端必须已经Root
*/

public static final String[] wifiConnectToComputer = {
"setprop service.adb.tcp.port 5555",
"stop adbd",
"start adbd"
};

public static Result execute(String[] commands) {
//----------------- 待写:检查此手机是否已经Root-------------

Runtime runtime = Runtime.getRuntime();

Process process = null;
DataOutputStream output = null; // 用于向终端进程输入命令
BufferedReader successResult = null;
BufferedReader errorResult = null;
StringBuilder successMsg = null;
StringBuilder errorMsg = null;

try {
process = runtime.exec(COMMAND_SU);
output = new DataOutputStream(process.getOutputStream());
for (String command : commands) {
if (command == null) {
continue;
}

output.write(command.getBytes());
output.writeBytes(COMMAND_LINE_END); // 输完一行命令要按回车
output.flush();
}

output.writeBytes(COMMAND_EXIT);
output.flush();
process.waitFor(); // 当前线程等待,直到process线程执行结束

successMsg = new StringBuilder();
errorMsg = new StringBuilder();
successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));

String s;
while ( (s = successResult.readLine()) != null) {
successMsg.append(s).append("\n");
}
while ( (s = errorResult.readLine()) != null) {
errorMsg.append(s).append("\n");
}



} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally { // 回收资源
try {
if (output != null) {
output.close();
}
if (successResult != null) {
successResult.close();
}
if (errorResult != null) {
errorResult.close();
}
} catch (IOException e) {
e.printStackTrace();
}

if (process != null) {
process.destroy();
}
}
return new Result(successMsg == null ? null : successMsg.toString()
, errorMsg == null ? null : errorMsg.toString());
}

public static class Result {
public String successMsg;
public String errorMsg;

public Result(String successMsg, String errorMsg) {
super();
this.successMsg = successMsg;
this.errorMsg = errorMsg;
}

}
}

获取手机IP地址需要Wifi权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

代码如下:

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
import java.net.InetAddress;

import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;

public class WifiUtils {

private static WifiUtils wifiUtils;
private Context context;

private WifiUtils(Context context) {
this.context = context;
}

public static WifiUtils getInstance(Context context){
if (wifiUtils == null) {
wifiUtils = new WifiUtils(context);
}
return wifiUtils;
}

/**
* 获取手机IP地址
* 必须连上wifi
*/

public String getIpAddress() {
int result = 0;
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
result = wifiInfo.getIpAddress();
return intToIp(result);
}

/**
* 直接获取的IP地址是一个4字节的整数
* 需要手动处理成常见的192.168.1.155形式
*/

private String intToIp(int i) {
return (i & 0xFF ) + "." +
((i >> 8 ) & 0xFF) + "." +
((i >> 16 ) & 0xFF) + "." +
( i >> 24 & 0xFF) ;
}
}
loveNight wechat
我的微信公众号,放一些有趣的内容,不定期更新。