老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 2
第一步:连接上目标安卓机器。
代码3-2-1 增加日记 - 连接设备
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
#Step 1: Connect to the target device
device = MonkeyRunner.waitForConnection(30,"192.168.1.102:5555")
这一步我们在上一节已经看过了,所以不详谈,如果不记得的请大家返回上一节。
第二步:确定连接上的目标安卓设备就是我们想要的设备。
代码3-2-2 增加日记-确保目标设备是想要的
#Step 2: Make sure that the device connected is as what we expected
ret = device.getSystemProperty("ro.serialno")
assert ret == "HT21ATD05099"
通过MonkeyDevice提供的getSystemProperty方法来获得序列号,然后在第8行使用断言来判断该序列号是否是预期的序列号。
第三步:确保目标安卓设备已经安装好NotePad这个应用,如果没有的话就安装上。
代码3-2-3 增加日记-安装应用
#Step 3: Check whether the NotePad application has already been installed
retPackage = device.shell("pm list packages | grep " +
"com.example.android.notepad")
#value return for "pm list packages" is with format like "package:com.example.android.notepad"
if retPackage !="package:" + "com.example.android.notepad":
ret = device.installPackage("/Users/apple/Documents/workspace-luna/MonkeyRunnerDemo/app/NotePad.apk")
assert ret == True
这里主要涉及了MonkeyDevice的两个方法的使用。第一个就是shell这个方法。这里使用该方法的目的是发送”pm list packages”命令到目标安卓机器去查询需要的应用的包名是否已经在系统上存在,如果已经存在的话就代表该应用已经在系统上安装上了,否则就需要调用MonkeyDevice的第二个方法installPackage来把主机指定路径的应用包推到目标机器然后进行安装。这里检查NotePad应用的包名是否存在完整命令是”pm list packages|grep “com.example.android.notepad”,其中pm就是安卓上面专门用来对应用包进行管理的命令工具,管道前一部分的意思是用pm命令把所有的已经安装的应用的包名给列出来;管道后一部分的意思是在所有的包名中查找目标应用NotePad的包名”com.example.android.notepad”。其实这个命令的返回跟我们在主机命令行中执行”adb shell pm list pakcages|grep “com.example.android.notepad”是一样的。下面我们比较没有管道后面一部分把其他包过滤的功能时候的输出和有管道后面一部分进行过滤之后的输出。 
图3-2-1 列出所有已安装包名
图3-2-2 只列出目标包名
从上图的对比大家可以看到如果没有加上过滤功能的话列出来的是一大堆已安装的应用的包名,加上管道后面的过滤功能后就只列出我们的目标应用NotePad对应的包名了。这些其实都是类Linux操作系统的基本命令使用知识了。
这里需要注意的是pm命令返回来的目标应用的包名信息前面是多了一个标识字串”package:”的,然后才是真正的包名。所以在13行判断返回来的包名和预期的包名是否是一样的时候就需要对这个标识字符做一些处理。
如果目标应用的包名不存在于目标系统上面的话,那么就在14行调用MonkeyDevice的installPackage方法来把参数指定的主机本地路径的apk安装到目标安卓机器上面。
最后15行就用断言判断该命令执行是否成功,也就是安装是否成功,如果失败的话会抛出异常。