一、概要
   1.定义: 
  当应用切换到后台并且没有其他活动时,系统会在一定时间内通过状态判断,将进程 ID 迁移到冻结的 cgroup 节点上,实现冻结 CACHE 应用。这项功能可以减少活跃缓存应用在后台存在时所消耗的 CPU 资源,从而达到节电的目的。当应用再次切换到前台时,系统会将该应用的进程解冻,以实现快速启动。 
 
 
  
  2.作用: 
 
 
  
 -  
   进程的执行被暂停:冻结的进程会被暂停,其所有线程的执行将被停止,包括应用程序的主线程以及任何后台线程。
 -  
   资源释放:冻结进程占用的资源,例如 CPU 和内存,会被释放。这些资源将被系统重新分配给其他需要执行的进程或系统服务。
 -  
   电池节省:冻结进程不会在后台运行,因此可以节省设备的电池消耗。对于后台的应用程序,冻结可以降低其电池使用量,延长设备的电池寿命。
 -  
   系统稳定性:通过冻结不活跃或低优先级的进程,可以避免它们竞争系统资源,从而提高系统的稳定性和响应能力。
 -  
   快速恢复:冻结的进程可以快速恢复其执行状态。当需要重新激活进程时,系统可以迅速将其恢复到之前的运行状态,而无需重新启动或加载应用程序。
 
   3.挂起进程的方式 
 
 
 
   冻结是不分配cpu资源,也即进程挂起。 
 
 
 
   1)通过信号暂停进程 
 
 
  
  # 在另一个终端上发送信号。 
 
 
  
  kill 
  -SIGSTOP 16690 
  # 发送信号任务给进程ID16690暂停 
 
 
  
  kill 
  -SIGCONT 16690 
  # 发送信号任务给进程ID16690恢复 
 
 
  
  2)通过shell命令 
 
 
  
  adb 
  shell 
  device_config put activity_manager_native_boot use_freezer 
  true 
  && adb reboot 
 
 
  
  //检查是否冻结 
 
 
  
  adb shell 
  cat 
  /dev/freezer/frozen/cgroup.procs 
 
 
  
  adb shell 
  cat 
  /sys/fs/cgroup/uid_{应用UID}/cgroup.freeze 
 
 
  
  adb logcat | grep -i 
  "\(freezing\|froze\)" 
 
 
 整体架构流程
   提示:这里可以添加技术整体架构 
 
 
 
   例如: 
 
 
 
   在语言模型中,编码器和解码器都是由一个个的 Transformer 组件拼接在一起形成的。 
 
 
 
 
 技术名词解释
   提示:这里可以添加技术名词解释 
 
 
 
   例如: 
 
 
 -  
   Bert
 -  
   GPT 初代
 -  
   GPT-2
 -  
   GPT-3
 -  
   ChatGPT
 
技术细节
   提示:这里可以添加技术细节 
 
 
 
   例如: 
 
 
 -  
   API
 -  
   支持模型类型
 
   进程的OOM_ADJ (Out of Memory Adjustment)值除了决定系统内存不足的时候是否回收该进程,进程冻结策略也是依赖它去计算的。有下面的这些场景会触发进程oom adj值的重新计算,大概有切换Activity、启动广播、绑定服务、是否可见状态改变等: 
 
 
 
   1.冻结流程 
 
 
 -  
   Activity destroy的时候在ActivityRecord.setState里面就会去更新进程状态,更新进程状态的时候就会更新oom adj:
 -  
   进程oom adj值的重新计算最终会去到OomAdjuster.applyOomAdjLSP,在里面就会调用updateAppFreezeStateLSP去更新进程的进程冻结状态:
 -  
   进程oom adj值的重新计算最终会去到OomAdjuster.applyOomAdjLSP,在里面就会调用updateAppFreezeStateLSP去更新进程的进程冻结状态:
 -  
   freezeAppAsyncLSP里面会post一个10分钟的message在时间到了的时候去冻结进程(就是10分钟之后调用Process.setProcessFrozen):
 
 
  总结一下就是,如果进程的oom adj大于CACHED_APP_MIN_ADJ,就会启动一个10分钟的定时器,在10分钟之内如果进程的oom adj一直没有变回小于CACHED_APP_MIN_ADJ就会冻结进程。 
 
 
 
   2.解冻流程 
 
 
 -  
   Activity start的时候在ActivityRecord.setState里面就会去调用WindowProcessController.updateProcessInfo更新进程状态,更新进程状态的时候就会更新oom adj:
 -  
   最终也是会去到OomAdjuster.updateAppFreezeStateLSP,调用链路在上面的冻结流程里面已经追过,这里就省略了。可以看到如果adj小于CACHED_APP_MIN_ADJ就会调用CachedAppOptimizer.unfreezeAppLSP进行解冻:
 -  
   最终去到CachedAppOptimizer.unfreezeAppInternalLSP里面,如果还在10分钟的后悔时间里面就直接removeMessages删除定时器,如果进程已经冻结了就调用Process.setProcessFrozen解冻进程(frozen参数传入false)
 
小结
   提示:这里可以添加总结 
 
 
 
   例如: 
 
 
 
   提供先进的推理,复杂的指令,更多的创造力。 
 
 



















