当前位置:首页 > 3EDD9C 2019年11月24日
如果你想了解APK的安装原理,你不能逃避这个知识。

原标题:你不能逃避了解APK的安装原理。

这篇文章是从郭林(身份证:郭林生物)和授权的平台。

/作者简介/

本文来自MQ的贡献,分享了他对APK安装原则的个人理解。我相信这对每个人都有帮助!同时,我也感谢作者精彩的文章。

这篇文章有点长,请耐心阅读!

MxsQ的博客地址:

https://www.jianshu.com/u/9cf1f31e1d09

https://www.jianshu.com/u/9cf1f31e1d09

/背景/

你知道APK有多有钱吗?你知道APK的具体安装原理吗?当你借此机会查找各种数据时,你会发现它们是不同的,你不能抓住核心部分,你找不到原因,你很容易陷入萌芽状态。

如果你仔细考虑一下,在工作日你可以接触到四种APK安装场景。对于每一种情况,都有不同的应对策略,这就是现有数据不同的原因。场景如下

因此,本文有两个目的:

1.了解APK的核心安装原则

2.理解应对过程的原理,以达到每个场景下的核心安装状态

/运行APP的条件/

当所有系统环境都准备好并且安装了APK时,运行该应用程序的要求是什么?可以用启动过程的活动来窥见一点,可以简单地描述为以下过程:

展开全文

1.AMS从项目管理系统获取要启动的活动的启动信息

2.AMS需要确认该活动运行的进程是否启动,否则需要请求受精卵孵化。

3.以上两个过程是正常的,并且活动启动过程被执行。

事实上,PMS装载APK主要完成三件事:

1.分析AndroidManifest.xml,获取组成该应用程序的组件的信息,并获取启动信。

2.为每个应用程序分配UID和GID,以创建该应用程序运行的进程。这涉及安卓沙盒模型,可以理解为应用程序资源归属问题的解决方案。

3.更新应用程序权限

因此,所有不同的APK安装场景都需要在完成必要的准备工作后完成上述三件事。这是一个所有道路都通向同一目的地的过程。让我们先谈谈回到同一个地方,然后继续到达不同的道路。

注意:本文的源代码版本是8.0。

一起回来

首先了解包类:

从APK解析的信息将存储在包中。应该注意的是,代码路径区分分包,即在5.0之后,为了解决65536问题,APK分为多个APK政策。以及活动、服务、提供商等。不是日常生活中使用的相应组件,而是存储相应组件信息的信息聚合类,大致如下:

publicatalStaticClassActivityExtendscomponent & lt;活动潜在信息>;可实现

第一步是解析AndroidManifest.xml

第一件事是解析AndroidManifest.xml并直接定位PackageParser.parsePackage

安卓系统中有各种各样的包,如APK、Jar等,它们以静态文件的形式存在,需要包管理。但是,包管理是在内存中执行的,因此需要PackageParser将各种包转换成内存中的数据结构。

对于是否使用分包策略,上述代码片段if是不同的执行路径,但都通过此调用路径:

parseBaseApk

parseBaseApk

parseBaseApkCommon

parseBaseApk

parseBaseApk

parseBaseApkCommon

上述XmlResourceParser逐步分析了AndroidManifest.xml文件中清单节点的字节点信息,例如,parseBaseapplication解析应用节点信息,解析后的数据存储在pkg中。包含的具体信息大致如下:

information.png机器人清单节点

xml特定解析的细节不再深入。执行parseBaseApkCommon后,可以获得的最关键的信息是应用程序节点下每个组件应用程序的组件信息,而uid、GID、GIDS共享在use-permission和manifest下获得的UID信息,这将决定可以访问的资源。

第二步是分配流程的UID

Scanpackagedirtyli。

上面的代码有两个类要做一个简单的理解:

设置:存储各种重要的动态配置信息或索引,如包信息索引、package.xml文件(稍后讨论)、UID信息集等。

包设置:存储APK包解析的信息,包括第一步解析的数据结构包信息,可以通过pkgName从设置中找到包设置

设置:存储各种重要的动态配置信息或索引,如包信息索引、package.xml文件(稍后讨论)、UID信息集等。

包设置:存储APK包解析的信息,包括第一步解析的数据结构包信息,可以通过pkgName从设置中找到包设置

整个代码实际上完成了三件事:

1.为pkg和更新包设置描述的应用程序分配UID,因为APK安装涉及新应用程序安装、旧版本更新和共享用户ID场景。如果是新版本,准备一个新的包设置并分配UID;更新旧版本时,更新包设置,已分配UID在共享用户id的情况下,需要考虑程序包设置的可用性。

2.将pkg指向的数据包保存到PMS

3.将pkg描述的四个组件保存到PMS,以便AMS访问

接下来,将只跟踪分配的UID。

请参见设置

一般来说,应用程序在最后一个应用程序UID-第一个应用程序UID之间分配UID,小于最后一个应用程序UID的UID由特权用户使用,并且可以由应用程序以共享方式使用。安装应用程序后,uid保持不变,可以通过adb命令查看:

adb shell ps | grap packageName

权限更新

APP需要在运行期间持续访问系统资源并使用资源。在第一步解析AndroidManifest.xml时,在use-permission和permission节点下应用的权限已被记录但尚未授权,权限状态需要更新。

常见权限,如网络权限、文件读写权限等。;危险的权限包括位置权限、相机权限等。,以及自定义权限。Grantpermissionslpw。

权限文件位于/system/etc/permissions/platform . XML中,而权限标识存储在PMS . ms setting . mpeMissions中。默认的全局可访问权限位于mGlobalGids中,如果您感兴趣,您可以自己查看这些权限。有三种类型的权限级别:

保护正常:安装应用程序时,无需用户操作,任何应用程序都可以申请和授权。

任何应用程序都可以申请,安装应用程序时需要授权,并且需要用户操作

保护签名:此权限只能由声称授权的apk使用相同私钥签名的应用程序来申请。

保护正常:安装应用程序时,无需用户操作,任何应用程序都可以申请和授权。

任何应用程序都可以申请,安装应用程序时需要授权,并且需要用户操作

保护签名:此权限只能由声称授权的apk使用相同私钥签名的应用程序来申请。

不同的授权级别要求根据系统条件设置不同的授权策略。授权策略有四种类型:

授权安装:在安装过程中授权,不需要用户操作

GRANT_RUNTIME:运行时授权,在6.0之后添加动态权限应用程序,需要用户操作

GRANT_UPGRADE:在安装过程中提示用户进行授权,并要求用户采取行动

授权_拒绝:未授权

授权安装:在安装过程中授权,不需要用户操作

GRANT_RUNTIME:运行时授权,在6.0之后添加动态权限应用程序,需要用户操作

GRANT_UPGRADE:在安装过程中提示用户进行授权,并要求用户采取行动

授权_拒绝:未授权

上述代码可以简单描述为根据应用的级别和系统状态确认授权策略。当然,在知道授权策略之后,记录将被更新。在上面的代码切换(授予),权限状态。将调用更新权限标志来更新记录,这里不执行扩展。

摘要

APK安装的核心步骤是:

1.分析来自安卓清单的应用程序信息、组件信息和权限信息

2.为应用程序分配UID,并让PMS记录组件信息,这在AMS启动四个组件时是必需的

3.更新应用程序权限信息并授权应用程序资源访问

如果你只对APK安装的核心部分感兴趣,你可以看到它已经结束了。

每条路都有自己的路。

目前,APK安装的核心步骤分散,缺乏控制逻辑。然而,以下文章的长度是跟踪和解释各种APK安装场景,以了解在核心步骤中经历了什么过程。场景的顺序是系统启动安装、第三方应用程序安装、ABD安装和市场安装。每个场景都可以被看作是一个独立的章节。

系统启动安装

当系统进程启动时,它初始化各种环境参数,并在系统运行时启动各种辅助功能。启动引导服务时,激活PMS.main以创建PMS并在服务管理器中注册。

每次系统启动时,都会重新安装所有应用程序。有四种类型的应用程序存储在不同的文件夹中:

/data/app-private:受DRM保护的程序

/system/app-private:系统自己的程序

/供应商/应用程序:手机制造商自己的程序

/data/app:用户安装的程序

/data/app-private:受DRM保护的程序

/system/app-private:系统自己的程序

/供应商/应用程序:手机制造商自己的程序

/data/app:用户安装的程序

While /system/framework是一个资源应用程序,用于打包资源文件,不包含执行代码。

如前所述,分配给每个用户安装的应用程序的UID不变,因此系统可以通过/data /data/system/package.xml包. xml文件存储上次安装的应用程序的信息,包括应用程序的UID。因此,解析完package.xml信息后,每个应用程序的UID都可以应用到系统中进行分配。

然后,在获得各种程序的文件夹后,通过scanDirTracedLI安装它们,然后触发grantPermissionsLPw通过updatePermissionsLPw更新所有应用程序权限。最后,编写并保存最新的数据包。在这里,APK安装的所有核心步骤都是串联的。

解析package.xml文件

Xml文件格式如图所示:

对关键节点角色的实际理解可以给出程序如何被解析的概述。

包节点:描述应用程序的安装信息。例如,子节点名有一个包名,子节点Perms有应用权限,其节点属性userId是密钥UID。有关具体的分析步骤,请参见设置. readLPw和设置. readPackageLPw。

共享用户节点:关于共享应用程序的信息。可以在包节点中解析共享用户标识信息(与用户标识互斥)。出现这种情况时,进程id分配操作将暂停。解析共享用户节点时,将在分配前验证共享用户id的有效性。设置。readlpw。readshareduserlpw将详细说明。

包节点:描述应用程序的安装信息。例如,子节点名有一个包名,子节点Perms有应用权限,其节点属性userId是密钥UID。有关具体的分析步骤,请参见设置. readLPw和设置. readPackageLPw。

共享用户节点:关于共享应用程序的信息。可以在包节点中解析共享用户标识信息(与用户标识互斥)。出现这种情况时,进程id分配操作将暂停。解析共享用户节点时,将在分配前验证共享用户id的有效性。设置。readlpw。readshareduserlpw将详细说明。

解析包节点时,解析用户标识后,通过设置. addPackageLPw和设置. addUserIdLPw为系统分配UID,可以获得描述应用信息的包设置。

软件包. xml文件保存

请参见设置

除了根据规则生成xml之外,还会备份package.xml的存储。备份文件路径是/data/system/package-backup . XML。备份文件是防止package.xml在写入过程中意外中断的安全措施。

斯堪的纳维亚跟踪我

分析和安装各种类型的应用程序更容易理解。目前,我们有控制器,所以我们将安装文件一个接一个地分开进行安装。参见PMS.scanDirTracedLI和scanDirLI。

第三方应用程序安装

第三方应用程序要求PMS向打包处理程序发送信息以驱动安装,请参见PMS . package handler . dohandlemessage。

上面的逻辑是这样的。

INIT_COPY

handler参数包含安装APK所需的参数。收到INIT_COPY消息后,它将与DefaultContainerService连接。默认容器服务(DefaultContainerService)负责处理文件检查和复制等耗时的操作,并且运行在与PMS不同的进程中。与默认容器服务(DefaultContainerServices)链接后,PMS获得活页夹,活页夹可转换为即时容器服务(AIDL),并可用于与默认容器服务通信。如果建立了链接,请将HandlerParams添加到安装任务队列中。有关连接操作,请参见package handler . connectoseservice。

注意,连接成功后,MCS _ BOUND信号被发送到PackageHandler,imcs被作为参数对象。

MCS _ BOND

接收这个信号有两种可能。一个是与默认容器服务建立连接并接收AIDL;在这里交流。两者都接收安装请求。

