ios启动崩溃保护

news2024/9/25 21:30:36

在这里插入图片描述

网传上个月下旬小红书因为配置问题导致连续性启动崩溃,最终只能通过紧急发版解决。对于冷启动崩溃保护的最容易查到的资料来源于微信读书团队的分享。
何为保护?要保护什么?该怎样保护?带着这几个疑问,一一谈一下个人的见解。

何为保护

所谓保护只不过是检测到出现连续性启动崩溃的补救措施,而不是防范于未然。
这里涉及到三个问题,针对这三个问题分别谈一下个人看法:

  1. 如何定义启动崩溃
    一般是用户点击桌面图标触发App冷启动,在启动活动的某个标志时间点或事件节点内出现的崩溃,我们称之为启动崩溃。
    这里又涉及到一个标志时间或事件的问题,一般考虑的条件是常规且必要的任务执行完毕,如热修复脚本检查更新完毕,离线配置更新完毕,必要的SDK和业务初始化完毕。针对不同App这个时间可能很短也可能较长,我们至少要保证常规的线上问题修复手段能奏效(如加载热修脚本),即保证常规的问题修复手段先行。只有常规手段不能有效防止问题出现时才应走到不得已而为之的启动保护。

  2. 如何定义连续
    假如第一个问题得到的时间或事件节点是A,则在A发生前出现的崩溃都属于启动崩溃,所谓连续性即不间断出现在A发生之前的崩溃现象。

  3. 怎样进行崩溃计数
    两种方案:
    第一种:常见的崩溃统计如bugly、KSCrash、PLCrash都有外漏的处理崩溃事件接口,只需要在响应的接口里进行计数即可。
    第二种:通过代码监听Unix、Mach和UncaughtException,具体可以参考KSCrash的实现,需要注意的点是在处理异常时尽量不要做繁重的事物,处理完毕要转发异常,以免影响crash收集工具工作。

要保护什么

为何出现连续崩溃,小红书的例子是老配置引起崩溃,但App启动后在新配置拉下来之前就出现了崩溃,也就是说如果正确的新配置能拉下来就可以避免后续再出现相同的崩溃。
所谓保护,即通过一种手段保证持续性的崩溃能最大限度的被修复。

该怎样保护

这个问题的前提是出现了技术手段无法形成有效影响的连续性crash问题。因此保护的措施就是在出现连续启动crash时挂起正常的启动流程,临时进入一种特殊的保护状态,在此状态下进行一些预定义的必要操作,以求能最大限度的修复/规避crash达到快速止损的目的。

  1. 出现几次进入保护状态
    业内一般连续3次及以上,原因大概是两次或更少可能出现临时异常导致误触,太多用户可能会放弃尝试。

  2. 如何实现保护状态
    两种方式:
    第一种:通过runtime方法交换hookdidFinishLaunchingdidBecomeActive两个必要的生命周期方法,hook后。原函数是正常启动流程,新函数就承担了是否进入保护流程以及实现保护操作的责任。
    因此可以根据连续crash数决定是否调用原函数。
    为了保证用户视觉上处于正常状态,保护流程中可以设置window的rootViewController,在该Controller中可以用户做一些提示性信息。当然具体的保护策略也可以在这个Controller中实现。

  3. 保护操作完成后该如何
    保护策略完成后App应该走正常的启动流程,因为冷启过程会走两个生命周期方法,因此分别调用这两个方法即可。

应该怎样制定保护策略呢?
一个问题出现的原因总体上可以分为外部原因和内部原因两类,出现连续性crash,尤其是大规模连续性crash的内部原因(即App自身的原因)通常是代码健壮性不够,对异常数据或数据类型的兼容度有缺失。
外部原因通常是来自外部的数据有问题,导致在解析或使用过程中出现崩溃。而来自外部的数据大多是API接口数据,API接口可能来自自己内部的服务,也可能来自三方服务,甚至是三方crash sdk本身。极端情况下,内部API接口可以随时调整和上线,但对三方服务的接口却无能为力,因此开发App时应该注重对数据的合法性及安全性校验。

保护策略,一般涉及以下内容:

  1. 拉取热修复脚本(修复/规避某些代码异常)
  2. 删除API数据的缓存(针对离线数据引起的crash)
  3. 删除非必要的数据库(针对数据库导致的crash)
  4. 拉取一些预定义操作的配置(如配置是否初始化某个sdk、移除特定路径下的内容等)

最近重构冷启动保护策略,写了个简单的任务管理框架来实现异常监听和启动任务托管,代码见GitHub

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

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

相关文章

浅谈常态化压测

目录 一、常态化压测介绍 1.什么是常态化压测 2.为什么要进行常态化压测 3.常态化压测的价值 二、常态化压测实践 1.常态化压测流程介绍 2.首次进行常态化压测实践 2.1 准备阶段 2.2 执行阶段 2.3 调优阶段 2.4 复盘阶段 三、常态化压测总结 一、常态化压测介绍 1…

AI让分子“起死回生”:拯救抗生素的新希望

生物工程师利用人工智能(AI)使分子“起死回生”[1]。 为实现这种分子“复活”,研究人员应用计算方法对来自现代人类(智人)和我们早已灭绝的远亲尼安德特人和丹尼索瓦人的蛋白质数据进行分析。这使研究人员能够鉴定出可以杀死致病细菌的分子,从而促进研发用于治疗人类…

