移动性能测试 “京东钱包” 体验报告

Mr. Bug · 2016年02月04日 · 最后由 奉先斩二爷 回复于 2017年03月01日 · 9763 次阅读
本帖已被设为精华帖!

We are Mr Bug ! We are App Bug Hunter !!!

目的

用评分的形式,通过:安全、性能、稳定三个方面去检测评估一款 APP。

活动简介

  • 主刀医生: Mr Bug 项目团队
  • 发起时间: 11 月 4 日
  • 发起方: 毛里求斯
  • 体检目标: 京东钱包 3.11.1
  • 体检项: 性能,安全,稳定

总分

总分为 61.54 * 33.3%(安全)+ 67.44 * 33.3%(性能)+ 84.0 * 33.3%(稳定性)= 70.99 分

体检结果概要

得分详细信息

安全

检查项 满分 得分 说明
本地数据敏感信息均经过加密 3.85 0.0 发现 cookies 数据库
本地数据没有明文存储的敏感信息 3.85 0.0 shared_prefs 目录下 MYINFO.xml 文件中暴露了用户名,如果是手机号的话就很麻烦
本地数据篡改检测 3.85 3.85 修改数据后,更换 xml 文件后应用没有提醒,但是会被覆盖掉
使用 https 7.69 7.69 网络连接主要有两类,一类是操作事件类,主要收集用户操作信息,采用 http ;另一类是业务类,主要是 app 的功能(登陆、注册、投资等主要操作),采用 https
不允许使用自定义 ssl 证书 3.85 3.85 把抓包工具的 ssl 证书加入到系统信任证书并设置代理后,所有 https 通讯均会失败(握手时会检查出使用的不是京东的证书)
敏感信息加密传输 7.69 7.69 所有包含敏感信息的网络包均通过 https 通道,且不支持第三方证书,难以解密
数据包防篡改校验(服务端) 7.69 7.69 由于无法篡改网络包,故此扫描项无法进行
数据包防篡改校验(客户端) 7.69 7.69 由于无法篡改网络包,故此扫描项无法进行
DNS 劫持校验 3.85 3.85
权限扫描,除少量与外部沟通的组件外其他组件不允许外部调用 7.69 0.0 扫描结果显示有 36 个 activity ,4 个 broadcast receiver 和 4 个 services 可被外部调用。
各 activity 接收空/具有非法值的 intent 后保持稳定 3.85 3.85 有些 activity 传入空 Indent 后回出现 NullPointException ,但应用会改为启动 MainActivity ,不会崩溃
content provider 防 sql 注入 3.85 3.85 content provider 不能被外部调用
content provider 防遍历文件 3.85 3.85 content provider 不能被外部调用
DEX 加壳保护,防止静态反编译直接获取源码 7.69 0.0 无防护,apktools 直接反编译
资源文件加密,防止直接查看或修改资源文件 3.85 0.0 无防护,可直接获取资源文件
反二次打包,使二次打包时无法成功或打包后的 apk 无法安装使用 7.69 0.0 无防护,可植入第三方代码重打包
so 文件保护,防止高级调试工具对 so 文件进行动态调试获取接口等敏感信息 3.85 0.0 未做防护,so 文件可反编译,可打断点调试
屏蔽日志输出流中的 info、debug 等信息 3.85 3.85
核心业务中无敏感信息在日志中输出 3.85 3.85

性能

检查项 满分 得分 说明
内存 不超过 80M 11.11 5.28 实际内存峰值为 122 M
流量 页面消耗不超过 200KB 11.11 9.44 实际页面消耗达到 230 KB
耗电量 每小时不超过 300 mAh 11.11 11.11 实际耗电量为 300 mAh
页面重绘 3x 和 4x 重绘不超过 1/3 11.11 0.0 实际 3x 和 4x 重绘超过 1/3 的页面有 20 个
无内存泄露 11.11 8.89 内存泄露点有 1 个
无内存抖动 11.11 6.67 内存抖动点有 2 个
帧率不小于 10 11.11 7.78 最低帧率为 7 fps
启动时间 热启动时间不超过 3s 11.11 7.16 综合时间取全新启动。启动时间为 6.1s
响应时间 关键业务响应时间不超过 3s 11.11 11.11 关键业务最大响应时间为 2.26s

备注:其中 内存抖动、内存泄露 采用的测试机为 小米 红米 Note1 ,其它项为 Mi3 联通版。详细内容请看 设备配置

稳定性

