PackageManagerService主要负责各种apk包的安装、卸载、优化和分析
一、PackageManagerService的初始化
SystemService.java中通过
main()->SystemServer().run()->startBootstrapServices()来启动PackageManagerService
其中startBootstrapServices()中相关流程如下:
Installer installer = mSystemServiceManager.startService(Installer.class)
// Start the package manager.
Slog.i(TAG, "Package Manager");
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
通过PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore)将服务“package”加入ServiceManager中,这样应用程序可以使用PackageManager通过Binder来调用PackageManagerService
其中将PackageManagerService加入ServiceManager如下:
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;
}
应用程序端使用PackageManagerService的方法如下:
PackageManager pm = context.getPackageManager();
其中Context派生出ContextImpl类,ContextImpl中实现getPackageManager方法: 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;
}
其中
ActivityThread.getPackageManager()的实现如下:
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中取出“package”服务,通过Binder实现对PackageManagerService的调用
二、PackageManagerService类关系图
其中IPackageManger.Stub和IPackageManager.Stub.Proxy位于文件IPackageManager.java中
该文件由aidl工具根据IPackageManager.aidl文件生成,位于out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/content/pm/IPackageManger.java