扫盲贴|如何评价一款App的稳定性和质量?

简介: 我们不应该为了掩盖代码质量问题,通过手动try catch去规避某些问题,这样有可能会打断用户的正常使用,并造成感知性的阻断反馈,应该从用户使用APP时的真实感知出发,当出现问题时及时捕获和处理问题。 App的稳定性时一个长期不断迭代的过程,在这个过程中U-APM是一个很好的提升效率降低成本的工具,他提供了收集、解析、聚合、分析的能力,下一期我们会从如何通过U-APM解决和处理崩溃、ANR等问题进行讲解,尽情期待。

「崩溃」与「卡顿」、「异常退出」等一样,是影响App稳定性常见的三种情况。相关数据显示,当iOS的崩溃率超过0.8%,Android的崩溃率超过0.4%的时候,活跃用户有明显下降态势。它不仅会造成关键业务中断、用户留存率下降、品牌口碑变差等负面影响,而且会直接带来卸载和流失。也同时给开发者带来不可小觑的资本损失。

那么,崩溃率低的App质量就高么?是否可以通过崩溃率直接判断App的稳定性?

首先,衡量一个App质量好坏时我们需要定义一个统一的口径,即哪些指标可以作为稳定性的评估口径?以友盟+的U-APM定义的稳定率这个概念为例,评价一个App的稳定性和质量,一般从以下三点综合考虑:

发生了崩溃,如java崩溃和Native崩溃,即用崩溃率这个指标来评估计算;

发生了ANR,即用ANR率这个指标来评估计算;

异常退出,如:low memory killer、任务列表中划掉、系统异常、断电、用户触发关机/重启等,即用异常率这个指标来评估计算。

崩溃,也就是程序出现异常,导致程序退出。包括:

Java崩溃,也就是在Java代码中出现了未捕获异常,导致程序异常退出。如:空指针异常、数组越界异常等。

Native异常,也就是在Native代码中,出现错误产生相应的signal信号,导致程序异常退出。如:访问非法地址、地址对其问题等。

Java崩溃的捕获相对会简单一些,Native崩溃的捕获可能要求我们对系统底层知识要有一定的掌握。我们知道Android是基于Linux系统的,系统中的崩溃大多是由于编码错误或硬件错误导致的。当系统遇到不可恢复的错误时会通过异常中断的方式触发异常处理流程,这些中断的处理被统一为了信号量。当应用程序接收到某个信号量时会按照内核默认的动作处理,如Term、lgn、Core、Stop、Cont。同时我们也可以通过sigaction注册接收信号来指定处理动作,比如捕获崩溃信息等。当然捕获过程中也会有一些困难点,尤其在极端环境中,比如栈溢出时,由于栈空间已经被用完,造成我们的信号处理函数没法被调用,以至于无法捕获到崩溃信息,这时我们需要考虑使用signalstack,使我们的信号处理函数可以在堆里面分配到一块内存空间作为“可替换信号栈”来处理崩溃信息。

 

 

当然,除了稳定、安全的捕获能力外,还需要丰富崩溃现场的上下文信息,比如Logcat信息、调用栈信息、设备信息、环境信息等等,为我们后续定位和解决问题提供全面的参考。

对于发生崩溃的情况,我们使用崩溃率作为数据指标。包括:

UV崩溃率,也就是发生崩溃错误的去重用户/去重活跃总用户;

PV崩溃率,也就是发生崩溃错误的次数/启动次数;

启动崩溃率,也就是应用启动过程中发生的崩溃,很容易被忽略但又非常重要的崩溃指标,因为启动是APP生命周期中非常重要的一个阶段,很多广告、闪屏、活动等内容都在这个过程中透出,同时启动时又需要加载各种初始化,并且如果启动出现错误,往往热修复、降级融灾策略都无法弥补。

ANR,也就是Application Not Responding,当应用程序一段时间无法及时响应,则会弹出ANR对话框,让用户选择继续等待,还是强制关闭。从用户体验的角度看,有时候ANR可能要比崩溃会带来更糟糕的体验,所以开发者重视崩溃的同时也要非常重视ANR。

ANR捕获的准确性一直是不断升级打怪、不断完善的过程。早期我们通过FileObserver 监听/data/anr/traces.txt文件的变化进行捕获和上报,但很遗憾随着版本升级,系统和厂商开始收紧系统文件但权限,此方案的覆盖设备情况越来越低,造成ANR捕获的准确性也一直降低。

