Android应用生死轮回的那些事儿(2) - PackageManager

PMS对外的接口

如我们上节所讲,在Android中,为应用包的安装,删除各种操作服务的,是PackageManagerSerivce,简称PMS.

如果想要调用PMS的服务,则可以通过Context去调用getPackageManager方法。

这个定义于Context.java中:

    /** Return PackageManager instance to find global package information. */public abstract PackageManager getPackageManager();

我们先来看一张图,了解PackageManager与PMS的关系:

PackageManager中定义的方法的前因后果

我们下面先以PackageManager中所提供的getApplicationInfo方法为例,看看它是如何被实现的。

PackageManager中的定义

ApplicationInfo getApplicationInfo (String packageName,int flags)
  • packageName:包名
  • flags:支持下面的标志:

支持的标志如下:

  • GET_SHARED_LIBRARY_FILES:获取so库的安装路径,然后可以通过ApplicationInfo的sharedLibraryFiles属性来读取相关信息。
  • MATCH_SYSTEM_ONLY:只包括带有系统属性的
  • MATCH_UNINSTALLED_PACKAGES:即使是应用被uninstall了,但只要保留了数据,也可以被搜出来。
public abstract PackageInfo getPackageInfo(String packageName, int flags)
throws NameNotFoundException;

PackageManager的实现 - ApplicationPackageManager

ApplicationPackageManager继承了抽象类PackageManager.

final class ApplicationPackageManager extends PackageManager

ApplicationPackageManager是在ContextImpl中被new出来的:

    @Overridepublic 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中的第二个参数pm是沟通PMS的桥梁。

我们来看ActivityThread中getPackageManager的实现:

    public static IPackageManager getPackageManager() {if (sPackageManager != null) {return sPackageManager;}IBinder b = ServiceManager.getService("package");sPackageManager = IPackageManager.Stub.asInterface(b);return sPackageManager;}

ApplicationPackageManager中的实现

在ApplicationPackageManager类中,其实还是对PMS的对应功能的封装。

    public ApplicationInfo getApplicationInfo(String packageName, int flags)throws NameNotFoundException {try {ApplicationInfo ai = mPM.getApplicationInfo(packageName, flags, mContext.getUserId());
...} catch (RemoteException e) {throw new RuntimeException("Package manager has died", e);}throw new NameNotFoundException(packageName);}

PackageManagerService中真正落地

