后台进程管理
功能介绍
云手机performance系统服务,自动清理后台应用进程,防止第三方应用后台自动拉起和相互唤醒,对开机速度、手机OOM、CPU高占用等现象有显著的提升和改善。
- 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:performance系统服务。
lowmemorykiller:AOSP原生lmkd服务。
- 后台自启动拦截日志
- 低内存查杀关键日志
- 命令行工具
- 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]
查看服务特性使能状态、客户白名单等服务信息。
- adb shell cmd performance [command] [args]
约束
- 默认开启。
- 默认对daemon进程、白名单应用豁免。
- 低内存Critical档位查杀所有运行中的应用进程,包括白名单应用。