SEGV_ACCERR 异常崩溃
异常描述
今天在测试开发的app时,遇到一个很奇怪的问题:项目在模拟器和真机调适的情况下运行是没有任何问题,但是如果导出测试包来进行安装,在iOS9及之前的手机就出现各种闪退。由于是导出的测试包来进行的安装,所以不好跟踪异常信息,后面集成了一个第三方的日志SDK(Bugly)来跟踪日志,但是报错的信息也不是很清晰,下面给出错误日志信息:
异常原因
基于这个问题,我在网上找了很多资料,最后在 stackoverflow 找到解决方案。
当你项目的资源文件中含有16位图或者图片显示模式γ值为P3
,在iOS 9.3
以下的设备中会出现这个问题。如果你的app需要支持广色域显示的话,那你必须得把target设置成iOS 9.3+
,相反,如果你的app不需要支持广色域且你想兼容iOS 9.3
之前的项目,你就得把所有的16位的或者显示模式为P3
图片全都替换成8位模式的SRGB颜色的图片。
说白了就是一名话:项目中的部分图片有问题。
解决方案
前面也说了:是图片的问题导致项目在iOS 9.3
以下的系统出现闪退现象。那么解决方案有两种:
- 修改app的兼容版本号,最低支持
iOS 9.3
- 找到项目中有问题的图片,移除它们,并让UI重新切图
显然第一种方案不可取,那么我们现在来说下第二种方案的具体步骤。
- 导出项目的
ipa
文件 - 将
ipa
文件的后缀名改为zip
我们导出的安装包是以.ipa
结尾的,现在需要将.ipa
改为.zip
。 - 解压该
zip
文件
将刚刚重命名的zip
文件解压,会在当前目录生成一个Payload
的文件夹,里面有一个.app
结尾的文件。 - 进入到
.app
结尾中文件中
有两种方法进入到.app
文件中1
2
3
41、鼠标右键,显示包内容
2、打开终端,使用终端进入
cd XXX/Payload/XXX.app - 找到
Assets.car
文件
当我们进入到.app
文件里面的后,里面有一个Assets.car
的文件,这个文件就是我们需要处理的文件,这里我们需要借助assetutil
命令将Assets.car
的内容重定向到某个普通文件中,方便我们查找有问题的图片。这里我们将内容重定向到桌面的一个.txt
文件中。1
2# 将 Assets.car 文件里面的内容重定向到桌面的 XXX.txt 文件中
sudo xcrun --sdk iphoneos assetutil --info Assets.car > ~/Desktop/XXX.txt - 打开
XXX.txt
文件,找到文件中有问题的图片名称
打开刚刚我们重定向的那个XXX.txt
的文件,然后搜索P3
关键字,找到这一项中Name
字段所对应的值,这个值就是我们项目中存在问题的图片名称,我们可以记录下这个图片名称,然后在我们的项目中删除该图片。