51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3672|回复: 2
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-6-27 17:07:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 悠悠小仙仙 于 2017-6-27 17:11 编辑

用途:作为最基本的常规测试,全自动,用模拟器,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进行安装、启动、授权,检测有没有首屏闪退
  • 标题里,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,代码如下,不翻译了

    1. <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路径
    2. opts = "-g " if int(apilevel) >= 21 else "" # grant all runtime permissions for api>=21
    3. 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)

    1. # stage 2.2: clear logcat
    2. subprocess.call('adb -s %s logcat -c' % (d, ), shell=True)
    3. # launch it
    4. subprocess.call("adb -s %s shell monkey -p %s 1" % (d, pkg), shell=True)
    复制代码

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

    1. <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>
    复制代码
    检测有没有闪退
  • 所有闪退或者其他问题,会自动出报告,搜集logcat,apk信息,发邮件,然后才由人工参与,这个全自动过程结果如下:[color=rgb(0, 105, 214) !important]


先贴代码

  1. # d是设备串号,pkg是apk的包名
  2. wininfo = subprocess.check_output('adb -s %s shell dumpsys window windows' % (d, ), shell=True)
  3. # stage 2.4: check if the app activity is focused
  4. launched = False
  5. for l in wininfo.splitlines():
  6.     if 'mCurrentFocus' in l and 'Application Error' in l:
  7.         launched = False
  8.         break
  9.     if 'mCurrentFocus' in l or 'mFocusedApp' in l:
  10.         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还可以在启动后稍微自动点几下来到主界面,都是脚本活

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2017-6-27 17:26:01 | 只看该作者
真机少的情况下,模拟器随起随用,全版本覆盖,喝口咖啡的时间就搞定,不用等兼容性报告,开发自己也可以用
真机可以用来开发调试,插上也能增加兼容性机型,即插即用
如果公司设备多,用云管理,那么可以固定一组用来测兼容,总而言之模拟器比较灵活(8.0来了),真机比较真(废话),搭配使用
是有模拟器打不开的,但是我们遇到的也不是非常多,百度sdk我们碰到过几个
对于机型多或者APP多比较有用,何乐而不为
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    昨天 07:25
  • 签到天数: 2772 天

    连续签到: 3 天

    [LV.Master]测试大本营

    3#
    发表于 2017-6-27 21:06:01 | 只看该作者
    感觉很强大!
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-9-21 05:47 , Processed in 0.066816 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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