clipboard · 剪贴板代理
拦截 ClipboardManager(剪贴板)。把目标 App 读写剪贴板时的包名替换为虚拟包名,并处理 Android 8.0(Oreo)剪贴板 API 变更。
拦截的服务
Context.CLIPBOARD_SERVICE,继承 BinderInvocationProxy。
关键行为
- 用
ReplaceLastPkgMethodProxy改写getPrimaryClip/setPrimaryClip/getPrimaryClipDescription/hasPrimaryClip/addPrimaryClipChangedListener/removePrimaryClipChangedListener/hasClipboardText的最后一个包名参数。 - 版本适配:
getInterface()区分 Oreo 前后——Oreo 后从ClipboardManagerOreo.mService取系统服务,Oreo 前从ClipboardManager.getService静态字段取。 inject()不只替换sCache,还把系统ClipboardManager实例的mService字段改写为代理接口(兼容部分版本绕过 sCache 直接持有的情况)。isOreo()兼容三星设备特殊处理(DeviceUtil.isSamsung())。
与虚拟服务的关系
剪贴板沿用真实系统,仅靠包名改写让系统把剪贴板操作归属到虚拟包,避免目标 App 的剪贴板内容暴露真实包名。
拦截方法清单
从源码 onBindMethods / @Inject 内部类提取的 MethodProxy 拦截点:
- addPrimaryClipChangedListener
- getPrimaryClip
- getPrimaryClipDescription
- hasClipboardText
- hasPrimaryClip
- removePrimaryClipChangedListener
- setPrimaryClip拦截与转发流程
剪贴板沿用真实系统,仅改包名让操作归属虚拟包——不建虚拟剪贴板服务,避免内容双份。