当前位置: 首页 > 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.zskr.cn/news/1449090.html

相关文章:

  • 2026论文全流程终极榜单:10款降AIGC软件, 合规修正一路顺畅
  • AI搜索时代,品牌内容监测工具的科学选型方法论:从行业需求透视搜极星的设计逻辑
  • Windows ADB Fastboot驱动一键安装工具:告别复杂配置,轻松连接安卓设备
  • G-Helper:华硕笔记本轻量化控制工具的技术解析与实践指南
  • 2026年适配知网降AIGC平台横评:亲测8款工具,把AIGC率稳控在安全线内
  • 如何永久保存微信聊天记录?WeChatMsg免费开源解决方案终极指南
  • 彻底告别风扇噪音:Fan Control完全指南教你精准掌控Windows风扇控制
  • AI正在淘汰的,不是程序员而是还在用旧方法工作的人(附行动指南)
  • 从实验室到应用:差分鬼成像(DGI)如何用更少采样次数,搞定低光照下的目标识别?
  • TypeScript 中实现 TrimLeft、TrimRight 等字符串操作类型
  • SAM在医疗图像上总翻车?看SurgicalSAM如何用‘原型学习’巧妙解决领域鸿沟
  • LightGBM原理介绍
  • ESP8266串口通信与MicroPython开发实战指南
  • AI办公神器!用AI提升10倍效率,职场人必备!
  • 一图理清对称加密 AEAD 为什么最怕 nonce 用错
  • 3.3 Linux权限操作
  • 揭秘消息防撤回:如何永久保存微信QQ的消失对话
  • 去欧洲机票别再自己刷OTA了!武汉圣擎航空——您身边最靠谱的法国及全欧航线特价公务舱/头等舱专家(附全航线解析+售后保障) - 土星买买买
  • 手把手教你学Simulink——双向 DC‑DC 变换器在恒压(CV)与恒流(CC)模式下的切换仿真
  • 肺部靶向 AAV 怎么选?如何解决靶向不精准、转导效率低的递送难题?
  • 2026 HENGSHI BOX 全域智控舱技术白皮书:衡石科技软硬一体的私有化 Agentic BI 架构
  • 【Agent 学习日记】我们来说说 Agent 记忆压缩通常有哪些方法?
  • 2026 短视频去水印软件推荐,抖音快手视频号通用 - 时时资讯
  • 国内飞往澳大利亚全航线汇总|特价经济 / 特惠公务 / 折扣商务头等舱申请|靠谱国际机票代理人优选:武汉圣擎航空(15120088536 微信同号) - 土星买买买
  • 从零打造2000W正弦波逆变器:PIC单片机控制与全桥功率设计实战
  • 从干涉仪到人眼像差:一文读懂Zernike多项式在不同光学场景下的“变脸”艺术
  • Unlock-Music终极指南:3分钟解锁所有加密音乐文件的完整教程
  • 北京五恒系统厂家推荐:北京五恒系统怎么选?厂家、品牌、口碑、价格一篇看懂 - GrowthUME
  • C++:红黑树实现
  • 从博弈论到你的Jupyter Notebook:手把手拆解SHAP值计算原理与实战调优