ContentProvider在AMS中相关的数据结构
ContentProvider数据结构
ContentProvider_ams.png应用进程端数据结构
1. ContentProvider
ContentProvider组件,我们要实现一个ContentProvider需要继承它,实现完成之后本进程或者其他进程就可以调用它都增删改查都接口了.
Transport mTransport : 继承了ContentProviderNative, ContentProviderNative又继承了Binder类,实现了IContentProvider接口,所以mTransport实现了IContentProvider的Binder服务端,其他地方(也可能是跨进程)调用ContentProvider的时候直接调用到Transport类中。
2. ProviderClientRecord
ProviderClientRecord描述了应用进程中一个ContentProvider的信息
mProvider :指向了ContentProvider的Transport对象
mLocalProvider: 指向了对应的ContentProvider对象
3. ActivityThread中如何保存ContentProvider信息
// The lock of mProviderMap protects the following variables.
final ArrayMap<ProviderKey, ProviderClientRecord> mProviderMap
= new ArrayMap<ProviderKey, ProviderClientRecord>();
final ArrayMap<IBinder, ProviderRefCount> mProviderRefCountMap
= new ArrayMap<IBinder, ProviderRefCount>();
final ArrayMap<IBinder, ProviderClientRecord> mLocalProviders
= new ArrayMap<IBinder, ProviderClientRecord>();
final ArrayMap<ComponentName, ProviderClientRecord> mLocalProvidersByName
= new ArrayMap<ComponentName, ProviderClientRecord>();
mProviderMap : 以ProviderKey为Key保存了App端所有运行的ContentProvider信息
mProviderRefCountMap : 记录了App端所有ContentProvider的引用信息
mLocalProviders : 以ContentProvicer的Binder为key,保存了App端所有的ContentProvider信息
mLocalProvidersByName : 以CompomentName为key,保存了App端所有端ContentProvider信息
AMS端的数据结构
1. ContentProviderRecord
在AMS服务中来描述一个ContentProvider信息,对应于App端的一个ProviderClientRecord。
- ProviderInfo info : 描述一个ContentProvider在AndroidManifest.xml文件中的信息
- CompomentName name: ContentProvider的名称
- boolean singleton : 该ContentProvider是否支持单例模式
- provider : App端ContentProvider的中Transport的代理端
在ActivityThread的installProvider()过程,会创建ContentProvider对象, 该对象有一个成员变量Transport,继承于ContentProviderNative对象,作为binder服务端。经过binder传递到system_server 进程的便是ContentProvider.Transport的binder代理对象, 由publishContentProviders()过程完成赋值; - ProcessRecord proc: ContentProvider所属进程的基本信息
- ProcessRecord launchingApp : 记录了等待ContentProvider所在进程启动.
- ArrayList<ContentProviderConnection> connections : 记录了所有调用当前ContentProvider的连接信息.
2. ContentProviderConnection
连接contentProvider与请求该provider所对应的进程
provider : 目标Provider所对应的ContentProviderRecord结构体
client : 请求Provider的客户端进程
3. ProviderMap
记录了系统中所有发布的Provider信息
mProvidersByNamePerUser : 按照Provider的名字为Key, 记录了所有Provider信息
mProvidersByClassPerUser : 按照CompomentName为key, 记录了所有Provider信息
4. ProcessRecord
// class (String) -> ContentProviderRecord
final ArrayMap<String, ContentProviderRecord> pubProviders = new ArrayMap<>();
// All ContentProviderRecord process is using
final ArrayList<ContentProviderConnection> conProviders = new ArrayList<>();
pubProviders: 记录了当前进程所有已经发布的Provider信息
conProviders : 记录了当前进程和其他进程所建立的连接