PackageManagerService

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


    


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值