iOS APM性能统计 - 基础篇

Tips:若是未发布应用,可以利用Xcode自带的instruments工具,对我们的应用进行cpu占用、内存占用、FPS、循环引用、离屏渲染、卡顿、页面耗时、网络、启动时长等各个维度进行分析。若为线上应用,我们只能通过自行打点采集各个维度的信息,来进行性能分析。

一、性能统计维度

1.设备属性维度

  • OS类型
  • 广告标示符idfa (iOS14.5开始强制权限,iOS14.0-iOS14.5可强行读取idfa,14以下老方法)
  • 厂商标识符idfv (也可认为是应用维度)
  • 设备名称
  • 系统版本
  • 设备Machine
  • 运营商
  • 硬盘总容量
  • 物理内存总容量
  • 当前硬盘容量
  • 当前内存容量
  • 分辨率
  • 设备Model
  • 时区
  • 国家
  • 设备语言
  • 系统上次启动时间
  • 系统上次更新时间
  • 当前可用空间
  • 当前网络类型
  • 当前ip
  • 当前cpu使用率
  • 是否越狱标识
  • 当前电池电量
  • 当前屏幕亮度
  • 当前充电状态
  • gps开关状态
  • UserAgent
  • 最近一次定位坐标(需要定位权限)
  • ssid 当前wifi名称 (iOS13开始需要定位权限)
  • bssid 当前wifi的bssid(iOS13开始需要定位权限)
  • bundleSeedID

2.应用基本属性维度

  • 应用名称
  • 应用bundle id
  • 应用版本
    • BundleShortVersion
    • BundleVersion
  • 应用热更版本(若有)
  • 应用RN包版本(若有)
  • 业务灰度包版本(若有)
  • 小程序版本(若有)
  • 性能统计SDK版本
  • user id
  • session id
  • 自定义uuid(存储在keychain里)
  • 是否在后台
  • 应用运行时长
  • 当前应用商店地区
  • 当前应用商店商品货币类型

3.应用性能维度

  • 持续电量统计
  • 持续cpu使用率统计
  • 持续内存使用率统计
    • 各个模块、插件、大文件内存使用
    • 循环引用监测
  • 网络持续监测
    • 网络类型持续监测
    • 网络流量持续监测
    • 网络错误类型
  • FPS
  • 主线程卡顿监测
  • 页面渲染时长
  • 大文件存储监测
  • 闪退日志记录
  • 启动时间监测
    • 冷启动时间监测
    • 热启动时间监测
  • 全打点,每个函数耗时监测(线上不推荐)
  • Flutter、RN、web、小程序等问题日志(若有)

4.应用业务维度

  • 应用生命周期打点
  • 各个业务页面打点、停留时长打点
  • 用户行为打点(通过AOP,自动获取view的链路树打点)
  • 根据实际产品定制维度。。。
注意:由于苹果对标识设备、用户的行为监管越来越严,采集过多的设备信息会被苹果认为违规,会收到苹果的整改邮件通知。另外,中广协的CAID暂时不要对接,苹果审核时候会被劝退。

二、数据落地

0.设计理念

  • 性能统计SDK接入足够轻量、简单、无侵入
  • 策略配置灵活、易控制
  • 性能损耗低、绝不能影响主业务本身
  • 尽量不使用私有API,避免被苹果审核误判
  • 本地数据做好持久化,避免闪退时候写本地失败,使用mmap
  • 数据大小尽量小,可使用protobuf;另外部分数据可压缩上传
  • 数据需要加密传输
  • 上传数量策略灵活:部分点位实时上传、部分点位可以合并压缩后上传、断网重试等
  • 针对不同机型,有不同配置
  • 打点点位可以灰度、服务器下发
  • 配套监控、报警体系,实时跟进线上突发以及新功能问题
  • 全球化业务需要做到满足各国法规,国内三级等保、欧盟GDPR 等 ,隐私策略或是用户协议里需说明

1.数据采集

