包管理服务 ( PackageManagerService)ANDROID的系统服务之一 ,主要功能实现应用包的解析、安装、更新、移动、卸载等服务。

系统类图如下:



PackageManagerService主要通过InstallerUserManagerAppDirObserverSettingsDefaultContainerServicePackageHelperNativeLibraryHelperPackageHandlerPackageParser等类实现相应的功能。

Installer类与本地服务installd建立LocalSocket连接,借助installd实现包的installremovedexopt等功能。

UserManager类实现与用户相关的用户数据和包的安装、创建和管理,包括用户及用户数据的创建、删除。

AppDirObserver实现对/system/framework,/system/app /vendor/app/data/app/data/app-private等目录的addremove事件的监听,实现包的动态安装和卸载。

Settings类实现data/system/目录下的包安装信息相关的文件的读取和管理(创建、更新等),解析和读取如下packages.xml"packages-backup.xml""packages.list""packages-stopped.xml""packages-stopped-backup.xml" XML文件。

packages.xm是在解析apk时由 writeLP()创建的,里面记录了系统的permissions以及每个apkname ,codePath, pkgFlags, timeStamp, versionCode,uesrid等信息,这些信息主要通过apk AndroidManifest.xml解析获取,解析完apk后将更新信息写入这个文件并保存到flash,下次开机直接从里面读取相关信息添加到内存相关列表中。当有apk升级,安装或删除时会更新这个文件。

packages.list记录了如下数据:pkgNameuserIddebugFlagdataPath(包的数据路径)。

packages-stopped.xml记录处于停止状态的包的信息,主要包括包名、notLaunched状态等信息。

DefaultContainerService是一个应用服务,具体负责实现APK等相关资源文件在内部或外部存储器上的存储工作。 DefaultContainerService服务中提供了一个IMediaContainerService.Stub桩对象。PackageManagerService包管理服务在PackageHandler对象接收到应用安装消息后首先与该服务建立连接(通过BINDSERVICE)。在服务建立连接后onServiceConnected回调被调用,在onServiceConnected回调函数中根据参数传进来的IMediaContainerService.Stub的对象引用创建一个远程代理对象。以后PackageManagerService服务通过该代理对象访问DefaultContainerService服务。

PackageHelper是提供包安装用到的 MountServiceAPI方法的帮助类。

NativeLibraryHelper是提供APK包含的库文件安装、删除、空间大小计算等方法的帮助类。

PackageHandler实现包处理相关的消息的处理,如apk安装请求消息,如adb install等。PackageHandler运行在独立的线程。

PackageHandler对象对应用包的处理请求使用了模板和命令模式,把要处理的请求作为对象通过消息传递给处理函数;包的安装、移动及获得包的大小消息请求分别打包为InstallParamsMoveParamsMeasureParams对象,三个类都继承自HandlerParams超类,HandlerParams超类中定义了一个模板函数startCopy,模板函数startCopy中使用的三个函数在超类中没有实现,是虚函数,具体实现的功能由具体类确定;如虚函数handleStartCopy对于InstallParams类实现的是包的安装工作,对于MoveParams类实现的是包的移动工作,香港服务器租用,而MeasureParams类中的handleStartCopy函数实现的是包的测量工作。

InstallParamsMoveParamsMeasureParams三个类中提供了对应的观察者接口IPackageInstallObserverIPackageMoveObserverIPackageStatsObserver,三个接口在PackageManagerService的客户端对象调用PackageManagerService服务的包的安装、移动及获得包的大小等相关API时作为参数传进来,并在InstallParamsMoveParamsMeasureParams三个对象实例化时赋值给对应的观察者接口。因此三个观察者接口指向的对象实际是客户端提供的观察者对象(桩对象)的远程代理对象,InstallParamsMoveParamsMeasureParams三个对象通过对应的观察者接口向远端客户端发送通知。采用的模式是代理模式和观察者模式的复合模式。


更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Pycharm安装PyQt5的详细教程
  3. 类和 Json对象
  4. python list.sort()根据多个关键字排序的方法实现
  5. Android(安卓)迁移到AndroidX的实现
  6. Android实现多层级Spinner列表选项实时更新树形层级
  7. android:installLocation简析
  8. android 系统关机,重启
  9. 实现 Android(安卓)通知提示功能

随机推荐

  1. Android IntentService使用
  2. Android 如何自定义apk打包的包名
  3. Android 使用Okhttp进行文件下载
  4. Android中Java和JavaScript交互
  5. Android开发之动态库调用
  6. Mac 安装最新版的Android(安卓)Studio软
  7. android中The connection to adb is down
  8. GridView属性
  9. Android动态修改APP图标
  10. Android中Bundle支持的数据类型