检查项 满分 得分 说明
弱网环境跑 monkey 异常概率低于万分 7 10.0 6.0 (ANR)异常 2 次
无网环境跑 monkey 异常概率低于万分 7 10.0 10.0 正常
正常网络环境跑 monkey 异常概率低于万分 7 30.0 30.0 正常
无后台进程应用持续运行 10 小时无异常情况 20.0 20.0 正常
系统 Cpu 占用率高于 80% 以上持续运行 5 小时无异常退出 10.0 8.0 (ANR)异常 1 次
在测试过程中无明显 crash,卡顿等等情况 20.0 10.0 测试过程中和跑 monkey 的时候经常性退出需要重新登录

由于篇幅所限,评分规则放在报告末尾的 附录。有兴趣的同学可以点击查看

Bug List

序号 类型 严重级别 描述
1 内存溢出 P0 拍立返时,点击拍照,屏幕卡在转圈 loading 界面,日志出现 out of memory
2 内存泄露 P0 MAT 分析内存情况时发现内存泄露嫌疑对象:com.wangyin.maframe.cache.ImageMemoryCache
3 其他体验问题 P1 在测试过程中经常出现要求重新登录,体验不是很流畅
4 内存抖动 P1 在用户余额页面切换至京东小金库模块会有明显内存抖动
5 内存抖动 P1 在使用扫一扫时,存在明显的内存抖动
6 界面重绘 P1 至少 20 个界面出现 3x 或者 4x 重绘
7 功能 P1 电影票 - 观看影片预告片,点击左上方关闭按钮,仍然在播放视频
8 功能 P1 在操作过程中至少遇见三次突然需要重新登录的情况
9 安全 P1 apk 包可直接被 apktools 等工具反编译得到源码与资源文件
10 安全 P1 反编译得到的源码,经过二次修改后可直接打包成新的 apk 文件,可注入病毒与广告
11 内存峰值 P2 在界面间频繁操作,内存占用峰值,达到 122M
12 帧率 P2 操作界面过程中,帧率一般在 10 以下,较卡顿
13 安全 P3 修改手势密码的界面可通过外部 indent 启动,若此时京东钱包在后台运行并处于已登录状态,将可直接修改手势密码,绕过界面上必须先输入登录密码才可修改手势密码的限制
14 启动时间 P3 启动时间较长,平均启动时间达到 6.1s
15 体验 P3 手势密码部分划较快时,可能出现中间经过的点没有滑到
16 安全 P3 反编译后,libWangyinCryptoLib.so 等加密库可直接断点调试
17 流量 P4 随机打开活动页面,流量最大达到 230kb
18 安全 P5 shared_prefs 目录下 MYINFO.xml 文件中暴露了用户名(若包含其他信息则可能出现泄漏)

总体结论

安全

好的地方:

  • 敏感数据网络传输使用 https ,且应用内自动校验服务端 ssl 证书,能有效阻止 dns 篡改、代理抓包等获取传输数据的手段。
  • 日志输出中没有敏感信息

不好的地方

  • 作为金融软件,没有对应用本身任何加壳、防重打包、防篡改资源文件、防反编译方面的保护。 甚至代码混淆也没有(更正:有代码混淆,只是程度还不是太高)。大大降低了攻击者制作恶意包的门槛。且经过团队成员尝试,确实能重打包出可正常使用的应用。

  • 本地数据库未加密,且存有部分敏感信息

  • 组件暴露过多,甚至连相当重要的修改手势密码的 activity 也是可以被外部调用的。这会导致用户在不知情的情况下被其他人修改手势密码。

性能

好的地方:

  • 耗电量不是太大
  • 关键业务启动时间在 3s 内

不好的地方

  • 内存峰值过大,超过 120 M

  • 发现 1 处内存泄露和 2 处内存抖动,内存管理不大理想

  • 页面重绘过多,导致帧率偏低,用户用起来不流畅

  • 启动时间过长

稳定

好的地方:

  • 应用总体比较稳定,Monkey 测试下 Crash 出现次数少。

不好的地方

  • 弱网下出现 2 次 ANR ,说明对弱网下异常数据包的处理能力有待加强。



附录

评分规则

安全

