日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PMS系列1⃣️——PMS的创建

發布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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-privateAPP自己的私有目錄
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的创建的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。