需求

增加系统黑白名单,用于控制进程是否常驻,进程优化等。
1).白名单应用避免被系统杀掉,保持常驻
2).黑名单应用,针对性的进行限制,避免常驻内存,系统内存吃紧时,将其杀掉
开发者可以根据自己的策略进行修改扩展。动态的设置oomAdj 或者 直接进行杀掉。

增加黑白名单接口

frameworks/base / core/java/android/app/IActivityManager.aidl

List<String> getProtectedAppList();
void setProtectedAppList(in List<String> protectedAppList);
List<String> getStoppedAppList();
void setStoppedAppList(in List<String> stopAppList);

frameworks/base/core/java/android/app/ActivityManager.java

public List<String> getProtectedAppList() {try {return getService().getProtectedAppList();} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}public void setProtectedAppList(List<String> protectedAppList) {try {getService().setProtectedAppList(protectedAppList);} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}public List<String> getStoppedAppList() {try {return getService().getStoppedAppList();} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}public void setStoppedAppList(List<String> stopAppList) {try {getService().setStoppedAppList(stopAppList);} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}public void killNativeProcess(int[] pids) {try {getService().killNativeProcess(pids);} catch (RemoteException e) {throw e.rethrowFromSystemServer();}}

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

//Begin memory black & white listprivate List<String> mStopAppList = new ArrayList<String>();private List<String> mProtectedAppList = new ArrayList<String>();@Overridepublic List<String> getProtectedAppList() {return mProtectedAppList;}@Overridepublic void setProtectedAppList(List<String> protectedAppList) {this.mProtectedAppList = protectedAppList;}@Overridepublic List<String> getStoppedAppList() {return mStopAppList;}@Overridepublic void setStoppedAppList(List<String> stopAppList) {this.mStopAppList = stopAppList;}//End memory black & white list

白名单控制

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

 //Begin memory optimizeprivate boolean isProtectedApp(ProcessRecord app, ProcessRecord TOP_APP) {boolean rst = false;if(null != app && null != TOP_APP && app.uid == TOP_APP.uid){Log.i(TAG, app + "has same uid as top app, we should protect it.");return true;}List<String> protectedApps = getProtectedAppList();Log.i(TAG, "check whether app should stop " + app);Log.i(TAG, "protected list contains " + protectedApps);if(null != protectedApps && protectedApps.size() > 0){for(String processName : protectedApps){if(!TextUtils.isEmpty(processName) && processName.equals(app.processName)){rst = true;break;}}}String tmp = rst?"is":"is not";Log.i(TAG, "app " + app + tmp +" contained in protected list, we should protect it");return rst;}//End memory optimize