检查项 检查项说明 权重(该检查项基础分) 评分方式
本地数据敏感信息均经过加密 检查 /data/data/、/sdcard/ 及其他应用使用到的存储的数据是否经过加密,尝试使用主流解密方法进行解密 3.85 通过得所有分。不通过 0 分
本地数据没有明文存储的敏感信息 本地没有经过加密的存储数据均非敏感信息(如密码、金额、cookie、token) 3.85 通过得所有分。不通过 0 分
本地数据篡改检测 当手动篡改本地存储数据后,应用能检测到此篡改并自动修正并给出警告 3.85 通过得所有分。不通过 0 分
使用 https 使用 https 进行加密通信 7.69 通过得所有分。不通过 0 分
不允许使用自定义 ssl 证书 应用中校验 SSL 证书是否为此应用对应后台的 SSL 证书。由于 Android 可以通过设置信任第三方证书(如 fiddler 的证书),因此如果信任所有系统信任证书会造成 https 被解密。 3.85 通过得所有分。不通过 0 分
敏感信息加密传输 数据包中所有敏感信息加密传输(包括但不限于密码、金额、用户个人信息) 7.69 通过得所有分。不通过 0 分
数据包防篡改校验(服务端) 不接受一模一样的两个数据包(有可能第二个包是 replay 出来的),不接受手工更改过数据包参数的数据包(需要有个类似 CRC 校验的值检验数据包内容是否被篡改) 7.69 通过得所有分。不通过 0 分
数据包防篡改校验(客户端) 不接受一模一样的两个数据包(有可能第二个包是 replay 出来的),不接受手工更改过数据包参数的数据包(需要有个类似 CRC 校验的值检验数据包内容是否被篡改) 7.69 通过得所有分。不通过 0 分
DNS 劫持校验 接口地址若使用域名应校验服务器是否正确(例如每个数据包中包含自定义规则的 token )。若使用 ip 地址则此项直接通过。 3.85 通过得所有分。不通过 0 分
权限扫描,除少量与外部沟通的组件外其他组件不允许外部调用 使用 drozer 运行 run app.package.attacksurface ,检查允许外部调用的组件是否确实必须允许外部调用 7.69 通过得所有分。不通过 0 分
各 activity 接收空/具有非法值的 intent 后保持稳定 使用 drozer 运行 run app.activity.start --action --category --component 检查各 activity 接收空/具有非法值的 intent 后反应 3.85 通过得所有分。不通过 0 分
content provider 防 sql 注入 使用 drozer 运行 run scanner.provider.injection -a 检查是否存在 sql 注入漏洞 3.85 通过得所有分。不通过 0 分
content provider 防遍历文件 使用 drozer 运行 run scanner.provider.traversal -a 检查是否能遍历 content provider 的文件 3.85 通过得所有分。不通过 0 分
DEX 加壳保护,防止静态反编译直接获取源码 使用 apktool、apkIDE、Apk 改之理/androidkiller 进行逆向获取资源。DEX 有做加壳加固/有加入花指令更好,最终无法直接得到 Java 源码 7.69 通过得所有分。不通过 0 分
资源文件加密,防止直接查看或修改资源文件 使用 apktool、apkIDE、Apk 改之理/androidkiller 进行逆向获取资源。资源文件有做压缩加密等操作,无法直接查看 3.85 通过得所有分。不通过 0 分
反二次打包,使二次打包时无法成功或打包后的 apk 无法安装使用 使用 apktool 进行重打包。有对核心代码做高级混淆欺骗,使二次打包失败或打包后的 apk 无法使用 7.69 通过得所有分。不通过 0 分
so 文件保护,防止高级调试工具对 so 文件进行动态调试获取接口等敏感信息 使用 IDA、JEB 等工具进行动态调试。对 so 文件有加密或隐藏,防止被 IDA 等工具直接动态调试 3.85 通过得所有分。不通过 0 分
屏蔽日志输出流中的 info、debug 等信息 3.85 通过得所有分。不通过 0 分
核心业务中无敏感信息在日志中输出 3.85 通过得所有分。不通过 0 分

性能

设备配置

检查细则

检查项 检查项说明 权重(该检查项基础分) 评分方式
内存 不超过 80M 11.11 小于 80M 为满分,大于 80M,为 权重 *(1-(x-80)/80)
流量 页面消耗不超过 200KB 11.11 小于 200KB 为满分,大于 200KB,为 权重 *(1-(x-200)/200)
耗电量 每小时不超过 300 mAh 手机要处于未充电状态,测试场景分 3 个:1).高负荷操作 1 小时 (高频率使用或者跑 Monkey)。2).中等负荷操作一小时 (平时正常使用频率)。3).低负荷操作小时 (程序处于后台)。 11.11 小于 300mAh 为满分,大于 300mAh 为 权重 *(1-(x-300)/300)
页面重绘 3x 和 4x 重绘不超过 1/3 11.11 小于等于 2 个为满分,大于 2 个每个扣权重的十分之一分。超过 12 个零分
无内存泄露 11.11 0 个为满分,大于 0 个每个扣权重的十分之二分。超过 5 个零分
无内存抖动 内存是否发生抖动:这个地方要从两方面检测,一个是自然抖动,就是无任何操作情况下,是否发生抖动。第二个情况是点击才会出现内存突然增加或减少,频繁操作查看是否出现抖动。若发生抖动,与具有相同功能的其他 App 进行对比,如果对比 App 不发生抖动,则可认为待测 App 存在问题。 11.11 0 个为满分,大于 0 个每个扣权重的十分之二分。超过 5 个零分
帧率不小于 10 11.11 大于 10 为满分,否则为 权重 *(1-(10-x)/10)
启动时间 热启动时间不超过 3s 综合启动时间为全新启动,冷启动,热启动三项平均值 11.11 小于 4.5s 为满分,否则为 权重 *(1-(x-4.5)/4.5)
响应时间 关键业务响应时间不超过 3s 11.11 小于 3s 为满分,否则为 权重 (1-(x-3)/3)

稳定性

检查项 检查项说明 权重(该检查项基础分) 评分方式
弱网环境跑 monkey 异常概率低于万分 7 9.6K/s~19.8K 网络环境进行 monkey 测试,随机事件数量大于 100 万运行时间大于 5 小时 10.0 通过基础分为权重,异常一次扣 2 分。不通过 0 分
无网环境跑 monkey 异常概率低于万分 7 无网进行 monkey 测试,随机事件数量大于 100 万运行时间大于 5 小时 10.0 通过基础分为权重,异常一次扣 2 分。不通过 0 分
正常网络环境跑 monkey 异常概率低于万分 7 正常环境进行 monkey 测试,随机事件数量大于 100 万运行时间大于 5 小时 30.0 通过基础分为权重,异常一次扣 2 分。不通过 0 分
无后台进程应用持续运行 10 小时无异常情况 20.0 通过基础分为权重,异常一次扣 2 分。不通过 0 分
系统 Cpu 占用率高于 80% 以上持续运行 5 小时无异常退出 10.0 通过基础分为权重,异常一次扣 2 分。不通过 0 分
在测试过程中无明显 crash,卡顿等等情况 20.0 通过基础分为权重,异常一次扣 2 分。不通过 0 分

该文章版权归TesterHomemrbug团队所有,转载请注明出处

共收到 73 条回复 时间 点赞

太牛逼!

太牛逼,估计我们的 app 更差

太暴力

各种扒裤衩

专业的测试。。。试问这些预定义的参数值是怎么来的?

太牛逼!!

牛叉,太专业了

ORZ...

给力啊! 太专业了

专业,牛逼,清晰透彻

学习了

匿名 #12 · 2016年02月04日

太专业了,能否介绍一下具体用的什么工具

专业,清晰!佩服


确认下,是否有混淆。

金融软件得努力啊,p0,p1bug 都有,好多检查项

膝盖碎了。。。

学习了! 感谢分享。

希望整个支付宝的,以及微信支付的。让我们看看支付哪家最强!!!

#20 楼 @erick 这个么,最强不最强单靠这些也看不出来啊了

#15 楼 @lihuazhang 貌似主体是有混淆的。 不过捆了些 sdk 是没带混淆

#15 楼 @lihuazhang 已确认,是有代码混淆的。此处是笔误,正文已更正。

#5 楼 @fengzhou 你指的是哪些参数值呢?

好专业啊

#24 楼 @mrbug 比如内存不超过 80M ,帧率不低于 10;

求 drozer 的进一步分享。。。

#24 楼 @mrbug
报告做的很专业,但是我也有类似的问题:

比如为什么要求内存不超过 80M,为什么要求页面流量消耗不超过 200KB,为什么要求耗电量每小时不超过 300 mAh?
再比如检查稳定性的,为什么跑 monkey 的时候要跑 5 个小时,为什么无后台程序要运行 10 个小时,为什么要求系统 Cpu 占用率高于 80%,以及倒数 2 3 项并未说明如何操作算 “持续运行”,究竟只是打开 app 放在那里还是在跑着脚本?

我觉得在不把这些参数说明白的情况下,就算拿出了测试报告也很难说服开发进行优化。

#28 楼 @chaos1001 说服开发优化 就得提出解决方案,所以我一直都认为做这种专项测试就应该开发自己做。

这是用 Mokey 测试出来的?还是 Appnium?

#26 楼 @sziitash
#28 楼 @chaos1001 这些标准是参考一些大公司(如 58 ,阿里)内部标准制定出来的。