随后我们改进为监控消息队列的运行时间的方式捕获ANR,也就是向主线程Looper中放入一个空消息,监听该空消息在5秒后是否被执行,但该方案无法真实的捕获ANR情况(存在漏报和误报情况),并且也无法得到完整的ANR内容。后续我们参考Android ANR的实现原理,实现了一套实时、准确的ANR捕获方案,并且可以兼容所有系统版本。我们知道系统的system_server 进程在检测到 APP 出现 ANR 后,会向出现ANR 的进程发送 SIGQUIT (signal 3) 信号。默认情况,系统的 libart.so 会收到该信号,并调用 Java 虚拟机的 dump 方法生成 traces。

我们通过拦截SIGQUT,在出现ANR时优先接收到信号,并生成traces和ANR日志,在处理完信号后,将信号继续传递给系统让系统生成traces文件,生成traces文件时,在保证内容与系统原生的一致性的同时还对生成traces文件的速度进行了明显的提升,有效地避免了可能因生成 traces 时间过长,而被 system_server 使用 SIGKILL (signal 9) 再次强杀,同时我们对捕获到的内容进行了丰富,包括:触发 ANR 的原因、手机中 TOP 进程CPU 使用率、ANR 进程中 TOP 线程 CPU 使用率、CPU 各核心处理时间分布情况、磁盘 IO 操作等待时长等重要信息,对分析、定位和解决 ANR 问题,提供了更加强有力的支撑!

 

同样对于发生ANR的情况,我们也分为UV ANR率和PV ANR率,算法可参考如上崩溃率的计算。

当然,除了崩溃和ANR,我们往往忽略了异常退出这种场景,但往往通过异常退出我们可以发现如low memory killer、系统重启等无法正常捕获到的问题。比如兼容性问题导致的闪退、设备重启、三方库主动调用exit函数,导致应用闪退次数增加等难以发现的问题,所以通过异常退出率我们可以比较全面的了解和衡量应用的稳定性。

综上,对于文章开始的那个问题,我想大家都应该有答案了吧。当然,我们不应该为了掩盖代码质量问题,通过手动try catch去规避某些问题,这样有可能会打断用户的正常使用,并造成感知性的阻断反馈,应该从用户使用APP时的真实感知出发,当出现问题时及时捕获和处理问题。

App的稳定性时一个长期不断迭代的过程,在这个过程中U-APM是一个很好的提升效率降低成本的工具,他提供了收集、解析、聚合、分析的能力,下一期我们会从如何通过U-APM解决和处理崩溃、ANR等问题进行讲解,尽情期待。

作者:友盟+移动开发专家 张文

原文链接

本文为阿里云原创内容,未经允许不得转载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊 5G 云专线

作者|小枣君来源|鲜枣课堂通过本文,和大家分享探讨一下 5G 云专线。我们从今天文章的标题开始说起吧。5G、云、专线,分开的3个词,作为通信人,大家应该都懂(专线可能陌生一点)。但是,合起来之后&…

谈AK管理之基础篇 - 如何进行访问密钥的全生命周期管理?

简介: 我们也常有听说例如AK被外部攻击者恶意获取,或者员工无心从github泄露的案例,最终导致安全事故或生产事故的发生。AK的应用场景极为广泛,因此做好AK的管理和治理就尤为重要了。本文将通过两种AK使用不安全的典型案例&#x…

2021信服云创新峰会:托管云成上云第三种选择

9月17日,以“万物皆可云”为主题的信服云创新峰会成功举办。中国工程院院士、中国科学院计算技术研究所研究员倪光南,IDC咨询(北京)有限公司副总裁/首席分析师武连峰,深信服科技股份有限公司创始人、CEO何朝曦&#xf…

三只松鼠:阿里云数据中台基座上的多渠道、多业态生长

简介: 刚刚过去的2020年,对三只松鼠来说更像是一座认知分水岭,三只松鼠CEO章燎原坦言“要忘记流量时代,并习惯放缓增长”,而随后的重要一步,就是以披荆斩棘的姿态进入数据中台建设新赛道。 刚刚过去的2020年…

浅谈专有云MQ存储空间的清理机制

简介: 浅谈专有云MQ存储空间的清理机制 在近⼀年的项⽬保障过程中,对专有云MQ产品的存储⽔位清理模式⼀直存疑,总想一探究竟但又苦于工作繁忙、精力有限,直到最近⼀次项⽬保障过程中再次出现了类似的问题,⼤家对MQ Bro…

气象气候应用在Intel最新处理器Icelake上的性能测评

浪潮HPC实验室 一、Intel第三代至强可扩展处理器(Icelake)性能大升级 Intel于今年发布了第三代至强可扩展处理器系列产品(代号Ice Lake),与上一代至强可扩展处理器系列产品(代号Cascade Lake)相比,第三代…

评审恩仇录——我为什么愿意执行代码评审

简介: 代码评审带来的好处不言自明, 但企业业务快速发展的诉求与代码评审推动落地两者之间, 往往存在矛盾。在如今快速发展的互联网时代,数字化、智能化已经是基础能力,单纯只靠人肉审查的时代已经过去了,基于各种自动化检查能力的…

