一.先验知识

0.PcakageaManagerService版本号变化

1.概述

2.PackageManagerService服务启动流程

3. PackageManagerService入口

二.四种安装方式

1.系统应用安装2.网络下载应用安装3. ADB工具安装

4.第三方应用安装

三.总结

概述

1.1概述

众所周知,Android应用终于是打包成.apk格式(事实上就是一个压缩包)。然后安装至手机并运行的。APK即Android Package的缩写。

Android系统在启动的过程中,会启动一个应用程序管理服务PackageManagerService。这个服务负责扫描系统中特定的文件夹,找到里面的应用程序文件,即以Apk为后缀的文件。然后对这些文件进解析,得到应用程序的相关信息。完毕应用程序的安装过程。

应用程序管理服务PackageManagerService安装应用程序的过程。事实上就是解析析应用程序配置文件AndroidManifest.xml的过程,并从里面得到得到应用程序的相关信息,比如得到应用程序的组件Activity、Service、Broadcast Receiver和Content Provider等信息,有了这些信息后,通过ActivityManagerService这个服务。我们就能够在系统中正常地使用这些应用程序了。

Android应用APK安装的方式

一般而言,Android应用安装有例如以下四种方式:

系统应用安装:开机时载入系统的APK和应用,没有安装界面;

网络下载应用安装:通过各种market应用完毕,没有安装界面;

ADB工具安装:即通过Android的SDK开发tools里面的adb.exe程序安装,没有安装界面。

第三方应用安装:通过SD卡里的APK文件安装(比方双击APK文件触发)。有安装界面。系统默认已经安装了一个安装卸载应用的程序。即由packageinstaller.apk应用处理安装及卸载过程的界面。

应用安装涉及到的文件夹

/system/app :系统自带的应用程序,获得adb root权限才干删除

/data/app :用户程序安装的文件夹。安装时把apk文件复制到此文件夹

/data/data :存放应用程序的数据

/data/dalvik-cache:将apk中的dex文件安装到dalvik-cache文件夹下(dex文件是dalvik虚拟机的可运行文件,当然,ART–Android Runtime的可运行文件格式为oat。启用ART时,系统会运行dex文件转换至oat文件)

/data/system :该文件夹下的packages.xml文件。相似于Windows的注冊表,这个文件是在解析apk时由writeLP()创建的。里面记录了系统的permissions,以及每一个apk的name,codePath,flags,ts,version,uesrid等信息。这些信息主要通apk的AndroidManifest.xml解析获取,解析完apk后将更新信息写入这个文件并保存到flash,下次开机直接从里面读取相关信息加入到内存相关列表中。当有apk升级,安装或删除时会更新这个文件。

/data/system/packages.xml中内容具体解释(这里列举的标签内容不一定完整。仅仅是列举核心内容,packages.xml的完整定义详见官方文档):

安装概述

(1) 拷贝apk文件到指定文件夹

在Android系统中,apk安装文件是会被保存起来的,默认情况下,用户安装的apk首先会被复制到 /data/app 文件夹下。

/data/app文件夹是用户有权限訪问的文件夹,在安装apk的时候会自己主动选择该文件夹存放用户安装的文件,而系统出厂的apk文件则被放到了 /system 分区下,包含 /system/app,/system/vendor/app,以及 /system/priv-app 等等,该分区仅仅有Root权限的用户才干訪问。这也就是为什么在没有Root手机之前,我们无法删除系统出厂的app的原因了。

(2) 解压apk,复制文件,创建应用的数据文件夹

为了加快app的启动速度。apk在安装的时候,会首先将app的可运行文件(dex)复制到 /data/dalvik-cache 文件夹。缓存起来。

然后,在/data/data/文件夹下创建应用程序的数据文件夹(以应用的包名命名)。存放应用的相关数据,如数据库、xml文件、cache、二进制的so动态库等等。

(3) 解析apk的AndroidManifinest.xml文件

Android系统中,也有一个相似注冊表的东西,用来记录当前全部安装的应用的基本信息,每次系统安装或者卸载了不论什么apk文件。都会更新这个文件。这个文件位于例如以下文件夹:

/data/system/packages.xml

系统在安装apk的过程中。会解析apk的AndroidManifinest.xml文件。提取出这个apk的重要信息写入到packages.xml文件里。这些信息包含:权限、应用包名、APK的安装位置、版本号、userID等等。

由此,我们就知道了为啥一些应用市场和软件管理类的app能够非常清楚地知道当前手机所安装的全部的app,以及这些app的具体信息了。

