PackageManager分析(2)
来源:互联网 发布:数据维护需要学什么 编辑:程序博客网 时间:2024/04/29 19:51
1.PackageManagerService.java用到一个很重要的工具类,PackageParser.java。这里面是一些工具类和工具方法,辅助PackageManagerService来完成一些功能,具体代码自己去看一下。
下面仔细分析一下PackageManagerService的启动流程。
1.PackageManagerService中有一个静态方法:main()。生成一个IPackageManager接口,也就是PackageManagerService。下面我们主要看PackageManagerService的构造方法。
public static final IPackageManager main(Context context, boolean factoryTest) {
PackageManagerService m = new PackageManagerService(context, factoryTest);
ServiceManager.addService("package", m);
return m;
}
2.构造方法中,首先会进行一些成员变量的初始化,比如mContext, mFactoryTest, mMetrics, mSettings等。
最重要的是初始化mInstaller这个变量。Installer是一个很重要的类,所有对apk的install, uninstall,move等操作,都是通过它进行的。在下一篇中,会分析它。
Installer installer = new Installer();
if (installer.ping() && Process.supportsProcesses()) {
mInstaller = installer;
} else {
mInstaller = null;
}
3.建立PackageHandler消息循环,用于处理外部的apk安装请求消息,如adb install,packageinstaller安装apk时会发送消息
mHandlerThread.start();
mHandler = new PackageHandler(mHandlerThread.getLooper());
4.解析/system/etc/permission下xml文件(framework/base/data/etc/),包括platform.xml和系统支持的各种硬件模块的feature.主要工作:
(1)建立底层user ids和group ids 同上层permissions之间的映射;可以指定一个权限与几个组ID对应。当一个APK被授予这个权限时,它也同时属于这几个组。
(2)给一些底层用户分配权限,如给shell授予各种permission权限;把一个权限赋予一个UID,当进程使用这个UID运行时,就具备了这个权限。
(3) library,系统增加的一些应用需要link的扩展jar库;
(4) feature,系统每增加一个硬件,都要添加相应的feature.将解析结果放入mSystemPermissions,mSharedLibraries,mSettings.mPermissions,mAvailableFeatures等几个集合中供系统查询和权限配置使用。
5.检查/data/system/packages.xml是否存在,这个文件是在解析apk时由
writeLP()创建的,里面记录了系统的permissions,以及每个apk的name
,codePath,flags,ts,version,uesrid等信息,这些信息主要通过apk的
AndroidManifest.xml解析获取,解析完apk后将更新信息写入这个文件并保
存到flash,下次开机直接从里面读取相关信息添加到内存相关列表中。当有apk
升级,安装或删除时会更新这个文件。
6.检查BootClassPath,mSharedLibraries及/system/framework下的jar
是否需要dexopt,需要的则通过dexopt进行优化
7.启动AppDirObserver线程监测/system/framework,/system/app,/data/app,/data/
app-private目录的事件,主要监听add和remove事件。对于目录监听底层通过
inotify机制实现,inotify 是一种文件系统的变化通知机制,如文件增加、删除
等事件可以立刻让用户态得知,它为用户态监视文件系统的变化提供了强大的支持。
当有add event时调用scanPackageLI(File , int , int)处理;
当有remove event时调用removePackageLI()处理;
8.对于以上几个目录下的apk逐个解析,主要是解析每个apk的AndroidMa-
nifest.xml文件,处理asset/res等资源文件,建立起每个apk的配置结构信息,
并将每个apk的配置信息添加到全局列表进行管理。调用installer.install()进
行安装工作,检查apk里的dex文件是否需要再优化,如果需要优化则通过辅助工
具dexopt进行优化处理;将解析出的componet添加到pkg的对应列表里;
对apk进行签名和证书校验,进行完整性验证。
9.将解析的每个apk的信息保存到packages.xml和packages.list文件里,
packages.list记录了如下数据:pkgName,userId,debugFlag,
dataPath(包的数据路径)
下面仔细分析一下PackageManagerService的启动流程。
1.PackageManagerService中有一个静态方法:main()。生成一个IPackageManager接口,也就是PackageManagerService。下面我们主要看PackageManagerService的构造方法。
public static final IPackageManager main(Context context, boolean factoryTest) {
PackageManagerService m = new PackageManagerService(context, factoryTest);
ServiceManager.addService("package", m);
return m;
}
2.构造方法中,首先会进行一些成员变量的初始化,比如mContext, mFactoryTest, mMetrics, mSettings等。
最重要的是初始化mInstaller这个变量。Installer是一个很重要的类,所有对apk的install, uninstall,move等操作,都是通过它进行的。在下一篇中,会分析它。
Installer installer = new Installer();
if (installer.ping() && Process.supportsProcesses()) {
mInstaller = installer;
} else {
mInstaller = null;
}
3.建立PackageHandler消息循环,用于处理外部的apk安装请求消息,如adb install,packageinstaller安装apk时会发送消息
mHandlerThread.start();
mHandler = new PackageHandler(mHandlerThread.getLooper());
4.解析/system/etc/permission下xml文件(framework/base/data/etc/),包括platform.xml和系统支持的各种硬件模块的feature.主要工作:
(1)建立底层user ids和group ids 同上层permissions之间的映射;可以指定一个权限与几个组ID对应。当一个APK被授予这个权限时,它也同时属于这几个组。
(2)给一些底层用户分配权限,如给shell授予各种permission权限;把一个权限赋予一个UID,当进程使用这个UID运行时,就具备了这个权限。
(3) library,系统增加的一些应用需要link的扩展jar库;
(4) feature,系统每增加一个硬件,都要添加相应的feature.将解析结果放入mSystemPermissions,mSharedLibraries,mSettings.mPermissions,mAvailableFeatures等几个集合中供系统查询和权限配置使用。
5.检查/data/system/packages.xml是否存在,这个文件是在解析apk时由
writeLP()创建的,里面记录了系统的permissions,以及每个apk的name
,codePath,flags,ts,version,uesrid等信息,这些信息主要通过apk的
AndroidManifest.xml解析获取,解析完apk后将更新信息写入这个文件并保
存到flash,下次开机直接从里面读取相关信息添加到内存相关列表中。当有apk
升级,安装或删除时会更新这个文件。
6.检查BootClassPath,mSharedLibraries及/system/framework下的jar
是否需要dexopt,需要的则通过dexopt进行优化
7.启动AppDirObserver线程监测/system/framework,/system/app,/data/app,/data/
app-private目录的事件,主要监听add和remove事件。对于目录监听底层通过
inotify机制实现,inotify 是一种文件系统的变化通知机制,如文件增加、删除
等事件可以立刻让用户态得知,它为用户态监视文件系统的变化提供了强大的支持。
当有add event时调用scanPackageLI(File , int , int)处理;
当有remove event时调用removePackageLI()处理;
8.对于以上几个目录下的apk逐个解析,主要是解析每个apk的AndroidMa-
nifest.xml文件,处理asset/res等资源文件,建立起每个apk的配置结构信息,
并将每个apk的配置信息添加到全局列表进行管理。调用installer.install()进
行安装工作,检查apk里的dex文件是否需要再优化,如果需要优化则通过辅助工
具dexopt进行优化处理;将解析出的componet添加到pkg的对应列表里;
对apk进行签名和证书校验,进行完整性验证。
9.将解析的每个apk的信息保存到packages.xml和packages.list文件里,
packages.list记录了如下数据:pkgName,userId,debugFlag,
dataPath(包的数据路径)
- PackageManager分析(2)
- PackageManager分析(1)
- PackageManager分析(3)
- PackageManager 分析(1)
- PackageManager分析(4)
- PackageManager分析(5)
- android中的packagemanager分析
- Android Framework --- PackageManager 分析
- packageManager
- PackageManager
- PackageManager
- PackageManager
- PackageManager
- Android Framework 分析---3PackageManager 分析
- PackageManager(管理应用程序包)
- Android源码之“应用程序界面“分析二(PackageManager和PackageManagerService)
- Android近期任务列表 Recent Applicatoins 分析 + Android PackageManager
- [gitbook] Android框架分析系列之Android PackageManager
- 你是说删除文件吗?
- 程序段的Class Scope
- Apache commons——Apache旗下的通用工具包项目
- JNI 的使用
- POJ 3253 Fence Repair 哈夫曼树/优先级队列
- PackageManager分析(2)
- BT技术概念 — 一些术语的意思
- zoj 2851 Code Formatter
- PackageManager分析(3)
- 为Eclipse指定Java VM
- Android 性能优化的一些方法(2)
- 自我时间管理:一分钟先生
- wc
- 周总结