AI+混合云模式,如何最大化挖掘数据价值?

9月8日,IBM举行了“科技一席谈”线上媒体访谈会,此次访谈以“数据与AI”为主题,由IBM 大中华区科技事业部、客户成功管理部总经理朱辉,IBM 中国混合云与 AI 华东及华南大区总经理许伟杰作主题分享。 在数字化转型的时代&#xff…

阿里云贾扬清:大数据和人工智能一体化是必然趋势

简介: 拥抱“融合”是大数据演进的新方向,⼤数据⼈⼯智能⼀体化是⼤数据发展的必然⽅向,而人工智能是⼤数据业务发展的终极出⼝ 。 12月13日,阿里云计算平台负责人贾扬清在Flink Forward Asia 2020 峰会上指出,拥抱“融…

云效安全那些事儿—访问控制与数据安全

简介: 云效 Codeup 提供了代码 GPG 签名,拒绝未签名的提交;支持代码属主验证,约束提交记录属主。 在质量管控上,云效 Codeup 精细化读写权限管控,支持代码提交卡点机制,保障提交质量。 接下来我…

深信服何朝曦:托管云为用户上云提供第三种选择

9月17日,以“万物皆可云”为主题的信服云创新峰会成功举办。会上,深信服科技股份有限公司CEO何朝曦分享了运用云计算技术帮助用户进行数字化转型的观点。他认为兼具公有云和私有云优势的托管云,可以帮助非科技型企业和中小企业获得“数字化平…

java 使用c .dll_Windows下java调用c的dll动态库--Dev_Cpp编译c生成dll

1.eclipse下建立一个HelloJNI.java内容如下:package JNI;public class HelloJNI{static{System.out.println("开始");System.loadLibrary("goodluck");System.out.println("结束");}public native static int get();public native st…

阿里云助力江苏省财政厅力推统一公共支付平台

简介: 为深化“放管服”改革,贯彻“互联网政务服务”要求,江苏省财政厅加快推进江苏省统一公共支付平台建设,实现全省政府非税收入、政务服务在线收缴和财政电子票据的集中统一处理,不仅节约了因“重复建设”产生的财政…

Midway Serverless 发布 2.0,一体化让前端研发再次提效

简介: 2021 年 3 月,Midway Serverless 推出了第二个大版本。就像两年前说的一样,开源只是开始,终态远没有到来。Midway 体系希望能够在当前的十字路口,不断向前演进,让前端可以去发展,朝着应用…

binaryviewer java_用java实现java的2进制文件字节序转换到C/C++的2进制文件字节序

展开全部package admit.action;/*用JAVA读取各种计算机文件系统的文件列表 当你安装了jdk,在32313133353236313431303231363533e78988e69d8331333332613732jdk的类库里,有一个标准的File类,通过该类,可以很方便的实现浏览各种文件…

ZDNS宣布完成B轮融资,根服务器之外,顶级域名系统迎重要机遇

从互联网诞生,由于IPv4技术中UDP报文数据容量限制,到2021的今天,全球也仅有13个根服务器(俗称“主根”),其中10个主根由美国持有,英国、瑞典、日本各持有1个。而中国只运营根镜像服务器。虽然目…

应用容灾中,MySQL数据表是否需要跨云同步?

简介: 容灾系统的重要目标在于保证系统数据和服务的“连续性”。当系统发生故障时,容灾系统能够快速恢复服务和保证数据的有效性。为了防止天灾人祸、不可抗力,在同城或异地建立对应的IT系统,其中最核心的工作是数据同步。本文选取…

java浮点数数转二进制的数吗_深入理解计算机系统(2.7)-二进制小数和IEEE浮点标准 - Java 技术驿站-Java 技术驿站...

整数的表示和运算我们已经讲完了,在实际应用中,整数能够解决我们大部分问题。但是某些需要精确表示的数,比如某件商品的价格,某两地之间的距离等等,我们如果用整数表示将会有很大的出入,这时候浮点数就产生…

Docker 终失 C 位,开源少年缘何黑化

作者 | 马超出品 | CSDN(ID:CSDNnews)开源真是火了,近些年成功的IT项目像TensorFlow、RocketMQ、TDEngine都是开源项目,而且这种火爆还出了圈,连带着RISC-V这种准开源的芯片也成为了各方争抢的香饽饽。但是…

中油即时通信电脑版_市场营销之即时通讯营销

✎IM营销又叫即时通讯营销(instantmessaging),是企业通过即时工具im推广产品和品牌,以实现目标客户挖掘和转化的网络营销方式。封面设计丨Sweety 责编丨花花第60篇丨每日一篇好文:2645字丨5分钟阅读即时通讯营销常用的主要有以下两种情况:第一…