问题描述
Android13 项目,应用一段时间无操作后再点击操作会报ANR异常导致应用崩溃。
原因分析:
- Android 11 QPR3 或更高版本支持 Android Freezer 。此功能用于停止执行缓存的进程,并通过让可能会试图在缓存期间运行的应用执行不当行为来减少资源用量。框架通过将进程迁移到冻结的 cgroup 来冻结缓存的应用;这可以减少活跃缓存应用存在的活跃和空闲 CPU 消耗)
由于应用无操作,系统将应用冻结,再次操作时无法响应,导致ANR
- 应用被冻结时会打印相关日志信息,可通过指令 adb logcat | grep -i "freezing " 判断应用是否被冻结。
ActivityManager: freezing 1527 xxx
解决方案:
1. 修改冻结相关逻辑,通过包名过滤对应的apk,实现应用不冻结的需求。具体修改如下:
frameworks/base/services/core/java/com/android/server/am/CachedAppOptimizer.java
private void freezeProcess(final ProcessRecord proc) {
int pid = proc.getPid(); // Unlocked intentionally
final String name = proc.processName;
.....
+ if("xxxxx".equals(name)){ //添加包名过滤
+ Slog.d(TAG_AM,"ignore freezeProcess "+name);
+ return;
+ }
.....
}
2. 关闭后台进程冻结功能,具体操作如下:
开发者选项里面找到"Suspend execution for cached apps"条目去控制后台进程冻结功能的开关,也可以用命令去控制:
adb shell settings put global cached_apps_freezer <enabled|disabled|default>
enable 打开
disabled 关闭
default 由系统决定是否打开
参考
应用程序冻结器
Android13冻结进程分析:如何提高设备性能和用户体验
Android Freezer 简介
Android进程冻结机制