Skip to content

InvocationStubManager · 代理注册器 ​

InvocationStubManager 是 45 个系统服务代理的调度中枢——单例,扫描所有 IInjector 实现并批量 inject(),把虚拟 Binder 替换进 ServiceManager.sCache,完成系统服务劫持。它是 bindApplication 流程的关键一环。

单例与状态 ​

java
public final class InvocationStubManager {
    private static InvocationStubManager sInstance = new InvocationStubManager();
    private static boolean sInit;
    private Map<Class<?>, IInjector> mInjectors = new HashMap<>(13);

    public static InvocationStubManager getInstance();
    public boolean isInit();
    public void init() throws Throwable;   // 入口:injectAll + sInit=true
}

mInjectors 按 IInjector 的 Class 索引注入器实例,供后续 findInjector/getInvocationStub 取回。

API ​

方法作用
getInstance()取单例
init()初始化入口,调 injectAll() 注入全部代理
injectAll()调 injectInternal()(受 sInit 保护,只注入一次)
injectInternal()实例化并 addInjector 全部 ~40 个 Stub
addInjector(IInjector)注册单个注入器到 mInjectors
findInjector(clazz)按类型取注入器实例
checkEnv(clazz)校验某注入器环境是否就绪
getInvocationStub(injectorClass)取注入器对应的 MethodInvocationStub(即替换后的 Binder 代理)

注入器清单(节选) ​

injectInternal() 顺序注册约 40 个 Stub,覆盖几乎所有系统服务。按类别:

类别注入器
核心ActivityManagerStub、PackageManagerStub、LibCoreStub、HCallbackStub、TransactionHandlerStub
通信ClipBoardStub、ContentServiceStub、ISmsStub、ISubStub、PhoneSubInfoStub
设备/状态TelephonyStub、TelephonyRegistryStub、LocationManagerStub、PowerManagerStub、VibratorStub、DisplayStub、WindowManagerStub
网络ConnectivityStub、WifiManagerStub、BluetoothStub、ContextHubServiceStub
媒体/输入AudioManagerStub、InputMethodManagerStub、AppWidgetManagerStub、MmsStub
账户/搜索AccountManagerStub、SearchManagerStub、UserManagerStub
调度/策略AlarmManagerStub、JobServiceStub、AppOpsManagerStub、RestrictionStub、SessionManagerStub
其他NotificationManagerStub、DropBoxManagerStub、MountServiceStub、BackupManagerStub、PersistentDataBlockServiceStub

各注入器对应一个 服务代理 的详细文档。

注入机制 ​

每个注入器实现 IInjector,inject() 时通常走 BinderInvocationStub 或 MethodInvocationProxy:

调用时机 ​

init() 由 VClientImpl.bindApplicationNoCheck 在加载目标 App ClassLoader 之后、makeApplication 之前调用——确保目标 App 任何系统服务调用都已先被劫持:

关联 ​

基于 VirtualApp 与 epic,仅供学习研究。VirtualApp 禁止商用。