为什么我的app被终止了(iOS app后台Carsh)

Why is my app getting killed?
本篇也是学习笔记,有点上头,一天看了好几个WWDC session , 快速学习然后吸收的感觉挺爽的. 类似皮克斯去年的动画 "心灵旅程" 的心流状态. hhhhh
地址: 喜欢可以去详细观看
WWDC 2020 为什么我的app被终止了

概要

主要介绍在APP在后台被系统杀死的六种主要原因,并且告诉你怎么使用MetricKit框架去发现和减少程序被强制杀死的概率;怎么防止崩溃;怎么使用后台机制,怎么找到潜在的问题并采取行动去修复。

app在后台被终止的原因

崩溃(Crashes)
CPU资源限制(CPU resource limit)
看门狗(Watchdog)
内存超出系统限制(Memory limit exceeded)
内存自动清理(Memory pressure exit)
后台任务超时(Background task timeout)

使用MetricKit 框架收集的类型

cumulativeNormalAppExitCount:正常退出次数
cumulativeMemoryResourceLimitExitCount:内存OOM引起程序退出次数
cumulativeCPUResourceLimitExitCount:cpu资源超限引起退出次数
cumulativeMemoryPressureExitCount:系统内存自动清理引起退出次数
cumulativeBadAccessExitCount:非法访问(SIGSEGV/SIGBUS)引起退出次数
cumulativeAbnormalExitCount:Abort函数中止引起退出次数
cumulativeIllegalInstructionExitCount:非法指令(SIG)引起退出次数
cumulativeAppWatchdogExitCount:看门狗(WatchDog)引起的退出次数
cumulativeSuspendedWithLockedFileExitCount:后台读写文件引起的退出次数
cumulativeBackgroundTaskAssertionTimeoutExitCount:后台任务超时引起的退出次数

一. carsh

screenshot.png

解决方案:
这里大多数代码问题,请参考常规的carsh解决方案,查看日志等


截屏2021-02-27 下午10.24.00.png

二. Watchdog

在 app 关键切换期间长时间挂起等待 比如说打开、切到后台 然后再切到前台
这种切换有大概 20 秒的时间限制
如果附加了调试器 是不会发生这种终止情况的
出现看门狗 通常意味着发生了严重问题 比如说
1.死锁、
2.无限循环
3.在主线程上发生的其他无限同步工作

解决方案

使用Xcode查看和导出崩溃日志
使用 MXCrashDiagnostic 获取(见崩溃)

三. CPU resource limit(CPU资源限制)

发生CPU资源限制被系统终止的可能原因

后台长时间占用CPU资源过高(High sustained CPU load in background)

四. Memory limit exceeded(内存超出系统限制)

截屏2021-02-27 下午10.27.47.png
如何查看原因

后台的中央处理器内存占用持续很高时 系统会生成一份能量例外报告
如果此持续性工作的时间长到一定程度 系统会终止 app 的运行
如果内存占用太多 系统会在内存占用率超过界限值时 马上终止 app 的运行 前台和后台的占用率界限值一样

可以在 Xcode Organizer 中查看 中央处理器的资源例外日志
也能通过 MXCPUExceptionDiagnostic 查看

解决方案

这些报告包含调用栈 以此识别出 你的 app 在终止发生时正在做什么
也许你的代码里有漏洞 造成了中央处理器运行的任务过多 修改一下就好
但如果你需要在后台进行很高强度的工作
1.可以考虑把工作移入后台处理任务

注意 不同设备的界限值也不同 一般来说 设备越老 界限值越低 若你的 app 的目标设备早于 iPhone 6s 就需要尽量把内存占用量 始终控制在 200MB 以下

五. Memory pressure exit(内存自动清理)

发生原因

通常不是程序问题(Not a bug with you app)
(压力退出-自动清理)系统为了给其他APP内存而杀掉后台的程序机制

如何解决

尽量保证程序在后台占用内存小于50MB(Aim for less than 50MB in the background)

六. Background task timeout(后台任务超时)

执行后台任务时,未在30s内结束后台任务(Failure ro end the task explicitly result in termination.(in 30s))

如何发现?
iOS14控制台会有超时任务消息打印


image.png

使用MXBackgrounndExitData(iOS14 MetricKit)统计和发现

如何解决?
  1. 从前台转到后台时 可以通过调用指令 UIApplication.beginBackgroundTask 获得额外的运行时间完成关键工作 当工作完成时 需调用 endBackgroundTask 指令
  2. 30s内结束后台任务
  3. 检查后台任务的剩余时间

只有在时间足够的前提下开启任务
时间小于5s时尽快结束任务

你可能感兴趣的:(为什么我的app被终止了(iOS app后台Carsh))