final void updateOomAdjLocked() {...applyOomAdjLocked(app, wasKeeping, TOP_APP, true, false, now);switch (app.curProcState) {case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY:case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:mNumCachedHiddenProcs++;numCached++;if (numCached > cachedProcessLimit && !isProtectedApp(app, TOP_APP)) {//这这里针对白名单       应用进行维护killUnneededProcessLocked(app, "cached #" + numCached);}break;}

黑名单控制

这里主要限制的是,服务被杀后,自启动
frameworks/base/services/core/java/com/android/server/am/ActiveServices.java

//Begin memory optimizeprivate static final int APP_UID_BEGIN = 10000;private boolean shouldStopService(ServiceRecord r){boolean rst = false;List<String> stoppedApps = mAm.getStoppedAppList();Log.i(TAG, "check whether service should stop " + r);Log.i(TAG, "stop list contains " + stoppedApps);if(null != stoppedApps&& stoppedApps.size() > 0&& null != r&& null != r.app&& r.app.uid >= 10000&& null != r.appInfo&& !TextUtils.isEmpty(r.appInfo.packageName)){for(String pkgName : stoppedApps){if(!TextUtils.isEmpty(pkgName)&& pkgName.equals(r.appInfo.packageName)){rst = true;break;}}}String tmp = rst?"is":"is not";Log.i(TAG, "service " + r + tmp + " contained in stop list");return rst;}//End memory optimize
void serviceDoneExecutingLocked(ServiceRecord r, int type, int startId, int res) {boolean inDestroying = mDestroyingServices.contains(r);if (r != null) {if (type == ActivityThread.SERVICE_DONE_EXECUTING_START) {Log.e(TAG, "service " + r.name.toString() + " started");//Begin memory optimize 在这里增加限制if(shouldStopService(r)){Log.e(TAG, "service " + r.name.toString() + " should be stopped");res = Service.START_NOT_STICKY;}//End memory optimize// This is a call from a service start...  take care of// book-keeping.r.callStart = true;//上面限制后,进行判断switch (res) {case Service.START_STICKY_COMPATIBILITY:case Service.START_STICKY: {// We are done with the associated start arguments.r.findDeliveredStart(startId, true);// Don't stop if killed.r.stopIfKilled = false;break;}case Service.START_NOT_STICKY: {// We are done with the associated start arguments.r.findDeliveredStart(startId, true);if (r.getLastStartId() == startId) {// There is no more work, and this service// doesn't want to hang around if killed.r.stopIfKilled = true;}break;}case Service.START_REDELIVER_INTENT: {}case Service.START_TASK_REMOVED_COMPLETE: {}default:}if (res == Service.START_STICKY_COMPATIBILITY) {r.callStart = false;}} else if (type == ActivityThread.SERVICE_DONE_EXECUTING_STOP) {}final long origId = Binder.clearCallingIdentity();serviceDoneExecutingLocked(r, inDestroying, inDestroying);Binder.restoreCallingIdentity(origId);} else {Slog.w(TAG, "Done executing unknown service from pid "+ Binder.getCallingPid());}}

参考:
Android增加系统白名单
从updateOomAdjLocked看lowmemorykiller之外的Android进程回收机制
Service的自动重启问题

实战-Android 系统黑白名单相关推荐

  1. android ip 黑白名单,GaussDB T 单机 IP黑白名单配置

    一.测试环境: 数据库服务器IP为192.168.100.1,侦听端口为1888.需配置的远程连接IP为192.168.100.,需禁止接入的IP为192.168.10.,192.168.2.225. ...

  2. android ota 方案实战,Android 系统OTA升级流程

    Android系统进行升级的时候,有两种途径,一种是通过接口传递升级包路径自动升级(Android系统SD卡升级),升级完之后系统自动重启:另一种是手动进入recovery模式下,选择升级包进行升级, ...

  3. 实战-Android 系统读取Uboot环境变量实现

    需求 系统起来之后,很多时候需要读取或者设置Uboot下的环境变量 实现 不同平台读取uboot环境变量略微有差异,思路都大同小异.Uboot底层有读取环境变量的实现,可参考实现. 这里以Amlogi ...

  4. 实战-Android系统默认关闭内核打印

    需求 出于性能考虑,系统默认关闭kernel 打印,需要查看是通过 dmesg 命令查看. 实现 diff --git a/kernel/printk/printk.c b/kernel/printk ...

  5. Android底层网络防火墙,详解Android 利用Iptables实现网络黑白名单(防火墙)

    一.概述 为了使读此简笔的人对Iptables有一个简单的了解,此处强行百度了一波概念,如果想深入的了解Iptables的各种配置规则和内核对其的管理运行机制请自行www.baidu.com,这些并不 ...

  6. Android 系统(212)---monkey实战–测试步骤、常用参数、常规monkey命令

    monkey实战–测试步骤.常用参数.常规monkey命令 [转]monkey实战–测试步骤.常用参数.常规monkey命令 ***(本文转自:https://blog.csdn.net/u01164 ...

  7. libraries 和android runtime之间的关系,《Android Studio应用开发实战详解》——第1章,第1.3节Android系统架构...

    本节书摘来自异步社区<Android Studio应用开发实战详解>一书中的第1章,第1.3节Android系统架构,作者 王翠萍,更多章节内容可以访问云栖社区"异步社区&quo ...

  8. 《Android Studio应用开发实战详解》——第1章,第1.2节Android系统基础

    本节书摘来自异步社区<Android Studio应用开发实战详解>一书中的第1章,第1.2节Android系统基础,作者 王翠萍,更多章节内容可以访问云栖社区"异步社区&quo ...

  9. 《Android 网络开发与应用实战详解》——2.3节Android系统架构

    本节书摘来自异步社区<Android 网络开发与应用实战详解>一书中的第2章,第2.3节Android系统架构,作者 王东华,更多章节内容可以访问云栖社区"异步社区"公 ...

最新文章

  1. AI硬件碎片化难题,英特尔想用“一个API”解决,还推出新的编程语言DPC++
  2. WebServices 简介
  3. python论文格式检查系统_论文格式检查软件
  4. JAVA进阶day06内部类和匿名类
  5. 技术和赚钱真的冲突吗?
  6. 【hihocoder 1039 字符串消除】模拟
  7. java pdf转base64_后台返回pdf的base64编码到前端,如果pdf中有中文,不会显示问题?...
  8. Fisher准则一维聚类
  9. arcpy.mapping常用四大件-MapsurroundElement
  10. Use __doPostBack() As A Bridge
  11. 网易云会员歌曲下载记录(.ncm-.mp3)
  12. win7语言文件夹c盘什么位置,Win7系统C盘中ProgramData文件夹在哪?
  13. Flutter异常Another exception was thrown: A RenderFlex overflowed by 5.0 pixels on the bottom解决方案
  14. 手机屏幕物理点击器是什么原理_手机触摸屏的原理是什么?
  15. 想想自己如果不做开发,可能会从事什么职业?
  16. 手机使用计算机网络打印机,手机也可连接打印机 NETGEAR WNDR4700 无线打印
  17. RAID 0 1 5 10特点以及工作原理
  18. 网页中验证码无法正常显示
  19. “30岁,打拼十年,一事无成”:前半生偷的懒,后半生拼命还
  20. 用C++设计一个简单的学籍管理系统

热门文章

  1. 颜值测试软件99分,心理学:第一眼看到了什么,测你的真实颜值多少分?我居然99分...
  2. 计算机网络技术零基础自学英语软件,零基础英语app排行榜 10款比较好的英语自学APP推荐...
  3. win10 ideal Go 运行和编译
  4. 坯子库无法一键安装插件没用_坯子插件库下载-坯子插件库电脑版下载v2020.1-IE浏览器中文网站...
  5. 18年往届菜鸟的编程进阶路
  6. 轻薄本用服务器的性能,高性能轻薄本推荐-高性能轻薄本排行榜2020
  7. 科研人必看,SCI期刊实时影响因子的意义和算法
  8. html url 空格转义字符,url特殊字符转义小知识
  9. easyExcel生成动态表头
  10. 调酒壶里的酸奶(DFS)