最近在看monkeyrunner,但是从开始看到最后真正的可以自动化的启动一个程序可真是经历了不少难题,最初连运行都起不来,网上各种文章也都是千篇一律的说要下载这个下载那个,但是怎么配置怎么运行都没有写清楚,搞了两天我才真正的调起程序,这里记录下也为和我有一样困惑的童鞋提供一些解决文案
一、使用前的准备工作,下载所需要的东西
1. Android sdk,JDK,SDK Manager 可以百度搜索“android SDK 下载”,搜索出来的第一项选择普通下载,千万没点高速下载,会捆绑流氓软件的,切记!
我这里也在百度网盘上共享了链接:http://pan.baidu.com/s/1mg84xQC 密码:l7i8
下载完这个包后,解压取出里面的sdk目录,并将里面的tools目录与platform-tools目录加入到环境变量PATH里,这个是为了可以在cmd下真接运行adb与monkeyrunner命令,安装包里的jdk-7u45-windows-i586.1454527248.exe
2. 下载SL4A 这个只要下载一个apk安装到手机里或者虚拟设备里
地址:https://code.google.com/p/android-scripting/downloads/detail?name=sl4a_r6.apk&can=2&q=
如果没法翻墙我也共享在百度网盘里了 链接:http://pan.baidu.com/s/1mgh0dtQ 密码:wooa
3. python_extras.zip 这个其实可以不下,但是你以后的使用中我敢保证你肯定会用的到的,相信我,github地址:https://github.com/damonkohler/sl4a 如果没有github工具那就直接点击右边的Download zip吧,
如果github访问也困难的话我也共享在百度网盘了
链接:http://pan.baidu.com/s/1nt1aPEL 密码:tt70
好了,要下载的基本上就结束了,下面一步一步地介绍如何使用
二、 在手机上安装sl4a,不管你用什么方式,adb install 还是用360手机助手或者豌豆,安装以后运行,第一次运行点击”accept”
在这个界面点击menu->Preferences,设置一下Server Port,这步也可以不设置,不设置的话就是以后每次端口都不一样,
返回再点击menu->View->Interpreters
在这个界面再次点击menu->start Server,如果是usb连接方式选择private
这时就有一个40999(也就是你刚才设置过的server Port端口)的server端
手机上的设置到此为止,接下来就开始在PC端上操作了
三、PC端上的设置
1. 添加一个环境变量 AP_PORT,值为9999
2. 进行adb端口 forward,第一个tcp端口是你刚才在环境变量里的端口号,第二个是你在手机的sl4a里设置的server port端口号
三、monkeyrunner的运行
1、交互模式下运行
在cmd窗口中输入monkeyrunner,前提是你已经将sdk中的tools目录加入到环境变量中的PATH中,如果没有加入就只能先pushd到tools目录下再运行monkeyrunner,这个东西一开始启动有些慢,耐心点,当出现>>>的时候说明已经成功启动了,
输入
>>> from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
这些就是python的语法了,理论上应该不会出现什么问题
再输入device = MonkeyRunner.waitForConnection()
waitForConnection是一个阻塞式方法,如果没有手机连接的话会一直等着,你也可以设置一个超时时间MonkeyRunner.waitForConnection(10) 表示超时时间为10秒。
连接成功后会出现>>>
现在就可以调用device的一些方法,如reboot,可以先爽一爽重启手机
四、自动化的调起360手机卫士
monkeyrunner的调用api为device.startActivity(component=’packageName/Activity')
那么现在问题来了,packageName好弄,但是这个Activity可就不好搞了,可以通过反编译apk文件,但这里使用sl4a中的android模块来搞到这个activity
解压将刚才下载的sl4a-master.zip,取出里面的\sl4a-master\python\中的python_extras.zip,再解压这个zip,cmd到这个目录下,先使用adb命令得到安装的包的package名字,输入pm list packages –3 -f
找到这样的一个package:/data/app/com.qihoo360.mobilesafe-2.apk=com.qihoo360.mobilesafe 后面的就是package名字
接下来获得activity名字
使用以下python代码
import android
import pprint
droid=android.Android()
apps=droid.getLaunchableApplications()
pprint.pprint(apps.result)
仔细找找,找到以下的字典元素,其中后面的u'com.qihoo360.mobilesafe.ui.index.AppEnterActivity'就为360卫士的StartActivity
u'\xa0360\u536b\u58eb': u'com.qihoo360.mobilesafe.ui.index.AppEnterActivity',
这样将上面的代码补充全
device.startActivity(component='com.qihoo360.mobilesafe/com.qihoo360.mobilesafe.ui.index.AppEnterActivity')
OK,到现在为止,就可以正常的自动化的启动程序了
五、如何通过monkeyrunner调用一个py脚本
将上面的代码写入到一个py文件中,我这里保存在autoStart.py,放在d根目录下
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
device = MonkeyRunner.waitForConnection()
if device:
device.startActivity(component='com.qihoo360.mobilesafe/com.qihoo360.mobilesafe.ui.index.AppEnterActivity')
启动cmd,输入monkeyrunner D:\autoStart.py 这里一定要加上具体的路径名,这样这个小的启动程序脚本就可以跑起来了!真TM不容易啊!
六、可能遇到的问题
1.在使用android的时候,会出现socket.gaierror: [Errno 11001] getaddrinfo failed错误
这个是因为没有开启sl4a的server,也就是上面的第二大步
还有可能是没有设置adb forward
解决办法 adb forward tcp:9999 tcp:40999
2.还是在使用android时候出现socket.error: [Errno 10061]
这个可能是你环境变量中没有设置AP_PORT
解决办法在环境变量中加入AP_PORT 值为9999