生活随笔
收集整理的這篇文章主要介紹了
Android 之PackageManager框架
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/stonecao/article/details/6591454
1.接著前面講的ActivityManager框架,繼續說一下系統另一個重要的框架,PackagerManager
同樣先看一下靜態類結構圖:
大部分情況我們是在Activity中使用getPackageManager方法獲取一個ApplicationPackageManager的對象,ApplicationPackageManager實際上是包裝了一個IPackageManager.Stub.Proxy的對象
由IPackageManager.Stub.Proxy代理執行PackageManager相關操作,IPackageManager.Stub.Proxy實際代理的是PackageManagerService,
2.看了前面說的,可能你有點暈,我們再來重新理一下:首先是IPackageManager是通過IPackageManager.aidl文件生成,同時生成了存根類IPackageManager.Stub,代理類:IPackageManager.Stub.Proxy
這個是packageManager進程通信的基本框架,我前面blog有說,不多加說明了然后PackageManagerService,它繼承了IPackageManager.Stub,它作為PackageManager動作的實際執行者,在system_process中存在再是我們用戶應用程序中的ApplicationPackageManager,先看它如何被獲取的:
ContextImpl.java中有一個方法: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;}
ApplicationPackageManager實際上是包裝了一個IPackageManager對象(IPackageManager.Stub.Proxy),當我們調用queryIntentActivities時,實際通過代理對象去執行:public List<ResolveInfo> queryIntentActivities(Intent intent,int flags) {try {return mPM.queryIntentActivities(//mPM是IPackageManager.Stub.Proxy對象intent,intent.resolveTypeIfNeeded(mContext.getContentResolver()),flags);} catch (RemoteException e) {throw new RuntimeException("Package manager has died", e);}}
進過進程通信,在PackageManagerService執行對應操作:
3.PackageManagerService的構建與獲取
--PackageManagerService的構建:在system_process進程加載時,PackageManagerService被構建,在SystemServer.ServerThread.run中有如下一段代碼,它就是加載 PackageManagerService的:Slog.i(TAG, "Package Manager");pm = PackageManagerService.main(context,factoryTest != SystemServer.FACTORY_TEST_OFF);//啟動PackageManagerService
///PackageManagerService///public static final IPackageManager main(Context context, boolean factoryTest) {PackageManagerService m = new PackageManagerService(context, factoryTest);ServiceManager.addService("package", m);return m;}--PackageManagerService獲取: 先看前面在ContextImpl.java->getPackagerManager中: IPackageManager pm = ActivityThread.getPackageManager();
/ActivityThreadpublic 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中獲取的服務pakager,該服務在.PackageManagerService的構建時被注冊到ServiceManager中的,ServiceManager機制暫時沒有深入了解,后面再發blog專門說一下ServiceManager就到此為止,11點了,希望大家看過后多留幾個腳印,也算是我一晚上辛苦的慰勞,也歡迎大家隨時拍磚。
?
總結
以上是生活随笔為你收集整理的Android 之PackageManager框架的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。