# app 3.6.1 Bugly中崩溃分析

突然有一天,领导的Android手机中的程序运行停止了,这告诉了CTO,CTO立刻通知Android负责人,查询原因,并且询问当前的崩溃率是多少,得知3%左右,Android优化完之后,CTO又问iOS的负责人,iOS现在线上的崩溃率多少啊,‘2%左右’,‘这有点高啊,以后要降到0.2%,iOS要立刻发一个版本,降低崩溃率’,然后我们就开始分析Bugly上面的崩溃信息了。

目录

  • 已解决的bug
  • 暂时无解的bug
  • 要添加保护的bug
  • 总结
  • 崩溃产生的原因
  • 崩溃率的现状
  • 我们离优秀还有多远

已解决的bug

  1. UIWebView加载网页中进入后台崩溃
    网页中使用了OpenGL ES绘制,根据Apple的要求,这个不能在后台绘制的(An OpenGL ES application will be terminated if it attempts to execute OpenGL ES commands in the background.),解决方案:
  • 就是网页提供绘制开始和停止的接口供原生在进入后台和切换到前台时使用,但是我们使用的是其他厂家提供的链接,没有此接口。
  • 在前后台切换时,停止和重新加载UIWebView,调用stopLoading但是还是会在后台绘制,并不能停止OpenGL ES的绘制,所以排除此方法。
  • 改用WKWebView,因为这是Apple的bug,所以使用最新的API去替换,但是其他厂家提供的链接不支持WKWebView
  • Apple Forum中有开发者指出这是Apple的bug,并提供了解决方法,在进入后台时调用webView:enableGL方法设置为NO,进入前天后,调用webView:enableGL方法设置为YES
typedef void (*CallFuc)(id, SEL, BOOL);
typedef BOOL (*GetFuc)(id, SEL);
-(BOOL)webView:(UIWebView*)view enableGL:(BOOL)bEnable
{
  BOOL bRet = NO;
  do
  {
  Ivar internalVar = class_getInstanceVariable([view class], "_internal");
  if (!internalVar)
  {
  NSLog(@"enable GL _internal invalid!");
  break;
  }
   
  UIWebViewInternal* internalObj = object_getIvar(view, internalVar);
  Ivar browserVar = class_getInstanceVariable(object_getClass(internalObj), "browserView");
  if (!browserVar)
  {
  NSLog(@"enable GL browserView invalid!");
  break;
  }
   
  id webbrowser = object_getIvar(internalObj, browserVar);
  Ivar webViewVar = class_getInstanceVariable(object_getClass(webbrowser), "_webView");
  if (!webViewVar)
  {
  NSLog(@"enable GL _webView invalid!");
  break;
  }
   
  id webView = object_getIvar(webbrowser, webViewVar);
  if (!webView)
  {
  NSLog(@"enable GL webView obj nil!");
  }
   
  if(object_getClass(webView) != NSClassFromString(@"WebView"))
  {
  NSLog(@"enable GL webView not WebView!");
  break;
  }
   
  SEL selector = NSSelectorFromString(@"_setWebGLEnabled:");
  IMP impSet = [webView methodForSelector:selector];
  CallFuc func = (CallFuc)impSet;
  func(webView, selector, bEnable);
   
  SEL selectorGet = NSSelectorFromString(@"_webGLEnabled");
  IMP impGet = [webView methodForSelector:selectorGet];
  GetFuc funcGet = (GetFuc)impGet;
  BOOL val = funcGet(webView, selector);
   
  bRet = (val == bEnable);
   
  }while(NO);
   
  return bRet;
}
  • 上一个方法中能解决一定概率的崩溃问题,但是不能从根本上解决,还是存在一定概率的崩溃,所以改用进入后台时,加载空白页面,移除UIWebView,清除delegate,销毁UIWebView。为什么还需要销毁呢?

因为只加载空白页的话,回到前台在加载之前的URL,那么加载出来之后点击返回的时候,会多了一层空白页,而不是返回上一个视图

  1. 我的评论中方法currentCalendariOS 9上崩溃的问题
    崩溃是iOS 9上的bug,替换为最新的方法[NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian],最新的方法支持到最低支持iOS 8

暂时无解的bug

之所以称为无解的bug是因为:

  1. 没有测试设备支持我们测试和调试,许多问题出现在9.3.58.1.3中,但是没有设备测试。
  2. 程序启动直接崩溃,根据提供的信息无法判断是什么导致的,有可能跟极光推送的SDK有关系,但是咨询极光推送的技术支持说肯定不是他们SDK的问题,应该是程序中可能移动文件夹导致的崩溃。
  3. 真的一无所有的bug,对于此类bug,真的是欲哭无泪,任何信息没有无法根据已有的信息判断出来。

要添加保护的bug

有些bug需要添加保护,因为Objective-C给了用户太高的授权,导致产生各种不应该产生的bug

  • 比如数组越界
  • 字典里面添加nil。
  • 对于KVO、KVC也需要添加保护,防止不配对的情况。
  • 不同类型比较,比如NSString的方法isEqualToString经常和NSNumber类型的比较
    虽然项目中有对字典或数组的保护,但是需要开发者主动去调用,比如safeObjectAtIndex数组,有时候就容易忘记,所以需要添加保护,不论用户是否调用array[0],还是[array objectAtIndex:0],都可以自动去处理。

总结

崩溃产生的原因

由于网络环境、设备机型、开发环境等多样元素的存在,应用性能问题组合起来查过2亿种可能,连接超时、闪退、卡顿、崩溃、网络劫持、交互性差、CPU使用率问题、内存泄漏等对移动互联网的性能产生重大影响。
其中崩溃是最严重的问题,在运行的过程中强行关闭,打断用户正在进行的操作体验。
应用崩溃带来的后果:

  • 关键业务终端
  • 用户留存率下降
  • 口碑变差
  • 生命周期价值下降

现在崩溃率的现状

1253121Y0-0.jpg-16kB
1253121Y0-0.jpg-16kB

iOS应用崩溃率远高于Android,基本上是Android应用平均崩溃率的5倍,这让人大跌眼镜,颠覆了我的认知观。
792612e70e154784915aaaf5035116e3_th.jpg-24.7kB
792612e70e154784915aaaf5035116e3_th.jpg-24.7kB

Android系统中,崩溃率最高的是航空行业,崩溃率为2.05%。iOS系统中,O2O、游戏行业崩溃率均在4%以上,其中游戏行业崩溃率高达5.83%。

我们离优秀还有多远

20150415164715dc357.jpg-95kB
20150415164715dc357.jpg-95kB

统计显示,当崩溃率超过8‰的时候,活跃用户明显下降态势。由此看来,移动开发者必须重视移动应用对最新操作系统版本的支持以及旧版本的兼容问题。
我们现在的崩溃率高达20‰,牢牢站住了严重隐患这一层,领导们给我们的要求是下降一个量级到达2‰,进入优秀层级。

参考链接
How to fix OpenGL ES application crashes when moving to the background
《2016中国移动应用性能管理白皮书》重磅发布

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 23,804评论 8 183
  • 讲述人/阿伟 我和陶珍是高一的时候认识的,我们俩在高一下半年就确定了恋爱关系,阿珍那时看起来不怎么漂亮,但眼神却很...
    盘州丹霞阅读 807评论 1 0
  • 出关出机场已经九点半了。去取钱,机场周边的取款机全部没有现金了,从来没有想过会这样窘迫。有一个很热心的当地司机迎上...
    Haili_smile阅读 320评论 0 0
  • 这是《零秒思考》的实践版。 Topic 1:拓展人际网络的时候,应该遵循的原则? 1、多接触一些与自己性格不同的,...
    丨张伟丨阅读 159评论 0 0
  • 1 “你个鳖孙儿”洪涛和部长开着玩笑,“咋又没有荆芥类”。每次我们几个同学小聚都选这家家乡菜。一来家乡菜在深圳可选...
    张前进阅读 5,098评论 4 6