广播拦截策略
1.流程图
广播发送
├─ 特权进程(Root/Shell) → 放行
├─ 系统进程(UID≤1000) → 自动启动校验 → 非法广播? → 拦截
│ ├─ 黑名单匹配 → 拦截
│ └─ 用户/白名单校验 → 受限用户? → 拦截
│ ├─ 小部件/智能白名单 → 放行
│ └─ 普通应用 → 分类限制检查 → 命中? → 拦截
├─ 动态白名单链 → 匹配任一? → 放行
└─ 特殊广播处理 → 黑名单/分类限制 → 拦截
2.拦截策略
拦截类型 | 触发条件/判断逻辑 | 处理结果 |
超级省电模式拦截 | 激活且应用不在白名单() | 拦截 |
系统进程校验 | 系统进程(UID≤1000)触发: • 非法广播(activityInfo==null) • 黑名单匹配() | 拦截 |
多用户限制 | 非主用户/访客用户中: • 受限用户(isRestrictUser) • 特定应用(拼多多/支付宝等,) | 拦截 |
白名单豁免 | 满足任一条件: • 系统应用/小部件() • 智能白名单() • Action白名单() | 放行 |
分类限制检查 | 非四大组件类型(!isCpnType)且非Top应用(!isTopPkg),匹配全局/组件限制列表 | 拦截 |
动态进程状态检查 | 同时满足: • 非默认允许启动(!) • 非活跃进程(!) | 拦截 |
特权进程豁免 | Root/Shell进程(isRootOrShell) | 放行 |
实验版本特殊处理 | 实验版本()且非全局黑名单 | 放行 |
Provider拦截
1.流程图
2.拦截策略
拦截类型 | 触发条件/判断逻辑 | 处理结果 | 设计目的 |
系统进程豁免 | 调用方进程UID≤10000 | 放行 | 保障系统核心功能稳定性 |
全局黑名单拦截 | 应用在全局禁止列表 | 拦截 | 防止恶意应用滥用Provider25 |
组件黑名单拦截 | 满足以下任一条件: • 调用方为null且Provider在黑名单 • 调用方进程名不包含Provider包名且Provider在黑名单 | 拦截 | 限制未授权访问或跨应用滥用 |
超级省电模式拦截 | 超级省电模式激活且未通过rSPS校验 | 拦截 | 极端场景下限制非核心应用资源占用 |
分类限制拦截 | 匹配全局/组件分类限制规则(如非四大组件类型) | 拦截 | 防止非必要后台数据共享56 |
动态状态放行 | 满足以下任一条件: • 默认白名单() • 活跃进程() | 放行 | 优化内存和性能 |
多维度白名单放行 | 满足以下任一条件: • 保护白名单() • 关联白名单() • Provider组件白名单() • 调用方在白名单() | 放行 | 保障授权应用或组件正常运作 |
Activity拦截
1.流程图
2.拦截策略
检查类型 | 处理结果 | 关联方法/配置 | 设计目的 |
无效Intent检查 | 拦截 | handleWhiteListCheck参数校验 | 防止无效或恶意Intent |
调用方白名单 | 放行 | 预置调用方包名白名单 | 授权应用豁免拦截 |
目标包名白名单 | 放行 | 预置目标包名白名单 | 保护核心应用组件 |
目标组件白名单 | 放行 | 预置Activity类名白名单6 | 精确控制组件级访问 |
自调用白名单 | 放行 | 同应用内调用校验3 | 允许应用内部安全跳转 |
关联白名单 | 放行 | 跨应用关联授权(如合作应用)6 | 支持生态内协作 |
全局黑名单 | 拦截 | 全局禁用应用列表16 | 封禁高风险或违规应用 |
推送黑名单 | 拦截 | 禁止非关联应用弹窗3 | 防止广告/骚扰推送 |
关联黑名单 | 拦截 | 预置危险调用关系6 | 阻断恶意应用协作 |
锁屏黑名单 | 拦截 | 锁屏禁用组件列表3 | 保障锁屏安全性与功耗 |
超级省电模式 | 拦截 | InSuperPowerSavingMode()1 | 极端场景下限制非核心功能 |
分类限制 | 拦截 | 按组件类型(如后台Activity)过滤3 |
Service拦截
1.流程图
graph TD
A[调用shouldPreventStartService] --> B{type=""?}
B -- Yes --> C{UID≤10000?}
C -- Yes --> Z[放行]
C -- No --> D{组件黑名单且非自调用?}
D -- Yes --> Y[拦截]
D -- No --> E{Action黑名单且非自调用?}
E -- Yes --> Y
E -- No --> F{BlackguardList命中?}
F -- Yes --> Y
F -- No --> Z
B -- No --> G{参数无效?}
G -- Yes --> Z
G -- No --> H{全局黑名单?}
H -- Yes --> Y
H -- No --> I{分类限制?}
I -- Yes --> Y
I -- No --> J{startService?}
J -- Yes --> K{目标进程未启动且不允许跨进程?}
K -- Yes --> Y
K -- No --> Z
J -- No --> L{bindService?}
L -- Yes --> M{系统应用?}
M -- No --> N{命中非系统白名单?}
N -- Yes --> Z
N -- No --> Y
M -- Yes --> O{通知/Job/Sync白名单?}
O -- Yes --> Z
O -- No --> P{GCM服务且非体验版?}
P -- Yes --> Q{自启动/LRU白名单?}
Q -- Yes --> Z
Q -- No --> Y
P -- No --> Y
2.拦截策略
拦截场景 | 触发条件 | 放行条件 | 优先级 |
系统进程豁免 | 调用方UID ≤ 10000 | 直接放行 | 最高 |
组件黑名单 | 组件类名在黑名单 && 非自调用(!callerApp.processName.contains(pkgName)) | 自调用或非黑名单组件 | 高 |
Action黑名单 | Action在黑名单 && 非自调用 | Action为空或非黑名单 | 高 |
BlackguardList拦截 | Action在特殊黑名单 | 无豁免条件 | 高 |
全局应用黑名单 | 包名在全局黑名单 | 体验版且非核心黑名单(isExpVersion && !isExGlobalBlackList) | 中 |
分类限制拦截 | 应用分类受限(如后台服务) | 默认放行标记/白名单/LRU进程 | 中 |
跨进程启动拦截 | startService&& 目标进程未启动 | 允许跨进程启动(isAllowStartFromStartService返回true) | 低 |
非系统应用绑定拦截 | bindService&& 非系统应用调用 | Root/Shell进程或命中任意白名单(包名+Action/组件/Job/Sync) | 中 |
系统应用绑定拦截 | bindService&& 系统应用调用 | 通知服务/Job/Sync白名单豁免 | 中 |
GCM绑定拦截 | GCM服务 && 非体验版 | 自启动白名单/默认放行/LRU进程 | 低 |
RemovePendingJob
1.流程图
2.拦截策略
检查条件 | 命中结果 | 逻辑说明 | 优先级 |
包名为空或无法获取应用信息 | 移除 | 参数无效防御性处理 | 最高 |
应用分类限制检查命中(如后台限制模式) | 移除 | 通过检测后台/电池优化等场景 | 高 |
默认放行标记(isDefaultAllowStart) | 放行 | 系统标记为关键应用(如系统服务) | 中 |
自启动白名单(isInAutoBootWhiteList) | 放行 | 用户手动配置或厂商预装应用 | 中 |
LRU近期使用进程(isInLruProcessesLocked) | 放行 | 关联AMS的最近使用进程列表,提升用户体验 | 低 |
bringUpServiceLocked拦截
1.流程图
2.拦截策略
检查条件 | 结果 | 逻辑行为 |
全局开关关闭(mSwitch=false)或包名为空 | 放行 | 直接返回false,允许继续执行启动流程 |
非标准启动类型(非REGULAR_PROCESS_STARTUP)且包名受限制 | 拦截 | 若包名不在白名单(),返回true阻止启动 |
系统限制后台启动(())且包名在限制列表() | 拦截 | 更新限制计数()并返回true |
包名在LRU近期使用进程列表() | 放行 | 即使命中限制列表,LRU机制仍放行 |
StartInstrumentation拦截
1.流程图
2.拦截策略
检查条件 | 结果 | 逻辑行为 |
基础参数无效(组件名/应用信息/包名为空) | 放行 | 直接返回false,允许StartInstrumentation执行 |
实验版本或白名单应用 | 放行 | 跳过所有限制检查 |
Oneway Binder调用(callingPid=0) | 拦截 | 全局开关开启或包名在黑名单时拦截 |
Root/Shell进程 | 放行 | 系统级调用不限制 |
LRU进程 | 放行 | 用户近期使用的应用豁免限制 |
关联调用黑名单命中 | 拦截 | 记录拦截事件并更新统计 |
StartInstrumentation拦截
1.流程图
2.拦截策略
检查条件 | 拦截逻辑 |
应用进程清理后触发重启 | 若在息屏黑名单中则拦截自启动 |
屏幕唤醒锁释放时检查 | 白名单应用放行,Persist限制应用拦截 |
Alarm定时任务触发时 | 息屏状态且命中黑名单则忽略Alarm |
判定标准 | 行为 |
---------------------------------- | ----------------------------------------------------------------------------- |
包名在熄屏黑名单列表 | 拦截(返回true) |
包名在系统白名单(如系统核心应用) | 放行(返回false) |
包名在Persist限制列表 | 拦截(返回true) |