采集维度分为六大类:

  • 启动后打点记录一次性基本设备信息维度: 机型、系统版本、idfa等
  • 每次打点都需要包含的base维度:uuid、userid、会话id、sdk版本等
  • 持续性的性能监测维度:电量、cpu使用率、内存使用率、卡顿、网络相关等
  • 偶发性的统计维度:冷启动耗时、热启动耗时、闪退等
  • 业务维度:模块、页面打点、停留时间打点等
  • 自定义日志:自定义log等
{
     //base信息
     "timestamp":"事件产生时间(13位 毫秒)",
     "appId":"应用ID",
     "device":"设备型号",
     "sessionId":"会话id",
     "idfv":"应用开发商标识符",
     "advertisingId":"idfa",
     "deviceId":"自定义存keychain uuid",
     "sdkVer":"SDK版本号",
     "appVer":"应用版本号",
     "userID":"用户ID",
     ...  
     "deviceInfo":{
       ...
     },
     "crashInfo":{
       ...
     },
     "performanceInfo":{
       ...
     },
     "moduleInfo":{
       ...
     },
     "eventInfo":{
       ...
     }
}

采集时机:

  • 实时上传维度
  • 部分数据合并后择机上传
  • 突破某个阀值上传
  • 断网重试或是下次启动上传

2.数据合成、压缩、存储

  • 数据存储,若为实时上传类型,则不用存储端侧,若实时上传失败且重试机制情况下依然失败,则需要存储端侧;若为非实时数据,则需要存储端侧;择机上传;
  • 考虑到app意外退出,会有日志或是闪退信息无法存储端侧的情况,可以采用mmap方式存储日志;
  • 考虑到频繁的IO会造成性能上的消耗,我们需要对数据进行合并,且读写时候,需要参照当前机型的虚拟内存页的大小,老的机型是4KB。即每次读写都是按开辟4KB存储;
  • 考虑到上传数据的大小问题,可以考虑使用protobuf对数据进行压缩;另外,protobuf数据本地持久化的过程可以参照微信的MMKV设计;
  • 另外数据是否加密,可以酌情考虑
  • 端侧日志数据存储上限应针对不同硬盘大小设定

3.上传服务器

  • 上传失败重试机制
  • app闲时或是刚进入后台等时机,择机上传
  • https

4.数据分析处理

  • 数据上传到数据服务器,进行解压、处理、按业务维度进行处理
  • 根据具体业务进行多维度处理
  • 入库需要的数据,定时清理老日志文件

5.web仪表盘展示

  • 按应用维度、版本维度、系统维度、业务维度、动作维度、机型维度 等等进行展示;
  • 业务点击率、转化率等;
  • 按PV、UV、DAU、MAU、PCU、APA、ARPU等维度;
  • 异常、闪退维度;
  • 更多。。。

6.监控、报警体系搭建

  • 根据已有的维度以及数据,对线上业务或是新版本进行监控,比如初始化成功率、登录成功率、支付成功率、某个业务的点击或是完成率、在线用户数,针对不同时段给到一个上、下限,若是触发了边界值,则通过邮件、企业微信、短信或是报警电话等方式通知相关干系人;
  • 具体的监控以及报警体系以实际业务为基准定制;
  • 我们部门有买了小米75寸电视作为监控屏幕,挂在部门墙上;
  • 按照经验,我们部门在凌晨会经常收到误报,常见的是苹果支付的问题(一般是苹果服务器抽风), 另外是业务部门在做停服更新,登录、支付、用户等指标骤降,会触发报警,还是需要跟各个业务部门定好更新机制;

三、复盘、优化、整改

  • 有了以上的日志分析,需要对各个业务线进行复盘、优化、整改,再监测,再优化整改,不断循环;
  • 监控与报警体系搭建也不是一朝一夕,也需要不断优化,使其更加精准,尤其是节假日的时候,发挥其作用;
  • 这么多的数据如何有效的利用以及如何用来改善产品,需要运营、产品一起去有效的开发,而不是纯粹的只是记录、监控;
  • 这些数据可以有效的帮助市场同学分析,在各个移动平台广告投放的效果 以及转化;
  • 作为技术人员,除了关注技术侧的应用本身质量、稳定性、性能等,视野也要拓展,协同运营、产品、市场给应用带来更多的用户,更好的体验;

四、总结

APM开发力度如何,应视业务规模而定,若达到一定的量,必须认真对待。本文更多的提了一些iOS侧,对于android也一样适用,除了部分设备指纹维度有所区别。

posted @ 2021-04-26 23:45  七夜i  阅读(988)  评论(0编辑  收藏  举报