半自动开启adb无线调试

2,197 阅读4分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

牙叔教程 简单易懂

无线调试是什么

安卓11增加了无线调试开关, 也就是完全不用数据线, 只要手机和电脑在同一个局域网, 就可以进行adb调试, 无线调试开启方法请参考: Wi-Fi 调试(Android 11 及更高版本,无需借助 USB)

无线调试流程

  1. 每次连接的ip基本是固定的, 但是port端口是随机的, 所以每次都要获取最新的端口
  2. 在命令行中输入 adb connect 192.168.101.31:38549

看上去只有两步, 但是每一步都有N步, 细分下来是这样的步骤:

  1. 手机回到桌面
  2. 眼睛看设置图标在哪里
  3. 点击设置图标
  4. 往下翻找到更多设置
  5. 再往下翻找到开发者选项
  6. 再往下翻找到无线调试
  7. ......

是不是步骤细分之后, 特别特别的繁琐, 凡事就怕细究, 下面我们来做成半自动的方法, 就不用每次都做这么繁琐的事情了

半自动无线调试流程

  1. 获取ip和port, 并用机器人发送到钉钉
  2. 手动复制钉钉消息中的命令
  3. 点击bat

看上去只有3个步骤, 实际上细究下来, 还是有些麻烦, 不过起码比上面的繁琐程度低一些

源码讲解

获取ip和port

我是小米11pro, 有些代码只有小米才能用, 比如 .className("miui.widget.ClearableEditText") 获取ip的代码流程已经有非常详细的注释了, 相信使用小米手机的用户能看懂

这是autojs执行的代码

function getIpPort() {
  // 打开设置
  app.startActivity({
    packageName: "com.android.settings",
    className: "com.android.settings.SubSettings",
  });
  text("搜索系统设置项").visibleToUser(true).boundsInside(0, 0, device.width, device.height).waitFor();

  // 点击搜索框
  let view = idEndsWith("input").visibleToUser(true).boundsInside(0, 0, device.width, device.height).findOne();
  view.parent().parent().click();
  view = text("取消").visibleToUser(true).boundsInside(0, 0, device.width, device.height).waitFor();

  // 输入 无线调试
  view = visibleToUser(true)
    .className("miui.widget.ClearableEditText")
    .boundsInside(0, 0, device.width, device.height)
    .findOne();
  view.setText("无线调试");

  // 点击 无线调试
  view = text("无线调试")
    .className("android.widget.TextView")
    .visibleToUser(true)
    .boundsInside(0, 0, device.width, device.height)
    .findOne();
  view.parent().parent().click();

  // 获取ip和端口
  view = textMatches(/192\.168.*/)
    .className("android.widget.TextView")
    .visibleToUser(true)
    .boundsInside(0, 0, device.width, device.height)
    .findOne();
  return view.text();
}
用机器人发送到钉钉

添加机器人的方法, 也有详细的注释, 跟着操作即可. 找这个添加机器人的入口, 我都花了一些时间, 因为钉钉的界面和原来还不一样. ​

注意一下发送的消息, 直接就是 adb connect 192.168.101.31:38549, 一会你复制的时候, 就是复制这条消息

这是autojs执行的代码

function sendInfo(info) {
  // 打开钉钉群聊
  // 点击右上角设置
  // 点击智能群助手
  // 点击添加机器人
  // 点击添加机器人
  // 点击自定义
  // 点击添加
  let token = "78a6e03a7854e5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  let url = "https://oapi.dingtalk.com/robot/send?access_token=" + token;
  var temp = http.postJson(url, { msgtype: "text", text: { content: 'adb connect ' + info + " \n\n来自 牙叔教程" } });
  log(temp.body.string());
}

到了这一步, 需要手动复制一下 adb connect 192.168.101.31:38549

点击bat

这段代码的意思是 获取剪贴板内容, 然后cmd执行剪贴板内容, 精华部分是第一句

这是电脑执行的代码, 写入一个bat文件, 双击bat文件即可

' 2>nul&@start wscript -e:vbs "%~f0"&goto :eof
Set objHTML=CreateObject("htmlfile")
ClipboardText=objHTML.ParentWindow.ClipboardData.GetData("text")
set fso=wscript.createobject("scripting.filesystemobject")
set file=fso.opentextfile("123.txt",2,true)
file.writeline ClipboardText
Set obj = createobject("wscript.shell")
obj.run "cmd /c " & ClipboardText

上面的代码巧妙利用 bat 和 vbs 的语法特征,让同一个文件,被 cmd.exe 识别成批处理,让 wscrpt.exe 识别成 vbs,并且同时符合两者的语法,并且保证都没有错误,保证两者的高度兼容。就叫它 bat/vbs 复合编程吧 (Hybrid Programming)

start wscript -e:vbs "%~f0"

cmd.exe 识别成:启动 wscript.exe ,其参数是: ① -e:vbs 设定以vbs解析文件自身 ② "%~f0" 指这个批处理本身。

wscript.exe 把这句识别成:调用一个叫 start 的函数,函数参数是 wscript 这个变量,然后用这个函数的结果来 减去 e。接下来是又是一个 : ,分行,然后又是调用一个名叫 vbs 的函数,参数是字符: "%~f0"

这句是最为精巧的,因为它成功的让 vbs 引擎解释了一段批处理,而且没有错误!当然这些 start()、vbs()函数是不存在的,但是会被 cmd.exe 当成命令执行。为什么不用 wscript //e:vbs "%~f0" 来执行呢?vbs解析会出错的,呵呵

环境

手机: Mi 11 Pro Android版本: 11 ​

Autojs版本: 9.0.11 电脑: win10

参考

批处理中直接执行vbs的方法

批处理保存剪贴板信息

名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问 --- 牙叔教程

声明

部分内容来自网络 本教程仅用于学习, 禁止用于其他用途

微信公众号 牙叔教程