Android手机用wifi连接adb调试的方法
zhyn4317
8年前
<p style="text-align:center"><img src="https://simg.open-open.com/show/04cf664430d3a0211f27b0221b783266.png"></p> <p style="text-align:center">ic_adb_green_black_48dp.png</p> <h2><strong>0x0 前言</strong></h2> <p>Android开发肯定要连接pc的adb进行调试,传统的方法是用usb与pc进行连接,操作简单即插即用,缺点是pc上必须得有对应手机的usb驱动程序,对于谷歌亲儿子系列和三星摩托等外国品牌而言这不是什么问题,通常sdk里面就自带了,然而想华为小米这种自带魔改rom的国产货就很难说了,通常需要安装厂家自己出的usb驱动程序才能连接adb,然而一想到雷猴王的wps全家桶多么丧病我就不想在电脑上装任何他家的东西。</p> <p>当然后来有了更加先进的连接adb的方式——wifi连接。只需要敲入几行命令开启手机端的adb服务,pc端即可根据手机的ip地址进行adb连接,不用依赖驱动程序,所有品牌的手机都适用,唯一的前提条件是————</p> <p><strong>ROOT</strong></p> <p>我去,对Android开发者而言这也算个事?</p> <p>下面就来介绍怎么使用这种连接方法。</p> <h2><strong>0x1 手动输入秘笈</strong></h2> <p>首先在手机上安装一个模拟shell的app,随便是什么,能像linux的shell一样执行命令行就可以。</p> <p>秘笈很简单:</p> <pre> <code class="language-java">su setprop service.adb.tcp.port 5555 stop adbd start adbd</code></pre> <p>第一行,和linux一样获取root权限,我刚才说过你的手机应该已经root了,否则这里会报错。</p> <p>第二行设置adb服务端口为5555,这是adb的默认端口。</p> <p>第三行第四行,重启adb服务。</p> <p>如果执行到这里都没有问题,那么用你觉得方便的方法获取手机在无线网络中的ip地址,比如最常见的192.168.0.100</p> <p>到你的pc机上,打开cmd.exe或其他什么类似的东西,找到adb的存放的路径,执行以下代码</p> <pre> <code class="language-java">adb connect 192.168.0.100</code></pre> <p>如果你随后看到</p> <pre> <code class="language-java">connected to 192.168.0.100</code></pre> <p>类似的字样,说明已经连接成功了,你在Android Studio的Android Monitor窗口中应该就能看到你的手机了。</p> <p><img src="https://simg.open-open.com/show/71593a399321f89edbceba66ae955ae8.jpg"></p> <p style="text-align:center">wifiConnector.JPG</p> <h2><strong>0x2 让app自动输入秘笈</strong></h2> <p>在制作粗糙的模拟shell app里用手机触摸屏上的软键盘输入了3次这种秘笈以后,我终于不能忍了。为什么不能一键让程序自动替我们输入这些命令呢?</p> <p>于是现在我假设在某个布局文件中我们已经有了一个Button,名字叫btn_su,在某个Activity中我们加载了这个布局文件,并且绑定给一个Button对象btnSu</p> <p>下面设置这个btnSu的点击事件监听器</p> <pre> <code class="language-java">btnSu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO } });</code></pre> <p>在事件监听器里面实现启动adb服务的功能。</p> <p>首先开启一个具有root权限的进程:</p> <pre> <code class="language-java">Process localProcess = Runtime.getRuntime().exec("su");</code></pre> <p>打开该进程的输入流</p> <pre> <code class="language-java">DataOutputStream os = new DataOutputStream(localProcess.getOutputStream());</code></pre> <p>向该输入流中写入如下字符串</p> <pre> <code class="language-java">os.writeBytes("setprop service.adb.tcp.port 5555\n"); os.writeBytes("stop adbd\n"); os.writeBytes("start adbd\n"); os.flush();</code></pre> <p>以上代码相当于向一个具有root权限的shell中写入如下命令</p> <pre> <code class="language-java">setprop service.adb.tcp.port 5555 stop adbd start adbd</code></pre> <p>下面为了更方便的连接电脑进行调试,顺便就获取一下手机的ip地址显示在屏幕上:</p> <pre> <code class="language-java">WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); //判断wifi是否开启 WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); String ip = intToIp(ipAddress); Toast.makeText(MainActivity.this, ip, Toast.LENGTH_LONG).show();</code></pre> <p>其中intToIp方法想必谁都会写,这里就不贴出来了。</p> <p>完整的监听器onClick实现代码如下:</p> <pre> <code class="language-java">@Override public void onClick(View v) { DataOutputStream os = null; try { Process localProcess = Runtime.getRuntime().exec("su"); os = new DataOutputStream(localProcess.getOutputStream()); os.writeBytes("setprop service.adb.tcp.port 5555\n"); os.writeBytes("stop adbd\n"); os.writeBytes("start adbd\n"); os.flush(); WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); //判断wifi是否开启 WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); String ip = intToIp(ipAddress); Toast.makeText(MainActivity.this, ip, Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (os != null) { os.close(); } } catch (IOException e) { } } }</code></pre> <h2><strong>0x3 吐槽</strong></h2> <p>阿里的价值观到底是什么摸不太透,不过想来我这个玩意极大的提升操作效率岂不是对那些手敲命令行的人不公平,隐约觉得说起价值观貌似也是分分钟药丸。幸好不在阿里工作,否则早就被叉出去了哈哈。</p> <p> </p> <p>来自:http://www.jianshu.com/p/dc6898380e38</p> <p> </p>