ReceiverIntentResolver.getResolveList
谁调用 : frameworks/base/services/core/java/com/android/server/pm/resolution/ComponentResolver.java的 private void addReceiversLocked
InstallPackageHelper.java 的 commitPackageSettings:
将一个扫描完成的 AndroidPackage 加入系统中,加入之后系统就可以查询了 。
它调用
ComponentResolver#addAllComponents -> ComponentResolver#addReceiversLocked
AndroidPackage:
AndroidPackage 是一个接口,最终实现类是 PackageImpl , 表示一个扫描之后的package 。
pms启动的时候调用以下来解析packages.xml 中的内容 :
PackageSetting .readLPw ->
PackageSetting.readPackageLPw ->
PackageSetting.addPackageLPw ->
packages.xml 中的内容 :
<package name="com.android.shell" codePath="/system/priv-app/Shell" nativeLibraryPath="/system/priv-app/Shell/lib"
publicFlags="805879365" privateFlags="-1940909976" ft="11e8f7d4c00" it="186680119a0" ut="11e8f7d4c00"
version="30" sharedUserId="2000" isOrphaned="true">
pms启动的时候 ,第一步先解析 packages.xml 中的内容 ,然后再扫描系统安装目录下的文件 。
然后会做一致性比对,修改之后保存入 packages.xml 。
scanDirLI
ParsingPackageUtils 用来解析包。
解析之后的 sharedUserId 字符串值会存入 ParsingPackageImpl的 sharedUserId 。
在 pms 启动时候有以下代码:
t.traceBegin("addSharedUsers");
mSettings.addSharedUserLPw("android.uid.system", Process.SYSTEM_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.phone", RADIO_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.log", LOG_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.nfc", NFC_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.bluetooth", BLUETOOTH_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.shell", SHELL_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.se", SE_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
mSettings.addSharedUserLPw("android.uid.networkstack", NETWORKSTACK_UID,
ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
t.traceEnd();
然后在 pms的 addForInitLI 方法中会判断是否有 sharedUserId这个属性,如果有就从mSettings的mSharedUsers里面对应的整型值。