当接收到安装请求时,如果mContainerService不为空,但mBound标志位设置不正确,则出现异常,安装请求队列被清空。如果一切正常,将安装请求句柄参数添加到请求队列中,并将位置0的参数取出到startCopy。处理后,从请求队列中删除HandlerParams。如果队列仍然有任务,发送MCS _ BOUND信息号继续执行下一个任务,否则发送MCS_UNBIND信号解析服务。

开始复制

HandlerParams是一个抽象类。子类需要实现以下三种方法。

当作为包安装被请求时,实际的类是InstallParams。

handler params . start copy

HandlerParams的实际操作步骤如下:

1.检查安装尝试的次数。如果超过限制,放弃安装请求,发送MCS _ GIVE _ UP信号,并调用handleServiceError。

2.调用子类handleStartCopy来处理特定的安装

3.调用子类句柄返回代码来处理安装结果

复制APK·

请参见安装参数. handleStartCopy

APK的安装位置需要确认,不同的安装位置需要建造不同的安装设备。InstallArgs子类包括MoveInstallArgs、AsecInstallArgs、FileInstallArgs。最后,绑定器允许DefaultContainerService将apk复制到相应的位置,而无需跟踪特定的复制过程。

复制apk后,结果由InstallParams处理。请参见安装参数。handlestartCopyHandlereturncode和processPendingInstall安装。

直接跟进安装软件包跟踪和安装软件包。

这将触发核心安装过程。

第三方安装概述

永磁同步电机驱动APK的安装如图所示:

通过INIT_COPY信号与DefaultContainerService连接,获取连接成功后可转换为IMediaContainerService的绑定器,并发送MCS _ BOUND信号

通过MCS _ BOUND信号接收即时通讯服务(AIDL)

通过INIT_COPY接收句柄参数请求数据并加入请求队列

句柄参数请求通过新的MCS _ BOUND模型进行处理,适当的APK路径通过开始拷贝(startCopy)获得,拷贝通过默认容器服务(DefaultContainerService)进行,最后通过句柄返回代码触发核心安装逻辑。

通过INIT_COPY信号与DefaultContainerService连接,获取连接成功后可转换为IMediaContainerService的绑定器,并发送MCS _ BOUND信号

通过MCS _ BOUND信号接收即时通讯服务(AIDL)

通过INIT_COPY接收句柄参数请求数据并加入请求队列

句柄参数请求通过新的MCS _ BOUND模型进行处理,适当的APK路径通过开始拷贝(startCopy)获得,拷贝通过默认容器服务(DefaultContainerService)进行,最后通过句柄返回代码触发核心安装逻辑。

第三方安装交互流程(是否跳过此部分并不重要)

如前所述,第三方安装涉及安装页面和与用户的交互,但是到目前为止还没有提到这样的信息。原因是驱动安装基本上需要永磁同步电机。安装页面和用户交互是为了解决如何获取安装数据并向项目管理系统发送安装请求。这里有一个简单的解释。

系统有内置的应用软件包安装程序来处理APK的安装和卸载。软件包安装程序涵盖的页面分别是安装开始、安装阶段、软件包安装活动和安装安装。

对于7.0以下的版本,可以通过文件:// Uri的意图启动安装启动。

但是,在7.0之后,禁止将文件:// Uri公开给其他程序,因此需要文件提供程序来解决它。

OnCreate通过不同的协议启动安装转移或打包安装活动。但是处理逻辑在打包安装活动中。安装阶段(InstallStaging)是在7.0之后处理场景。安装分段。暂存asyncatask将内容协议的Uri转换为文件协议,并跳转到PackageInstallerActivity。

在处理pkgUri、验证安装权限并与用户交互以获得用户同意安装的操作之后,PackageInstallerActivity开始安装。

安装安装将通过软件包安装程序与项目管理系统进行会话。会话,调用会话.提交,最后触发安装阶段.安装阶段发送初始化_复制信号来执行PMS驱动的APK安装过程。

