admin 管理员组

文章数量: 887019

最近做了个需求,从电脑上通过数据线控制手机打电话和自动添加微信好友。查找一番,很快有了方向,那就是通过 adb工具,即Android Debug Bridge(安卓调试桥) tools。它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备(也就是手机)交互。

好了,知道用什么就好整了,下面简单介绍下过程

1.下载adb工具

adb 官网下载:http://adbshell/upload/adb.zip
adb常用指令参考:https://github/mzlogin/awesome-adb

2.手机配置

首先当然得是安卓机了(不过貌似也有ios版本的仿写adb,没有试过,没试过暂且不管),需要将手机的的开启开发者选项,然后开启usb调试,允许usb控制以及模拟点击之类的设置,这个随手机型号的不同而不同。

连上数据线插到电脑,一般都会自动安装驱动了,如果你中招了,安装失败的话,去下个豌豆荚之类的手机助手即可,电脑可以识别到手机就ok了,下面就可以测试adb了

3.测试adb命令

从cmd中进到下载好的adb工具文件夹内,就可以开始敲命令了,看着自己的手机在动是不是很神奇。上面给的命令连接目录做的很好了,赞一个。
可以查看连接设备,查手机信号,电量,分辨率等等参数,可以打开应用,模拟点击,滑动,输入等

//电源键
adb shell input keyevent 26
//菜单键
adb shell input keyevent 82
//home键
adb shell input keyevent 3
//返回键
adb shell input keyevent 4
//打开微信
adb shell am start -n com.tencent.mm/.ui.LauncherUI
//模拟点击 100 300是坐标
adb shell input tap 100 300 
//模拟滑动 300 1000 300 500 分别表示起始点x坐标 起始点y坐标 结束点x坐标 结束点y坐标。
adb shell input swipe 300 1000 300 500 
//模拟输入 hello
adb shell input text hello
//拨打电话 10086
adb shell am start -a android.intent.action.CALL tel:10086
//编辑短信hello(不支持中文,不过好像有方法做到,貌似需要在手机安装特殊的输入法,暂不搞)
adb shell am start -a android.intent.action.SENDTO -d sms:10086 --es sms_body hello
adb shell input keyevent 22  //焦点去到发送按键
adb shell input keyevent 66  //回车,就是按下发送键

有了这些模拟操作基本就可以自动化一个操作了
我实现的主要是微信自动加好友,如果只是用于自己的手机玩玩的话,可以用固定的坐标点去实现,这个就非常简单了(但碰到那些会变化的界面,那么你固定的坐标就偏移了)。那么只好像别的办法了,有没有方法去获取页面各个控件的坐标呢?
答案当然是有了(O(∩_∩)O哈哈~)安卓里面有个 uiautomator 的东西。

4. Uiautomator 获取页面元素坐标

Uiautomator是谷歌推出的,用于UI自动化测试的工具,也就是普通的手工测试,点击每个控件元素看看输出的结果是否符合预期。(只支持 Android 4.3 以上系统,貌似现在没有低于这个版本的手机了吧)
获取当前手机页面各个元素信息方法如下:

  • 抓取当前页面元素布局信息保存到手机自动位置
adb shell uiautomator dump /data/local/tmp/uidump.xml
  • 将手机里的xml文件导出到电脑指定位置,缺省时保存到adb.exe目录下
adb pull /data/local/tmp/uidump.xml
  • 解析xml 得到目的控件的坐标

这个得去找个xml解析类咯,我用的是 Rapidxml,用过的都说好。
解析微信的界面的话,得写个递归函数去遍历所有的元素,然后找出元素中 content-desc 和 text 不为空的控件,比如微信的添加朋友界面

以下就是解析上个那个界面后,删除 content-desc 和 text 都为空的元素,将几个关键key打印出来的log,重点就是 bounds 这个key值了,它的值就是这个控件在屏幕上所占矩形区域。有了这个坐标,你想点哪里还不能点了?

< text: , resource-id: , class: android.widget.FrameLayout, content-desc: 当前所在页面,添加朋友, bounds: [0,0][1080,2030] >
< text: , resource-id: com.tencent.mm:id/hy, class: android.widget.ImageView, content-desc: 返回, bounds: [0,66][132,198] >
< text: 添加朋友, resource-id: android:id/text1, class: android.widget.TextView, content-desc: , bounds: [167,98][367,165] >
< text: , resource-id: android:id/title, class: android.widget.TextView, content-desc: 分隔栏, bounds: [0,198][1080,253] >
< text: 微信号/QQ号/手机号, resource-id: com.tencent.mm:id/can, class: android.widget.TextView, content-desc: , bounds: [39,286][1041,372] >
< text: 我的微信号:xi******ng, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [268,403][740,489] >
< text: , resource-id: com.tencent.mm:id/cbl, class: android.widget.ImageView, content-desc: 我的二维码, bounds: [740,394][811,498] >
< text: , resource-id: android:id/title, class: android.widget.TextView, content-desc: 分隔栏, bounds: [0,498][1080,553] >
< text: 雷达加朋友, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [171,580][391,645] >
< text: 添加身边的朋友, resource-id: android:id/summary, class: android.widget.TextView, content-desc: , bounds: [171,645][402,690] >
< text: 面对面建群, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [171,756][391,821] >
< text: 与身边的朋友进入同一个群聊, resource-id: android:id/summary, class: android.widget.TextView, content-desc: , bounds: [171,821][600,866] >
< text: 扫一扫, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [171,932][303,997] >
< text: 扫描二维码名片, resource-id: android:id/summary, class: android.widget.TextView, content-desc: , bounds: [171,997][402,1042] >
< text: 手机联系人, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [171,1108][391,1173] >
< text: 添加或邀请通讯录中的朋友, resource-id: android:id/summary, class: android.widget.TextView, content-desc: , bounds: [171,1173][567,1218] >
< text: 公众号, resource-id: android:id/title, class: android.widget.TextView, content-desc: , bounds: [171,1284][303,1349] >
< text: 获取更多资讯和服务, resource-id: android:id/summary, class: android.widget.TextView, content-desc: , bounds: [171,1349][468,1394] >

至此,大功告成。

值得注意的是生成xml的时间大约是 2-4秒,一定要给足够了,否则还没生成,你就去导出肯定是失败的。
如果就模拟个几步每次都去生成,导出,解析xml的话太费时了,但,我们可以这样
首次加微信好友时,每次都这么来一遍,费时就费时吧。
然后将每个步骤的坐标都记录下了保存到本地ini,下次再来的时候直接读坐标即可。
什么?你说换个手机勒,坐标又对不上了。
–每个手机的型号都存一次不就行了,_,像下面这样:

5.效果图

最后,也是最重要的,没图没JB啊,好吧上图

6.demo源码下载

最最最后,最最最最重要的,没代码说个鸟。
https://download.csdn/download/qiangzi4646/10313730

7补充:一台PC 控制多台手机

只需要指定对哪台手机发送命令,在 adb 命令后加 -s <android 设备序列号>
使用命令 adb devices即可得到

例:

//打开android 设备序列号 为35b6e1d5  的手机的微信
adb -s 35b6e1d5  shell am start -n com.tencent.mm/.ui.LauncherUI

本文标签: 多台 电脑 手机 加微信 ADB