MOJi辞書进入后台很快被系统杀死的原因排查

应用场景:启动APP,然后切换至后台,30秒~n分钟后,再次打开APP,直接重新启动。

排查过程主要经历如下几点:

1、iOS系统(因iOS 13被曝出会导致APP频繁重启)
查看其他项目是否跟MOJi辞書一样容易被kill掉,于是创建了一个简单项目,根据应用场景,APP仍然处于开启状态,说明该情况不是系统导致的。

2、Xcode开发工具(因Xcode近期更新频繁,而我目前使用的也不是最新版,可能修复了什么bug)
直接把Xcode升级到最新,根据应用场景,APP还是会被kill掉,同时我也继续复测了第一点,说明不是Xcode和iOS系统导致。

3、applicationDidEnterBackground与applicationWillEnterForeground
根据应用场景,发现操作都是在进入后台或者是进入前台相关,然后查看AppDelegate文件中这两个API的内部实现,没太特别的操作,暂时先注掉这两个API,继续应用场景,但APP还是被kill掉。

4、iVersion与iRate
怀疑是他们不再维护的原因,导致部分实现引起程序被kill掉。在Podfile文件中,注掉了这两个框架的引用,重新在终端pod install(删掉这两个框架)。然后重新编译运行,根据应用场景,APP依然是被kill掉,即不是这个原因。

5、Instruments
使用苹果自带的测试工具,查看了多个template,后面发现这个File Activity(可以观察APP前后台对I/O的操作)
使用步骤如下:

a、打开Instruments。

b、选择 File Activity template。

c、点击Choose,进入界面,左上角中选择设备以及对应的应用程序。

d、点击左上角红色圆圈按钮开始运行,界面状态更新如下图所示:

e、这时候,File Activity已经开始记录操作了。由于我们要测试APP在后台做了什么事情,所以让APP进入后台。大概30秒(时间可以为30秒~n分钟)后,关闭分析工具,他开始自动分析并收集之前对APP的各种操作,如图所示:

f、分析完毕后,就会生产一个类似报告的界面,选中MOJiDict.app这一栏查看具体情况,如图所示:

通过Instruments工具中的File Activity模板可以发现,APP后台的时候,Google文件夹里的文件不断的被写入操作(当然Realm也有I/O操作,但是他操作完之后就结束了)。

猜想一:是否是因为APP在后台时的I/O操作过于频繁,系统监测到并直接kill掉?(iOS 13后对性能的要求越来越高,如资源占用,耗电等)

猜想二:是否把这一频繁的操作移除,APP就不会有这个问题?

通过猜想,第一时间就想到了Firebase(Google旗下的产品),于是决定把关于Firebase相关的内容移除看看。这个框架主要是用于APP的统计分析。接着我做了几个尝试:

a、注释掉[FIRApp configure]这个初始化方法;
注掉后编译运行,发现APP还是会被kill掉。这时候我想是不是还有其他地方也用到了Firebase的东西?突然又想到,他是可以监听APP进入后台然后做各种操作的。于是通过全局搜索,搜索DidEnterBackground或者WillEnterForeground等方法,果然发现了


b、由于里面的文件没法改,只能把#import<Firebase/Firebase.h>引用注掉;
重新编译运行,根据应用场景操作APP,发现还是会被kill掉,这时候开始有点蒙了。

c、紧接着再把GoogleService-Info.plist文件也删掉;
再次编译运行,APP还是会被kill掉。

这时候,已经把Firebase相关的文件或者引用都去掉了啊。怎么APP还是被kill掉?

难道是Xcode的bug?记录了缓存?又重启Xcode,不行!!!

重启电脑,还是不行!!!

难道想的方向不对???突然间想到,还有一处地方没有移除—–Cocoapods

最后抱着试一试的态度,决定把Pods下的Firebase相关框架移除。在Podfile文件中,注掉对应的框架,如#pod ‘Firebase/Analytics’,重新在终端输入pod install。然后重新对APP编译运行。

奇迹~~~~出现了!!!
彻底移除Firebase框架APP根据应用场景再操作一波,APP再也没有被kill掉。

总结:
1、目前需要把Firebase框架彻底移除,才能保证APP在进入后台的时候不被系统杀死。
2、可能是新版Firebase框架里面加了一些特殊操作,而这些操作我们无法控制。

3、可能需要使用其他第三方分析平台。

补充:
最后采用Firebase 6.4.0(经boss发现,此版本不会被kill),即在新版本还没有解决该问题之前,暂时还是使用该版本。