刚进公司时,接手了一个项目。项目中有一个模块就是PJSIP,遇到的问题就是稳定性差,莫名的Crash。
大家可能都会有这种经验,当点击某一个按钮,导致程序崩溃,遇到这种问题通常容易解决。解决方式就是查看这个点击事件具体的操作,然后对操作进行调试就能很快的发现并解决问题。但是遇到这种稳定性的问题,并且设计到JNI,就需要大量的测试,来定位问题,再考虑解决办法。
导致稳定性差可能有以下两种原因:
1.项目代码导致的
2.PJSIP代码导致的
对于第一个情况,自定义了CrashHandler,引用第三方日志管理工具,用于手机Crash的日志,对日志进行分析,以便于确定问题的来源。
对于第二种情况,由于涉及到JNI以及so库的原因,无法收集到有意义的日志。因此需要先把手机root,然后在data/tombstones目录下会记录每次底层Crash的日志,该日志会给出那个.so库出问题,以及简单的异常信息描述。
概括而言,经过N次的测试、调试,最终发现是资源释放的问题,包括把还在使用的资源释放或者没有回收未使用的资源。