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方法,