真正的实现还是要看PMS:

    @Overridepublic ApplicationInfo getApplicationInfo(String packageName, int flags, int userId) {if (!sUserManager.exists(userId)) return null;enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get application info");// writersynchronized (mPackages) {PackageParser.Package p = mPackages.get(packageName);if (DEBUG_PACKAGE_INFO) Log.v(TAG, "getApplicationInfo " + packageName+ ": " + p);if (p != null) {PackageSetting ps = mSettings.mPackages.get(packageName);if (ps == null) return null;// Note: isEnabledLP() does not apply here - always return inforeturn PackageParser.generateApplicationInfo(p, flags, ps.readUserState(userId), userId);}if ("android".equals(packageName)||"system".equals(packageName)) {return mAndroidApplication;}if ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) {return generateApplicationInfoFromSettingsLPw(packageName, flags, userId);}}return null;}

Android应用生死轮回的那些事儿(2) - PackageManager相关推荐

  1. Android应用生死轮回的那些事儿(6) - 武器库完结篇

    Android应用生死轮回的那些事儿(6) - 武器库完结篇 PackageManager武器库的完结篇,让我们梳理一下从Android 1.0到Android 7.0的发展过程吧. 资源相关API ...

  2. Android应用生死轮回的那些事儿(3) - 武器库(1)-权限管理相关API

    Android应用生死轮回的那些事儿(3) - 武器库(1)-权限管理相关API PackageManager中提供的武器,可以用"既多又杂,版本变化大"来形容. 不过,我们通过分 ...

  3. Android应用生死轮回的那些事儿(4) - 武器库(2)-应用组件查询相关API

    Android应用生死轮回的那些事儿(4) - 武器库(2)-应用组件查询相关API 这一节我们将学习: 如何查询系统中安装了哪些应用 如何获取一个包的信息 如何获取一个Application的信息 ...

  4. Android应用生死轮回的那些事儿(1) - installd初探

    Android应用生死轮回的那些事儿(1) - installd初探 前面我们讨论过dex2oat的过程,下面我们开始探索系统中的重要工具进程,installd守护进程. 我们有PackageMana ...

  5. Android 系统(98)---Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)

    Android app 在线更新那点事儿(适配Android6.0.7.0.8.0) 一.前言 app在线更新是一个比较常见需求,新版本发布时,用户进入我们的app,就会弹出更新提示框,第一时间更新新 ...

  6. android service 自动停止,【Android】Service那点事儿

    1.Service简介 服务是一个应用程序组件,可以在后台执行长时间运行的操作,不提供用户界面.一个应用程序组件可以启动一个服务,它将继续在后台运行,即使用户切换到另一个应用程序.此外,一个组件可以绑 ...

  7. 那些年,Android音视频开发那些事儿

    音视频开发的主要应用有哪些? 音频播放器,录音机,语音电话,音视频监控应用,音视频直播应用,音频编辑/处理软件,蓝牙耳机/音箱,等等 1.视频监控类 (JNI+应用层开发) 从硬件到嵌入式再到软件,涉 ...

  8. Android马甲包的那些事儿

    制作Android马甲包最简单的方式就是使用 productFlavors 机制. 本文就是在productFlavors机制的基础上制作的马甲包,每个马甲只需要 在build.gradle文件中配置 ...

  9. Android视频加密那点事儿!

    不错,转来备份. 转自:https://blog.csdn.net/shenshibaoma/article/details/79003854 前言 最近有需求要做视频的加密.因为视频下载到本地后,为 ...

最新文章

  1. undo表空间文件丢失恢复(4)--无备份无recover的情况下恢复
  2. Linux下给PHP安装redis扩展
  3. 【转】Apache配置中ProxyPassReverse指令的含义
  4. Java程序设计进阶之路一:捕捉异常
  5. oracle:connect by start
  6. nginx log response_python+pandas分析nginx日志的实例
  7. Outlook应用指南(1)——数据备份还原技巧
  8. 程序员如何写简历?来自硅谷的八条建议
  9. Tree(HDU-5060)
  10. python画图时常用的颜色——color=‘ ’
  11. 无限磁力_给力的磁力搜索网站你都知道吗?
  12. 计算机组成原理概述篇
  13. js复制到剪贴板html5,移动端web 复制到剪贴板 怎么实现?
  14. 工业镜头、相机的结构、参数解释及选型指南
  15. 如何测试一个串口调试助手软件,串口调试助手(SComAssistant)
  16. Console 接口介绍及电路设计
  17. iphonex蓝牙打不开转圈_多人反应iPhone X蓝牙连接时遇到问题
  18. SpringBoot整合Redis实现排行榜功能
  19. 【爬虫进阶】常见的反爬手段和解决方法(建议收藏)
  20. oracle 截取时间年或月

热门文章

  1. IDEA 2018 激活破解方法(包含最新License server)
  2. 软件工程的目的是教会不会写程序的人开发软件吗?
  3. mysql 数据库防御_MySQL数据库注入分析和防御
  4. 前端媒体查询知识梳理
  5. python魔法方法学不懂_Python进阶:Python魔法方法
  6. 常见CPU和GPU转码技术对比
  7. Android自定义控件图片+文字布局
  8. 攻读计算机专业博士,范文:计算机专业攻读博士(2)
  9. 【adb】成功解决adb获取不到OPPO手机设备id
  10. python+appium+夜神模拟器刷快手极速版金币套现,帮你赚够早餐钱