核心功能
1.解析AndroidNanifest.xml清單文件跛十,解析清單文件中的所有節(jié)點(diǎn)信息
2.掃描.apk文件豆巨,安裝系統(tǒng)應(yīng)用蜻拨,安裝本地應(yīng)用等
3.管理本地應(yīng)用压怠,主要有眠冈, 安裝,卸載菌瘫,應(yīng)用信息查詢 等
啟動(dòng)流程
PackageManagerService和AMS一樣都在SystemServer的startBootstrapServices中創(chuàng)建
Installer installer = mSystemServiceManager.startService(Installer.class);
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
//PackageManagerService
main(Context context, Installer installer,boolean factoryTest, boolean onlyCore) {
PackageManagerService m = new PackageManagerService(injector, onlyCore, factoryTest);
ServiceManager.addService("package", m);//將PMS注冊(cè)到SM中
final PackageManagerNative pmn = m.new PackageManagerNative();
ServiceManager.addService("package_native", pmn);
}
public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) {
階段1:BOOT_PROGRESS_PMS_START
階段2:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START
階段3:BOOT_PROGRESS_PMS_DATA_SCAN_START
階段4:BOOT_PROGRESS_PMS_SCAN_END
階段5:BOOT_PROGRESS_PMS_READY
}
階段1:BOOT_PROGRESS_PMS_START
public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) {
mMetrics = new DisplayMetrics(); // 分辨率配置
mInstaller = installer; //保存installer對(duì)象
mPermissionManager = injector.getPermissionManagerServiceInternal();//創(chuàng)建權(quán)限管理服務(wù)
mSettings = injector.getSettings();//創(chuàng)建setting
//添加system, phone, log, nfc, bluetooth, shell蜗顽,se,networkstack 這8種shareUserId到mSettings雨让;
//DexOpt優(yōu)化
mPackageDexOptimizer = new PackageDexOptimizer(mInstaller, mInstallLock, mContext,"*dexopt*");
mDexManager = new DexManager(mContext, this, mPackageDexOptimizer,installer, mInstallLock);
// ART虛擬機(jī)管理服務(wù)
mArtManagerService = new ArtManagerService(mContext, this, mInstaller, mInstallLock);
//創(chuàng)建PackageManager的handler線程雇盖,循環(huán)處理外部安裝相關(guān)消息
mHandlerThread = new ServiceThread(TAG,Process.THREAD_PRIORITY_BACKGROUND, true/*allowIo*/);
mHandlerThread.start();
mHandler = new PackageHandler(mHandlerThread.getLooper());
}
//Settings 階段1:BOOT_PROGRESS_PMS_START
Settings(File dataDir, PermissionSettings permission,Object lock) {
//packages.xml 所有安裝app信息 PKMS 掃描完目標(biāo)文件夾后會(huì)創(chuàng)建該文件。
//當(dāng)系統(tǒng)進(jìn)行程序安裝宫患、卸載和更新等操作時(shí)刊懈,均會(huì)更新該文件。該文件保存了系統(tǒng)中與 package 相關(guān)的一些信息娃闲。
mSettingsFilename = new File(mSystemDir, "packages.xml");
//所有安裝app信息的備份
mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml");
//描述系統(tǒng)中存在的所有非系統(tǒng)自帶的 APK 的信息虚汛。當(dāng)這些程序有變動(dòng)時(shí),PKMS 就會(huì)更新該文件皇帮。
mPackageListFilename = new File(mSystemDir, "packages.list");
final File kernelDir = new File("/config/sdcardfs");
mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml");
mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");
}
boolean readLPw(@NonNull List<UserInfo> users) {
//解析"/data/system/packages.xml"
XmlPullParser parser = Xml.newPullParser();
parser.setInput(str, StandardCharsets.UTF_8.name());
}
階段2:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START
scanDirTracedLI()
掃描system/vendor/product/odm/oem等目錄的priv-app卷哩、app、overlay包属拾;系統(tǒng)apk的安裝
private void scanDirLI(File scanDir, int parseFlags, int scanFlags, long currentTime,
PackageParser2 packageParser, ExecutorService executorService) {
ParallelPackageParser parallelPackageParser =new ParallelPackageParser(packageParser, executorService);
for (File file : files) {
parallelPackageParser.submit(file, parseFlags);//將apk放入隊(duì)列中
}
for (; fileCount > 0; fileCount--) {
ParallelPackageParser.ParseResult parseResult = parallelPackageParser.take();
//下面去解析
//PackageParser.parseBaseApk()主要是對(duì)AndroidManifest.xml進(jìn)行解析将谊,解析后所有的信息放在Package對(duì)象中
}
}
階段3:BOOT_PROGRESS_PMS_DATA_SCAN_START
scanDirTracedLI()
掃描data目錄的應(yīng)用信息冷溶,及時(shí)更新,祛除不必要的數(shù)據(jù)尊浓;應(yīng)用apk的安裝
階段4:BOOT_PROGRESS_PMS_SCAN_END
sdk版本變更逞频,更新權(quán)限;OTA升級(jí)后首次啟動(dòng)栋齿,清除不必要的緩存數(shù)據(jù)苗胀;權(quán)限等默認(rèn)項(xiàng)更新完后,清理相關(guān)數(shù)據(jù)瓦堵;更新package.xml
階段5:BOOT_PROGRESS_PMS_READY
安裝流程
安裝時(shí)
1基协、把a(bǔ)pk文件復(fù)制到data/app/包名目錄下,
2菇用、開(kāi)辟應(yīng)用程序的數(shù)據(jù)文件夾(so庫(kù)澜驮,緩存)
3、將apk的dex安裝到data/dalvik-cache目錄下