Android 系统服务在测试流程中的应用

本文基于uiautomator1.0测试脚本介绍自动化测试技术的应用,介绍如何获取Context、通过app包名启动app、数据库的应用、App运行监控、uiatutomator1.0中文录入支持。

shell 进程的 Context

类似uiautomator1.0通过shell启动的应用是无法直接获取Context的,但是有些Android服务是依赖于context的,shell应用虽然不自带context,但是可以通过ActivityThread.systemMain()初始化一个shell类型的context。通过该context可以使用PackageManager、ActivityManager,sqlite等服务,但是需要动态权限和app权限的操作是无法正常调用的。下面就是该Context的具体应用介绍。

PackageManager 运用

通过Context获取PackageManager可以获取系统安装应用的信息以及已安装应用的启动Intent。

数据库应用

使用数据库方式与普通应用一致,流程是首先创建SqliteHelper继承SQLiteOpenHelper,处理数据库创建、升级的表结构更新逻辑,需要注意的是构造参数中databaseName要使用绝对路径并且context不能为null。

设备当前 App 运行状态监控

我们在测试过程中有时需要统计相关Activity展示的信息,并统计何时打开了页面并停留多长时间,以及应用的crash、ANR、系统ANR等信息。我们可以通过接管系统ActivityController来实现。

接管系统ActivityController需要实现IActivityController.Stub接口,并在回调方法内实现应用Activity切换、应用崩溃、应用ANR、系统ANR等异常的统计业务,通过ActivityManager#setActivityController方法接管系统服务,示例代码如下:

运行 app 的进程监控

测试过程中被测app有可能会关联多个pid,如果你想统计被测应用的进程执行周期那么下面的内容会对你有所帮助。

我们可以通过ProcessObserver根据pid统计process执行周期,并通过uid与app进行关联来实现统计指定应用的process变化周期。示例代码如下:

uiatutomator1.0 录入中文

大家都知道uiatutomator2.0支持中文录入,uiatutomator1.0原声是不支持中文录入的,其实Android自动化测试框架的中文录入是通过AccessibilityNodeInfo来实现文本录入的,但是系统版本过低时是不支持直接录入中文的,下面的代码是基于AccessibilityNodeInfo实现中文录入的逻辑