美文网首页
Android App安装以及启动流程

Android App安装以及启动流程

作者: arvinljw | 来源:发表于2019-10-24 11:10 被阅读0次

App 安装

Android App的安装可以分为有界面的安装和无界面的安装。

有界面的安装其实就是调用系统App(PackageInstaller)去安装apk,打开安装apk应用之后,点击安装按钮执行startInstall方法,然后就进入安装中界面开始安装,安装成功或者失败都会有对应的回调。内部其实也是使用PackageManager的installExistingPackage方法,通过binder机制,调用到PackageManagerService的installExistingPackage方法,最终调用到installExistingPackageAsUser方法安装,而安装的核心原理其实就是将apk文件拷贝到系统可识别的重要的文件目录

  • /data/data/packageName/xxx.apk
  • /data/data/packageName/(db,cache等)
  • /data/dalvik-cache/(profiles,x86)

无界面安装是调用adb命令,执行到一个c写的commandline脚本,调用install_app方法,然后再调用pm_command,然后执行到pm脚本,执行run方法,调用runinstall,然后调用installPackageAsUser通过AMS执行安装。

App应用启动流程

说到App的启动,就需要从开机开始说起,Android开机会先把所有应用安装一遍就是把apk拷贝到对应的目录(这也是Android开机慢的原因)。

整个流程如下:

  • 激活linux内核
  • linux内核激活引导进程
  • 引导进程经过一系列操作激活init进程
  • init进程创建zygote进程
  • zygote进程孵化SystemService进程,SystemService会先创建好所有系统服务
  • 系统服务启动完成之后,SystenService会激活Launch进程
  • Launch进程就会先请求PMS,获取到安装的所有apk的信息并展示
  • 这时候就可以点击某个应用来启动
  • 启动就会调用startActivity
  • 然后使用binder机制调用AMS,从应用进程进入系统进程
  • 如果该Activity的应用没有被创建,就会通过socket通知zygote进程孵化一个新的进程作为该应用的进程
  • 然后再通过socket把新创建的进程传递给AMS,这时候应用进程存在了,就会对该进程的权限校验,信息的检查等
  • 接着调用ApplicationThread也是通过binder机制调用到ActivityThread,从系统进程回到应用进程
  • 最终创建出Activity并执行其onCreate方法,启动完成

其实App的启动,除了刚开机是不一样之外,正常时候基本与Activity的启动非常接近。

总结

  • apk的安装其实是文件拷贝的过程
  • 桌面Launcher其实也是一个应用程序,启动一个app,大致流程与Activity的启动非常相似,无非会多一个孵化应用进程的过程

相关文章

网友评论

      本文标题:Android App安装以及启动流程

      本文链接:https://www.haomeiwen.com/subject/zuervctx.html