Android App安装以及启动流程

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的启动非常相似,无非会多一个孵化应用进程的过程
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容