FAQ#

一、术语#

异常次数率:统计周期内(小时/天),异常发生次数/应用冷启动次数;

异常设备率:统计周期内(小时/天),异常发生设备数/总设备数;

总异常设备率:选定时间范围内,出现异常的总设备数/启动应用的总设备数;

平均异常设备率:选定时间范围内,每天或每小时异常设备率的平均值;

异常设备周同期差:今日设备异常率-七日前设备异常率:

​ 说明:例如,当前时间为周一10:30 ​ 今日设备异常率=今日00:00-10:30的设备异常率 ​ 七日前设备异常率=上周一00:00-10:30的设备异常率

二、原理#

  1. 卡顿的判断逻辑是什么?

    安卓和iOS原理一致。

    开启一个检测线程,每隔固定时间(默认5s)向主线程发送消息,5s后检查消息是否被响应。若无响应,则认为发生了卡顿。

  2. iOS卡死崩溃和FOOM(foreground out of memory)崩溃的判断逻辑是什么?

    以上两种崩溃是资源使用达到上限,被系统强杀,在app内是无法感知到被强杀的,因此需要额外的判断。

    判断逻辑参考了Facebook的文章:https://code.fb.com/ios/reducing-fooms-in-the-facebook-ios-app

    核心原理是在app运行过程中,保存app状态信息,下次启动时读取app状态信息。用排除法判断app上次是否发生崩溃、是否用户自行退出、应用版本更新重启、系统更新、系统重启,以上情况排除后再判断是否为FOOM或卡死崩溃。

    注意:使用_exit()退出应用时,无法执行保存app状态信息的函数,可能发生误报,应使用exit(),或者在退出前调用SDK提供的notifyAppWillQuit函数通知SDK应用即将退出。

  3. iOS FOOM为什么没有崩溃栈信息?

    FOOM是因为内存泄漏或内存使用不当造成的,排查FOOM需要获取app运行过程中的内存调用信息(包括泄漏内存的大小以及调用栈)。记录内存调用栈是比较消耗资源的操作,因此暂时没有实现此功能。如有需要可与我们联系。

  4. 是否与其他崩溃捕获SDK兼容?

    安卓、iOS、鸿蒙SDK兼容。若最后初始化,捕获到崩溃信号并处理成功后交给上一个handler处理。但并不建议在一个应用中使用多个崩溃捕获SDK,可能出现未知的bug。

  5. ANR的判断原理是什么?哪些情况会造成ANR?

    ANR是通过SIGQUIT信号捕获的。ANR是由操作系统判断的,不同厂商或者系统版本的设备,判断的条件可能有差别。出现ANR时,大部分手机会弹出应用无响应弹窗,有些品牌比如oppo, vivo会直接杀死app。

    ANR发生的主要原因有:

    系统资源紧张,比如CPU过载、内存不够、I/O读写速度慢;应用程序的主线程执行耗时函数,或者出现死锁;页面帧刷新出现严重卡顿,无法响应用户输入等。

三、数据#

  1. 为什么有的字段值为0或空?

    触发崩溃时,我们尽量在应用退出前采集运行时信息。但出现堆溢出等问题时,无法执行完整的崩溃处理流程,因此会有部分运行时信息丢失。

  2. 为什么ECat上的设备数与运营数据不同?

    ECat的设备数由设备id去重统计,设备id在应用首次启动时生成并保存在设备本地。

    对于安卓和Windows应用,若应用被卸载或清除应用数据,设备id会丢失,当重新安装启动后,会生成一个新的设备id。

    对于iOS应用,设备id保存在keychain中,应用卸载或清除数据不会丢失设备id。但设备恢复出厂设置,则会丢失设备id,当重新安装启动后,会生成一个新的设备id。

    因此,一般情况下,ECat统计到的设备数始终大于等于真实设备数。

四、符号#

  1. 同名的符号文件,新版本会覆盖旧版本吗?

    对于Native符号文件和iOS符号文件,以UUID确认其唯一性。仅在UUID相同,MD5不同时才会发生覆盖。

    对于其他符号文件,以appVersion确认其唯一性。appVersion相同,MD5不同时会发生覆盖。

五、功能#

  1. 重还原功能有什么用?

    用于Native崩溃和iOS崩溃的符号还原,在上传符号文件后,可还原30天内已发生的崩溃。

  2. ECat能否获取系统日志?

    在安卓下可以。

    在获得用户授权后,设置setPermission("READ_LOGS", true)即可在异常时获取系统日志。系统日志是用logcat命令获取的,配置了READ_LOG权限后,所有异常数据都会携带systemlog。

  3. 获取系统日志的性能消耗如何?

    单次执行logcat对效率的影响很小。如果C#或lua异常频繁触发,因为SDK有上报抑制,只有在需要上传的时候才会获取系统日志。