PackageManagerService

1伞租、PMS Overview

PackageManagerService在Android系統(tǒng)中是一個非常重要的系統(tǒng)服務,提供了應用安裝包的掃描灶挟、安裝坏逢、卸載以及應用權(quán)限管理等比較敏感的功能。由于涉及的功能比較多妙黍,進而其代碼邏輯也是非常復雜悴侵,這里對PackageManagerService的邏輯進行梳理、以便日后功能的開發(fā)以及日常Debug

關(guān)于PackageManagerService中有很多API是以LP拭嫁、LI等后綴結(jié)尾可免,我們對這些后綴做如下解釋說明:

1.1、PMS中的兩個鎖

要想弄明白方法名中的LI噩凹、LIF巴元、LPw、LPr的含義驮宴,需要先了解PackageManagerService內(nèi)部使用的兩個鎖逮刨。因為LI、LIF堵泽、LPw修己、LPr中的L,指的是Lock迎罗,而后面跟的I和P指的是兩個鎖睬愤,I表示mInstallLock同步鎖。P表示mPackages同步鎖纹安。LPw尤辱、LPr中的w表示writing,r表示reading厢岂。LIF中的F表示Freeze光督。

mPackages同步鎖,是指操作mPackages時塔粒,用synchronized (mPackages) {}保護起來结借。mPackages同步鎖用來保護內(nèi)存中已經(jīng)解析的包信息和其他相關(guān)狀態(tài)。mPackages同步鎖是細粒度的鎖卒茬,只能短時間持有這個鎖船老,因為爭搶mPackages鎖的請求很多,短時間持有mPackages鎖圃酵,可以讓其他請求等待的時間短些柳畔。

mInstallLock同步鎖,是指安裝App的時候郭赐,對安裝的處理要用synchronized (mInstaller) {}保護起來荸镊。mInstallLock同步鎖,用來保護所有對installd的訪問。installd通常包含對應用數(shù)據(jù)的繁重操作躬存。

由于installd是單線程的张惹,并且installd的操作通常很慢,所以在已經(jīng)持有mPackages同步鎖的時候岭洲,千萬不要再請求mInstallLock同步鎖宛逗。反之,在已經(jīng)持有mInstallLock同步鎖的時候盾剩,可以去請求mPackages同步鎖雷激。

1.2、方法名中的LI告私、LIF屎暇、LPw、LPr的含義

2驻粟、Main Class Diagram


\bullet PackageManagerService開機由SystemServer啟動根悼、后面會詳細描述

\bullet PackageManager是PackageManagerService的代理,是一個抽象類蜀撑,具體的Implement者是ApplicationPackageManager

\bullet ApplicationPackageManager通過AIDL IPackageManager獲取到PackageManagerService的服務API

\bullet PackageManagerService通過Installer實現(xiàn)應用的安裝與卸載

3挤巡、Initialization

3.1、ApplicationPackageManager

上面提到酷麦、PackageManager是一個抽象類矿卑,實際的實現(xiàn)類是ApplicationPackageManager。當客戶端利用Context的getPacakgeManager函數(shù)獲取PackageManger時沃饶,獲取的就是ApplicationPacakgeManager母廷、看它的構(gòu)造函數(shù):

protected ApplicationPackageManager(ContextImpl context,IPackageManager pm) { ? ?mContext = context; ? ?mPM = pm;

}

容易看出,ApplicationPackageManger中持有了IPackageManger對象糊肤。

3.2徘意、SystemServer

private void startBootstrapServices() { // Wait for installd to finish starting up so that it has a chance to // create critical directories such as /data/user with the appropriate // permissions. We need this to complete before we initialize other services.//啟動Installer服務 Installer installer = mSystemServiceManager.startService(Installer.class); ......... //根據(jù)系統(tǒng)屬性,決定是否為加密設(shè)備加密 String cryptState = SystemProperties.get("vold.decrypt"); if (ENCRYPTING_STATE.equals(cryptState)) { Slog.w(TAG, "Detected encryption in progress - only parsing core apps"); mOnlyCore = true; } else if (ENCRYPTED_STATE.equals(cryptState)) { Slog.w(TAG, "Device encrypted - only parsing core apps"); mOnlyCore = true; } //調(diào)用PKMS的main函數(shù) mPackageManagerService = PackageManagerService.main(mSystemContext, installer, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); //判斷是否為初次啟動 mFirstBoot = mPackageManagerService.isFirstBoot(); mPackageManager = mSystemContext.getPackageManager(); .......... // Manages A/B OTA dexopting. This is a bootstrap service as we need it to rename // A/B artifacts after boot, before anything else might touch/need them. // Note: this isn't needed during decryption (we don't have /data anyways). if (!mOnlyCore) { boolean disableOtaDexopt = SystemProperties.getBoolean("config.disable_otadexopt", false); if (!disableOtaDexopt) { try { //啟動OtaDexoptService也需要PackageMangerService的參與 OtaDexoptService.main(mSystemContext, mPackageManagerService); }...... } }}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轩褐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子玖详,更是在濱河造成了極大的恐慌把介,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟋座,死亡現(xiàn)場離奇詭異拗踢,居然都是意外死亡,警方通過查閱死者的電腦和手機向臀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門巢墅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事君纫⊙庇觯” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵蓄髓,是天一觀的道長叉庐。 經(jīng)常有香客問我,道長会喝,這世上最難降的妖魔是什么陡叠? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮肢执,結(jié)果婚禮上枉阵,老公的妹妹穿的比我還像新娘。我一直安慰自己预茄,他們只是感情好兴溜,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著反璃,像睡著了一般昵慌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淮蜈,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天斋攀,我揣著相機與錄音,去河邊找鬼梧田。 笑死淳蔼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的裁眯。 我是一名探鬼主播鹉梨,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼穿稳!你這毒婦竟也來了存皂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤逢艘,失蹤者是張志新(化名)和其女友劉穎旦袋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體它改,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡疤孕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了央拖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祭阀。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹉戚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出专控,到底是詐尸還是另有隱情抹凳,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布踩官,位于F島的核電站却桶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔗牡。R本人自食惡果不足惜颖系,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辩越。 院中可真熱鬧嘁扼,春花似錦、人聲如沸黔攒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽督惰。三九已至不傅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赏胚,已是汗流浹背访娶。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留觉阅,地道東北人崖疤。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像典勇,于是被迫代替她去往敵國和親劫哼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349