深入PMS源码(二)—— APK的安装和卸载源码分析

1、应用程序安装基础

  • 单个APK程序安装的过程
  1. 把原始的APk文件复制到程序相应的目录文件下,对于第三方app复制到/data/app/目录下
  2. 为程序创建相应的数据目录、提取dex文件、修改系统包管理信息
  • 程序安装过程
  1. 在程序目录下创建以包名称命名的程序apk文件File
  2. 在data/data/目录下创建应用程序的数据文件
  3. 将程序所有的信息写入到配置文件package.xml文件中
  • HandlerParams主要实现子类
  1. InstallParams:完成要安装程序的Copy工作
  2. MoveParams:实现对已安装程序移动到外部保存目录中
  abstract class HandlerParams {
    // 抽象类
4676        final static int MAX_RETRIES = 4; // 最多重试4次
4677        int retry = 0;
4678        final boolean startCopy() {
    // 提供文件Copy方法
4679            try {
   
4681                retry++;
4682                if (retry > MAX_RETRIES) {
    // 尝试超过4次报错
4684                    mHandler.sendEmptyMessage(MCS_GIVE_UP); // 超过4次后发送报错信息,回调错误方法
4685                    handleServiceError();
4686                    return false;
4687                } else {
   
4688                    handleStartCopy(); // 子类需重写,执行文件复制操作
                        res = true;
4691                }
4692            } catch (RemoteException e) {
   
4694                mHandler.sendEmptyMessage(MCS_RECONNECT);
4695            }
4696            handleReturnCode();
                return res;
4697        }
4699        final void serviceError() {
   
4701            handleServiceError();
4702            handleReturnCode();
4703        }
4704        abstract void handleStartCopy() throws RemoteException; // 抽象方法
4705        abstract void handleServiceError();
4706        abstract void handleReturnCode();
    }

由上面源码知道,HandlerParams是抽象类,内部提供程序文件的复制功能,执行将安装的apk文件复制到程序的制定安装位置,程序调用startCopy()后开始执行文件赋值,具体赋值调用抽象方法handleStartCopy(),所以具体的功能子类需要重写此方法,在copy发生异常时会发送Handler消息实现重试,最多重试4次后抛出异常;

2、PMS中APK安装过程

程序的安装执行到PMS中后,从Packagemanager的installpackage()方法开始,间接调用到PMS中installStage()函数,installStage()中首先创建InstallParams对象,保存要安装的文件URI和其他信息,然后发送INIT_COPY异步消息启动文件复制

public void installStage(.) {
   
4590        Message msg = mHandler.obtainMessage(INIT_COPY); // 创建INIT_COPY消息
4591        msg.obj = new InstallParams(packageURI, observer, flags,
4592                installerPackageName); // 创建InstallParams对象封装安装包属性信息
4593        mHandler.sendMessage(msg);
4594    }

Handler在处理INIT_COPY消息时,根据mBound变量确定是否绑定了MSC服务,未绑定的先调用connectToService()执行绑定过程,然后将HandlerParams加入mPendingInstalls集合中等待执行,在服务绑定后发送MCS_BOUND消息,对于已经绑定的直接发送MSC_BOUND事件执行任务

                    if (!mBound) {
    // 1、判断服务是否绑定
457                        if (!connectToService()) {
    // 2、执行Service绑定
459                            params.serviceError();
460                            return;
461                        } else {
   
464                            mPendingInstalls.add(idx, params); // 3、添加要执行的任务
465                        }
466                    } else {
   
467                        mPendingInstalls.add(idx, params); // 3、添加任务
470                        if (idx == 0) {
   
471                            mHandler.sendEmptyMessage(MCS_BOUND); // 4、就一个事件时,直接发送事件立即执行
472                        }
473                    }

在处理MCS_BOUND消息时,使用获取的Binder服务从mPendingInstalls列表中取出安装信息HandlerParams类中,

