獲取PackageManagerService

最近項目中有個需求需要在PackageManagerService添加一個方法蝌以,然后進行調(diào)用却妨。
我們知道PackageManagerService作為系統(tǒng)的核心服務,由SystemServer在系統(tǒng)啟動時創(chuàng)建,我們先看看SystemServer是如何創(chuàng)建的:

mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);

原來是通過一個靜態(tài)方法創(chuàng)建的佣赖,再看看這個靜態(tài)方法:

public static PackageManagerService main(Context context, Installer installer,
            boolean factoryTest, boolean onlyCore) {
        PackageManagerService m = new PackageManagerService(context, installer,
                factoryTest, onlyCore);
        ServiceManager.addService("package", m);
        return m;
    }

這個方法比較簡單,就是new一個PackageManagerService的實例记盒,然后向ServiceManager注冊憎蛤。既然注冊到ServiceManager里面,我們在獲取PackageManagerService時就不必new或者調(diào)用那個main方法纪吮,因為PackageManagerService在構(gòu)造函數(shù)執(zhí)行了大量邏輯俩檬。
在ServiceManager中既然有addService方法,那么就應該有getService方法碾盟。(整個ServiceManager代碼邏輯比較簡單棚辽,就是維護了一個HashMap,用于保存各項系統(tǒng)服務)

public static IBinder getService(String name) {
        try {
            IBinder service = sCache.get(name);
            if (service != null) {
                return service;
            } else {
                return getIServiceManager().getService(name);
            }
        } catch (RemoteException e) {
            Log.e(TAG, "error in getService", e);
        }
        return null;
    }

看到這里我們是不是就可以這樣獲取

(PackageManagerService)ServiceManager.getService("package")

然而在編譯時報如下錯誤

pm.jpg

看來是PackageManagerService所在的這個包無法訪問冰肴。
是不是在外部就無法獲取了呢屈藐。這時想到榔组,我們經(jīng)常在Acticity中通過getPackageManager獲取一個PackageManager,而PackageManager其實就是IPackageManager的一個客戶端代理联逻。于是搓扯,我們?nèi)タ纯磄etPackageManager是如何實現(xiàn)的。

在ContextImpl中:

@Override
    public PackageManager getPackageManager() {
        if (mPackageManager != null) {
            return mPackageManager;
        }

        IPackageManager pm = ActivityThread.getPackageManager();
        if (pm != null) {
            // Doesn't matter if we make more than one instance.
            return (mPackageManager = new ApplicationPackageManager(this, pm));
        }

        return null;
    }

這里調(diào)用了ActivityThread的一個也叫getPackageManager的方法包归,繼續(xù)看下去:
在ActivityThread中

 public static IPackageManager getPackageManager() {
        if (sPackageManager != null) {
            //Slog.v("PackageManager", "returning cur default = " + sPackageManager);
            return sPackageManager;
        }
        IBinder b = ServiceManager.getService("package");
        //Slog.v("PackageManager", "default service binder = " + b);
        sPackageManager = IPackageManager.Stub.asInterface(b);
        //Slog.v("PackageManager", "default service = " + sPackageManager);
        return sPackageManager;
    }

這里就很清晰了锨推,也是通過ServiceManager.getService獲取,然后通過這樣的方法IPackageManager.Stub.asInterface(b);來獲取到PackageManagerService的公壤。
這樣就比較簡單了换可,我們就可以這樣獲取:

IPackageManager.Stub.asInterface(ServiceManager.getService("package")).***

類似的厦幅,我們也可以通過這種形式獲取一些其他的系統(tǒng)服務沾鳄,比如:

ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)).endCall();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市慨削,隨后出現(xiàn)的幾起案子洞渔,更是在濱河造成了極大的恐慌,老刑警劉巖缚态,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磁椒,死亡現(xiàn)場離奇詭異,居然都是意外死亡玫芦,警方通過查閱死者的電腦和手機浆熔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桥帆,“玉大人医增,你說我怎么就攤上這事±铣妫” “怎么了叶骨?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祈匙。 經(jīng)常有香客問我忽刽,道長,這世上最難降的妖魔是什么夺欲? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任跪帝,我火速辦了婚禮,結(jié)果婚禮上些阅,老公的妹妹穿的比我還像新娘伞剑。我一直安慰自己,他們只是感情好市埋,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布黎泣。 她就那樣靜靜地躺著恕刘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聘裁。 梳的紋絲不亂的頭發(fā)上雪营,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天弓千,我揣著相機與錄音衡便,去河邊找鬼。 笑死洋访,一個胖子當著我的面吹牛姿搜,可吹牛的內(nèi)容都是我干的沪停。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巡李!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起昙啄,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤僵缺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后食绿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侈咕,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年器紧,在試婚紗的時候發(fā)現(xiàn)自己被綠了耀销。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡铲汪,死狀恐怖熊尉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掌腰,我是刑警寧澤狰住,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站齿梁,受9級特大地震影響催植,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜士飒,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一查邢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酵幕,春花似錦扰藕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽未桥。三九已至,卻和暖如春芥备,著一層夾襖步出監(jiān)牢的瞬間冬耿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工萌壳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亦镶,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓袱瓮,卻偏偏與公主長得像缤骨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尺借,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

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