SEGV_ACCERR 异常崩溃

SEGV_ACCERR 异常崩溃

2018-12-04 | |

异常描述

今天在测试开发的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重新切图

显然第一种方案不可取,那么我们现在来说下第二种方案的具体步骤。

  1. 导出项目的ipa文件
  2. ipa文件的后缀名改为zip
    我们导出的安装包是以.ipa结尾的,现在需要将.ipa改为.zip
  3. 解压该zip文件
    将刚刚重命名的zip文件解压,会在当前目录生成一个Payload的文件夹,里面有一个.app结尾的文件。
  4. 进入到.app结尾中文件中
    有两种方法进入到.app文件中
    1
    2
    3
    4
    1、鼠标右键,显示包内容

    2、打开终端,使用终端进入
    cd XXX/Payload/XXX.app
  5. 找到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
  6. 打开XXX.txt文件,找到文件中有问题的图片名称
    打开刚刚我们重定向的那个XXX.txt的文件,然后搜索P3关键字,找到这一项中Name字段所对应的值,这个值就是我们项目中存在问题的图片名称,我们可以记录下这个图片名称,然后在我们的项目中删除该图片。