阿里巴巴应用研发平台EMAS官方账号
分类: Android平台
2020-11-04 11:43:52
阿里云 云原生应用研发平台EMAS 张月(此间)
简介: 崩溃堆栈是我们日常应用问题排查中的重要辅助手段,在移动开发上也不例外,为了支持用户在堆栈上的快速定位,我们面临一个看似比较简单问题:高亮崩溃中的关键行, 辅助用户快速定位问题。
崩溃堆栈是我们日常应用问题排查中的重要辅助手段,在移动开发上也不例外,为了支持用户在堆栈上的快速定位,我们面临一个看似比较简单问题:高亮崩溃中的关键行, 辅助用户快速定位问题。
崩溃堆栈关键行: 堆栈中是属于用户开发代码中那行直接引起崩溃的代码。
举个例子:
业界的竞品基本上是通过 Package Name判断的,在没有 Package Name 的情况下,有的竞品会定位到第一行,有的则会定位到非系统库的第一行。
例如: 友商这种情况下就将关键行挂在了第一行 fastjson 的位置。
这里容易出现两个问题:
为了更好的解决这个问题,我们提出了下面用词频比/词频分的方式来解决问题的新方案。
所以在 Package Name 的基础上,我们还需要一个辅助手段,让我们能够识别这两种情况,从而在关键行定位更精准。
这里我们想到的一个做法就是利用全量的 Crash 崩溃堆栈,计算词频比和相应的词频分,通过概率去优化我们的关键行判断。
实现上分为两个平台。
这个问题,对于 iOS,其实不用考虑用户填写的 Bundle ID, 因为 IOS Crash 天然就自带 Binary Images,我们将用户主包信息预存下来,用于后续判断就行了。
Binary Images
对于组件化的包,我们可以通过 Binary Images 里面的信息统计一下每个包名出现的频率,具体的频率分布统计大致如下图所示,纵坐标代表包名出现的次数:
注:横坐标为包名(这里放不下),纵坐标为包名出现次数
出现的频率越低,那么我们越认为他是一方库或者二方库。
对于 Android,情况稍微复杂一点,首先 Android 的 Crash 中其实是不能明确标识包名的,而且 Android 的 Package Name 并不是一个词,而是一长串的以点分隔的包名, 例如
"com.aliyun.emasha.cache"。
如果单纯的还以包名的词频比来做匹配的话,那么就会出现下面的问题
所以还要解决这两个问题
所以这里要引入包名分级和词频分的概念
但这还不够,如果我们的词频比只是单纯的累加,那么 com 开头的的包名,词频分一定会很高,大于所有的 org 开头的包名,但根据我们的经验,其实不是这样的,我们认为不同级别的匹配,权重应该是不一样的,所以我就拍脑袋想了个权重。
0 5 2 1 1 1
这里举个例子
com.alibaba.aliyun.emas.ha.tlog 这个包名
com 1
com.alibaba 0.3
com.alibaba.aliyun 0.1
com.alibaba.aliyun.emas 0.05
com.alibaba.aliyun.emas.ha 0.02
com.alibaba.aliyun.emas.ha.tlog 0.01
如果匹配到 com 那么词频分为 1 * 0
如果匹配到 com.alibaba 那么词频分为 1 0 + 0.3 5 = 1.5
如果匹配到 com.alibaba.aliyun 那么词频分为 1 0 + 0.3 5 + 0.1 * 2 = 1.7
以此类推
但是在我们的经验中匹配到了 com.alibaba 和匹配到了 com.alibaba.aliyun,后者更有可能是关键行,所以它的词频分按理来说也就更低。所以我们这里做一个符合常理的修正,对于位数过短的匹配,需要后几位的权重做补齐。
最终结果如下:
如果匹配到 com 那么词频分为 1 0 + 1 5 + 1 2 + 1 1 + 1 1 + 1 1 = 10
如果匹配到 com.alibaba 那么词频分为 1 0 + 0.3 5 + 0.3 2 + 0.3 1 + 0.3 1 + 0.3 1 = 3
如果匹配到 com.alibaba.aliyun 那么词频分为 1 0 + 0.3 5 + 0.1 2 + 0.1 1 + 0.1 1 + 0.1 1 = 2
看上去是比较符合我们的经验的。
所以这里词频分的最终定义:根据包的词频多级累加算出来的一个评价包名是否是三方库的分数,分数越高,是三方库的几率越大。如果一个包名分级过短,需要把缺失的后面分级的也算上累加,用于增大短包名的词频分。
我们对所有的包做一个词频分统计,可以得到如下分布图
注:横坐标为包名(这里放不下),纵坐标为包名的词频分
根据观察和测试,这里把阈值定在 0.2 左右比较能区分用户的包名和三方、系统库。
在工程实现上我们也做了一些优化
常规的利用 Package Name 做判定: F1 Score
使用词频分思路的:F1 Score
上面的效果评估只考虑到了每一个包名的情况,在生产因素下,考虑到崩溃行出现的位置,包名出现的频率,以及没关键行的情况,准确率可能会有所不同,所以我们在真实环境做了高亮测试,测试方式为:对线上50个 App,每个 App 取前3条崩溃来做统计,总的准确率如下,可以说是比较高的。
安卓准确率:(333-9)/(333)*100%=90.91%
iOS准确率:(173-0)/(173)*100%=100%
总体准确率:(503-9)/(503)*100%=94%
小需求可以做出大深度, 后续我们可以考虑更多跨用户数据的脱敏拉通,理解数据,为客户带来更多的数据价值。
阿里巴巴应用研发平台 EMAS 是国内领先的云原生应用研发平台(移动App、H5应用、小程序、Web应用等),基于广泛的云原生技术(Backend as a Service、Serverless、DevOps、低代码等),致力于为企业、开发者提供一站式的应用研发管理服务,涵盖开发、测试、运维、运营等应用全生命周期。
欢迎大家移步使用: