PMS系列1⃣️——PMS的创建
生活随笔
收集整理的這篇文章主要介紹了
PMS系列1⃣️——PMS的创建
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PMS的構造過程
- SystemServer創建PMS過程
- SystemServer.startOtherServices()
- PMS.main()
- PMS的構造方法的五個階段
- 階段一:START 開始階段
- 階段二:SYSTEM_SCAN_START 掃描系統階段
- 階段三:DATAS_SCAN_START 掃描DATA分段區域階段
- 階段四:SCAN_END 掃描結束階段
- 階段五:READY 準備階段
SystemServer創建PMS過程
PMS和AMS一樣,屬于framework中比較重要的系統服務,位于SystemServer進程,它的構造和啟動也是通過SystemServer的main中的開啟三大類服務發起的:
SystemServer.startOtherServices()
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);在SystemServer的main中調用了PMS的main方法;注意這里傳入了一個installer對象,他的構造是在SystemServer中的startCoreService(),代碼如下:
Installer installer = mSystemServiceManager.startService(Installer.class);這個installer和AMS,PMS一樣,都是系統服務,PMS中的好多操作都是通過Installer服務實現的;
PMS.main()
public static PackageManagerService main(Context context, Installer installer,boolean factoryTest, boolean onlyCore) { ...// 分析1 PackageManagerService m = new PackageManagerService(context, installer,factoryTest, onlyCore);// 分析2ServiceManager.addService("package", m);return m;}- 調用pms的構造方法
- 將pms交給ServiceManager中,這一步不清楚的同學可以先看ams系列
PMS的構造方法的五個階段
pms的構造方法非常長,大概可以分為五個階段,下面詳細了解下這五個階段
階段一:START 開始階段
在第一階段start階段中,主要是創建了很多關鍵對象,并且賦值給PMS成員:
mSettings = new Settings(mPermissionManager.getPermissionSettings(), mPackages);mInstaller = installer;mPackageDexOptimizer = new PackageDexOptimizer(installer, mInstallLock, context,"*dexopt*"); SystemConfig systemConfig = SystemConfig.getInstance();mHandler = new PackageHandler(mHandlerThread.getLooper());Watchdog.getInstance().addThread(mHandler, WATCHDOG_TIMEOUT);File dataDir = Environment.getDataDirectory();mAppInstallDir = new File(dataDir, "app");mAppLib32InstallDir = new File(dataDir, "app-lib");mAsecInternalPath = new File(dataDir, "app-asec").getPath();mDrmAppPrivateInstallDir = new File(dataDir, "app-private");mFirstBoot = !mSettings.readLPw(sUserManager.getUsers(false));- mSettings:用于保存所有包的動態設置,比如ShareUID,ShareUID用于進程間共享數據,如果兩個APP擁有相同的ShareUID,它們可以運行在同一個進程中共享數據;
- mInstaller:在SystemServer中創建,和AMS,PMS一樣是一個系統服務,PMS的很多操作都是由Installer完成的,比如APK的安裝和卸載
- mPackageDexOptimizer:dex優化工具
- systemConfig:全局的系統配置,比如系統的權限
- mHandler:PackageHander類型,PackageHandler繼承了Handler,PMS的工作是通過handler驅動的
- Watchdog:WatchDog有兩個用途,一個定時檢測AMS,PMS是否發生死鎖,另一個是檢測線程的消息隊列是否長時間處于工作狀態,如果出現上面問題,就會保存當前日志,然后殺死SystemServer進程
- 創建一些Data分區的子目錄,比如/data/app
- readLPw():解析package.xml文件,并且將其保存到Setting的對應字段中,package.xml中記錄系統所有安裝的應用信息,包括基本信息,簽名和權限
階段二:SYSTEM_SCAN_START 掃描系統階段
File frameworkDir = new File(Environment.getRootDirectory(), "framework");scanDirTracedLI(frameworkDir, mDefParseFlags| PackageParser.PARSE_IS_SYSTEM| PackageParser.PARSE_IS_SYSTEM_DIR| PackageParser.PARSE_IS_PRIVILEGED,scanFlags | SCAN_NO_DEX, 0);// Prune any system packages that no longer exist.final List<String> possiblyDeletedUpdatedSystemApps = new ArrayList<String>();if (disabledPs.codePath == null || !disabledPs.codePath.exists()) {possiblyDeletedUpdatedSystemApps.add(ps.name);}階段二的工作主要是掃描系統分區的目錄:
- 創建系統分區的子目錄比如framework,app,priv-app
- 調用scanDirTracedLI()掃描系統文件
- 對掃描的文件進行處理:處理的邏輯主要是判斷系統OTA升級后,系統APP是否需要更新,是否需要刪除
/system叫系統分區,主要存儲谷歌和其他廠商提供的Android系統相關的文件和框架
階段三:DATAS_SCAN_START 掃描DATA分段區域階段
scanDirTracedLI(mDrmAppPrivateInstallDir, mDefParseFlags| PackageParser.PARSE_FORWARD_LOCK,scanFlags | SCAN_REQUIRE_KNOWN, 0);// 分析2for (String deletedAppName : possiblyDeletedUpdatedSystemApps) {PackageParser.Package deletedPkg = mPackages.get(deletedAppName);mSettings.removeDisabledSystemPackageLPw(deletedAppName);String msg;if (deletedPkg == null) {msg = "Updated system package " + deletedAppName+ " no longer exists; it's data will be wiped";// Actual deletion of code and data will be handled by later// reconciliation step} else {msg = "Updated system app + " + deletedAppName+ " no longer present; removing system privileges for "+ deletedAppName;deletedPkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_SYSTEM;PackageSetting deletedPs = mSettings.mPackages.get(deletedAppName);deletedPs.pkgFlags &= ~ApplicationInfo.FLAG_SYSTEM;}logCriticalInfo(Log.WARN, msg);}- 調用scanDirTracedLI()掃描data分區目錄,/data/app , /data/app-private
- 遍歷possiblyDeletedUpdatedSystemApps ,如果這個系統APP不在PMS的成員變量mPackage中,則說明是殘留APP,后續會將其刪除;如果在,但是由于當前掃描的是DATA分區,說明其不屬于系統APP,移除其系統APP權限;
/data可以成為DATA分區,它用來存儲用戶的個人數據和配置文件
| app | 存放用戶自己安裝的APP |
| data | 存放已安裝APP的數據,每一個app有自己單獨的目錄 |
| app-private | APP自己的私有目錄 |
| app-lib | 存儲所有APP的jni庫 |
| system | 存放系統配置文件 |
| anr | 存放發生ANR時系統生成的trace.text文件 |
階段四:SCAN_END 掃描結束階段
// If the platform SDK has changed since the last time we booted,// we need to re-grant app permission to catch any new ones that// appear. This is really a hack, and means that apps can in some// cases get permissions that the user didn't initially explicitly// allow... it would be nice to have some better way to handle// this situation.int updateFlags = UPDATE_PERMISSIONS_ALL;if (ver.sdkVersion != mSdkVersion) {Slog.i(TAG, "Platform changed from " + ver.sdkVersion + " to "+ mSdkVersion + "; regranting permissions for internal storage");updateFlags |= UPDATE_PERMISSIONS_REPLACE_PKG | UPDATE_PERMISSIONS_REPLACE_ALL;}updatePermissionsLPw(null, null, StorageManager.UUID_PRIVATE_INTERNAL, updateFlags);ver.sdkVersion = mSdkVersion;// If this is the first boot or an update from pre-M, and it is a normal// boot, then we need to initialize the default preferred apps across// all defined users.if (!onlyCore && (mPromoteSystemApps || mFirstBoot)) {for (UserInfo user : sUserManager.getUsers(true)) {mSettings.applyDefaultPreferredAppsLPw(this, user.id);applyFactoryDefaultBrowserLPw(user.id);primeDomainVerificationsLPw(user.id);}}mSettings.writeLPr();- 如果當前版本和上次版本不一樣,更新apk的權限授權
- 如果是第一次啟動,初始化用戶的設置的默認app,比如默認的瀏覽器
階段五:READY 準備階段
mInstallerService = new PackageInstallerService(context, this);// Expose private service for system components to use.LocalServices.addService(PackageManagerInternal.class, new PackageManagerInternalImpl());- 創建了PackageInstallerService,用于管理安裝會話的服務,pis會為每一次安裝過程分配一個SessionId
- 將pis添加到LocalServices中,LocalService用于存儲運行在當前進程的本地服務
總結
以上是生活随笔為你收集整理的PMS系列1⃣️——PMS的创建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第106章 Caché 函数大全 $ZF
- 下一篇: CGDI 宝马神器