天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。
从前面几个小节我们知道ADB命令行客户端是存在与主机端的一个命令,用户可以使用该命令来发送服务请求到ADB服务器,ADB服务器再判断该服务请求是主机服务请求还是本地服务请求来决定是否应该将请求传送给远程adbd守护进程进行执行。
在测试过程中,我们经常会用到ADB这个命令行客户端来辅助测试,那么我们这里就对我们经常会用到的命令进行学习和实践。
ADB命令之-列出所有设备信息:”adb devices -l”。
该命令的作用是将所有连接上来的安卓设备的基本信息给列出来,比如该设备的设备id,有了该id后我们编写脚本的时候就可以在MonkeyRunner类的waitForConnection中指定该id来建立MonkeyRunner后台和目标安卓机器的连接。
图4-4-1 列出所有设备信息
ADB命令之-指定一个设备进行通信:”adb -s”。
如上面列出来的信息中显示有多个设备挂载上了主机,那么我们如何才能发送一个命令到想要的一个设备上面了,比如进入到目标设备的交互shell。这个时候我们就可以通过”-s”选项来指定目标设备的设备id来指定想要连接的目标设备来发送想要的命令了,比如”adb -s 192.168.1.103:5555 shell”。下图显示了该命令发送后的结果,红色圈起来的部分代表已经进入到目标安卓机器的交互shell。
图4-4-2 发送命令到指定目标设备
当然,如果当前挂载上来的只有一个设备的话,你也可以不知道ing任何设备就能发送命令。但如果有多过设备而没有指定目标设备的话,命令会因为不知道发送到哪个设备而报错:
图4-4-3 发送命令到没有指定的设备的错误输出
ADB命令之-通过TCP连接目标设备。
有时候可能你不想通过USB线直接连上你的主机来进行测试,因为USB连接毕竟是物理连接,在测试运行过程中可能你不小心动了下USB连线就会导致整个测试需要重头再来。这个时候你就可以考虑使用TCP协议来连接你的目标安卓设备了。但连接之前,你需要先在USB有线连接的基础上保证目标安卓机器上的adbd有在监听默认TCP端口5555,否则主机端是不能连接上adbd的(当然你也可以指定adbd去监听其他TCP端口,只是这样的话,主机端就需要指定该端口进行连接了)。默认情况下adbd是没有开启该TCP端口监听的。
我们可以通过往目标安卓机器发送“adb shell getprop service.adb.tcp.port”命令去检查adbd是否有设置监听任何TCP端口,安卓的getpropr命令是去获取一个系统属性,这个在上一章我们已经描述过,这里指定的”service.adb.tcp.port”这个系统属性指的就是adbd监听的TCP端口。当然,如果你对linux命令比较熟悉的话,也可以直接发送‘adb shell netstat|grep 5555”命令去检查当前是否有任何服务在监听该端口。这里给出当没有设置监听的时候的两个命令的输出结果如下:
图4-4-4 判断adbd是否有监听TCP默认端口
这个时候我们就需要把”service.adb.tcp.port”这个属性设置成默认监听端口5555,需要发送的命令是”adb shell setprop service.adb.tcp.port 5555”。当设置好该监听端口后我们再通过上面的两个命令去查看该端口是否有起效:
图4-4-5 adbd默认TCP监听端口已打开
下一步我们要做的就是获得安卓目标设备的IP地址了,可以通过发送命令”adb shell netcfg”来获得:
图4-4-6 获得目标安卓机器ip地址
最后我们就可以通过”adb connect”命令来连接上指定的ip地址所表示的安卓设备了,下图给出了连接前后的”adb devices -l”列出来的连接上来的设备信息对比,可以看到比连接前多了个已IP:port为设备id的安卓设备信息:
图4-4-7 连接前后设备列表对比
ADB命令之-端口转发
用户可以通过ADB命令行客户端的端口转发选项把一个本地端口转发到目标安卓设备的对应端口,这样本地应用就能直接跟本地端口进行通信,其效果有如直接跟远端对应端口进行通信。比如我们可以将本地4939端口设置成对目标安卓设备的ViewServer服务监听端口4939的转发,这样我们就可以直接操作该本地端口进行ViewServer通信了。下图显示了如何通过”adb forward”命令对该端口进行转发,然后通过”adb forward --list”命令将所有设置了端口转发的连接给列出来。
图4-4-8 端口转发命令示例
ADB命令之-安装应用
可以通过“adb install”命令将指定路径的安装包安装到目标安卓机器上面,请看下图示例:
图4-4-9 安装应用命令示例
ADB命令之-卸载应用
可以通过”adb uninstall”命令卸载指定包名的应用。通过安卓系统的”pm”包管理命令”pm list packages”可以列出所有已经安装的包名,然后找到需要卸载的应用包。
图4-4-10 列出所有已安装应用包
在找到需要卸载的应用包后就可以通过”adb uninstall”命令将其卸载掉了,请看下图:
图4-4-11 卸载应用命令示例
ADB命令之-推送文件到目标设备
通过”adb push local remote”命令可以把本地local的一个文件推送到目标安卓设备的remote这个地址下面。下例就是通过该命令把本地的NotePade.apk命令推送到远程设备的”/data/local/tmp/”这个目录下面,并最终通过”ls”命令把该文件列出来:
图4-4-12 push文件示例
ADB命令之-下拉文件到本地
有时我们需要从目标安卓设备下载一些文件到主机这边,比如需要分析系统log的时候。这时我们就可以通过”adb pull remote local”命令将远程remote路径指定的一个文件下拉到本地local指定的位置。下图显示了将远程“/data/local/tmp/1.png”这个文件下拉到本地当前目录的命令示例:
图4-4-13 push文件示例
ADB命令之-实时查看logcat记录
可以通过”adb logcat”命令来查看logcat打印的实时调试信息,方便我们在开发的过程中调试系统问题。下图给出了”adb logcat”命令的一部分打印输出:
图4-4-14 adb logcat 输出示例
ADB命令之-发送安卓系统shell命令
最后描述的一个命令就是”adb shell”命令,上面其实我们已经见识过它的威力了。如果”adb shell”命令后面没有加其他命令,那么就会进入到安卓交互式shell,其效果跟我们直接在安卓命令行终端跟安卓系统进行交互没有任何区别。如果“adb shell”命令后面跟着一个安卓系统的shell命令,那么该命令执行完后会立即返回,并不会进入交互式shell。这里不可能对安卓系统的所有命令进行描述,我们只能在今后碰到的时候针对性的进行描述。
——— 未完待续———
作者:天地会珠海分舵
微信公众号:TechGoGoGo
微博:http://weibo.com/techgogogo
CSDN:http://blog.csdn.net/zhubaitian