
# 后台进程管理
#### 功能介绍
云手机performance系统服务，自动清理后台应用进程，防止第三方应用后台自动拉起和相互唤醒，对开机速度、手机OOM、CPU高占用等现象有显著的提升和改善。
- performance低内存查杀策略
  当系统剩余空闲内存低于某阈值，将根据剩余内存档位，从高到低选择杀不同优先级的进程。
  
  | 策略        | 触发条件       | 清理进程                                                                                                    |
  |:---|:---|:---|
  | High档     | 总内存剩余25%   | 空进程 缓存进程                                                                |
  | Middle档   | 总内存剩余20%   | 已使用过且不可感知类进程 （不可见、无悬浮窗、无音频焦点等）                                          |
  | Low档      | 总内存剩余15%   | 上一个使用过的Activity进程 上一个使用过的Provider进程 后台服务进程 |
  | Critical档 | 总内存剩余200MB | 根据内存占用从大到小查杀所有应用进程，直到剩余总内存高于200MB为止                                                                     |
     
  
 
#### 使用方法
- 监听被杀应用广播
  客户后台管理程序可以通过监听被杀应用广播，获取被杀应用的包名和原因。
  ```
  public static final String ACTION_APP_KILLED = "android.intent.action.APP_KILLED";
  private MyBroadcastReceiver mBroadcastReceiver = new MyBroadcastReceiver();
  private void registerReceiver() {
  IntentFilter filter = new IntentFilter(ACTION_APP_KILLED);
  this.registerReceiver(mBroadcastReceiver, filter);
  }
  private void unregisterReceiver() {
  this.unregisterReceiver(mBroadcastReceiver);
  }
  private class MyBroadcastReceiver extends BroadcastReceiver {
  private static final String TAG = "AppKilled";
  @Override
  public void onReceive(Context context, Intent intent) {
  Log.d(TAG, "package: " + intent.getStringExtra("package"));
  Log.d(TAG, "reason: " + intent.getStringExtra("reason"));
  }
  }
  ```
  

- 前台App内存泄漏举例 使用云手机总内存为3.79GB，编写Demo App通过JNI native层分配超大内存，使得系统剩余内存低于200MB，就会相继触发低内存强杀High档位到Critical档位。
  ```
  #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)
  #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)
  extern "C" JNIEXPORT jint JNICALL
  Java_com_android_memnative_MainActivity_mallocMem(JNIEnv *env, jobject thiz, jint mb) {
      jint total = 0;
      for (jint i = 0; i < mb; i++) {
          jint size = sizeof(char) * 1024 * 1024;
          char *p = (char *) malloc(size);
          if (p != NULL) {
              memset(p, 1, size);
              LOGI("malloc success: %d mb\n", mb);
              total += 1;
          } else {
              LOGE("malloc failed: %d mb\n", mb);
          }
      }
      LOGI("malloc total: %d mb\n", total);
      return total;
  }
  ```
  ```
  public class MainActivity extends AppCompatActivity {
   
      static {
          System.loadLibrary("memnative");
      }
      public native int mallocMem(int mb);
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          setContentView(R.layout.activity_main);
          mallocMem(3300); // malloc native memory 3300MB
      }
  }
  ```
  系统会根据进程重要程度自动清理应用进程，同时发出被杀应用广播。若清理完后台进程，系统剩余总内存仍低于200MB，且前台App内存占用最大，则杀前台App，同时通知栏弹出系统低内存通知。
  ![](https://support.huaweicloud.com/usermanual-cph/zh-cn_image_0000001580790624.png "点击放大")
  
  

- 后台自启动管理策略
  除了以下豁免策略的应用进程之外，禁止第三方应用进程后台自动拉起和相互唤醒。
  
  | 豁免策略的应用 | 备注                               |
  |:---|:---|
  | 系统应用    | 如：/system/app、/system/priv-app等。 |
  | 特权应用    | 如：uid=1000、默认输入法等。               |
  | 可视化应用   | 如：有桌面挂件、动态壁纸类应用等。                |
  | 白名单应用   | 请参考命令行工具。                        |
     
  
- Logcat关键日志
  - 低内存查杀关键日志
    **logcat \| grep LMK**
    ```
    BackgroundAppKiller: [LMK] start to kill top app, which takes up a lot of memory: ActivityRecord{248080f u0 com.android.memnative/.MainActivity t84}
    BackgroundAppKiller: [LMK] Killing AppInfo{packageName='com.android.memnative', uid=10059, isHighMemClean=false, reason='[memory:critical]', startTraffic=0, delayMillis=0, totalMillis=0}
    lowmemorykiller: [LMK] start to kill process.
    lowmemorykiller: [LMK] Killing 'com.android.deskclock' (4198), uid 10049, adj 906
    ```
    BackgroundAppKiller：performance系统服务。
    lowmemorykiller：AOSP原生lmkd服务。
    
  
  
  
  - 后台自启动拦截日志
    **logcat -s AutoRunController \| grep "has no auto-run permission"**
    ```
    AutoRunController: com.android.memnative has no auto-run permission to startProcess
    ```
    
   
- 命令行工具
  - **adb shell cmd performance \[command\] \[args\]**
    支持修改服务使能状态、增删客户白名单功能。
    
    | 命令        | 参数                               | 说明                                                                 | 举例                                                                         |
    |:---|:---|:---|:---|
    | bg-killer | -e \<true\|false\>               | 设置后台进程清理特性开关，默认开启。                                                 | adb shell cmd performance bg-killer -e true                                |
    | bg-killer | -a \<packageName\|packageNames\> | 添加后台进程清理白名单。 参数为包名列表，多个包名之间以","分隔。    | adb shell cmd performance bg-killer -a com.android.test1,com.android.test2 |
    | bg-killer | -d \<packageName\|packageNames\> | 删除后台进程清理白名单。 参数为包名列表，多个包名之间以","分隔。    | adb shell cmd performance bg-killer -d com.android.test1,com.android.test2 |
    | auto-run  | -e \<true\|false\>               | 设置后台自启动管理特性开关，默认开启。                                                | adb shell cmd performance auto-run -e true                                 |
    | auto-run  | -a \<packageName\|packageNames\> | 添加后台自启动管理白名单。 参数为包名列表，多个包名之间以","分隔。    | adb shell cmd performance auto-run -a com.android.test1,com.android.test2  |
    | auto-run  | -d \<packageName\|packageNames\> | 删除后台自启动管理白名单。 参数为包名列表，多个包名之间以","分隔。 | adb shell cmd performance auto-run -d com.android.test1,com.android.test2  |
       
    
  
  - **adb shell dumpsys performance \[command\] \[args\]**
    查看服务特性使能状态、客户白名单等服务信息。
    
   
 
#### 约束
- 默认开启。

- 默认对daemon进程、白名单应用豁免。
- 低内存Critical档位查杀所有运行中的应用进程，包括白名单应用。
 