亚行安装

[/s2/]通过亚行[指挥部/s2/]

adb安装程序包路径

APK可以安装在手机上。首先,我们需要对预防性维护有一个简单的了解。PM全名是包管理器,是包管理工具。项目管理可用于执行应用程序的安装,并查询应用程序包、系统权限、控制应用程序等的信息。项目经理收到的各种操作命令大多是通过项目经理完成的。首相将收到上述ABD命令。见下午。快跑

钥匙编码不多,而且是一次性发布的。预防性维护和预防性维护在不同的过程中运行。需要IPC,这是在软件包安装程序的帮助下进行的。会话,调用提交。下图显示了这种关系。

不会粘贴形成上图的模板代码。请访问。Mhandler发送MSG_COMMIT信号。pacakgeinstallersion . mhandlercallback执行commitLocked。

INIT_COPY信号在PMS.installStage中发送,以便将安装请求排队。因此,永磁同步电机也用于驱动APK装置。

集市安装

市场的安装相对简单。下载APK后,市场应用程序将与PMS进行对话,并调用PMS.installPackageAsUser

还会发送INIT_COPY,这是通过PMS驱动的APK安装来执行的。

/摘要/

通过以上分析,实际上,真正的APK安装方法主要有两种。第一个是系统启动安装,第二个是永磁同步电机驱动安装。敲黑板,做一个总结。

APK核心安装步骤

应用程序信息、每个组件信息和权限信息都是从安卓清单(AndroidManifest)中分析出来的,代码索引是包解析器(Package Parser)。ParsebaseAPKCOMMON

将UID分配给应用程序,并让PMS用代码索引记录组件信息

更新应用程序权限信息,授权应用程序资源访问,代码索引为PMS.grantPermissionsLPw

应用程序信息、每个组件信息和权限信息都是从安卓清单(AndroidManifest)中分析出来的,代码索引是包解析器(Package Parser)。ParsebaseAPKCOMMON

将UID分配给应用程序,并让PMS用代码索引记录组件信息

更新应用程序权限信息,授权应用程序资源访问,代码索引为PMS.grantPermissionsLPw

系统启动时的安装

程序代码的起点是PMS。打包管理服务

获取应用程序文件夹、系统/框架、/数据/应用程序、数据/应用程序-私有、/系统/应用程序、/供应商/应用程序

根据pacakge.xml文件,恢复最后保存的应用程序信息,并为应用程序分配UID。请参见设置。代码的ReadLPw

一步一步扫描文件夹来定位和安装每个APK

更新所有应用程序权限

获取应用程序文件夹、系统/框架、/数据/应用程序、数据/应用程序-私有、/系统/应用程序、/供应商/应用程序

根据pacakge.xml文件,恢复最后保存的应用程序信息,并为应用程序分配UID。请参见设置。代码的ReadLPw

一步一步扫描文件夹来定位和安装每个APK

更新所有应用程序权限

永磁同步电机驱动装置

通过INIT_COPY信号与默认容器服务连接,并在成功连接后发送MCS _ BOUND信号

通过MCS _ BOUND信号接收活页夹,并将其转换为AILD接口(即时通信服务)

通过INIT_COPY接收句柄参数请求数据并加入请求队列

句柄参数请求由MCS _ BOUND信号处理,适当的APK路径由startCopy获得,复制由DefaultContainerService执行,最后核心安装逻辑由句柄返回代码触发。

通过INIT_COPY信号与默认容器服务连接,并在成功连接后发送MCS _ BOUND信号

通过MCS _ BOUND信号接收活页夹,并将其转换为AILD接口(即时通信服务)

通过INIT_COPY接收句柄参数请求数据并加入请求队列

句柄参数请求通过MCS _ BOUND信号处理,通过开始拷贝获得合适的APK路径,通过默认容器服务进行拷贝,最后通过句柄返回代码触发核心安装逻辑返回搜狐查看更多

负责任的编辑:


发表评论: