写给Android App开发人员看的Android底层知识(8)

(十)PMS及App安装过程算法

       PMS,全称PackageManagerService,是用来获取Apk包的信息的。安全

 

       在前面分析四大组件与AMS通讯的时候,咱们介绍过,AMS老是会使用PMS加载包的信息,将其封装在LoadedApk这个类对象中,而后咱们就能够从中取出在manifest声明的四大组件信息了。网络

 

       (一)app

       在下载并安装App的过程,会把Apk存放在data/app目录下。xml

Apk是一个zip压缩包,在文件头会记录压缩包的大小,因此后续在文件尾巴就算是追加一部小电影,也不会对解压形成影响——木马其实就是这个思路,在可执行文件exe尾巴上挂一个木马病毒,执行exe的同时也会执行这个木马,而后你就中招了。对象

       咱们能够把木马思想运用在Android多渠道打包上。在比较老的Android 4.4版本中,咱们会在Apk尾巴上追加几个字节,来标记Apk的渠道。Apk启动的时候,从apk中的尾巴上读取这个渠道值。blog

       后来Google也发现这个安全漏洞了,在新版本的系统中,就会在Apk安装的时候,检查Apk的实际大小,看这个值与Apk的头部记录的压缩包大小,是否相等,不相等就会报错说安装失败。图片

      

       (二)ip

       咱们继续说App的安装过程。Android系统使用PMS解析这个Apk中的manifest文件,包括:资源

  •    四大组件的信息,好比说,前面讲过的静态Receiver。好比说默认启动的Activity。
  •    分配用户Id和用户组Id。用户Id是惟一的,由于Android是一个Linux系统。用户组Id指的是各类权限,每一个权限都在一个用户组中,好比读写SD卡,好比网络访问,分配了哪些用户组Id,就拥有了哪些权限。

 

       3)在Launcher生成一个icon,icon中保存着默认启动的Activity的信息。

 

       4)App安装过程的最后,是把上面这些信息记录在一个xml文件中,以备下次安装时再次使用。

 

       (三)

       其实,在Android手机系统每次启动的时候,都会使用PMS,把Android系统中的全部Apk都安装一遍,一共4个步骤,以下所示:

 

 

其中的第3步、第4步,和单独安装一个App的步骤是同样的。咱们分析一下前两步:

      第1步,由于结束安装的时候,都会把安装信息保存在xml文件中,因此Android系统再次启动时,再次从新安装全部的Apk,就能够直接读取以前保存的xml文件了。

      第2步,从5个目录中读取并安装全部的apk。

 

      最后,回答前面说起的一个问题,为何App安装时,不把它解压呢?直接从解压文件中读取资源文件好比图片是否是更快呢?其实并非这样的,这部分逻辑须要到底层C++的代码去寻找,我没有具体看过,只是道听途说问过Lody,他是这么给我解释的:

      每次从apk中读取资源,并非先解压再找图片资源,而是解析Apk中的Resource.arsc文件,这个文件中存储着资源的全部信息,包括资源在Apk中的地址、大小等等,按图索骥,从这个文件中快速找到相应的资源文件。这是一种很高效的算法。

      不解压Apk的好处,天然是节省空间。

相关文章
相关标签/搜索