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的启动非常相似,无非会多一个孵化应用进程的过程