您的位置:首页 > 移动开发 > Android开发

Android FrameWork——PackageManager框架

2015-02-10 15:58 246 查看
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();

/////////////////////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中获取的服务pakager,该服务在.PackageManagerService的构建时被注册到ServiceManager中的,ServiceManager机制暂时没有深入了解,后面再发blog专门说一下ServiceManager

就到此为止,11点了,希望大家看过后多留几个脚印,也算是我一晚上辛苦的慰劳,也欢迎大家随时拍砖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: