chenlijunfan / IndirectAmbition

间接性踌躇满志
0 stars 0 forks source link

2019-08-06 简单谈谈Apk安装 #11

Open chenlijunfan opened 5 years ago

chenlijunfan commented 5 years ago
  1. 系统启动时Launcher安装2.各大Market安装3.下载安装(手动触发)4.ADB安装
  • Activity的启动过程 1.AMS从PMS获取要启动的Activity的启动信息 2.AMS需要确认此Activity所需要的进城有没有启动,没有则需要请求Zygote孵化 3.以上过程正常,执行Activity启动流程
  • PMS加载APK主要完成三件事 1.解析AndroidManifest.xml,拿到构成此app的各组件的信息,以及启动信息 2.为每个app分配UID,GID,以此创建App运行的进城,这涉及到Android的沙箱模型,可以理解为应用程序资源归属问题的解决 3.更新应用程序权限
  • 1.解析AndroidManifest.xml 通过XmlResourceParser逐步解析AndroidManifest.xml文件中Manifest节点信息 image

  • 2.分配进城UID 1).为pkg所描述的应用程序分配UID,并更新PackageSetting,因为APK的安装涉及到新应用的安装、旧版本更新以及share user id场景。新版本情况下,需要准备新的PackageSetting并分配UID;旧版本更新情况下,更新PackageSetting,UID已做过分配;share user id情况下考虑PackageSetting的可用性 2).将pkg所指向的Package保存到PMS 3).将pkg描述的四大组件保存到PMS,以供AMS访问

  • 3.权限更新 权限文件位于/system/etc/permissions/platform.xml,而权限ID保存在PMS.mSetting.mPerssions中,默认全局可访问的权限在mGlobalGids中 image

  • 4.核心步骤 1).从AndroidManifest中解析出应用信息、各组件信息、权限信息 2).为应用程序分配UID,并让PMS记录个组件信息,AMS启动四大组件时,需要这些信息 3).更新应用程序权限信息,授权应用程序资源访问权

  • PMS驱动APK安装可以用上图表示: 1.通过INIT_COPY信号与DefaultContainerService进行连接,连接成功后拿到可转为IMediaContainerService的Binder,发送MCS_BOUND信号 2.通过MCS_BOUND信号接收IMediaContainerService(AIDL) 3.通过INIT_COPY接收HandlerParams请求数据,加入请求队列 4.通过MCS_BOUND新型号处理HandlerParams请求,通过startCopy()拿到合适的APK路径,通过DefaultContainerService进行复制,最后通过handleReturnCode()最终触发核心安装逻辑

注意:在7.0以下的版本能通过file:// Uri的 intent启动InstallStart。但在7.0之后禁止将file:// Uri暴露给其它程序,因此需要FileProvider来解决。