另外一件事就是Linux的用户Id和用户组Id。以便他能够获得合适的运行权限。

以上这些都是由PackageServiceManager完毕的,以下我们会重点介绍PackageServiceManager。

(4) 显示快捷方式

这些应用程序仅仅是相当于在PackageManagerService服务注冊好了,假设我们想要在Android桌面上看到这些应用程序,还须要有一个Home应用程序,负责从PackageManagerService服务中把这些安装好的应用程序取出来,并以友好的方式在桌面上展现出来,比如以快捷图标的形式。

在Android系统中,负责把系统中已经安装的应用程序在桌面中展现出来的Home应用程序就是Launcher了

1.2 PackageManagerService启动过程

1.3 PackageManagerService入口

2.1系统应用安装方式

2.1系统应用安装方式

第一步:1.PackageManagerService.main()初始化注冊

将PackageManagerService服务初始化并注冊到ServiceManager里面进行管理。

第二步:2.建立java层的installer与c层的installd的socket联接

建立java层的installer与c层的installd的socket联接,使得在上层的install,remove,dexopt等功能终于由installd在底层实现;

第三步:3.建立PackageHandler消息循环

建立PackageHandler消息循环,用于处理外部的apk安装请求消息,如adb install,packageinstaller安装apk时会发送消息。

典型的比方INIT_COPY和MCS_BOUND等,在通过网络下载时候会调用。

第四步:4. 成员变量readLp()恢复上一次的安装信息

因为Android每次启动的时候都须要安装一次信息,可是有些信息是保持不变的,比如Linux用户组Id,PackageManagerService 每次安装程序之后。都会把这些程序的信息保存下来。以便下次使用。 恢复上一次程序的安装信息是通过PackageManagerService 的成员变量mSetting的readLP()来实现的,恢复信息之后就開始扫描和安装app了。

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

第五步:5.jar的detopt优化

检查BootClassPath。mSharedLibraries及/system/framework下的jar是否须要dexopt,须要的则通过dexopt进行优化;

第六步:6.scanDirLI函数扫描特定文件夹的apk文件解析

启动AppDirObserver线程监測/system/framework,/system/app,/data/app,/data/app-private文件夹的事件,主要监听add和remove事件。对于文件夹监听底层通过inotify机制实现,inotify 是一种文件系统的变化通知机制,如文件添加、删除等事件能够立马让用户态得知,它为用户态监视文件系统的变化提供了强大的支持。

当有add event时调用scanPackageLI(File , int , int)处理;当有remove event时调用removePackageLI()处理;

调用installer.install()进行安装工作,检查apk里的dex文件是否须要再优化,假设须要优化则通过辅助工具dexopt进行优化处理。将解析出的componet加入到pkg的相应列表里;对apk进行签名和证书校验,进行完整性验证。

第七步:7.updatePermmisonLp函数分配权限

这个函数为申请了特定资源訪问权限的app。分配相应的用户组ID.

第八步:8.writeLP()函数保存安装信息

mSetting的writeLP()将所获得应用程序的安装信息。保存在一个本地的配置文件里。以便下次安装的时候,将应用的信息回复过来。

2.1系统应用安装方式

2.2网络下载应用安装

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHBqaXNodQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

2.3 ADB工具安装

2.4第三方应用安装

