Android13 应用被冻结导致ANR问题处理

问题描述

Android13 项目,应用一段时间无操作后再点击操作会报ANR异常导致应用崩溃。


原因分析:

  1. Android 11 QPR3 或更高版本支持 Android Freezer 。此功能用于停止执行缓存的进程,并通过让可能会试图在缓存期间运行的应用执行不当行为来减少资源用量。框架通过将进程迁移到冻结的 cgroup 来冻结缓存的应用;这可以减少活跃缓存应用存在的活跃和空闲 CPU 消耗)

由于应用无操作,系统将应用冻结,再次操作时无法响应,导致ANR

  1. 应用被冻结时会打印相关日志信息,可通过指令 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进程冻结机制

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值