Xamarin.Android应用在Zebra TC21/TC26设备闲置后启动崩溃需重装
问题解决方案
问题复现方法
- 开启设备开发者选项中的「不保留活动」开关,同时将后台进程限制设置为「不允许后台进程」,模拟系统低内存回收Application的场景
- 应用正常运行一次后切后台,执行adb命令模拟系统回收:
adb shell am kill <你的应用包名>(不要用force-stop,后者会清除应用临时状态,无法复现系统回收的真实场景) - 重启设备后不启动应用,触发Zebra设备默认的深度休眠电源优化策略,静置1-2小时后再启动应用,大概率可以复现崩溃
系统日志排查重点
- 优先过滤
AndroidRuntime: FATAL EXCEPTION开头的日志,获取完整的崩溃堆栈,确认NRE发生的具体类、字段或方法调用位置 - 搜索
ActivityManager: Killing相关日志,确认崩溃前系统是否回收过应用进程,记录回收的触发条件、时间节点 - 排查
PackageManager、ApplicationInfo相关日志,确认应用启动时是否存在组件加载失败、权限缺失的异常 - 过滤依赖注入框架的相关日志,确认DI容器初始化阶段是否有服务注册失败、实例创建异常的报错
重启无法修复问题的排查方向
该现象基本可以定位为应用持久化存储数据损坏导致,重启设备不会清除应用私有目录下的SharedPreferences、本地数据库、缓存配置文件,只有卸载重装才会清空所有私有数据,可重点排查以下逻辑:
- 依赖注入框架是否有将服务实例状态持久化到本地的逻辑,恢复状态时未做空校验触发NRE
- Zebra设备的深度休眠机制会对应用私有文件做特殊缓存优化,进程被强制回收时可能产生写入一半的脏数据,下次启动解析失败
Application子类的OnCreate初始化逻辑是否依赖本地持久化数据,数据读取失败后未做降级处理直接抛出异常
Zebra设备Loggly日志无法采集的解决方法
Zebra设备默认开启企业级日志拦截策略,第三方应用的自定义日志会被默认拦截,可做如下调整:
- 在
AndroidManifest.xml中添加权限配置:android.permission.READ_LOGS、对应存储权限 - 开启开发者选项中的「企业日志输出」开关,允许第三方应用输出日志
- 优先将日志写入本地私有目录的文件中,崩溃后直接导出本地日志排查,无需依赖Loggly上报
临时规避方案
- 在
Application的OnCreate方法中添加全局异常捕获,捕获到启动阶段的NRE时自动清空本地持久化配置,再重启应用 - 所有依赖注入的服务调用处统一做空校验,即使容器初始化失败也走降级逻辑,避免直接崩溃
内容的提问来源于stack exchange,提问作者Tim Coulter
相关产品推荐
相关产品推荐

