10.5 第三阶段:调用installSystemProviders方法

ActivityManagerService第三阶段的工作由installSystemProviders方法完成,代码如下:


public final class ActivityManagerService extends ActivityManagerNative

implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback{

……

public static final void installSystemProviders(){

List<ProviderInfo>providers;

synchronized(mSelf){

/*从ActivityManagerService的mProcessNames取出进程名为system的进

*程。user ID为SYSTEM_UID的进程信息,该信息在setSystemProcess函数

中设置过,即system_server/

ProcessRecord app=mSelf.mProcessNames.get("system",

Process.SYSTEM_UID);

/*调用ActivityManagerService的方法生成运行在system进程中的

ProviderInfo,表示一个Content Provider/

providers=mSelf.generateApplicationProvidersLocked(app);

/过滤flags标记不为FLAG_SYSTEM的非系统级APK(参考PMS)/

if(providers!=null){

for(int i=providers.size()-1;i>=0;i—){

ProviderInfo pi=(ProviderInfo)providers.get(i);

if((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)==0){

providers.remove(i);

}

}

}

}

调用ActivityThread的方法安装该Provider/

if(providers!=null){

mSystemThread.installSystemProviders(providers);

}

//监视Settings数据库的变化

mSelf.mCoreSettingsObserver=new CoreSettingsObserver(mSelf);

//通过usagestats服务监视系统使用状态

mSelf.mUsageStatsService.monitorPackages();

}


ActivityManagerService的installSystemProviders方法的主要工作可以分为以下两个步骤:

1)调用generateApplicationProvidersLocked查询Content Provider。

2)调用ActivityThread.installSystemProviders安装Content Provider。

10.5.1 查询Content Provider

查询Content Provider在generateApplicationProvidersLocked方法中完成,代码如下:


private final List<ProviderInfo>generateApplicationProvidersLocked(

ProcessRecord app){

List<ProviderInfo>providers=null;

try{

/通过PackageManagerService查询满足条件的Content Provider/

providers=AppGlobals.getPackageManager().

queryContentProviders(app.processName, app.uid,

STOCK_PM_FLAGS|PackageManager.GET_URI_PERMISSION_PATTERNS);

}catch(RemoteException ex){

}

int userId=app.userId;

if(providers!=null){

final int N=providers.size();

for(int i=0;i<N;i++){

ProviderInfo cpi=

(ProviderInfo)providers.get(i);

/*PackageManagerService对Content Provider的组织形式是

*ProviderInfo,在此将转化为ActivityManagerService的存

储形式ContentProviderRecord/

ComponentName comp=new ComponentName(cpi.packageName, cpi.name);

ContentProviderRecord cpr=mProviderMap.getProviderByClass(comp, userId);

if(cpr==null){

cpr=new ContentProviderRecord(this, cpi, app.info, comp);

//存入mProviderMap中

mProviderMap.putProviderByClass(comp, cpr);

}

//存入ProcessRecord

app.pubProviders.put(cpi.name, cpr);

app.addPackage(cpi.applicationInfo.packageName);

/通过PackageManagerService,最终调用Installer的dexopt方法对该APK进行DEX优化/

ensurePackageDexOpt(cpi.applicationInfo.packageName);

}

}

return providers;

}


generateApplicationProvidersLocked首先从PackageManagerService中查询运行在system进程中且UID为SYSTEM_UID的Content Provider的信息,该信息在PackageManagerService的存储形式是ProviderInfo;然后将该ProviderInfo转化为ActivityManagerService中的存储形式ContentProviderRecord;最后将该Provider与ProcessRecord和ActivityManagerService关联。

这个过程很简单,熟悉Package Manager的读者应该很容易理解。这里有一个问题:哪个Content Provider满足generateApplicationProvidersLocked查询条件?

答案是SettingsProvider,它位于frameworks/base/packages/settingsprovider中。因为只有该Content Provider在其AndroidManifest.xml中设置了以上查询条件,代码如下:


<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.android.providers.settings"

coreApp="true"

android:sharedUserId="android.uid.system">

<application android:allowClearUserData="false"

android:label="@string/app_label"

android:process="system"

android:backupAgent="SettingsBackupAgent"

android:killAfterRestore="false"

android:icon="@drawable/ic_launcher_settings">

<provider android:name="SettingsProvider"

android:authorities="settings"

android:multiprocess="false"

android:writePermission="android.permission.WRITE_SETTINGS"

android:initOrder="100"/>

</application>

</manifest>