如何看待 Lody 新开源的 VirtualApp 插件框架

2025-04-09 08:10:42
推荐回答(1个)
回答1:

占坑,慢慢更。

LBE平行空间没有研究过,DroidPlugin倒是非常熟悉;我简单比较一下VA和DP吧。

首先,VA利用ContentProvider的同步特性构建了一套跨进程同步通信机制;这使得整个框架的核心得以摆脱AIDL Service异步过程的苦恼,代码看起来比较整洁,用起来也非常方便;同时,这个机制也解决了插件之间跨进程通信的难题;类似DroidPlugin这样的多进程机制的插件系统,如果插件之间需要通信,必须使用IPC机制:广播,AIDL等等,这些通信都是异步的,写起来非常蛋疼;而构建在ContentProvider机制上的同步AIDL通信使得插件的跨进程通信就像普通函数调用一样简单。它的实现原理就是把ContentProvider当作一个ServiceManager,所有的Binder都放在这里管理,利用query/call的同步调用方式,把Binder对象透传到不同的进程;这一点我会专门写文章介绍。

其次,对于组件Hook技术来说;我大致看了一下代码,Activity的处理方式和DroidPlugin没有本质的不同;但是对Service组件以及ContentProvider组件的处理有较大改进;非常清晰,处理方式也是直击要害;可以看出年轻的lody对Android Framework已经有相当的功力了。这里插个广告,Android插件化原理解析——ContentProvider的插件化 对于ContentProvider的处理跟我这篇文章类似,读者可以领略一下。

然后,在Hook框架方面,lody使用了基于注解的依赖注入技术;这使得虽然hook的对象很多,代码确井井有条;DP的hook都是相当直接的。当然,除去写法上的不同,在Java层他们hook的本质是相同的。关于如何hook可以参考我对DroidPlugin的介绍:
Android插件化原理解析——Hook机制之动态代理
Android插件化原理解析——Hook机制之Binder Hook

接着,VA处理了一部分native层的hook;从引入的libxhook.so可以看出来;这使得VA对于插件so的支持更加完善。具体hook了什么还不是很清楚,待研究。(已确认这个so没有用,thx @朱立志 提醒!)