Android 12:在 ActivityStarter 层拦截分享、搜索与 HTTP 外链

发布时间:2026/6/2 19:45:55

Android 12:在 ActivityStarter 层拦截分享、搜索与 HTTP 外链 场景客户自研 Launcher需要在系统侧限制第三方应用通过 TextView 链接跳转、文本/图片分享等路径离开业务界面。Android 12 起与「能否启动 Activity」强相关的逻辑集中在wm模块的ActivityStarter中适合在此做统一拦截。1. 背景与入口位置Android 12 变更应用启动相关逻辑中ActivityStarter已从传统am侧迁移到窗口管理侧源码路径为frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java拦截思路在解析 Intent、得到可启动目标ResolveInfo等之后根据action、data等特征直接放弃解析结果例如将rInfo置空使后续流程无法找到可启动组件等价于「禁止启动」。2. 拦截分享、网页搜索与 http(s) 浏览在ActivityStarter中合适位置需与你们工程里err、intent、rInfo等变量生命周期一致增加类似逻辑对ACTION_SEND/ACTION_SEND_MULTIPLE/ACTION_WEB_SEARCH一律忽略对ACTION_VIEW且 data scheme 为http/https的除打日志外可在主线程弹出提示并同样清空解析结果。frameworks\base\services\core\java\com\android\server\wm\ActivityStarter.java// 屏蔽发送、分享及搜索Stringactionintent.getAction();ContextcontextmService.mUiContext;// 获取可用于弹 Toast 等的 UI 上下文if(Intent.ACTION_SEND.equals(action)||Intent.ACTION_SEND_MULTIPLE.equals(action)||Intent.ACTION_WEB_SEARCH.equals(action)){Slog.w(TAG,ignore an intent: intent);rInfonull;}elseif(Intent.ACTION_VIEW.equals(action)intent.getData()!null){Stringschemeintent.getData().getScheme();if(scheme!nullscheme.startsWith(http)){newHandler(Looper.getMainLooper()).post(newRunnable(){Overridepublicvoidrun(){Toast.makeText(context,该功能暂不可使用,Toast.LENGTH_SHORT).show();}});rInfonull;Slog.w(TAG,ignore an intent: intent);}}说明要点ACTION_SEND/ACTION_SEND_MULTIPLE覆盖系统分享、多选分享等入口。ACTION_WEB_SEARCH覆盖「网页搜索」类 Intent。ACTION_VIEWhttp覆盖浏览器打开链接若业务仍允许tel:、mailto:等可在分支中按 scheme 细化。rInfo null后需保证与原有错误码、err赋值逻辑一致避免出现不一致的启动结果需结合你们补丁前后完整编译与 CTS/冒烟验证。3.mUiContext从何而来ActivityTaskManagerService截图对应ActivityTaskManagerService构造函数片段系统在创建 ATMS 时会保存当前系统进程的ActivityThread并从中取出系统 UI 上下文供需要与用户界面交互的系统服务使用例如上述Toast。frameworks\base\services\core\java\com\android\server\wm\ActivityTaskManagerService.javapublicActivityTaskManagerService(Contextcontext){mContextcontext;mFactoryTestFactoryTest.getMode();mSystemThreadActivityThread.currentActivityThread();mUiContextmSystemThread.getSystemUiContext();// ... ClientLifecycleManager、WindowOrganizerController 等初始化}因此ActivityStarter里通过mService.mUiContext具体字段名以你们分支为准拿到的本质上是ActivityThread.currentActivityThread()关联的getSystemUiContext()与「普通应用进程里用 Activity 拿到的 Context」不是同一路径但足以支撑系统侧轻量 UI 提示仍须遵守多用户、显示层级等系统限制。4. 验证建议合并冲突ActivityStarter在版本迭代中 diff 较多建议基于同一 Android 12 基线打补丁并做 rebase 记录。日志保留Slog.w(TAG, ignore an intent: intent)便于现场抓取完整 Intent排查误杀。范围若仅针对「指定包名」拦截可在上述判断外再增加callingPackage/userid等条件避免影响系统组件或白名单应用。

相关新闻