Android FrameWork——PackageManager框架

本文深入剖析了Android系统的包管理框架,包括PackageManagerService的构建与获取过程,以及ApplicationPackageManager的内部实现机制。揭示了跨进程通信中各组件的角色与职责。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中的


### Android FrameworkAndroid 的主要区别 Android 是一种基于 Linux 内核的操作系统,专为移动设备设计,其整体架构由多个层次组成,包括硬件抽象层、Linux 内核、运行时环境以及应用层等。而 Android Framework 则是 Android 操作系统的一个重要组成部分,属于中间层,位于操作系统核心与应用层之间。 #### 架构层面的区别 - **Android** 是整个操作系统的总称,涵盖了从底层硬件驱动到上层用户界面的所有部分[^1]。 - **Android Framework** 只是 Android 平台的一部分,专注于提供 API 和服务支持给开发者用于构建应用程序[^2]。 #### 功能定位的不同 - **Android**: 提供完整的计算环境,不仅限于软件开发工具包(SDK),还包括图形渲染引擎、多媒体框架以及其他基础组件来管理手机资源如电池电量、网络连接状态等等[^3]。 - **Android Framework**: 主要面向开发者,通过封装复杂的底层实现细节简化了程序编写过程;例如Activity Manager Service负责活动生命周期管理和任务调度等工作流控制逻辑[^2]。 #### 使用场景上的差异 对于最终消费者而言,“使用 Android”意味着体验到了一个全面集成好的智能手机或者平板电脑产品。“涉及 Android Framework”,则更多是指向那些希望利用该平台上已有的能力快速搭建自己专属解决方案的企业和个人程序员们来说的[^3]。 ```java // 示例:如何在 Android 应用中调用 Framework 提供的功能 Context context = getApplicationContext(); PackageManager pm = context.getPackageManager(); // 这里使用的是Framework中的 PackageManager 类 List<PackageInfo> packages = pm.getInstalledPackages(0); for (PackageInfo packageInfo : packages) { Log.d("Installed Apps", packageInfo.applicationInfo.loadLabel(pm).toString()); } ``` 以上代码片段展示了如何借助 Android Framework 中 `PackageManager` 来获取当前安装的应用列表信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值