Android 에서는 ActivityManager 하여금 프로세스를 제어하는데 Freeze 라는 프로세스 제어방법이 존재한다.

 

Freeze pid 바탕으로 프로세스를 멈추는 역할을 진행한다. 내용은 CPU 점유율 부하를 막기위해 설정된 time r경과하였음에도 지속적으로 동작하는 process cgroup으로 옮기고 freeze하여 CPU의 점유율에서 제외되도록 하는 기능이다.

 

 

 

1. Freeze 정보 확인

adb shell device_config list | findstr activity_manager_native_boot

위와 같이 명령을 입력하면 use_freezer, time등의 셋업된 값을 있다. use_freezer 경우 프로세스 freeze 진행하는 모듈동작을 allow해주는 의미를 가지며 time값의 경우 프로세스 freeze작업을 진행하기 위한 트리거 값이된다.

 

 

 

2. Freeze

frameworks/base/core/java/android/os/Process.java

    /**
     * Freeze or unfreeze the specified process.
     *
     * @param pid Identifier of the process to freeze or unfreeze.
     * @param uid Identifier of the user the process is running under.
     * @param frozen Specify whether to free (true) or unfreeze (false).
     *
     * @hide
     */
    public static final native void setProcessFrozen(int pid, int uid, boolean frozen);


    /**
     * Enable or disable the freezer. When enable == false all frozen processes are unfrozen,
     * but aren't removed from the freezer. While in this state, processes can be added or removed
     * by using setProcessFrozen, but they won't actually be frozen until the freezer is enabled
     * again. If enable == true the freezer is enabled again, and all processes
     * in the freezer (including the ones added while the freezer was disabled) are frozen.
     *
     * @param enable Specify whether to enable (true) or disable (false) the freezer.
     *
     * @hide
     */
    public static final native void enableFreezer(boolean enable);

Freeze동작을 위한 코든느 위와 같다. 실제 Freeze unFreeze 진행하기위한 API setProcessFrozen() 이며

enable 경우 Freeze기능 자체를 on/off하기 위해 존재하는 API이다.

 

해당 기능은 Android 11 QPR3 이상버전에서 지원하는 기능이며 process 갑자기 동작을 하지 않는 것으로 확인할 있다.

ps -ef 검색하면 process자체는 죽지 않고 살아있지만 동작만 안하는 상태로 Freeze상태를 이해하면 같다.

 

Freeze기능자체를 on/off하기 위해 아래 명령어를 사용할 있다.

  • Freeze On
adb shell device_config put activity_manager_native_boot use_freezer true
 
  • Freeze Off
adb shell device_config put activity_manager_native_boot use_freezer false

 

마지막으로 Freeze 발생되면 ActivityManager Tag Frozon 혹은 Freezing으로 검색해서 로그를 확인할 있다.

 

 

  • ref

https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/os/Process.java;bpv=0;bpt=1

https://source.android.com/devices/tech/perf/cached-apps-freezer

+ Recent posts