如何用 Xposed 注册(代理)服务

本文探讨了如何在Xposed模块与宿主应用间进行有效通信,介绍了使用广播、ContextProvider和代理Service的方法,特别强调了通过在宿主应用中创建代理Service,绕过SELinux限制,实现跨进程服务代理的技术细节。
摘要由CSDN通过智能技术生成

如何用 Xposed 注册(代理)服务

最近写 Xposed 模块又遇到了一个问题

两个应用直接有没有什么好一点的方法进行交互?

我们知道,Xposed 模块和宿主应用一般不属于同一个进程,所以我们要解决的问题本质是

如何跨进程通信

目前一些解决方案

广播

目前比较主流的方法就是广播,但广播有以下缺点:

  • 传输的对象必须是可序列化的
  • 广播是单程的,如果需要完成一次交互则需要两次广播
  • 无法确定对方的存活性
  • 广播是开放的,有被拦截的风险

ContextProvider

也有使用 ContextProvider 去完成通信的,效果嘛,比广播好,但也有缺点,就是复杂

代理 Activity

Xposed 既然是模块,为啥要交互嘞,于是将模块Activity放入宿主App,也不失一种方法。

代理Service

既然Activity能代理,那Service能代理吗?那我们先理一下Service的流程

流程

服务端
  • aidl接口和Stub实现
  • 写一个基于Service子类,实现 fun onBind(intent: Intent?): IBinder 方法,方法体里面返回aidl的实现
  • 然后去 AndroidManifest.xml注册Service,添加Intent过滤器
客户端
  • 利用Context#bindService()进行绑定服务
    • Intent:符合过滤器
    • ServiceConnection:连接器
      • onServiceConnected(ComponentName name, IBinder service):连接回调
        • ComponentName:目标组件
        • IBinder:代理服务,通过aidl.Stub#asInstance()即可获得服务
      • void onServiceDisconnected(ComponentName name):断开回调
细节

好,代码都会写了。我们就知道两个应用中传递了一个IBinder,通过IBinder完成服务的代理。Xposed 完全可以实现在宿主里面创建一个Binder实例。那现在的问题是如何将这个Binder代理给到Xposed模块?

传输Binder

Binder本身并不是一个可序列化的对象,这就淘汰了很多跨进程的方式。

似乎没有什么好的办法了,

但是我们忽略了一个问题,在fun onBind(intent: Intent?): IBinder方法里,并不会限制IBinder是哪个BinderasBinder()出来的。

意思是,完全可以利用宿主中存在的Service给Xposed模块的Service开门,实现代理Service

实现

理论成立,说下简单的实现步骤

  1. 在宿主中找一个没啥用的Service,主要是模块容易连接的,比如export = true或者IntentFilter条件简单的
  2. 模块可以通过正常方式连接这个服务,但Intent中做好特定的标记
  3. Hook该ServiceonBind方法,通过判断Intent中是否存在特定的标记从而选择返回模块中的Binder
  4. 模块中可以直接使用aidl#asInstance()解析这个IBinder从而完成Service代理

后话

这种方法不仅适用于对普通应用进行Service代理,也可以实现添加自定义系统服务

Ps:由于Selinux的存在,已经没法通过ServiceManager#addSerice()添加自定义系统服务了,故而可以通过这个方法进行曲线救国。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Xposed Framework需要一些技术知识和操作步骤。下面是一个简单的Xposed使用教程的概述: 1. ROOT您的Android设备:Xposed Framework需要Root权限才能正常工作,因此首先需要将您的Android设备ROOT。ROOT的具体步骤会因设备型号和Android版本而有所不同,请根据您的设备进行相应的ROOT操作。 2. 下载和安装Xposed Framework:从可信的来源下载适用于您设备和Android版本的Xposed Framework安装文件。常见的下载来源包括Xposed官方网站(https://repo.xposed.info/)和XDA Developers论坛(https://forum.xda-developers.com/)。安装Xposed Framework的具体步骤会因设备和Android版本而有所不同,请根据所下载的安装文件的指引进行安装。 3. 启用Xposed Framework:安装完成后,打开Xposed Installer应用程序。如果一切正常,您将看到Xposed Framework的状态为"Framework installed and active"。如果状态不是这样,请按照应用程序的提示进行修复。 4. 安装和管理Xposed模块:在Xposed Installer应用程序中,您可以浏览和搜索各种Xposed模块。选择您感兴趣的模块,然后点击安装按钮进行安装。安装完成后,您需要在模块列表中启用相应的模块。 5. 重启设备并享受修改:完成模块的安装和启用后,您需要重新启动您的Android设备。在设备重新启动后,Xposed Framework将会加载已安装的模块,并应用相应的修改。您可以根据所安装的模块的功能来体验修改后的系统行为。 请注意,以上仅是一个简单的概述,具体的步骤和操作可能因设备和Android版本而有所不同。在使用Xposed Framework之前,请务必备份重要数据,并仔细阅读相关文档和教程,以确保正确安装和使用。 同时,请注意合法合规使用Xposed Framework,遵守相关规定和法律。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值