android adb 功能,Android Adb调试功能漫谈

人不能停止奔跑,但是当人跑累了就应该停下来看看之前走过的路。

写篇技术文章还得文艺一把,其实就想把前些日子学习到的积累一下。

做Android开发的朋友都知道,我们开发时离不开Adb(Android Debug Bridge),比如从本地上传Apk然后用一句adb install /sdcard/..../abc.apk

来安装apk,再来一句adb shell am start -n com.example.hello/com.example.hello.MainActivity

来启动应用程序,其实这些命令都已经集成在IDE里面了。

Adb除了这些功能之外还有其他功能吗?

1. 截屏截图命令adb shell /system/bin/screencap -p /sdcard/screenshot.png

将截图复制到电脑盘中adb pull /sdcard/screenshot.png D:\Test\

2. 模拟按键操作adb shell inputusage: input ...

input text

input keyevent

input tap

input swipe

input text 往当前输入框里面输入文字

input keyevent 模拟输入(Home,返回,音量和各种字符的输入等等)

input tap 模拟手指在屏幕上的点击

input swipe 模拟手指在屏幕在的滑动

有上所有的输入都是针对全局的,不能指定对某个App进行输入,注意这个命令里面包含shell说明input是android系统里面的内置命令,经过测试input命令在各版本当中的差异很大,有的版没有tap操作,有的版本没有swipe操作,由于当时测试的时候没有记录的习惯,已经不记得细致的差异了

3. 发送原始输入的事件adb shell getevent

adb shell sendevent

这个命令可以模拟出所以的按键事件,有一些Android上的按键脚本工具上会用到这套命令,录制和播放就是用的这两个命令,但是如果我为了做Android上的测试,只写脚本,不要录制怎么办(不同的机型和版本上面event的组合差别很大,而且输入设备也不一样)?

上面这些命令经常被用到Android的自动化测试里面

296faefe3226

当然我们可以用强大的robotium,直接操作控件进行操作,这样当然更方便,我这边只是提供一种黑盒测试的思路,当我们没有程序源码时?当我们就想简单的操控Android设备时?

用另一种思路替换掉上面的命令

在Android测试里面还有另外一个工具叫Monkey Runner,用它的人非常少,因为非常不方便

不能直接操作控件

没有分析截屏的库,只能简单的判断两图是否完全相等来判定结果

但是也有优点

不需要源码做任何配合

操作是针对Android设备的全局操作,不受App限制(可以直接调用系统电话程序拨打电话)

截屏是截取的framebuffer,用Adb得先形成文件再下载起来,对IO损耗太大

这两个缺点足以让非常多的人抛弃它了

但是里面有几个库隐藏的功能非常强大,本人当时分析过的这一套的jar包(chimpchat.jar, common.jar, ddmlib.jar, guava.jar, monkeyrunner.jar),它能做到对于Android设备全局的

字符串输入

模拟各种按键输入

手指点击模拟输入

手指滑动模拟输入(步数,滑动执行的时间可以自定义设置)

这不是和上面的adb shell input一样的功能吗?是一样的,但是monkey的功能在各版本中都是一样,非常稳定,而且也不用去考虑adb shell sendevent在各版本,每种硬件上的差异化了

关键库chimpchat源码

296faefe3226

图1 关键代码块

关键函数

296faefe3226

图2 关键函数

蓝色框出来的代码不就是adb的常规功能,红色框出的代码不就是那几个模拟输入的函数?(更正:懒得重截图了,takeSnapshot是adb的常规功能,但是实现方式不一样,这里面是直接获取framebuffer)

不过这个包里面没有提供本地AdbServer的代码,只有AdbClient代码,也就是用这个包去调用adb功能必须先本地运行一个AdbServer。

296faefe3226

图3 Monkey 功能函数

再来看这一段,里面就是模拟输入的详细实现,keyDown和keyUp组合实现一次键盘输入,touch还分了up,down和move这样我们可以根据这几个函数定制很多自己的动作,上面的input tap和input swap能实现吗?哈哈,优势慢慢体现出来了。

296faefe3226

图4 两块功能的区分

从上图可以看出模拟输入函数和Adb的一些常用调试功能函数用的类不一样,也就是方式不一样,解释一下,上面有一个12399,其实本来是12345,我是为了测试改成12399了

296faefe3226

图5  code1

296faefe3226

图6 code2

296faefe3226

图7 Adb功能结构图

上面这段代码展示出了如何创建模拟输入功能实例,其实是在Andorid侧执行了monkey命令把监听端映射出来,我们连接该端口和monkey通信实现的模拟输入的功能,Adb的功能不多解释,文章太多了,也是AdbServer连接到Android设备的Adbd(Daemon)进行通信实现的,两部分功能实现原理类似,只是monkey功能(我们后面把模拟输入功能叫monkey功能)需要临时启动程序,而非守护程序。

用java实现Adb的功能而且更强

分析下来,其实用MonkeyRunner的一套jar包就可以实现adb的大部分功能(没验证过是不是所有的功能)、Adb没实现的monkey功能和传原始framebuffer的截屏功能  now just do it

引用包

这些包在 adt-bundle-windows-x86_64-'Date'\sdk\tools\lib 下面可以找到

296faefe3226

图8 引用包

不同sdk版本引用的包可能会有一些不一样,这个真正使用时得自己慢慢调试

296faefe3226

图9 code3

是不是有点意思了?哈哈,下一期讲些啥呢?用C++实现这些功能?啊?这也可以?我去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值