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点了,希望大家看过后多留几个脚印,也算是我一晚上辛苦的慰劳,也欢迎大家随时拍砖。
分享到:
相关推荐
《深入解析Android源码——以LauncherActivitySample为例》 在Android开发中,源码学习是提升技术水平的关键步骤,它能让我们深入了解系统运行机制以及应用程序的工作原理。本篇将聚焦于"安卓Android源码——...
【标题】"Android源码——WIFI扫描Demo.7z" 涉及的是一个关于Android平台上的Wi-Fi扫描功能的示例代码。这个压缩包包含了一个简单的Android应用,该应用演示了如何在Android设备上获取并显示周围的Wi-Fi接入点信息。...
本资料"Android源码——Intent切换.zip"很可能是关于Intent在Android应用开发中的详细解析,包括Intent的创建、使用方式以及源码分析。 首先,Intent分为显式Intent和隐式Intent两种类型。显式Intent明确指定了要...
"安卓Android源码——获取系统程序信息.zip"这个压缩包很可能包含了用于解析和显示系统中安装的应用程序信息的相关代码。下面,我们将深入探讨这一主题,围绕Android源码、系统程序信息的获取以及可能涉及的技术细节...
【Android源码——安全卫士源码分析】 在Android平台上,安全卫士是一款常见的系统优化和安全管理应用。它集成了多种功能,如病毒查杀、内存清理、流量监控、隐私保护等,为用户提供全面的手机安全解决方案。通过...
在这个压缩包文件“安卓Android源码——安卓调用系统闹钟及获取所有软件信息.rar”中,可能包含的是实现这两个功能的源代码示例。下面将详细阐述这两个知识点。 首先,我们来讨论如何在Android中调用系统闹钟。在...
这个压缩包"安卓Android源码——精典源码之获取系统程序信息.zip"显然包含了一段用于获取系统程序信息的源代码,名为"ApplicationList"。这篇文章将深入探讨这个主题,详细解释如何在Android系统中获取应用信息,...
本资料“安卓Android源码——数据库文件写入SD卡.zip”提供了一个实例,展示了如何在Android应用中实现这个功能。我们将详细探讨相关的知识点。 首先,了解Android的数据存储方式至关重要。Android提供了多种存储...
本资源“安卓Android源码——软件管理器.zip”包含的可能是一份关于安卓软件管理器的源代码实现,这为我们深入理解Android系统的内部工作原理提供了宝贵的资料。 软件管理器,通常被称为应用管理器或App Manager,...
"安卓Android源码——中国地区选择.zip"这个压缩包很可能包含了Android操作系统中与中国地区相关的源代码和配置文件。下面我们将深入探讨这个主题。 1. **源码结构**: Android系统的源码是一个庞大的开源项目,...
总结,获取Android系统程序信息涉及对`PackageManager`服务的调用,内容提供者的查询,以及对Android源码的理解。开发者可以根据需求选择合适的方法来获取和处理这些信息。对于深入学习Android系统的开发者,阅读和...
"安卓Android源码——如何远程下载安装的.zip"这个压缩包文件显然包含了关于如何在Android设备上实现远程下载并安装应用的源码示例。让我们深入探讨这个话题。 首先,Android系统的远程下载通常涉及到网络编程,...
这个压缩包文件“安卓Android源码——安卓应用游戏卸载器项目 (2).zip”包含了一个专门用于卸载安卓设备上应用和游戏的项目源码。这个项目可能是一个实用工具,帮助用户方便快捷地管理他们的手机或平板电脑上的应用...
这个压缩包文件“安卓Android源码——安卓应用游戏卸载器项目.zip”包含了创建一个用于卸载安卓设备上应用程序和游戏的项目的源代码及相关资源。从标签“安卓 android 源码”我们可以推断,这将涉及到Android操作...
这涉及到 Android 的权限系统,如 `Manifest.permission` 和 `android.content.pm.PackageManager`。用户可以在 Settings 中查看并更改应用的权限状态。 6. **广播接收器** Settings 应用中注册了多个广播接收器,...
这份名为“安卓Android源码——网络连接状态检测.zip”的压缩包包含了一个AndroidDemo项目,用于演示如何在Android系统中检查网络连接状态。下面,我们将深入探讨这个主题。 首先,Android提供了...
本压缩包文件“安卓Android源码——自动发送短信.zip”显然包含了实现这一功能的源代码。接下来,我们将详细讨论如何在Android中实现自动发送短信,以及涉及到的相关知识点。 首先,我们要了解Android系统的权限...
这份"安卓Android源码——安卓调用系统闹钟及获取所有软件信息.zip"的资源包含了两个主要的知识点:如何调用系统闹钟服务以及如何获取设备上安装的所有软件信息。接下来,我们将深入探讨这两个主题。 首先,我们来...
"安卓Android源码——MyIntent.rar" 提供的可能是对 Intent 类及相关功能的自定义实现或解析。 Intent 主要有两种类型:显式 Intent 和隐式 Intent。显式 Intent 通过指定目标 Component(Activity 或 Service)的...