更新时间:2024-07-31 GMT+08:00

后台进程管理

功能介绍

云手机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,同时通知栏弹出系统低内存通知。

  • 后台自启动管理策略
    除了以下豁免策略的应用进程之外,禁止第三方应用进程后台自动拉起和相互唤醒。

    豁免策略的应用

    备注

    系统应用

    如:/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

      -a <packageName|packageNames>

      添加后台进程清理白名单。

      参数为包名列表,多个包名之间以","分隔。

      adb shell cmd performance bg-killer -a com.android.test1,com.android.test2

      -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

      -a <packageName|packageNames>

      添加后台自启动管理白名单。

      参数为包名列表,多个包名之间以","分隔。

      adb shell cmd performance auto-run -a com.android.test1,com.android.test2

      -d <packageName|packageNames>

      删除后台自启动管理白名单。

      参数为包名列表,多个包名之间以","分隔。

      adb shell cmd performance auto-run -d com.android.test1,com.android.test2

    • adb shell dumpsys performance [command] [args]

      查看服务特性使能状态、客户白名单等服务信息。

约束

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