前言
友盟推出了全新的应用性能监控平台 U-APM,U-APM 可以帮助我们深入了解应用的性能和稳定性,帮助我们高效提升应用的质量。通过实时采集新版本上线后的崩溃信息,提供了多种辅助定位问题的关键信息及多维度分析报表,从而能够快速发现问题、定位问题、解决问题。
正文
一、U-APM 应用性能监控平台介绍
1. 大核心优势
1)捕获采集类型丰富,支持Java、Native、Swift、Objective-C、ANR、自定义异常的捕捉。
2)快速定位错误根源,提供行为日志、详细日志、内存快照、设备信息、自定义字段,帮您快速发现问题原因,提升问题解决效率。
3)智能告警专业服务,提供邮件、钉钉、飞书、企业微信告警触达通道,多时间段、多指标组合式告警,助您7*24小时监控应用情况。提供专业客服+技术支持,丰富用户课程,线下沙龙等,助您快速上手。
4)主流热门机型,随时随地获取海量Android和iOS云端真机, 稳定不掉线,操作流畅无延迟,省却百万真机购入费用,保障App质量。
2. U-APM 与其他产品功能对比
功能项 |
U-APM |
其他产品 |
数据最长查询时间 |
90天 |
60天 |
崩溃捕获 |
支持 |
支持 |
ANR |
支持 |
支持 |
自定义异常 |
支持 |
支持 |
卡顿分析 |
Android &iOS双端全采 |
仅支持Android |
启动分析 |
首次\冷\热启动,慢启动设备查询、启动崩溃分析 |
不支持 |
内存分析 |
支持 |
不支持 |
网络分析 |
即将上线 |
不支持 |
页面分析 |
即将上线 |
不支持 |
错误/异常分布 |
系统、设备、版本、地域、运营商、渠道、使用时长、页面 |
系统、设备、版本 |
告警触达方式 |
钉钉、飞书、企业微信、邮箱 |
邮箱 |
告警类型 |
Java崩溃、Native崩溃、ANR、自定义异常、C#错误、Lua错误、卡顿、OOM异常 |
崩溃 |
支持单一错误告警 |
支持 |
不支持 |
告警触发条件 |
指标比值支持且/或设置,时间、版本可灵活交叉设定 |
固定指标固定条件 |
云真机 |
支持 |
不支持 |
二、集成友盟 SDK 步骤
如果想要集成友盟的SDK也是需要一定操作步骤的,在同类产品中,过程不算法复杂,但也不是很简单。至于如何更加便捷,是不是可以考虑把填写应用信息的步骤省略掉?好了,这个问题留给咱们产品同学吧。接下来,我们开始详细介绍。
第一步、进入U-APM功能首页
U-APM功能体验链接地址:https://at.umtrack.com/q0Dmaa
第二步、填写应用程序信息并注册
进入创建应用界面,首先填写应用名称 AVPlayer,然后选择平台,这里需要注意的是友盟支持iPhone、iPad、Android三个移动终端平台,我们选择安卓,默认中文为应用语言。我们的应用程序是一款播放器,因此应用类型选择影视观看/本地播放。最后,填写应用程序的基本描述信息,点击“注册应用”按钮。
完成注册后,系统会给出应用程序的AppKey,为了保密,截图中隐藏了部分内容,请见谅。
第三步、下载并集成基础SDK
集成基础 SDK 有两种方式,分别是线上接入 SDK 和手动集成 SDK。目前,可能是考虑到新旧版本的兼容性问题,官方推荐新的 APP 使用线上接入 SDK 的方式。
那我们就与时俱进,以新版 APP 集成SDK为例进行演示说明。
1. 在工程 build.gradle 配置脚本中 buildscript 和 allprojects 段中添加 sdk maven 仓库地址。
配置方式如下:
buildscript {
repositories {
google()
jcenter()
maven { url 'https://repo1.maven.org/maven2/' }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven { url 'https://repo1.maven.org/maven2/' }
}
}
2. 集成组件化各业务SDK
在 maven 中可以灵活配置所需的 SDK,在工程 App 对应 build.gradle 配置脚本 dependencies 段中添加基础组件库和统计 SDK 库的依赖。
配置方法如下:
// 友盟基础组件库(所有友盟业务SDK都依赖基础组件库)
implementation "com.umeng.umsdk:common:9.4.2" // 版本号(必选))
implementation "com.umeng.umsdk:asms:1.4.1" // asms包依赖(必选)
implementation "com.umeng.umsdk:apm:1.4.2" // U-APM产品包依赖(必选)
代码实例:
3. 功能依赖库介绍
当然,也可以根据应用程序 APP 的实际需要添加其他功能的依赖库,依赖库的种类非常多,比如:
1)友盟基础组件库(所有友盟业务SDK都依赖基础组件库)
业务 |
组件 |
基础组件 |
com.umeng.umsdk:common:x.x.x(必选) |
基础组件 |
com.umeng.umsdk:asms:x.x.x(必选) |
2)友盟统计SDK依赖坐标
业务 |
组件 |
友盟统计SDK |
com.umeng.umsdk:abtest:x.x.x //ABTest模块依赖 |
友盟统计SDK |
com.umeng.umsdk:game:x.x.x //游戏统计依赖 |
3)应用性能监控SDK依赖坐标库
业务 |
组件 |
基础组件(必选) |
com.umeng.umsdk:common:x.x.x |
asms包依赖 |
com.umeng.umsdk:asms:x.x.x |
应用性能监控包(必选) |
com.umeng.umsdk:apm:x.x.x |
游戏统计SDK依赖(可选) |
com.umeng.umsdk:game:x.x.x |
4)友盟分享SDK核心库
业务 |
组件 |
友盟分享SDK核心库(使用U-Share必选) |
com.umeng.umsdk:share-core:x.x.x |
友盟分享面板核心库(使用U-Share必选) |
com.umeng.umsdk:share-board:x.x.x |
5)支持gradle在线依赖的友盟分享模块
业务 |
组件 |
QQ分享模块 |
com.umeng.umsdk:share-qq:x.x.x |
微信分享模块 |
com.umeng.umsdk:share-wx:x.x.x |
新浪微博分享模块 |
com.umeng.umsdk:share-sina:x.x.x |
支付宝分享模块 |
com.umeng.umsdk:share-alipay:x.x.x |
钉钉分享模块 |
com.umeng.umsdk:share-dingding:x.x.x |
6)友盟推送SDK依赖坐标
业务 |
组件 |
PushSDK核心库 |
com.umeng.umsdk:push:x.x.x |
PushSDK必须依赖utdid库,所以需要加入对应依赖 |
com.umeng.umsdk:utdid:x.x.x |
httpdns支持库,必须添加 |
com.umeng.umsdk:alicloud-httpdns:x.x.x |
httpdns支持库,必须添加 |
com.umeng.umsdk:alicloud-utils:x.x.x |
httpdns支持库,必须添加 |
com.umeng.umsdk:alicloud_beacon:x.x.x |
消息推送核心库,必须添加 |
com.umeng.umsdk:agoo-accs:x.x.x |
消息推送网络核心库,必须添加 |
com.umeng.umsdk:agoo_networksdk:x.x.x |
消息推送日志核心库,必须添加 |
com.umeng.umsdk:agoo_tlog:x.x.x |
消息推送网络核心库,必须添加 |
com.umeng.umsdk:agoo_tnet4android:x.x.x |
7)厂商推送依赖坐标(单一厂商通道下相关组件必须全部集成,例:小米通道集成2个组件)
业务 |
组件 |
小米-push |
com.umeng.umsdk:xiaomi-push:x.x.x |
小米-umengaccs |
com.umeng.umsdk:xiaomi-umengaccs:x.x.x |
华为-basetb |
com.umeng.umsdk:huawei-basetb:x.x.x |
华为-pushtb |
com.umeng.umsdk:huawei-pushtb:x.x.x |
华为-umengaccs |
com.umeng.umsdk:huawei-umengaccs:x.x.x |
魅族-push |
com.umeng.umsdk:meizu-push:x.x.x |
魅族-umengaccs |
com.umeng.umsdk:meizu-umengaccs:x.x.x |
OPPO-push |
com.umeng.umsdk:oppo-push:x.x.x |
OPPO-umengaccs |
com.umeng.umsdk:oppo-umengaccs:x.x.x |
vivo-push |
com.umeng.umsdk:vivo-push:x.x.x |
vivo-umengaccs |
com.umeng.umsdk:vivo-umengaccs:x.x.x |
第四步、初始化代码
统一对各个业务进行初始化接口,总共分三点,下面分别介绍。
1)隐私合规中加入友盟+SDK合规声明
https://developer.umeng.com/docs/147377/detail/213789。这一点是非常必要的,最近审核非常严格,特别是移动端APP。
2)在Applicaiton.onCreate函数中调用预初始化函数UMConfigure.preInit()
敏感的小伙伴,在这里就立马会提出一个疑问:调用友盟的这个方法会不会影响APP的移动速度?答案是多虑了。preInit()作为预初始化函数,耗时极少,不会影响App首次冷启动的用户体验,不会采集设备信息,也不会向友盟后台上报数据。
友盟预初始化函数声明如下:
public static void preInit(Context context, String appkey, String channel)
代码截图如下:
3)客户端在用户同意隐私政策后,开始正式初始化友盟SDK
调用初始化函数UMConfigure.init(),友盟初始化函数声明如下:
UMConfigure.init(Context context, String appkey, String channel, int deviceType, String pushSecret)
代码截图如下:
第五步、观察控制台统计数据
完成设置后,我们返回到首页,就可以查看相应的APP应用程序的统计信息了,包括异常次数、影响用户数、告警次数、云真机剩余分钟数等。
三、集成 SDK 过程中遇到的问题
问题1. 错误: 程序包com.umeng.commonsdk不存在
个人感觉,这是最常见的一种错误,但是官方的文档中居然没有相关的说明。官方常见问题列表地址:https://developer.umeng.com/docs/119267/detail/181401,感觉其中很多内容都是官方自己总结的,不够接地气,比如这个错误就不知道应该归到哪一类。官方是不是可以考虑增加一个社区模块,方便开发者之间交流。具体位置可以参考下图:
最终,折腾了好久,也没有通过在线模式集成友盟 SDK,后来还是换成了本地依赖模式解决这个问题。
问题2. SDK集成好后,监控平台没有看到相关的统计数据
这个问题是我疏忽导致的,我以为在调用UMConfigure.preInit()方法的时候传入AppKey就行了。而UMConfigure.init()方法没有同步更新,因此导致了这个问题。我也由此断定,真正起到关联作用的方法是UMConfigure.init()。当然也期待官方更合理的解释,因为我的理解可能有误。
问题3. 报错:Installation did not succeed. The application could not be installed: INSTALL_FAILED_CONFLICTING_PROVIDER
集成友盟 SDK 后,安装 APP 时报了这个错误。后来,把之前老的 APP 从手机端卸载,再重新安装,问题解决。这样看来,和集成友盟 SDK 的关系不大,但是这个问题就是这么神奇。
四、实际问题定位与解决
我们完成友盟 SDK 集成后,就可以通过后台首页发现对应的应用名称集成状态显示“已集成”。同时,我们还可以查看应用程序的运行状态,比如异常次数和影响用户数。
接下来,我们根据具体的异常监控结果进行分析。
1. 崩溃实例分析
通过后台的“分析”页签,找到“崩溃分析”模块,可以发现今天有一例崩溃错误。
在当前页面往下划,我们可以看到相应的错误列表和错误分布。其中,错误列表包含了错误发生的摘要、ID、最近一次的发生时间、错误类型、版本范围、错误次数、影响用户数、处理状态等,具体内容如下图所示:
错误分布包含了设备分布、系统分布、运营商分布、版本分布、页面分布、时长分布、渠道分布、地域分布,具体内容如下图所示:
好了,接下来,我们具体分析一下这个错误。点击错误列表中错误摘要的链接进入错误详情,里边有错误的具体明细,比如下图所显示的错误原因是数组越界:ArrayIndexOutOfBoundsException,具体的代码位置在文件 UappActivity.java 的第 93 行。
我们找到对应的代码行数看一下代码情况,具体截图如下:
哇哦,看到代码再结合报错提示,我们立马知道了这行代码写的有问题,大小为 3 的数组,索引值最大为 2 ,不可能是 3,修改成 0、1、2,问题解决。
重新编译后安装,再运行看一下效果,执行相同的操作,崩溃不再发生。此时,我们就可以手动修改该崩溃的处理状态了,比如下图所示,将“未修复”修改为“已修复”,其中还包括另外两个状态,分别是“处理中”、“已忽略”。
2. 设置告警策略
另外,我们还可以针对某种错误类型设置告警策略,比如上面的崩溃问题,如果我们不确定是否真正解决了。那么就可以点击“告警”按钮,进入告警策略设置页面。
在新建告警计划页面中,我们需要设置告警计划名称,一般使用错误名称+错误ID的方式,但是注意不要超过20个字符。同时,还可以设置告警生效时间,默认实时通知,也可以自定义通知时间段,比如每周二的下午三点到四点。
另外,还可以自定义告警触发条件,一般都是错误发生次数大于 0 时就会生效。还可以指定生效的应用版本,比如我只想监控 APP 应用最新的 3.0 版本,就从下拉列表中选择对应的版本即可。通知方式可以选择邮箱、钉钉、企业微信、飞书中的至少一种,常见的方式是前两种。
但是,在实际使用过程中,自己尝试了两个告警计划,邮箱都没有收到对应的通知。对于这个功能官方好像没有版本限制,通知消息列表也是空的,非常奇怪,本来想把这个问题留给以后排查的。但是,后来不知过了多久,居然收到了邮件通知,看来延时还是挺大的。邮件截图如下所示:
3. 其他功能
友盟应用性能监控平台 U-APM 除了上边介绍的崩溃分析和告警通知功能外,还有ANR分析、自定义异常、卡顿分析、启动分析、内存分析、网络分析等功能模块。
1)ANR分析,ANR 是用户在使用 Android APP 过程中出现弹框,提示应用无响应,计为一次ANR。稳定性模块可以捕获发生在主进程和子进程中的ANR。通过对ANR发生次数的计算,为开发者展示了App在所选时间中的错误趋势、错误分布和错误列表,可快速地分析出导致APP发生ANR的主要原因。
注意事项:启动监控ANR功能,Android 需要集成Common 9.3.8及以上 + APM 1.1.0 及以上版本号。iOS 需要集成Common 7.2.8及以上 + APM 1.1.0 及以上版本号,升级后自动采集。
2)自定义异常,开发人员可以自己定义某种异常类型,程序对异常进行了捕获处理,为更好了解并监控这类异常,开发人员也将这类异常上报到友盟+的错误分析服务中。不得不说这个功能应用场景还是非常多的,Bugly也有类似的功能。
3)卡顿分析,当消息设定时长超出卡顿的定义阈值后会被记为卡顿,可以作为判断应用性能的指标。解决卡顿问题在提升用户体验方面具有非常重要的意义,合理优化卡顿指标在 APP 开发过程中是一件中长期的任务。
注意事项:使用卡顿功能,Android需要集成Common 9.3.8及以上 + APM 1.2.0 及以上版本号。iOS 需要集成Common 7.2.8及以上 + APM 1.2.0 及以上版本号,升级后自动采集。
4)启动分析,包括启动趋势、慢启动分析、启动过崩溃分析。通过监控 APP 应用启动耗时的平均值、分位值、区间分布等数据,以及启动阶段的性能分解数据,分析慢启动和启动崩溃的原因。
5)内存分析,包括 OOM 异常、内存占用。提供了 APP 在运行阶段的内存溢出、内存占用情况及分布详情,便于我们分析应用的健康状况和问题定位。
6)网络分析, 通过收集 HTTP 请求、网络错误、DNS解析等维度的数据,分析当前应用的网络状况,有利于开发人员定位网络相关的编码问题,比如超时处理,断网重连等常见问题。
结尾
通过本文的介绍,我们可以看出友盟应用性能监控平台 U-APM 的集成过程还是比较简单的,另外,U-APM平台具备丰富的数据收集和功能分析能力,而且在具体的功能颗粒度划分方面做得也非常细。相比同类产品,比如Bugly、网易云捕等要强大很多。另外,在集成和使用过程中也遇到一些,并在文中有所体现,希望友盟团队不断完善U-APM 平台,为移动端开发的小伙们带来新的福音。
作者:刘振
社区笔名:liuzhen007(Data-Mining)