当前位置: 首页 > news >正文

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等)之后,根据actiondata等特征直接放弃解析结果(例如将rInfo置空),使后续流程无法找到可启动组件,等价于「禁止启动」。

2. 拦截分享、网页搜索与 http(s) 浏览

ActivityStarter中合适位置(需与你们工程里errintentrInfo等变量生命周期一致)增加类似逻辑:对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

// 屏蔽发送、分享及搜索Stringaction=intent.getAction();Contextcontext=mService.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);rInfo=null;}elseif(Intent.ACTION_VIEW.equals(action)&&intent.getData()!=null){Stringscheme=intent.getData().getScheme();if(scheme!=null&&scheme.startsWith("http")){newHandler(Looper.getMainLooper()).post(newRunnable(){@Overridepublicvoidrun(){Toast.makeText(context,"该功能暂不可使用",Toast.LENGTH_SHORT).show();}});rInfo=null;Slog.w(TAG,"ignore an intent: "+intent);}}

说明要点:

  • ACTION_SEND/ACTION_SEND_MULTIPLE:覆盖系统分享、多选分享等入口。
  • ACTION_WEB_SEARCH:覆盖「网页搜索」类 Intent。
  • ACTION_VIEW+http:覆盖浏览器打开链接;若业务仍允许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.java

publicActivityTaskManagerService(Contextcontext){mContext=context;mFactoryTest=FactoryTest.getMode();mSystemThread=ActivityThread.currentActivityThread();mUiContext=mSystemThread.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等条件,避免影响系统组件或白名单应用。
http://www.jsqmd.com/news/937737/

相关文章:

  • 解锁ARM设备远程控制新范式:RDP Wrapper的技术实现与创新应用
  • TypeScript 类型级别编程进阶:探索类型系统的深度应用
  • 中大企业知产管理升级:汉知宝以全场景能力成为优选方案
  • git过滤不需要的build编译文件
  • cubase15 R2R最新完整一键安装版本下载安装cubase 15最新版本下载安装支持Win/Mac 双系统版本加104G原厂音源Mac系统不关SIP安装Mac Cubase15.0.10编曲软件
  • 打破手机跑大模型壁垒,面壁智能联合清华开源端侧新品BitCPM-CANN
  • Ollama 本地跑开源模型:开发者最小上手命令与环境备忘
  • Windows环境下CP/M BIOS定制:从环境搭建到源码修改实战
  • AI搜索时代,品牌内容监测工具的科学选型方法论:从行业需求透视搜极星的设计逻辑
  • Windows ADB Fastboot驱动一键安装工具:告别复杂配置,轻松连接安卓设备
  • 2026论文全流程终极榜单:10款降AIGC软件, 合规修正一路顺畅
  • G-Helper:华硕笔记本轻量化控制工具的技术解析与实践指南
  • Windows风扇控制终极指南:Fan Control完全配置与优化教程
  • 计量室工业仪表IP分配记录
  • Windows HEIC缩略图终极解决方案:5分钟让iPhone照片在资源管理器完美预览
  • 使用 TypeScript 递归条件类型实现深只读(DeepReadonly)
  • 【字节跳动】「第四篇」山西大同太行算力中心全套设备及能耗安保弱电完整详单
  • Lab of Things:构建标准化物联网研究平台的核心架构与实践
  • 2026年适配知网降AIGC平台横评:亲测8款工具,把AIGC率稳控在安全线内
  • 如何永久保存微信聊天记录?WeChatMsg免费开源解决方案终极指南
  • 彻底告别风扇噪音:Fan Control完全指南教你精准掌控Windows风扇控制
  • AI工具链统一纳管实战手册(从零构建可信模型注册中心)
  • 从实验室到应用:差分鬼成像(DGI)如何用更少采样次数,搞定低光照下的目标识别?
  • 如何将微信对话转化为个人数字资产:WeChatMsg数据自主管理指南
  • AI正在淘汰的,不是程序员而是还在用旧方法工作的人(附行动指南)
  • 终极免费MP4视频修复工具:如何从损坏文件中拯救珍贵记忆
  • TypeScript 中实现 TrimLeft、TrimRight 等字符串操作类型
  • 2026 企业软件开发新风向: AI+原生代码平台快速迭代
  • SAM在医疗图像上总翻车?看SurgicalSAM如何用‘原型学习’巧妙解决领域鸿沟
  • 【真实经验分享】PDB未按预期时间执行自动统计信息收集问题分析