Android---App 的安装过程

Android 系统中两个比较重要的服务 ActivityManagerService(AMS) 和 WindowManagerService(WMS),这篇文章中通过分析 apk 的安装过程,来了解 Android 中另一个比较重要的系统服务 -- PackageManagerService(PMS)

编译阶段

在分析安装过程之前,需要先了解 Android 项目是如何经过编译打包生成最终的 .apk 格式的安装包。Google 有一张官方图片来描述 apk 的打包流程。

 一个完整的项目可能包含多个 module,而每一个 module 中的内容可以分为2部分:

\bullet Resources 资源文件;

\bullet Java 或者 Kotlin 源代码。

因此整个项目的编译打包过程,也是针对这两部分来完成的。

编译 Resource 资源文件

资源文件包括项目中 res 目录下的各种 XML 文件、动画、drawable 图片、音视频等。AAPT 工具负责编译项目中的这些资源文件,所有资源文件会被编译处理。XML 文件(drawable 图片除外)会被编译成二进制文件。所以解压 apk 之后,无法直接打开 XML 文件。但是,assets 和 raw 目录下的资源并不会被编译,会被原封不动的打包到 apk 压缩包中

资源文件编译之后的产物包括两部分:

\bullet resource.arsc 文件(保存的是一个资源索引表);

\bullet R.java 文件(定义了各个资源 ID 常量)。

这两者结合就可以在代码中找到对应的资源引用。比如如下的 R.java 文件

可以看出 R.java 中的资源 id 是一个4字节的无符号整数,用16进制表示。其中最高的1字节(7f)表示 packageId,次高的一个字节(01)表示 typeId,最低的两个字节(0000)表示 entryId。

resources.arsc 相当于一个资源索引表,也可以理解为一个 map 映射表。其中,map 的 key 是 R.java 中的资源 ID,而 value 是其对应的资源所在路径。实际上 resources 描述上还有其它相关信息。关于 Resource.arsc 的解析可以参考:解析编译之后的 Resource.arsc 文件格式

编译源码部分

项目中的代码首先会通过 javac 编译为 .class 字节码文件,然后这些 .class 文件连同依赖的第三方库中的 .class 文件一同被 dx 工具优化为 .dex 文件。如果有分包,那么也可能会生成多个 .dex 文件。实际上,源代码文件也包括 AIDL 接口文件编译之后生成的 .java 文件。Android 项目中如果包含 .aidl 接口文件,这些 .aidl 文件会被编译成 .java 文件。

打包阶段

使用工具 APK Builder 将已经编译之后的 resource 和 .dex 文件一起打包到 apk 中。实际上被打包到 apk 中的还有一些其他资源。比如 AndroidManifest.xml 清单文件和第三方库中使用的动态库 .so 文件。

apk 创建好之后还不能直接使用,需要使用工具 jarsigner 对其进行签名。Android 系统不会安装没有签名的程序。签名之后会生成 META_INF 文件夹,此文件夹中保存着跟签名相关的各个文件:

\bullet CERT.SF:生成每个文件相对的密钥;

\bullet MANIFEST.MF:数字签名信息;

\bullet xxx.SF:JAR 文件的签名文件;

\bullet xxx.DSA:对输出文件的签名和公钥。

PMS 在安装过程中,会检测 apk 中的签名、证书的合法性。

按照常量,签名之后的 apk 应该是能正常安装使用了。但是,实际打包过程还会多一步 apk 优化操作。使用工具 zipalign 对 apk 中的未压缩资源(图片、视频)等进行对齐操作。让资源按照 4 字节的边界进行对齐,这种思想主要是为了加快资源的访问速度。如果每个资源的开始位置都是上一个资源之后的 4*n 字节,那么访问下一个资源就不用再遍历,直接跳到 4*n 字节处判断是不是一个新的资源即可。

至此,一个完整 apk 安装包就创建成功。一个完整 apk 解压缩之后内容,如下图所示

整个编译打包流程可以用下图来描述

PMS 将 apk 安装到手机设置

PMS 安装过程概览

