标题里,2017年5.13做的在api level 23的模拟器上的结果,每行是一个apk,成功的有截图(png),或者无法安装(not_installed)或者闪退(bad),点击即是log 我们用这套全自动流程回归,并确保我们的质量,目前5.0+系统上闪退率为0,这里看到很多无法安装是因为用了x86模拟器;4.4比较挫,在修复;整个流程吃满12核cpu,32G内存的小服务器,需要50分钟左右
全自动管理一堆模拟器一般大家都用Android Studio,点击AVD Manager,额然后。。。 不,我们要全自动化
看一下所有Android工具链都是可以命令行执行的,从安装系统镜像,到造一个模拟器配置,到创建sd卡,到启动emulator,因为Google内部,也有一套类似我们的全自动模拟器headless链。但是!但是!这套命令行特别难用,每次都要看一遍文档,所以我做了个包装,代码我放在这里了:https://github.com/appetizerio/haem
Headless Android Emulator Manager (haem)Terminology: 只要记住四个概念target - something like android-19 android-23 目标平台,比如android-19, android-23abi - x86 x86_64 armeabi-v7a or arm64-v8 ABI,就是x86还是ARM,就这四种选择avd - an arbitrary name for an Android Virtual Device (AVD) 模拟器配置名port - every emulator listens on a local port, which can be inferred from its adb serialno, e.g., emulator-5444 模拟器的端口,比如emulator-5444端口对应就是5444Usage: haem.py [OPTIONS] COMMAND [ARGS]... 好了,很简单,命令,参数和git一样Options: --help Show this message and exit.Commands: check 确认你的环境能否跑模拟器,没有参数 create 创建一个模拟器配置 参数 AVD TARGET 见上 delete 删除一个模拟器配置 参数 AVD install 安装一个TARGET list 列举现在已经创建的模拟器配置 running 用adb devices报告现在运行的模拟器 start 启动模拟器 参数AVD stop 停止模拟器 参数PORT如果对细节感兴趣的,看看这个的代码就知道了,Python的,都是stackoverflow上行之有效的方法(比如好好退出我找了一阵子)
有了这个,一个脚本启动一麻袋模拟器(要记得自己的内存)
怎么全自动检测APP安装后首屏启动有没有闪退这个,有些坑
安装adb安装再普通不过了,注意了,>=21(5.0)的时候要动态授权,所以最好在安装时用上-g,代码如下,不翻译了
- <font color="#b0b2b0" face="Menlo, Monaco, Consolas, Courier New, monospace"><span style="font-size: 12px; letter-spacing: 0.45px; line-height: 18px; white-space: pre-wrap;"><i># d 是设备串号,outpath是apk路径
- opts = "-g " if int(apilevel) >= 21 else "" # grant all runtime permissions for api>=21
- install_info = subprocess.check_output('adb -s %s install %s%s' % (d, opts, outpath), shell=True)</i></span></font>
复制代码安装可能失败,找install_info里面有没有Failure
启动清了logcat再启动,这个Monkey命令就帮你省了activity名(很多人会用am)
- # stage 2.2: clear logcat
- subprocess.call('adb -s %s logcat -c' % (d, ), shell=True)
- # launch it
- subprocess.call("adb -s %s shell monkey -p %s 1" % (d, pkg), shell=True)
复制代码启动后12秒一般就够了,然后抓回来logcat,-d打印到屏幕走人
- <font face="Menlo, Monaco, Consolas, Courier New, monospace"><span style="font-size: 12px; letter-spacing: 0.45px; line-height: 18px; white-space: pre-wrap;">logcat_info = subprocess.check_output('adb -s %s logcat -d' % (d, ), shell=True)</span></font>
复制代码 检测有没有闪退