PKMS

核心功能

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

安裝流程

image.png

安裝時(shí)
1基协、把a(bǔ)pk文件復(fù)制到data/app/包名目錄下,
2菇用、開(kāi)辟應(yīng)用程序的數(shù)據(jù)文件夾(so庫(kù)澜驮,緩存)
3、將apk的dex安裝到data/dalvik-cache目錄下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惋鸥,一起剝皮案震驚了整個(gè)濱河市杂穷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揩慕,老刑警劉巖亭畜,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異迎卤,居然都是意外死亡拴鸵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)蜗搔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)劲藐,“玉大人,你說(shuō)我怎么就攤上這事樟凄∑肝撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵缝龄,是天一觀的道長(zhǎng)汰现。 經(jīng)常有香客問(wèn)我,道長(zhǎng)叔壤,這世上最難降的妖魔是什么瞎饲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮炼绘,結(jié)果婚禮上嗅战,老公的妹妹穿的比我還像新娘。我一直安慰自己俺亮,他們只是感情好驮捍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布疟呐。 她就那樣靜靜地躺著,像睡著了一般东且。 火紅的嫁衣襯著肌膚如雪启具。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天苇倡,我揣著相機(jī)與錄音富纸,去河邊找鬼。 笑死旨椒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的堵漱。 我是一名探鬼主播综慎,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勤庐!你這毒婦竟也來(lái)了示惊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤愉镰,失蹤者是張志新(化名)和其女友劉穎米罚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體丈探,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡录择,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碗降。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隘竭。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖讼渊,靈堂內(nèi)的尸體忽然破棺而出动看,到底是詐尸還是另有隱情,我是刑警寧澤爪幻,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布菱皆,位于F島的核電站,受9級(jí)特大地震影響挨稿,放射性物質(zhì)發(fā)生泄漏仇轻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一叶组、第九天 我趴在偏房一處隱蔽的房頂上張望拯田。 院中可真熱鬧,春花似錦甩十、人聲如沸船庇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鸭轮。三九已至臣淤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窃爷,已是汗流浹背邑蒋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留按厘,地道東北人医吊。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逮京,于是被迫代替她去往敵國(guó)和親卿堂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容