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>