ContentProvider Hook解析

5, ContentProvider Hook解析

ContentProvider和service一样,也是通过代理分发机制进行Hook,并且比service更简单,没有周期的处理,只有几个简单的方法,

例如, query/insert/delete/update等,

在AndroidManifest中注册了一个多进程的ContentProvider,

<provider
   android:name="com.didi.virtualapk.delegate.RemoteContentProvider"
   android:authorities="${applicationId}.VirtualAPK.Provider"
   android:process=":daemon" />

5.1 Hook过程

到此为止,还没有出现ContentProvider的Hook类,

当在插件中调用getContentResolver方法时就会调用PluginContext的getContentResolver方法,

public ContentResolver getContentResolver() {
     return new PluginContentResolver(getHostContext());
}

相当于直接利用PluginContentResolver替换掉系统的ContentResolver,并且PluginContentResolver也是继承于ContentResolver,

当调用query/insert/delete/update等方法时,会调用ContentResolver的acquireProvider/acquireExistingProvider等方法,

PluginContentResolver的acquireProvider方法如下,

if (mPluginManager.resolveContentProvider(auth, 0) != null) {
      return mPluginManager.getIContentProvider();
}
return (IContentProvider) sAcquireProvider.invoke(mBase, context, auth);

首先调用PluginManager的resolveContentProvider方法进行匹配,如果匹配上了,就需要Hook,否则说明不是插件的ContentProvider,不需要Hook。

PluginManager的getIContentProvider方法如下,

public synchronized IContentProvider getIContentProvider() {
    if (mIContentProvider == null) {
        hookIContentProviderAsNeeded();
    }
return mIContentProvider;
}

如果IcontentProviderProxy对象已经创建了就直接返回,否则就创建IcontentProviderProxy对象,

hookIContentProviderAsNeeded的主要逻辑如下,

1,获取已注册的ContentProvider的uri,然后主动调用了其call方法,


                
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值