一、背景
由于各种不可抗力,如疫情、公司暂停空调等原因,很多人被迫居家办公。对于Android开发者来说,最难受的莫过于远程无法连接手机,无法调试的问题。这里介绍一种远程桌面可以连接到本地手机的方法。
二、ADB数据转发
1、介绍
在Android上,adb默认占用的是5037端口,我们可以通过端口转发的形式来将adb的数据转发到远程,这里有一个工具adbportforward。
adbportforward有Client和Server的概念,Server就是手机的提供方,而Client则是手机的使用方,在这里Client代表我们登录的远程桌面,Server代表我们使用的电脑,在使用的电脑上面插手机设备。
2、使用
具体使用可见adbportforward wiki:
Server端配置:
java -jar adbportforward.jar server adblocation=[adb location] port=6037
设置adb地址(这里是adb.exe的上一级地址),然后设置端口(默认是6037)
Client端配置:
java -jar adbportforward.jar client adblocation=[adb location] remotehost=10.xxx port=6037
设置adb地址,然后设置需要连接到的远程host(也可以是IP),然后设置远程host的端口(默认是6037)
3、原理
查看adbportforward发现,它是通过转发端口数据来实现通信的。
Server端:
myPortForward = new PortForward( serverPort, "127.0.0.1", 5037 );
myPortForward.start( Executors.newCachedThreadPool() );
serverPort代表需要暴露的端口,将本地的5037与serverPort进行相互转发
Client端:
myPortForward = new PortForward( 5037, myRemoteHost, myRemotePort );
myPortForward.start( Executors.newCachedThreadPool() );
myRemoteHost和myRemotePort是需要连接的主机以及其暴露的端口,将本地的5037端口与远程端口之间互相转发。
理想情况下,Client的myRemoteHost就对应Server的IP,myRemotePort就对应Server暴露的serverPort,这样我们就打通了从远程桌面到本地桌面的连接,adb就可以正常使用了。
三、建立隧道
1、公网IP
一般来讲,我们家用的宽带是运营商使用NAT方式形成的组网,这种情况下,很多条宽带公用一个公网ip池,我们虽然可以访问互联网,但是从互联网却不能访问到我们家里的设备。那这样的话adbforward无法建立socket连接,也就无法使用。
可以先向运营商申请一个公网ip,这个ip是隔一段时间变化的,但是可以使用,拿到公网ip之后,需要将光猫改成桥接模式,然后修改拨号方式以及端口映射,这个网上有其他教程,这里就不做展开了,如果在baidu上面查到的ip与我们路由器的ip一致的话,代表成功了。
有些地方运营商可能不想提供ip,或者说只有某些套餐才提供公网ip,这样我们就没有办法使用公网ip了,那么就引出了内网穿透
2、内网穿透
内网穿透通俗的来讲,就是把我们本地的机器,通过一个中间服务器,转发到互联网上去,这样其他地方就可以访问本机的内容了,但是这里有个前提,就是必须要有一个拥有公网ip的中间服务器做一次转发才可以,所以传输速率取决于远程、本机、服务器之中带宽最小的那个。
1)FRP
frp是一个开源的内网穿透工具。如果有腾讯云或者阿里云之类的服务器,我们可以用frp来实现内网穿透。
frp的使用比较简单,
服务端:
frps.ini
[common]
bind_port = 7000
然后启动./frps -c frps.ini
客户端:
frpc.ini
[common]
server_addr = XX.XX.XX.XX
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
server_addr是服务器的公网ip,server_port对应上面的bind_port,type这里由于我们使用socket,所以选择tcp,local_ip与local_port默认即可,remote_port是开放出去的端口,我们的adbforward在Client端就使用这个端口。
设置完之后,客户端启动./frpc -c frpc.ini。
设置完成之后,如果输出正常,我们就可以通过adbforward进行连接了。
但是要注意的一点是,阿里云这些默认都有端口限制,所以要在安全组这里把我们需要映射的端口放开。
2) Sakura frp
Sakura frp也是一个内网穿透工具,只不过它帮我们充当了公网服务器的职能,也就是说,我们只要使用Sakura建立隧道,然后远程连接隧道的ip就可以了。这个软件有免费的流量限额,签到可以获取流量,比较良心。
注册账号,下载软件之后,建立tcp隧道,参数使用默认即可(Server port默认22),然后打开隧道,我们可以看到如下的日志:
Tunnel/GOWIYN5Z TCP 类型隧道启动成功
Tunnel/GOWIYN5Z 使用 [XXX.cloud:45208] 来连接到你的隧道
Tunnel/GOWIYN5Z 或使用 IP 地址连接(不推荐):[XX.XX.XX.XX:45208]
现在我们可以使用adbforward了,Server端端口设置为22,Client端设置host与端口如上面日志所示,然后就发现可以正常使用adb了。
四、结论
打通隧道,以及连接adbforward成功之后,远程桌面就可以像正常的桌面一样使用adb来调试手机了