Android应用生死轮回的那些事儿(2) - PackageManager
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相关推荐
- Android应用生死轮回的那些事儿(6) - 武器库完结篇
Android应用生死轮回的那些事儿(6) - 武器库完结篇 PackageManager武器库的完结篇,让我们梳理一下从Android 1.0到Android 7.0的发展过程吧. 资源相关API ...
- Android应用生死轮回的那些事儿(3) - 武器库(1)-权限管理相关API
Android应用生死轮回的那些事儿(3) - 武器库(1)-权限管理相关API PackageManager中提供的武器,可以用"既多又杂,版本变化大"来形容. 不过,我们通过分 ...
- Android应用生死轮回的那些事儿(4) - 武器库(2)-应用组件查询相关API
Android应用生死轮回的那些事儿(4) - 武器库(2)-应用组件查询相关API 这一节我们将学习: 如何查询系统中安装了哪些应用 如何获取一个包的信息 如何获取一个Application的信息 ...
- Android应用生死轮回的那些事儿(1) - installd初探
Android应用生死轮回的那些事儿(1) - installd初探 前面我们讨论过dex2oat的过程,下面我们开始探索系统中的重要工具进程,installd守护进程. 我们有PackageMana ...
- Android 系统(98)---Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)
Android app 在线更新那点事儿(适配Android6.0.7.0.8.0) 一.前言 app在线更新是一个比较常见需求,新版本发布时,用户进入我们的app,就会弹出更新提示框,第一时间更新新 ...
- android service 自动停止,【Android】Service那点事儿
1.Service简介 服务是一个应用程序组件,可以在后台执行长时间运行的操作,不提供用户界面.一个应用程序组件可以启动一个服务,它将继续在后台运行,即使用户切换到另一个应用程序.此外,一个组件可以绑 ...
- 那些年,Android音视频开发那些事儿
音视频开发的主要应用有哪些? 音频播放器,录音机,语音电话,音视频监控应用,音视频直播应用,音频编辑/处理软件,蓝牙耳机/音箱,等等 1.视频监控类 (JNI+应用层开发) 从硬件到嵌入式再到软件,涉 ...
- Android马甲包的那些事儿
制作Android马甲包最简单的方式就是使用 productFlavors 机制. 本文就是在productFlavors机制的基础上制作的马甲包,每个马甲只需要 在build.gradle文件中配置 ...
- Android视频加密那点事儿!
不错,转来备份. 转自:https://blog.csdn.net/shenshibaoma/article/details/79003854 前言 最近有需求要做视频的加密.因为视频下载到本地后,为 ...
最新文章
- undo表空间文件丢失恢复(4)--无备份无recover的情况下恢复
- Linux下给PHP安装redis扩展
- 【转】Apache配置中ProxyPassReverse指令的含义
- Java程序设计进阶之路一:捕捉异常
- oracle:connect by start
- nginx log response_python+pandas分析nginx日志的实例
- Outlook应用指南(1)——数据备份还原技巧
- 程序员如何写简历?来自硅谷的八条建议
- Tree(HDU-5060)
- python画图时常用的颜色——color=‘ ’
- 无限磁力_给力的磁力搜索网站你都知道吗?
- 计算机组成原理概述篇
- js复制到剪贴板html5,移动端web 复制到剪贴板 怎么实现?
- 工业镜头、相机的结构、参数解释及选型指南
- 如何测试一个串口调试助手软件,串口调试助手(SComAssistant)
- Console 接口介绍及电路设计
- iphonex蓝牙打不开转圈_多人反应iPhone X蓝牙连接时遇到问题
- SpringBoot整合Redis实现排行榜功能
- 【爬虫进阶】常见的反爬手段和解决方法(建议收藏)
- oracle 截取时间年或月
热门文章
- IDEA 2018 激活破解方法(包含最新License server)
- 软件工程的目的是教会不会写程序的人开发软件吗?
- mysql 数据库防御_MySQL数据库注入分析和防御
- 前端媒体查询知识梳理
- python魔法方法学不懂_Python进阶:Python魔法方法
- 常见CPU和GPU转码技术对比
- Android自定义控件图片+文字布局
- 攻读计算机专业博士,范文:计算机专业攻读博士(2)
- 【adb】成功解决adb获取不到OPPO手机设备id
- python+appium+夜神模拟器刷快手极速版金币套现,帮你赚够早餐钱