Skip to content

Latest commit

 

History

History
73 lines (31 loc) · 5.08 KB

9.PackageManagerService简介.md

File metadata and controls

73 lines (31 loc) · 5.08 KB

9.PackageManagerService简介

程序包管理主要包含三部分内容:

  • 提供一个能够根据intent匹配到具体的Activity、Provider、Service。即当应用程序调用startActivity(intent)时,能够把参数中指定的intent转换成一个具体的包含了程序包名称及具体Component名称的信息,以便Java类加载器加载具体的Component。
  • 进行权限检查。即当应用程序调用某个需要一定权限的函数调用时,系统能够判断调用者是否具备该权限,从而保证系统的安全。
  • 提供安装、删除应用程序接口。

该框架可以分为三层:

  • 应用程序层

    应用程序需要使用包管理服务时,调用ContextImpl类的getPackageManager()函数返回一个PackageManager对象,然后调用该对象所提供的各种API接口。

  • PmS服务层

    和AmS、WmS等其他系统服务一样,包管理服务运行于SystemServer进程。PmS服务运行时,使用了两个目录下的XML文件保存相关的包管理信息。

    • 第一个目录是system/etc/permissions:该目录下的所有xml文件用于permission的管理,具体包含两个事件。第一个是定义系统中都包含了哪些feature,应用程序可以在AndroidManifest.xml中使用use-feature标签声明程序都需要哪些feature。
    • 第二个目录是/data/system/packages.xml,该文件保存了所有安装程序的基本包信息,有点像系统的注册表,比如程序的包名称是什么,安装包路径在哪里,程序都是用了哪些系统权限。

    PmS在启动时,会从这两个目录中解析相关的XML文件,从而建立一个庞大的包信息树,应用程序可以间接从这个信息树中查询所有所需的程序包信息。

    除了PmS服务外,还有两个辅助系统服务用于程序安装。 一个是DefaultContainerService,该服务主要用于把安装程序复制到程序目录中。另一个是Installer服务,该服务实际上并不是一个Binder,而是一个Socket客户端,PmS直接和该Socket客户端交互。Socket的服务端主要完成程序文件的解压工作及数据目录创建,比如从APK文件中提取dex文件,删除dalvik-cache(会把每个apk的dex文件放到该目录,方便提升执行速度)目录下的dex文件,创建程序专属的程序目录等。

  • 数据文件层

    就像所有操作系统一样,Android中的程序也由相关的程序文件组成,这些程序文件可以分为三个部分:

    • 程序文件

      所有的系统程序保存在/system/app目录下,所有的第三方应用程序保存在/data/app目录下,该目录中的APK与原始的APK文件的唯一区别是文件的名称不同,原始文件可以任意命名,而该目录下的文件名称是以包名进行命名,并自动增加一个"-x"后缀,比如com.android.haii.debugjar-1.apk。当同样一个程序第二次安装时,后面的数字1会变成数字2,而当第三次再安装时,又会变成数字1,有点像“乒乓”机制。。/data/dalvik-cache目录保存了程序中的执行代码。一个APK实际上是一个Jar压缩类型的文件,压缩包中包含了各种资源文件、资源索引文件、AndroidManifest文件及程序文件,当应用程序运行前,PmS会从APK文件中提取出代码文件,也就是所谓的dex文件,并将该文件存储在该目录下,以便以后能够快速运行该程序。比如: data@app@com.android.xxx-1.apk@classes.dex

    • framework库文件

      这些库文件存在于/system/framework目录下,库文件类型是APK或者Jar,系统开机后,dalvik虚拟机会加载这些库文件,而在PmS启动时,如果这些Jar或者APK文件还没有被转换为dex文件,则PmS会将这些库文件转换为dex文件,并保存到/data/dalvik-cache目录下。

    • 应用程序所使用的数据文件

      应用程序可以使用三种数据保存方式,分为参数存储、数据库存储、文件存储。这三种存储方式对应的数据文件一般都保存到/data/data/xxx目录下,xxx代表程序的包名。

安装及卸载程序的操作都是由PmS完成,安装程序的过程包括在程序目录下创建以包名称命名的程序文件、创建程序数据目录,以及把程序信息保存到相关的配置文件packages.xml中,卸载则是一个相反的操作。

aipalign优化APK内部存储

所谓的内部存储优化是指,为了提高APK程序的加载速度,从而对APK中相关的数据进行边界对齐。因为从底层NAND Flash的角度来讲,读取NAND时,是以一个扇区进行读取的,因此,如果相关的数据能够在同一个扇区中,肯定会提高读取速度。zipalign的作用正是将APK包中的不同类型的数据文件进行边界对齐。