if (msg.obj != null) {
   
mContainerService = (IMediaContainerService) msg.obj; // 1、获取对应的服务
}
HandlerParams params = mPendingInstalls.get(0); // 2、取出要安装的参数
if (params != null) {
   
If(params.startCopy(){
    // 3、执行Copy文件,最终执行到FileInstallArgs.copyApk()
    if (mPendingInstalls.size() > 0) {
   
        mPendingInstalls.remove(0);  // 删除集合中的数据
    }
}; 
}

在Handler处理事件时,从消息msg中获取IMediaContainerService服务对象,并从mPendingInstalls集合中获取要执行的任务,此处获取的是前面创建的InstallParams对象,然后调用params.startCopy()方法执行文件复制,按照HandlerParams的源码程序会调用InstallParams.handleStartCopy()方法;

// InstallParams:实现全新安装时的复制过程
 class InstallParams extends HandlerParams {
   
      public void handleStartCopy() throws RemoteException {
   
            mArgs = createInstallArgs(this); // 1、
4834        if (ret == PackageManager.INSTALL_SUCCEEDED) {
   
4837        ret = mArgs.copyApk(mContainerService, true); // 2、
4838        }
      }
}

在InstallParams中主要执行两个过程:

  1. 根据Params类型创建InstallerArgs对象保存请求数据
  2. 调用InstallArgs.copyApk()方法实现复制
 private InstallArgs createInstallArgs(InstallParams params) {
   
4931        if (installOnSd(params.flags)) {
   
4932            return new SdInstallArgs(params);//复制到外部存储时使用
4933        } else {
   
4934            return new FileInstallArgs(params); // 复制到内部存储时使用,在FileInstallArgs内部调用IMediaContainerService服务执行Copy过程
    }
}

InstallArgs本身是一个抽象类,内部包含了很多属性信息,它的实现类主要有两个FileInstallArgs和SdInstallArgs,FileInstallArgs主要实现将文件复制到内部存储,而SdInstallArgs执行复制到外部文件存储,这里会创建FileInstallArgs对象,在FileInstallArgs.copy()中直接调用doCopyApk();

  • FileInstallArgs.copyApk()
int doCopyApk(IMediaContainerService imcs, boolean temp) throws RemoteException {
   
// 1、创建临时文件路径:data/app/vmd.sessionId.tmp 文件目录
final File tempDir = mInstallerService.allocateStageDirLegacy(volumeUuid, isEphemeral);
codeFile 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 JAVAPMS概述 1.1. 系统简介 JAVAPMS是JAVA门户管理系统(JAVA Portal Management System)的简称,以Sping+Hibernate+Freemarker+Html5+jQuery为技术核心架构,集系统管理、文档管理、审核工作流、基于模板的文档发布、页面静态化、内容检索、多媒体文档管理于一身,面向广大站长、软件开发者、程序爱好者、网页设计师,适用于个人站长、商业企业、政府机构、教育机构和其它各种单位组织的信息门户网站建设,是一款技术先进、安全稳定、操作友好、注重用户体验的JAVA门户管理系统,倾力打造JAVA、JSP门户管理系统品牌。 1.2. 安全高效的Java语言开发 Java是一种被广泛使用的网络编程语言,主要应用于企业、政府部门、电信、银行、手机平台开发等多个领域,是现在大型软件项目开发中的主角,长期占据《TIOBE世界编程语言排行榜》第一的宝座。随着Internet的发展,Java语言以其强大的生命力得到了越来越广泛的应用。Java语言之所以受人推崇,是因为它确实称得上是一种新一代编程语言,具有面向对象、可移植性好、与硬件无关、系统强健安全、提供了并发机制、性能高的众多优点,并提供了分布性、多线程、动态性的支持。 Java作为一种重要的开发工具,它具有七个主要特性:安全性、核心API、开放式标准、分布式和动态结构、面向对象、多线程、内存管理。 TIOBE发布的编程语言排行榜 1.3. 完善合理的技术架构 系统选用了经过java社区长时间使用,被证明稳定、可靠、安全、高性能的开源框架,包括Spring、Hibernate、Freemarker、jQuery、Shiro等框架。使用这些框架可以使软件开发更加高效、易于维护,而且具有更好的性能、更高的安全性。 1.4. 全面稳定的平台兼容性 在操作系统平台兼容性方面,系统可以在Linux、UNIX、Windows等系统上运行。客户可以根据自身情况选择自己熟悉的或正在使用的操作系统,减小维护成本。 在数据库平台兼容性方面,系统数据库持久层采用hibernate实现,使得系统可以支持几乎所有的数据库平台,包括Oracle、DB2、Microsoft SQL Server、MySQL、PostgreSQL等。这对于已经购买或熟悉某一类型数据库产品的用户非常有利,用户不必购买或维护多套不同的数据库,大幅度减低成本。 在应用服务器平台兼容性方面,系统支持跨应用服务器,如Tomcat、Weblogic、Webspere、JBoss等应用服务器,很好的满足了各层次用户的需求。 在浏览器兼容性方面,目前多种浏览器并存,使用非IE浏览器的用户越来越多,即使是IE浏览器也有多种版本。系统所有web页面制作遵循w3c标准制作,采用最新的html5规范,基于div+css布局,所有标签生成的html代码都经过跨浏览器测试。javascript脚本基于jquery和javascript标准编写,有效的解决了js跨浏览器的问题,系统可以在IE6、IE7、IE8、IE9、FireFox、Chrome、Opera、Safari浏览器下平稳运行。 1.5. 强大的中文采集与检索技术 系统支持强大的中文检索组件,可以对内容进行高效的全文检索,支持所有流行文档格式的检索,能够自动提取文本正文、生成内容摘要,能够自定义检索结果展现形式,以满足不同行业的特殊要求,构建细分领域内的垂直搜索引擎。 第2章 系统功能介绍 2.1. 系统登录 管理员对网站进行日常维护前须先进入管理后台登录页面,在输入帐号和密码后即可进入后台管理中心,如果登录信息输入错误超过三次,系统将要求输入验证码,防止恶意登录行为,加强系统安全性,登录界面如下图: 2.2. 我的工作台 2.2.1. 个人资料 在我的工作台中,管理员可以点击左侧的“个人资料”修改和完善自己的帐户信息,如真实姓名、电子邮箱、联系电话等,如下图所示: 2.2.2. 修改密码 点击我的工作台左侧的“修改密码”,可以对管理员登录密码进行修改,系统要求输入原密码,然后输入两次新密码,界面如下: 2.3. 文档中心 文档中心主要管理全站信息的发布,是系统的一个核心功能,可以对全站文档进行管理,栏目管理,模型管理,文档属性管理。 2.3.1. 文档管理 点击“文档中心”左侧功能菜单的“文档管理”,文档按所属栏目树形组织管理,点击相应的栏目将会在右边显示改栏目下的文章列表,配合多样化的文章搜索功能,可根据文档标题、文档状态(草稿、审核与否、回收站等)、文章属性(普通、图文、焦点、头条等)、进行文档搜索,文档列表界面如下所示: 添加或修改文章时,可设置文档所属栏目、标题、外部链接、副标题、标题颜色、短标题、自动T
在Android源码中,应用程序的安装是由PackageManagerService (PMS) 负责实现的。PackageManagerService是Android系统中的一个系统服务,负责管理应用程序的安装卸载、更新和权限控制等操作。 具体而言,应用程序的安装过程涉及到以下几个关键的类和组件: 1. PackageManagerService (PMS):PMS是系统服务的实现类,负责处理应用程序的安装卸载、更新等操作。它通过解析APK文件获取应用程序的信息,然后将相关信息记录在系统的包管理器中。 2. PackageInstaller:PackageInstaller是一个应用程序安装器,用于处理用户通过界面(如Google Play商店或系统文件管理器)安装应用程序的请求。它与PMS进行通信,并将安装请求传递给PMS进行处理。 3. PackageParser:PackageParser是一个APK解析器,用于解析APK文件并提取其中的信息,如应用程序的包名、版本号、权限等。PMS使用PackageParser来解析APK文件并获取相关信息。 4. PackageInstallerActivity:PackageInstallerActivity是一个系统界面组件,用于显示应用程序安装的界面。当用户通过界面触发应用程序安装时,PackageInstallerActivity会调用PackageInstaller来处理安装请求。 总结起来,应用程序的安装是由PackageManagerService负责实现的,它通过与PackageInstaller和PackageParser等组件的协作,完成解析APK文件、记录应用程序信息和处理安装请求等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值