apk安装相关

 apk安装流程

参考:APK安装流程

点击安装的话,简单来说分为四步:

  • 1)将APK的信息通过IO流的形式写入到PackageInstaller.Session中(内存上的拷贝)。

  • 2)调用PackageInstaller.Session的commit方法,将APK的信息交由PKMS处理。

  • 3)拷贝APK(在在handleReturnCode中的mArgs.copyApk(调用doCopyApk)中去拷贝apk里面的文件和so等)

  • 4)最后进行安装(processPendingInstall做真正的安装(installPackagesTracedLI去解析apk,安装、校验等))

最后的installPackagesTracedLI安装过程分四个阶段:

  1. 准备,分析当前安装状态,解析包 并初始校验: 在 preparePackageLI() 内使用 PackageParser2.parsePackage() 解析AndroidManifest.xml,获取四大组件等信息;使用ParsingPackageUtils.getSigningDetails() 解析签名信息;重命名包最终路径 等。

  2. 扫描,根据准备阶段解析的包信息上下文 进一步解析: 确认包名真实;根据解析出的信息校验包有效性(是否有签名信息等);搜集apk信息——PackageSetting、apk的静态库/动态库信息等。

  3. 核对,验证扫描后的包信息,确保安装成功:主要就是覆盖安装的签名匹配验证。

  4. 提交,在commitPackagesLocked函数中提交扫描的包、更新系统状态:添加 PackageSetting 到 PMS 的 mSettings、添加 AndroidPackage 到 PMS 的 mPackages 、添加 秘钥集 到系统、应用的权限添加到 mPermissionManager、四大组件信息添加到 mComponentResolver 。这是唯一可以修改系统状态的地方,并且要对所有可预测的错误进行检测。

apk拷贝:PackageManagerService.installStage---doHandleMessage---startCopy(handleStartCopy(含检验apk完整性)与handleReturnCode(里面调用processPendingInstall进行真正安装))---copyApk---doCopyApk
apk安装:processPendingInstall---processInstallRequestsAsync---installPackagesTracedLI---installPackagesLI

installd: 真正的安装命令是由该进程处理。
路径:frameworks/native/cmds/installd/installd.cpp

POST_INSTALL:消息处理中会发送安装完成的广播;
installPackageWithVerification 检查权限等,

普通应用App安装目录

1、 /data/app:用户App程序安装的目录。安装时Apk会被拷贝至此目录

2.1.2 dex、odex保存目录:

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

2.1.3 用户数据目录:

/data/data:存放应用程序的数据,无论是系统App还是普通App,App产生的用户数据都存放在/data/data/包名/目录下。

2.1.4 App注册表目录

/data/system :该目录下几个比较重要的文件是:

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

这个文件在PKMS的启动过程中会被映射成为PKMS中的Settings数据结构,并且在后续的PKMS启动中会围绕着该数据结构进行频繁的操作。

对于一个完整的APK,Android称其为Monolithic;对于拆分后的APK,Android称其为Cluster。

出现这个错误的原因是在导入seaborn包时,无法从typing模块中导入名为'Protocol'的对象。 解决这个问题的方法有以下几种: 1. 检查你的Python版本是否符合seaborn包的要求,如果不符合,尝试更新Python版本。 2. 检查你的环境中是否安装了typing_extensions包,如果没有安装,可以使用以下命令安装:pip install typing_extensions。 3. 如果你使用的是Python 3.8版本以下的版本,你可以尝试使用typing_extensions包来代替typing模块来解决该问题。 4. 检查你的代码是否正确导入了seaborn包,并且没有其他导入错误。 5. 如果以上方法都无法解决问题,可以尝试在你的代码中使用其他的可替代包或者更新seaborn包的版本来解决该问题。 总结: 出现ImportError: cannot import name 'Protocol' from 'typing'错误的原因可能是由于Python版本不兼容、缺少typing_extensions包或者导入错误等原因造成的。可以根据具体情况尝试上述方法来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ImportError: cannot import name ‘Literal‘ from ‘typing‘ (D:\Anaconda\envs\tensorflow\lib\typing....](https://blog.youkuaiyun.com/yuhaix/article/details/124528628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值