当点击某一个 App 安装包进行安装时,首先会弹出一个系统界面指示我们进行安装操作,这个界面是 Android Framework 中预置的一个 Activity--PackageInstallerActivity.java。当点击安装后,PackageInstallerActivity 最终会将所安装的 apk 信息,通过 PackageInstallerSession 传给 PMS。

具体方法在 commitLocked() 方法中,如下代码所示

图中的 mPm 就是系统服务 PackageManagerService。installStage 方法就是正式开始 apk 的安装过程。整个 apk 的安装过程可以分为两大步:1)拷贝安装包;2)装载代码

拷贝安装包

从 installStage 方法开始看起,代码如下

图中1处创建了类型为 INIT_COPY的 message;图中2处创建了 InstallParams,并传入安装包的相关数据。

message 发送出去之后,由 PMS 的内部类 PackageHandler 接收并处理,如下代码所示

图中1处从 message 中取出 HandlerParams 对象;图中2处调用 connectToService() 方法连接安装 apk 的 service 服务。

PackageHandler 的 connectToService 方法

通过隐私 Intent 方法绑定 Service。实际绑定的 Service 类型是 DefaultContainerService 类型

当绑定 Service 成功之后,会在 onServiceConnected 方法中发送一个绑定操作的 message,如下所示

MCS_BOUND message 的接收者还是 PackageHandler,具体如下

mPendingInstall 是一个等待队列,里面保存所有需要安装 apk 解析出来的 handlerParams 参数。从 mPendingInstalls 中取出第一个需要安装的 HandlerParams 对象,并调用其 startCopy() 方法。在 startCopy() 方法中,继续调用一个抽象方法 handlerStartCopy() 处理安装请求。

通过之前的分析,我们知道 HandlerParams 实际类型是 InstallParams。因此,最终调用的是 InstallParams 的 handlerStartCopy 方法。

InstallParams 的 handlerStartCopy 方法

这个方法是整个安装包拷贝的核心方法。具体如下

图中1处设置安装标志位,决定是安装在手机内部存储空间还是 SD卡当中。图中2处判断 apk 安装位置,如果安装位置合法,则执行图中3处逻辑,创建一个 InstallArgs。实际上是其子类 FileInstallArgs 类型。然后调用其 copyApk() 方法进行安装包的拷贝工作。

FileInstallArgs 的 copyApk 方法

从图中可以看出,copyApk() 方法调用了 doCopyApk() 方法。doCopyApk 方法中主要做了3件事情。

图中1处创建存储安装包的目标路径,实际上是 dateApp应用包名目录;图中2处调用服务的 copyPackage 方法,将安装包 apk 拷贝到目标路径下;图中3处将 apk 中的动态库 so 文件也拷贝到目标路径中。

上图中的 IMediaContainerService 实际上就是在开始阶段进行连接操作的 DefaultContainerService 对象。其内部 copyPackage() 方法本质上就是执行 io 流操作,具体如下

最终,安装包在 dataApp 目录下以 base.apk 的方法保存。

至此,安装包的拷贝工作就已经完成。

装载代码

代码拷贝结束之后,就开始进入真正的安装步骤。代码回到上述的 HandleParams 的 startCopy 方法。

可以看出当安装包拷贝结束之后,继续调用 handleReturnCode() 方法来处理返回结果。最终调用 processPendingInstall() 方法处理安装过程,代码如下

图中1处执行预安装的操作,主要是检查安装包的状态,确保安装环境正常。如果安装环境有问题,则会清理拷贝文件;图中2处,是真正的安装阶段。installPackageTraceLI 方法中添加跟踪 trace,然后调用 installPackageLI 方法进行安装。图中3处处理安装完成之后的操作。installPackageLI 是 apk 安装阶段的核心代码

