后台进程管理
功能介绍
云手机cph_performance系统服务,自动清理后台应用进程,防止第三方应用后台自动拉起和相互唤醒,对开机速度、手机OOM、CPU高占用等现象有显著的提升和改善。
- cph_performance低内存查杀策略
使用方法
- 监听被杀应用广播
客户后台管理程序可以通过监听被杀应用广播,获取被杀应用的包名和原因。
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,同时通知栏弹出系统低内存通知。
- 后台自启动管理策略
- 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:cph_performance系统服务。
lowmemorykiller:AOSP原生lmkd服务。
- 后台自启动拦截日志
- 低内存查杀关键日志
- 命令行工具
adb shell dumpsys cph_performance [command] [args]
命令
参数
说明
举例
debug
无
切换DEBUG日志开关
adb shell dumpsys cph_performance debug
setEnableBgKiller
[true] or [false]
设置后台进程清理特性开关,默认开启
adb shell dumpsys cph_performance setEnableBgKiller true
setEnableAutoRunController
[true] or [false]
设置后台自启动管理特性开关,默认开启
adb shell dumpsys cph_performance setEnableAutoRunController true
addBgKillerWhiteApp
[packageNames]
包名列表,多个包名之间以空格分隔
添加后台进程清理白名单
adb shell dumpsys cph_performance addBgKillerWhiteApp com.android.pkg1 com.android.pkg2
rmBgKillerWhiteApp
[packageNames]
包名列表,多个包名之间以空格分隔
删除后台进程清理白名单
adb shell dumpsys cph_performance rmBgKillerWhiteApp com.android.pkg1 com.android.pkg2
addAutoRunWhiteApp
[packageNames]
包名列表,多个包名之间以空格分隔
添加后台自启动管理白名单
adb shell dumpsys cph_performance addAutoRunWhiteApp com.android.pkg1 com.android.pkg2
rmAutoRunWhiteApp
[packageNames]
包名列表,多个包名之间以空格分隔
删除后台自启动管理白名单
adb shell dumpsys cph_performance rmAutoRunWhiteApp com.android.pkg1 com.android.pkg2
约束
- 默认开启。
- 默认对daemon进程、白名单应用豁免。
- 低内存Critical档位查杀所有运行中的应用进程,包括白名单应用。