![这里写图片描写叙述](

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHBqaXNodQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/">http://img.blog.csdn.net/20170310214918051?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHBqaXNodQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/

三.总结

1.安装和卸载都是通过PackageManager。实质上是实现了PackageManager的远程服务PackageManagerService来完毕具体的操作,全部细节和逻辑均能够在PackageManagerService中跟踪查看。

2.全部安装方式殊途同归,终于就回到PackageManagerService中,然后调用底层本地代码的installd来完毕。

再看apk 的安装过程。

回个我们再看真个apk的安装过程。主要分为例如以下几部

拷贝apk文件到指定文件夹

解压apk。复制文件,创建应用的数据文件夹

解析apk的AndroidManifinest.xml文件

向Launcher应用申请加入创建快捷方式

參考:

《Android源码情景分析》

《Android内核分析》

http://blog.csdn.net/luoshengyang/article/details/6766010

http://blog.csdn.net/hdhd588/article/details/6739281

http://ticktick.blog.51cto.com/823160/1669525

http://www.jianshu.com/p/953475cea991

http://cstsinghua.github.io/2016/06/13/Android%E5%AE%89%E8%A3%85APK%E8%AF%A6%E8%A7%A3/

http://junshengluo.com/2016/11/30/android-5-%E6%8E%A2%E7%A9%B6%20Android%20%20apk%20%E5%AE%89%E8%A3%85%E8%BF%87%E7%A8%8B/

深度探究apk安装过程的更多相关文章

  1. Android Activity启动流程, app启动流程,APK打包流程, APK安装过程

    1.Activity启动流程 (7.0版本之前) 从startActivity()开始,最终都会调用startActivityForResult() 在该方法里面会调用Instrumentation. ...

  2. Android APK安装过程介绍

    课题路径:从Myfile中点击应用进行安装,到安装完成,过程分析 思想方法:在研究PreloadInstaller的时候我们直接从整个apk的文件结构入手,由整体到部分的分析:但现在整个PMS非常庞大 ...

  3. Android APK安装过程学习笔记

    1.什么是APK APK,即Android Package,Android安装包.不同平台的安装文件格式都不同,类似于Windows的安装包是二进制的exe格式,Mac的安装包是dmg格式.APK可以 ...

  4. Android中APK安装过程及原理解析

    [原文] 来自华为内部资料 应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作.APK是Android Package的缩写,即android安装包 ...

  5. APK文件结构和安装过程

    APK文件结构Android应用是用Java编写的,利用Android SDK编译代码,并且把所有的数据和资源文件打包成一个APK (Android Package)文件,这是一个后缀名为.apk的压 ...

  6. android APK应用安装过程以及默认安装路径[转]

    一:安装过程 APK是类似Symbian Sis或Sisx的文件格式.通过将APK文件直接传到Android模拟器或Android手机中执行即可安装. Android应用安装有如下四种方式 1.   ...

  7. Android apk 的安装过程

    Android应用安装有如下四种方式 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有安装界面. 4.第三方应用 ...

  8. [android]android下apk的安装过程

    /********************2016年4月23日更新********************************/ 知乎:有什么apk分析工具? 拿到了一个apk文件,怀疑不安全,在 ...

  9. Android开发——Android系统启动以及APK安装、启动过程

    0. 前言   从Android手机打开开关,到我们可以使用其中的app时,这个启动过程到底是怎么样的? 1.  系统上电 当给Android系统上电,在电源接通的瞬间,CPU内的寄存器和各引脚均会被 ...

随机推荐

  1. ES6 异步编程之一:Generator

    Generator 生成器是es6原生提供的异步编程方案,其语法行为和传统函数完全不同,阮大的<ECMAScript 6 入门>一书中对生成器有比较详尽的介绍,还有一些其他的文章可以参考, ...

  2. BBS-登录

    from django.db import models # Create your models here. from django.contrib.auth.models import Abstr ...

  3. 剪枝的定义&&hdu1010

    半年前在POJ上遇到过一次剪枝的题目,那时觉得剪枝好神秘...今天在网上查了半天资料,终于还是摸索到了一点知识,但是相关资料并不多,在我看来,剪枝是技巧,而不是方法,也就是说,可能一点实用的小技巧,让 ...

  4. POJ 2353 Ministry

    Ministry Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4220   Accepted: 1348   Specia ...

  5. Etcd和ZooKeeper,究竟谁在watch的功能表现更好?

    ZooKeeper和Etcd的主要异同可以参考这篇文章,此外,Etcd的官网上也有对比表格(https://coreos.com/etcd/docs/latest/learning/why.html) ...

  6. 【Luogu】P2709小B的询问(莫队算法)

    题目链接 md,1A率等于0. 烦死. 终于搞到一道莫队了qwq. 先对区间分块再按照块编号为第一关键字,右端点为第二关键字排序,然后每次端点移动1乱搞. 然后……就wa了. 然后有很多细节需要注意q ...

  7. 关于sql语句实现将'1,2,3'转1,2,3等竖横转换问题

    这是本人的第一个博客,以后会及时整理遇到的问题,方便和大家进行交流. 第一次也不知道说什么了,直接进入正题吧. 因为我的数据在设计时候数据源是竖列存的,满足条件的数据是横列存的.如下图所示: 我要筛选 ...

  8. hdu 1277 AC自动机

    全文检索 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. css3 容器内容垂直居中

    .item{ top: 50%; position: absolute; transform: translateY(-50%); /* 这里我们使用css3的transform来达到类似效果 */ ...

  10. angular中关于文件引入

    var angular = require('angular'); module.exports = angular.module('app.mymodule2', []).controller('H ...