图中1处,调用 PackageParser 的 parsePackage 方法解析 apk 文件。主要是解析 AndroidManifest.xml 清单文件。将结果记录在 PackageParser.package 中。我们在清单文件中声明了 Activity、Service 等组件,就是在这一步被记录到 framework 中。后续它可以通过 startActivity 或 startService 启动相应的活动或者服务;图中2处对 apk 中的签名信息进行验证操作。collectCertificates 做签名验证,collectManifestDigest 主要做包的项目清单摘要的收集。主要是用来两个包是否一样,如果我们的设备上已经安装了一个 debug 版本的 apk,再次使用一个 release 版本的 apk 进行安装覆盖,会在这一步验证失败,会最终导致安装失败。图中3处执行 Dex 优化。图中4处调用 installNewPackageLI 方法,执行新 apk 的安装操作。

installNewPackageLI 方法,负责完成最后的 apk 安装过程。具体代码如下

scanPackageLI 继续扫描解析 apk 安装包文件,保存 apk 相关信息到 PMS 中,并创建 apk 的 data 目录,具体路径为datadata 应用包名。deletePackageLI 如果安装失败,则将安装包已经各种缓存文件删除。

至此,整个 apk 的安装过程结束。

安装成功之后,还会发送一个 App 安装成功的广播 ACTION_PACKAGE_ADDED。手机桌面应用注册了这个广播,当接收到应用安装成功之后,就将 apk 的启动 icon 显示在桌面上。

总结

主要介绍了一个 Android 项目从编译成 apk 文件,然后被安装到手机设备上的简要过程。编译分为:资源 + 源代码

生成 apk 之后还要经过签名、对齐等操作

apk 安装分2块进行:安装包拷贝代码装载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/182398.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu无网络连接,没有网络标识,快速解决方法

在这里插入代码片当我们装虚拟机的时候,需要用到网络时发现没有网络连接,且右上角没有网络标识符,这时只需要简单的输入一下三个命令即可 sudo nmcli networking offsudo nmcli networking onsudo service network-manager restart然后重启客…

windows环境下安装Java过程(免登录Oracle官网下载java)

下载路径 oracle官网: java下载路径 Oracle共享账号可下载JDK: 指路 安装流程 执行下载后的jdk的可执行文件一路next下去, 可以自定义安装路径添加环境变量, 两个地方需要添加 在cmd中输入java -version 进行验证,…

在线实用计算工具大全

