博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android应用生死轮回的那些事儿(2) - PackageManager
阅读量:6265 次
发布时间:2019-06-22

本文共 3558 字,大约阅读时间需要 11 分钟。

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的关系:

package_manager_gv

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出来的:

@Override    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中的第二个参数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:

@Override    public ApplicationInfo getApplicationInfo(String packageName, int flags, int userId) {        if (!sUserManager.exists(userId)) return null;        enforceCrossUserPermission(Binder.getCallingUid(), userId, false, false, "get application info");        // writer        synchronized (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 info                return 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;    }

转载地址:http://xfupa.baihongyu.com/

你可能感兴趣的文章
NSBundle介绍
查看>>
POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
查看>>
ConnectString中enlist设置的含义
查看>>
潜移默化学会WPF(企业经验篇)--Log4Net(二)
查看>>
轻量级面向SQL的MySQL开源监控工具
查看>>
ubuntu 卸载 程序软件
查看>>
iOS 6,5支持 portrait,landscape (横竖屏的处理)
查看>>
FineUI v3.2.2发布了!(7 天后再出新版,给不给力?)
查看>>
Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)------转帖
查看>>
vb webbrower 相对坐标
查看>>
原始的js代码和jquery对比
查看>>
.net和java和谐相处之安卓客户端+.net asp.net mvc webapi 2
查看>>
Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用
查看>>
jquery对象和javascript对象相互转换
查看>>
laravel开启调试模式
查看>>
Spring aop的实现原理
查看>>
ADO.NET一小记-select top 参数问题
查看>>
(转)jquery easyui treegrid使用小结 (主要讲的是如何编辑easyui中的行信息包括添加 下拉列表等)...
查看>>
iOS使用宏写单例
查看>>
Isotig & cDNA & gene structure & alternative splicing & gene loci & 表达谱
查看>>