51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2631|回复: 4
打印 上一主题 下一主题

[转贴] 利用模拟器全自动检测 APP 在全 Android 版本上是否会首屏闪退

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-5-27 13:57:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 测试的味道 于 2017-5-27 14:16 编辑

用途:作为最基本的常规测试,全自动,用模拟器,4.4-7.0,开发包/混淆后的包会不会首屏闪退
会提到的小技术:
  • 怎么全自动检测APP安装后首屏启动有没有闪退
  • 怎么自动管理一堆4.4-7.0的模拟器, 然后拿个开发包逐个系统自动安装、启动、授权、甚至简单的交互
为什么做这个Appetizer质量监控对APK进行DEX代码插桩,然后插装包运行时能监控质量(crash, http,卡顿等等),DEX代码插桩是一个很底层的技术,大家有个疑问,插桩后会不会闪退啊,你们怎么确保这个事情的。我们的流程是这样的:
  • 我们的质量监控代码托管在GitHub上,凡是commit到master(意味发版),触发webhook到我们的持续化集成服务器,自动pull,build
  • 我们保存了生产中的APK文件,会自动用这个新质量监控插件,全部插桩一遍,如果插桩失败(基本没有)会立即发邮件
  • 我们的持续化集成服务器没有显示器(叫headless server),会自动启动4.4-7.0 模拟器N台,然后每一个APK进行安装、启动、授权,检测有没有首屏闪退
  • 所有闪退或者其他问题,会自动出报告,搜集logcat,apk信息,发邮件,然后才由人工参与,这个全自动过程结果如下:标题里,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链。但是!但是!这套命令行特别难用,每次都要看一遍文档,所以我做了个包装。

Headless Android Emulator Manager (haem)Terminology:
  1.   Headless Android Emulator Manager (haem)
  2. Terminology:  只要记住四个概念
  3. target - something like android-19 android-23 目标平台,比如android-19, android-23
  4. abi - x86 x86_64 armeabi-v7a or arm64-v8 ABI,就是x86还是ARM,就这四种选择
  5. avd - an arbitrary name for an Android Virtual Device (AVD)  模拟器配置名
  6. port - every emulator listens on a local port, which can be inferred from its adb serialno, e.g., emulator-5444 模拟器的端口,比如emulator-5444端口对应就是5444
  7. Usage: haem.py [OPTIONS] COMMAND [ARGS]... 好了,很简单,命令,参数和git一样

  8. Options:
  9.   --help  Show this message and exit.

  10. Commands:
  11.   check  确认你的环境能否跑模拟器,没有参数
  12.   create 创建一个模拟器配置 参数 AVD TARGET 见上
  13.   delete 删除一个模拟器配置 参数  AVD
  14.   install 安装一个TARGET
  15.   list 列举现在已经创建的模拟器配置
  16.   running 用adb devices报告现在运行的模拟器
  17.   start 启动模拟器 参数AVD
  18.   stop 停止模拟器 参数PORT

  19. 如果对细节感兴趣的,看看这个的代码就知道了,Python的,都是stackoverflow上行之有效的方法(比如好好退出我找了一阵子)

  20. 有了这个,一个脚本启动一麻袋模拟器(要记得自己的内存)
复制代码
怎么全自动检测APP安装后首屏启动有没有闪退
  1. 这个,有些坑
  2. 安装

  3. adb安装再普通不过了,注意了,>=21(5.0)的时候要动态授权,所以最好在安装时用上-g,代码如下,不翻译了

  4. # d 是设备串号,outpath是apk路径
  5. opts = "-g " if int(apilevel) >= 21 else "" # grant all runtime permissions for api>=21
  6. install_info = subprocess.check_output('adb -s %s install %s%s' % (d, opts, outpath), shell=True)

  7. 安装可能失败,找install_info里面有没有Failure
  8. 启动

  9. 清了logcat再启动,这个Monkey命令就帮你省了activity名(很多人会用am)

  10. # stage 2.2: clear logcat
  11. subprocess.call('adb -s %s logcat -c' % (d, ), shell=True)
  12. # launch it
  13. subprocess.call("adb -s %s shell monkey -p %s 1" % (d, pkg), shell=True)

  14. 启动后12秒一般就够了,然后抓回来logcat,-d打印到屏幕走人

  15. logcat_info = subprocess.check_output('adb -s %s logcat -d' % (d, ), shell=True)
复制代码

  1. 检测有没有闪退

  2. 先贴代码

  3. # d是设备串号,pkg是apk的包名
  4. wininfo = subprocess.check_output('adb -s %s shell dumpsys window windows' % (d, ), shell=True)
  5. # stage 2.4: check if the app activity is focused
  6. launched = False
  7. for l in wininfo.splitlines():
  8.     if 'mCurrentFocus' in l and 'Application Error' in l:
  9.         launched = False
  10.         break
  11.     if 'mCurrentFocus' in l or 'mFocusedApp' in l:
  12.         launched = launched or pkg in l
复制代码
首先 dumpsys window windows这个命令会输出目前系统一层层的窗口层次(比如有launcher,弹出框什么的),不详细解释了,有兴趣的可以去看一下,比较直观
重点是mCurrentFocus(当前最上面的那个框)和mFocusedApp(当前最上面的那个APP)
有几种可能:
  • APP启动了,正常,那么应该顶层就是它这行应该都包含APP包名
  • APP启动了,闪退了,啥都没,回到桌面了,那么mCurrentFocus应该变成了桌面
  • APP启动了,碰到个坑,crash了,弹框说"应用程序已经退出",这是个坑,这时两行还都是APP包名,和情况1差别是mCurrentFocus那行会告诉说有一个弹出框,名字叫Application Error因为安装时会授权runtime permission,所以避免了很多首屏弹框要权限好了,聪明的你整理一下逻辑就是上面那些了针对APP还可以在启动后稍微自动点几下来到主界面,都是脚本活
后记
  • 人力可能也不复杂,但是有自动化方案的时候,我们团队总是选择花时间做自动化:1. 人做机械的事情会出错 2. 不要和电脑抢活干 3. 电脑很笨人很聪明,人做电脑不能做的事情
  • 质保流程可以长一点,但是自动化一点,一点点累积起来的是质量也是专业
  • 有兴趣可以去看看我们实战里面用插桩
  • 这个流程还在持续更新中,haem也是会增加新功能,意见建议一直在学习
  • 周末深夜分享没有泡面这样好么
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-11 07:42 , Processed in 0.065049 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表