自启动、关联启动的拦截规则
1. 自启动管控需求来源
自启动、关联启动、交叉启动、推送启动等现象的泛滥除了对个人信息保护带来隐患外,还会导致占用过多的系统CPU和内存资源,造成系统卡顿、发热、电池消耗过快;还可能引入一些包含“恶意代码”的进程在后台隐蔽启动,避开了杀毒软件等的查杀,威胁到用户通信秘密、财产安全。
2.自启动和管理启动的基础
App启动基础:Android 四大组件Activity\BroadCast\Service\ContentProvid是App启动的基本单元,大部分APP会直接或间接地依赖于这四种方式进行启动。
3.自启动和关联启动拦截规则
原理:应用主要是依赖四大组件启动,故在四大组件启动的通路新增插桩点,根据设定规则,进行组件式规则拦截,达到治理后台自启动和关联启动的现象。
3.1 通用拦截规则
1.如果是自启动和关联启动白名单应用或组件名,则不拦截启动
2.如果是前台桌面进程启动,即caller是前台可见进程或负一屏,则不拦截启动
3.如果是CTA、CTS、monkey或工程模式,则不拦截启动
4.如果caller是shell或root用户,则不拦截启动
5.如果一些自研应用或测试应用,则不拦截启动
6.如果是画中画、悬浮窗等启动,则不拦截启动
7.如果是widget启动,则不拦截启动
8.如果被调用者是系统应用或正在运行,则允许启动
9.如果调用者和被调用者是同一个应用,则允许启动。
10.如果调用者是系统应用,则允许启动
11.如果调用者是非系统应用,且被调用者是同步或闹钟操作,则禁止启动。
12.如果被调用者被限制在后台运行,则禁止启动
3.2 Activity启动拦截规则
1.如果调用者是系统应用或系统签名,则不拦截启动
2.如果被调用者是系统,则不拦截启动
3.如果是1个像素点或透明activity,则不拦截启动
4.如果 Intent 来自系统通知(from_systemUi),则允许启动。
5.如果调用者没有前台活动(callerVisible 为 false),则禁止启动。
6.如果调用者有前台活动,则允许启动。
3.3 Service启动拦截规则
(1) 窗口策略检测
如果被调用者与窗口相关(如 WindowAlarm),则允许启动。
拦截原因设置为 REASON_WINDOW。
(2) 通知检测
如果 Intent 来自系统通知(from_systemUi),则允许启动。
拦截原因设置为 REASON_NOTIFICATION。
(3) 被调用者检测
系统应用检测:
如果被调用者是系统应用,则允许启动。
拦截原因设置为 REASON_CALLED_SYSTEM。
前台运行检测:
如果被调用者正在前台运行(calledVisible 为 true),则允许启动。
拦截原因设置为 REASON_CALLED_FG。
活跃状态检测:
如果被调用者处于活跃状态(getAppActiveState 为 true),则允许启动。
拦截原因设置为 REASON_ACTIVE。
WebView 检测:
如果被调用者的类名包含 WEBVIEW_CLASSNAME_KEY(如 "sandbox"),则允许启动。
拦截原因设置为 REASON_WEB。
自启动检测:
如果调用者和被调用者是同一个应用,则允许启动。
拦截原因设置为 REASON_CALLER_SAME_CALLED。
如果被调用者处于空闲或冻结状态(getAppFreezeOrIdleState 为 true),并且被调用者在黑名单中(checkIsRestriced 为 true),则禁止启动。
拦截原因设置为 REASON_THIRDAPP_BLACK。
(4) 系统应用检测
调用者是系统应用:
如果调用者是系统应用,则允许启动。
拦截原因设置为 REASON_CALLER_SYSTEM。
非系统应用检测:
如果调用者是非系统应用,且被调用者是同步或闹钟操作,则禁止启动。
拦截原因设置为 REASON_JOB_SYNC_FORBIDDEN 或 REASON_ALARM_FORBIDDEN。
(5) 后台运行检测
如果被调用者被限制在后台运行(checkCanRunningBG 为 true),则禁止启动。
拦截原因设置为 REASON_USER_SET_BACKGROUND_RESTRICTED。
3.4 Broadcast启动拦截规则
(1) 窗口策略检测
如果被调用者与窗口相关(如 WindowAlarm),则允许启动。
拦截原因设置为 REASON_WINDOW。
(2) 通知检测
如果 Intent 来自系统通知(from_systemUi),则允许启动。
拦截原因设置为 REASON_NOTIFICATION。
(3) 被调用者检测
系统应用检测:
如果被调用者是系统应用,则允许启动。
拦截原因设置为 REASON_CALLED_SYSTEM。
前台运行检测:
如果被调用者正在前台运行(calledVisible 为 true),则允许启动。
拦截原因设置为 REASON_CALLED_FG。
活跃状态检测:
如果被调用者处于活跃状态(getAppActiveState 为 true),则允许启动。
拦截原因设置为 REASON_ACTIVE。
自启动检测:
如果调用者和被调用者是同一个应用,则允许启动。
拦截原因设置为 REASON_CALLER_SAME_CALLED。
如果被调用者处于空闲或冻结状态(getAppFreezeOrIdleState 为 true),并且被调用者在黑名单中(checkIsRestriced 为 true),则禁止启动。
拦截原因设置为 REASON_THIRDAPP_BLACK。
(4) 白名单检测
如果 Intent 的 Action 在白名单中(mActionWhiteList),则允许启动。
拦截原因设置为 REASON_ACTION_WHITE。
(5) 系统应用检测
调用者是系统应用:
如果调用者是系统应用,则允许启动。
拦截原因设置为 REASON_CALLER_SYSTEM。
非系统应用检测:
如果调用者是非系统应用,且被调用者未运行,则禁止接收系统广播。
拦截原因设置为 REASON_THIRDAPP_NOTRUNNING_CANT_RECIEVING_SYSTEM_BROADCAST。
(6) 后台运行检测
如果被调用者被限制在后台运行(checkCanRunningBG 为 true),则禁止启动。
拦截原因设置为 REASON_USER_SET_BACKGROUND_RESTRICTED。
(7) 默认策略
如果以上所有检测都未返回明确结果(即结果为 DEFAULT),则默认允许启动。
拦截原因保持为 REASON_DEFAULT。
3.5 Provider启动拦截规则
无太多规则,主要是名单配置规则