微信生态升级!小绿书来了!

如你所知,微信不只是一个聊天工具。一切从照片开始,你拍了一张照片,你就拥有了自己的相册,在“朋友圈”你可以了解朋友们的生活。如你所见,微信,是一个生活方式。不知不觉间,微信已经走过了 11个…

Docker的入门与使用

什么是Docker? docker官网 简介与概述 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上&#x…

C字符串与C++ string 类:用法万字详解(上)

目录 引言 一、C语言字符串 1.1 创建 C 字符串 1.2 字符串长度 1.3 字符串拼接 1.4 比较字符串 1.5 复制字符串 二、C字符串string类 2.1 解释 2.2 string构造函数 2.2.1 string() 默认构造函数 2.2.2 string(const char* s) 从 C 风格字符串构造 2.2.3 string(co…

通讯协议034——全网独有的OPC HDA知识一之聚合(三)时间加权平均

本文简单介绍OPC HDA规范的基本概念,更多通信资源请登录网信智汇(wangxinzhihui.com)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化,以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&…

使用一个python脚本抓取大量网站【2/3】

一、说明 我如何使用一个 Python 脚本抓取大量网站,在第 2 部分使用 Docker ,“我如何使用一个python脚本抓取大量网站”统计数据。在本文中,我将与您分享: Github存储库,您可以从中克隆它;链接到 docker 容器&#xf…

软件定制开发平台:管好数据资源,降本提质!

在如今的发展时代,利用好优质的软件定制开发平台,定能给广大用户提高办公协作效率,创造可观的市场价值。作为服务商,流辰信息一直在低代码市场勤于钻研,不断努力,保持敏锐的市场眼光和洞察力,为…

Modelsim恢复编辑器的解决方案——只能将外部编辑器删除后,重新匹配编辑器

Modelsim恢复编辑器的解决方案——只能将外部编辑器删除后,重新匹配编辑器 1,Modelsim和Questasim是相互兼容的,配置的编辑器变成了sublime,且更换不了编辑器2,解决问题的方案,还是没得到解决3,…

Markdown和LaTex的学习

下载Typora Typora(免费版) 轻量级Markdown编辑器 - 哔哩哔哩 (bilibili.com) 部分编辑器需要进入设置 中开启特定的 Markdown 语法,例如 Typora 就需要手动开启 高亮 功能 Typora的使用: Typora中各种使用 - lyluoye - 博客园 (cnblogs.com) 标题 #…

数据库的存储过程、触发器、事件 实现(超精简)

一 存储过程 什么是存储过程 : 自己搜 和代码写的有什么区别: 没区别 为什么用存储过程: 快 例子 -- 创建 test名字的存储过程 CREATE PROCEDURE test(in idin INT) BEGIN-- 创建变量declare id int default 0;declare stopflag int defau…

爬虫015_python异常_页面结构介绍_爬虫概念介绍---python工作笔记034

来看python中的异常 可以看到不做异常处理因为没有这个文件所以报错了 来看一下异常的写法

【C++】C++回调函数基本用法(详细讲解)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

【Flutter】【packages】simple_animations 简单的实现动画

package:simple_animations 导入包到项目中去 可以实现简单的动画, 快速实现,不需要自己过多的设置 有多种样式可以实现[ ] 功能: 简单的用例:具体需要详细可以去 pub 链接地址 1. PlayAnimationBuilder PlayAnima…

winform控件 datagridview分页功能

主要实现页面跳转、动态改变每页显示行数、返回首末页、上下页功能,效果图如下: 主代码如下: namespace Paging {public partial class Form1 : Form{public Form1(){InitializeComponent();}private int currentPageCount;//记录当前页行数…

ApplicationContext在Spring Boot中是如何创建的?

一、ApplicationContext在Spring Boot中是如何创建的? 1. SpringApplication ApplicationContextFactory有三个实现类,分别是AnnotationConfigReactiveWebServerApplicationContext.Factory、AnnotationConfigServletWebServerApplicationContext.Facto…

nginx动态加载配置文件的方法

1. main函数调用ngx_get_options函数 2. ngx_get_options(int argc, char *const *argv)中会解析用户输入命令。 case ‘s’: if (*p) { ngx_signal (char *) p; } else if (argv[i]) {ngx_signal argv[i];} else {ngx_log_stderr(0, "option \"-s\" requi…

将数组按照某个对象分类,结果值的json的值按照value递增排序

const arr [ { value: 532, lable: 1, type: “a” }, { value: 132, lable: 24, type: “b” }, { value: 432, lable: 13, type: “b” }, { value: 1812, lable: 5, type: “b” }, { value: 1932, lable: 8, type: “c” }, { value: 132, lable: 4, type: “a” }, { val…

CNN经典网络模型之GoogleNet论文解读

目录 1. GoogleNet 1.1 Inception模块 1.1.1 1x1卷积 1.2 辅助分类器结构 1.3 GoogleNet网络结构图 1. GoogleNet GoogleNet,也被称为Inception-v1,是由Google团队在2014年提出的一种深度卷积神经网络架构,专门用于图像分类和特征提取任…

一个竖杠在python中代表什么,python中一竖代表什么

大家好,小编来为大家解答以下问题,一个竖杠在python中代表什么,python中一竖代表什么,今天让我们一起来看看吧! 维基百科页面是错误的,我已经更正了。|和&不是布尔运算符,即使它们是急切运算…