Android UiAutomator 入门教程(1)

| 分类 Android  | 标签 Android  UiAutomator 

0x00 说在前面

最近接触了这个对于我来说“新的东西”,乍一看上去,好像真是个新的东西,毕竟还是面向Android的,其实从本质上来说也并不是什么新的东西。还记得之前无聊的时候学习如何编写外挂,现在想想还是大学舒服啊,有大把的时间,想干啥就干啥,现在也只能忙里偷闲写写文字,总结一下得失。好了,回到正题,说到写外挂,以我了解到的主要有两种方式,一种是通过修改游戏内存数据从而改变人物属性或者技能效果等,当然这种方式最关键的还是如果寻找到目标内存地址,以及过掉游戏保护和系统检测,也是属于比较有技术含量的方式,不仅需要对操作系统有很深的理解,还需要熟练的编程技术。第二种就相对简单,但是简单也就意味着功能的局限性,就是通过模拟玩家操作从而通过电脑自动化的进行游戏,例如大家一起来找茬,就可以直接或者两张图片然后遍历对比将像素区别较大的地方标记出来就可以,另外一些策略性游戏也可以使用这种暴力的方式从而找到最佳的策略通过游戏。

再说到UiAutomator,其实原理就是类似第二种外挂的运行方式,本质也就是个模拟器,可以模拟人工所能完成的各种操作,从而实现繁琐功能的自动化。

0x01 环境搭建

一般的Android开发环境即可,IDE选择用Eclipse,当然Android Studio也行,不过其实开发过程中跟Android 编程并无太大关系,只是用到其中的一些库文件,就是一个普通的java工程项目。项目的创建过程大概如下。

  • 首先新建一个java项目,然后导入JUnit, uiautomator.jar, android.jar,第一个Eclipse中添加库就直接有,第二第三个需要添加外部库文件,路径一般位于android-sdk/platforms/具体版本目录下。
  • 环境配置第一步就已经全部完成,现在就可以开始进行代码编写了,编写的过程中可以使用一个很方便的工具,位于android-sdk/tools/uiautomator.bat目录下,双击即可运行。使用这个工具可以查看手机当前屏幕所展示的所有组件,包括布局,每个组件的text,description,resource-id等等。

这个有一个测试样例,功能是打开主界面上的微信,注意因为uiautomator本身就是一个模拟器,所以写出来的代码都是基本都是针对特定型号的手机的,当然也有可能支持不同类型的手机,具体还是得看人工在手机上操作的步骤是否相同,手机上的应用位置是否相同等等。


//所有UI自动测试都要继承UiAutomatorTestCase
public class MessageTestCase extends UiAutomatorTestCase {
	public void testDemo() throws UiObjectNotFoundException{
		//获取UiDevice对象
		UiDevice device = getUiDevice();
		
		//点击home键操作
		device.pressHome();
		
		//我们使用content-desc属性来定位到微信,可以换成其他主界面上存在的应用
		UiObject weChat = new UiObject(new UiSelector().description("微信"));
		weChat.clickAndWaitForNewWindow();  //模拟点击
	}
}

  • 项目编写完成之后,就开始编译运行。首先打开cmd,进入android sdk/tools/目录下,运行android.bat create uitest-project -n MessageTestCase -t 1 -p "d:\workspace\MessageTestCase",两个MessageTestCase都是项目名,而不是类名。运行完后会在项目路径下生产build.xml文件。
  • 然后编译需要安装一下apache-ant,下载地址apache-ant。安装完后进入build.xml文件目录下,运行apache-ant安装目录\bin\ant build,运行完后会在工程目录的bin目录下生产MessageTestCase.jar文件。到这里电脑上的编译过程就结束了,下面开始接入手机,并在手机上运行我们的程序。
  • 当然编译之前接入手机也是可以的,确保adb添加到了系统环境变量中,先进入bin目录下,然后运行adb push MessageTestCase.jar /data/local/tmp,这一步是将jar包传输到手机上。
  • 最后一步就是在手机上运行了,adb shell uiautomator runtest MessageTestCase.jar -c MessageTestCase。运行成功就会看到手机上首先会回到主屏幕然后打开主屏幕上的相应程序。

另外有一个小技巧,那就是每次都输入这么多命令,是个人都会觉得很烦,尤其是调试的过程中经常修改程序。所以我会将这些步骤写成几个批处理文件,原本想写成一个,结果运行几次发现有几条命令是运行完就直接退出了cmd后面的都没法执行,所以只得分开了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
首先是第一个create.bat
color A
d:
cd d:\Android\sdk\tools
android.bat create uitest-project -n AutoWeChatTest -t 1 -p "d:\workspace\AutoWeChatTest"
pause

然后是build,bat
color A
d:
cd d:\workspace\AutoWeChatTest
d:\apache-ant-1.9.4\bin\ant build
pause

最后是run.bat
color A
d:
cd d:\workspace\AutoWeChatTest\bin
adb push AutoWeChatTest.jar /data/local/tmp
adb shell uiautomator runtest AutoWeChatTest.jar -c AutoWeChatTest -e username xxx -e password yyy
pause

另外,在最后一个run.bat中我们可以看到,可以通过-e加上参数向我们执行的类中传递参数,有几点需要注意的是,

  • 每一个参数前面都必须加上-e
  • 参数名要和值一一对应,而且值不允许有空格,即使用引号扩起来也没有用。
  • 参数的顺序没有关系,因为最终接收的时候都是按照参数名来获取值,一种类似map的形式。

例如上面的run.bat中传递的参数,我们在程序中就可以这么来获取

1
2
String user = getParams().getString("username");
String pass = getParams().getString("password");

这篇文章基本介绍了使用uiautomator进行开发的基本环境搭建,以及如何编译运行,最后介绍了一下参数传递的方式和注意事项,后面准备再写一篇,介绍一下如何使用uiautomator进行开发。


上一篇     下一篇