在线实用计算工具大全 在线计算工具的实用,可以有效提高学习或工作效率,本博文介绍一个在线的实用计算工具大全(https://tool.520101.com),作为一种辅助学习工具。 1. 在线排列组合计算 https://tool.520101.com/cal…

ts和js的区别?

文章目录 前言是什么?二、特性三、区别后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Typescript 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现…

酷开科技 | 酷开系统里萌萌哒小维在等你!

在一片金黄淡绿的颜色中,深秋的脚步更近了,在这个气候微凉的季节里,你是不是更想拥有一种温暖的陪伴呢?酷开科技智慧AI语音功能更懂你,贴心的小维用心陪伴你的每一天。 01.全天候陪伴 在酷开系统中,只要你…

vue3中router和route的区别(使用场景)

1.router router是用来对路由进行操作的; 多用于路由跳转、路由守卫、页面刷新、给路由文件添加路由路径或者移除路由路径等等 2.route route是用来获取路由信息的; 多用于获取路由路径、路由传参数据、路由文件配置的属性信息等等

链表(1)

目录 单链表 主函数test.c test1 test2 test3 test4 头文件&函数声明SList.h 函数实现SList.c 打印SLPrint 创建节点CreateNode 尾插SLPushBack 头插SLPushFront 头删SLPopBck 尾删SLPopFront 易错点 本篇开始链表学习。今天主要是单链表&OJ题目。 单链…

如何本地搭建SeaFile私有云盘并实现远程连接

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 现在我们身边的只能设备越来越多&#xff0c…

高校为什么需要大数据挖掘平台?

目前数据挖掘已经成为各种应用领域的重要技术,大学数据挖掘课程的开放已经出现。数据挖掘课程整合了多门学科知识。该课程包括各种理论知识,也离不开相关的实用技术。整个教学过程是培养和提高学生全面创新和解决问题的能力。过去,教学过程理…

uniapp 微信小程序 uni-file-picker上传图片报错 chooseAndUploadFile

这个问题真的很搞, 原因是微信开发者工具更新了,导致图片上传问题。 解决方法: 将微信开发者工具的基础库改为2.33.0一下即可。 在微信开发者工具详情 - 本地设置中(记得点击‘推送’按钮):

中国多主数据库:压强投入,期待破茧

拿破仑曾说:“战争的艺术就是在某一点上集中最大优势兵力”,强调了力量集中的重要性。 如今,国际形势风云变幻,西方世界对中国的围剿不再仅仅体现在军事和地缘政治上,而更多表现在经济与科技上。在科技领域&#xff0…

2-爬虫-代理池搭建、代理池使用(搭建django后端测试)、爬取某视频网站、爬取某视频网站、bs4介绍和遍历文档树

1 代理池搭建 2 代理池使用 2.1 搭建django后端测试 3 爬取某视频网站 4爬取某视频网站 5 bs4介绍和遍历文档树 1 代理池搭建 # ip代理-每个设备都会有自己的IP地址-电脑有ip地址---》访问一个网站---》访问太频繁---》封ip-收费:靠谱稳定--提供api-免费&#xff…

x264交叉编译(ubuntu+arm)

1.下载源码 https://code.videolan.org/videolan/x264 在windows下解压;复制到ubuntu; 2.进入源码文件夹-新建脚本文件 touch sp_run.sh 3.在sp_run.sh文件中输入 #!/bin/sh./configure --prefix/home/alientek/sp_test/x264/sp_install --enable-…

Android工具栏ToolBar

主流APP除了底部有一排标签栏外,通常顶部还有一排导航栏。在Android5.0之前,这个顶部导航栏以ActionBar控件的形式出现,但AcionBar存在不灵活、难以扩展等毛病,所以Android5.0之后推出了ToolBar工具栏控件,意在取代Aci…

Docker基础(简单易懂)

目录 一、docker是什么 核心概念 二、docker安装 1、卸载docker 2、使用yum 安装 三、docker常用命令 1、帮助命令 2、镜像命令 1)查看镜像 2)查询镜像 3)拉取镜像 4)删除镜像 3、容器命令 四、容器数据卷 五、Dock…

解决美颜SDK集成:技术最佳实践和故障排除

美颜SDK已成为许多应用的核心功能,因为它可以增强用户体验,提高图像质量,吸引更多的用户。然而,集成美颜SDK并不总是一帆风顺。本文将为您介绍一些关键的技术最佳实践,以及如何排除集成过程中可能遇到的故障。 一、技…

快速实现一个企业级域名 SSL 证书有效期监控巡检系统

Why 现在对于企业来说,HTTPS 已经不是可选项,已经成为一个必选项。HTTPS 协议采用 SSL 协议,采用公开密钥的技术,提供了一套 TCP/IP 传输层数据加密的机制。SSL 证书是一种遵守 SSL 协议的服务器数字证书,一般是由权威…

antv/x6 自定义html节点并且支持动态更新节点内容

antv/x6 自定义html节点 效果图定义一个连接桩公共方法注册图形节点创建html节点动态更新节点内容 效果图 定义一个连接桩公共方法 const ports {groups: {top: {position: top,attrs: {circle: {r: 4,magnet: true,stroke: #cf1322,strokeWidth: 1,fill: #fff,style: {visib…

2023下半年软考系统集成项目管理工程师上午真题及答案解析

1.( C )不属于风险识别的信息收集技术。 A.头脑风暴 B.德尔菲技术 C.排除法 D.根本原因分析 解析: 2.( C )不是SaaS(软件即服务)的特点。 A.由供应商管理软件更新和安全 B.无需购买软件 C.需要自行安装和维护软件 D.按需付费 解析: 3.…

LiveMeida视频接入网关

一、产品简介 视频接入网关主要部署在视频存储节点或视频汇聚节点,面向不同用户,主要用于对接不同厂家、不同型号的摄像机设备,获取摄像机视频后,以统一标准的视频格式和传输协议,将视频推送至上层联网/应用平台。可广…