Android手机用wifi连接adb调试的方法

0x0 前言

Android开发肯定要连接pc的adb进行调试,传统的方法是用usb与pc进行连接,操作简单即插即用,缺点是pc上必须得有对应手机的usb驱动程序,对于谷歌亲儿子系列和三星摩托等外国品牌而言这不是什么问题,通常sdk里面就自带了,然而想华为小米这种自带魔改rom的国产货就很难说了,通常需要安装厂家自己出的usb驱动程序才能连接adb,然而一想到雷猴王的wps全家桶多么丧病我就不想在电脑上装任何他家的东西。

当然后来有了更加先进的连接adb的方式——wifi连接。只需要敲入几行命令开启手机端的adb服务,pc端即可根据手机的ip地址进行adb连接,不用依赖驱动程序,所有品牌的手机都适用,唯一的前提条件是————

ROOT

我去,对Android开发者而言这也算个事?

下面就来介绍怎么使用这种连接方法。

0x1 手动输入秘笈

首先在手机上安装一个模拟shell的app,随便是什么,能像linux的shell一样执行命令行就可以。

秘笈很简单:

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

第一行,和linux一样获取root权限,我刚才说过你的手机应该已经root了,否则这里会报错。

第二行设置adb服务端口为5555,这是adb的默认端口。

第三行第四行,重启adb服务。

如果执行到这里都没有问题,那么用你觉得方便的方法获取手机在无线网络中的ip地址,比如最常见的192.168.0.100

到你的pc机上,打开cmd.exe或其他什么类似的东西,找到adb的存放的路径,执行以下代码

adb connect 192.168.0.100

如果你随后看到

connected to 192.168.0.100

类似的字样,说明已经连接成功了,你在Android Studio的Android Monitor窗口中应该就能看到你的手机了。

0x2 让app自动输入秘笈

在制作粗糙的模拟shell app里用手机触摸屏上的软键盘输入了3次这种秘笈以后,我终于不能忍了。为什么不能一键让程序自动替我们输入这些命令呢?

于是现在我假设在某个布局文件中我们已经有了一个Button,名字叫btn_su,在某个Activity中我们加载了这个布局文件,并且绑定给一个Button对象btnSu

下面设置这个btnSu的点击事件监听器

btnSu.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO

    }
});

在事件监听器里面实现启动adb服务的功能。

首先开启一个具有root权限的进程:

Process localProcess = Runtime.getRuntime().exec("su");

打开该进程的输入流

DataOutputStream 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();

以上代码相当于向一个具有root权限的shell中写入如下命令

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

下面为了更方便的连接电脑进行调试,顺便就获取一下手机的ip地址显示在屏幕上:

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();

其中intToIp方法想必谁都会写,这里就不贴出来了。

完整的监听器onClick实现代码如下:

@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) {

        }

    }
}

0x3 吐槽

阿里的价值观到底是什么摸不太透,不过想来我这个玩意极大的提升操作效率岂不是对那些手敲命令行的人不公平,隐约觉得说起价值观貌似也是分分钟药丸。幸好不在阿里工作,否则早就被叉出去了哈哈。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,641评论 25 708
  • 有一次吃晚饭的时候,和老婆聊到未来孩子的教育问题,也提到了现在孩子上学不给老师红包,孩子就不被重视。我感叹现在的社...
    糖三角先森阅读 531评论 12 4
  • 列车轰隆轰隆碾过铁轨,大大的黑色双肩包和厚重的滚轮拉杆箱塞满了行李架,拥挤的人群在狭窄的车厢里艰难地涌动,各...
    勒勒几阅读 241评论 0 0
  • 作为一个大四求职狗,这段时间我的习惯性焦虑越来越严重了。根据能量守恒定律,接受了过多的负能量,总得把它输出了。所以...
    松花江果妹阅读 163评论 0 0
  • 七律 ——写给惠风文学训练营 文/舟亮 惠存笔友邀清客,风聚诗家荐雅宾。 文海击水劈前浪,学山踏路斩后尘。 训磨品...
    舟亮阅读 342评论 0 0