#30 楼 @dftx511619 除了稳定性使用了 Monkey 外,其他主要是人肉测试。

#27 楼 @rickyzhan 我们用的都只是基础功能,网上有很多资料,建议去看这些资料。

#30 楼 @dftx511619 额。。。。。monkey 的 n 转移到了 appium 上???另外你问的是哪个?上下文呢?

#29 楼 @lihuazhang 还有一种方法可以说服开发优化,那就是让他们背 kpi = =+

真是厉害呀,这是我看到过的最有内容的报告。学习了

#32 楼 @mrbug 这份报告出来,需要使用多少人肉测试啊

厉害!膜拜

太专业啦,学习!🐮啊

膜拜膜拜膜拜 !

不让人好好过年了

太牛! 学习了

厉害!膜拜

#28 楼 @chaos1001 一些是根据业务生成的 SLA 标准,需要基本功和理论知识,不过这里的一些我觉得也不是很认同。

做的很牛,覆盖点炒鸡多,不过内存抖动和 so 文件保护等问题 提出,程序也不会修的,但重绘等是会修改的。

弱弱问一下,这个体验报告,几个人搞,共搞了几天? -__.-

太强大了,膜拜!
如果是 IOS 系统,能收集到这么多数据吗?

报告中有些指标值得商榷:
内存 不超过 80M,这个为何要写死,单个应用程序最大内存限制,按硬件配置不同而不同,可动态获取:adb -s $udid shell getprop dalvik.vm.heapgrowthlimit
帧率不小于 10,我没记错的话应该是 60fps
内存抖动,我理解的内存抖动,GC 过程基本上是剧烈的直上直下趋势,峰顶是尖的,文章中的图峰顶是平的,GC 的频率还是有一段间隔的,这可能是人为频繁切换某个功能导致的正常现象,当然还要结合手机的配置来看,配置低的 GC 也要相对频繁

#48 楼 @quqing fps 30. 60 是对游戏的。有规律抖动,有可能在不断分配释放,这里可能有问题。

#48 楼 @quqing fps 其实是一个不怎么直观的,而且是一个和操作很大关联的数值。一般来讲 30 的话是流畅,30-60 就是非常流程的过程了。所以单纯从 fps 来看的确没有太大的说服力

专业!!

好赞!!!

其实金融类的 app,我以为安全分数应该占得最重要的。感觉这份报告好细致,自己公司的产品,按照这么走估计连 20 都没有。。。

高大上啊

您好,请问一下耗电测试你们是怎么做的?用的物理工具设备电量检测仪器还是其他?我看你们测到好精准(耗电量 每小时不超过 300 mAh)

请问下耗电量测试是使用什么工具测试的啊~~

一个字,牛,好想知道每个检测点具体的测试方法。

写的太赞了,我想问下测试内存抖动和内存泄露的具体方法,测试工具是啥

正常网络环境跑 monkey 异常概率低于万分 7。请问异常概率怎么看的?

个人觉得业内需要一些标准参考,这个很专业很详细,要是组件一个这样的测评团队,应该会对应用有很大的性能和体验的提升,赞,赞,赞,

一个 app 的质量基线应该可以参照这个定出来了

[本地数据敏感信息均经过加密 3.85 0.0 发现 cookies 数据库
本地数据没有明文存储的敏感信息 3.85 0.0 shared_prefs 目录下 MYINFO.xml 文件中暴露了用户名,如果是手机号的话就很麻烦]

上面这两项,在没有 root 的机器上,没有权限读取 cookies 和 shared_prefs 下的文件,想请教下,你们是如何获取这些数据的?

最近要测试支付组件,安全那一块可以直接拿来参考了- -

monkey 的异常概率是如何计算的,能告知一下吗

牛逼!值得学习,如果大部分能用自动化来实现就更好了

想问下启动时间中:全新启动和冷启动有啥区别?

大赞!收藏啦,感谢分享

电量的具体测试方法是怎么样的

大赞!!!!学习了~

匿名 #71 · 2017年01月09日

牛!您好,想请教两个问题
(1)上面评论中说 一些性能测试的指标是: “这些标准是参考一些大公司(如 58 ,阿里)内部标准制定出来的”,这个标准的文档或者链接方便透露一下吗?
(2)性能指标中有一项 “页面重绘 3x 和 4x 重绘不超过 1/3”,这句话什么意思啊?对这块毫无概念,求教,谢谢

能给个 Mr Bug 联系方式吗?

膝盖碎了一地啊

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册