- 向PMS的handler发送INIT_COPY信息,将apk文件复制到
data/app
目录,顺便进行空间和权限检查; - 解析apk信息,进行签名校验、检查是否和已有的ContentProvider冲突、四大组件注册;
- dexopt操作,installd进行在安装过程中进行预编译,针对dex的opt(Dalvik虚拟机)或者oat(ART虚拟机)的优化
- 更新权限信息,并判定是否授予该app请求的权限
- 完成安装,发送
Intent.ACTION_PACKAGE_ADDED
广播
data/app
目录
1.1 安装来源,包括adb,shell,all_user,然后向PMS的mHandler
发送INIT_COPY
的消息
1.2 handleStartCopy
的核心就是copyApk,顺便进行存储空间检查,权限检查等等安全校验
完成apk copy到data/app
目录的操作后,
2.1、执行processPendingInstall()
方法,这个方法先是解析了package包,然后做了大量签名和权限校验的工作
2.2、执行installNewPackageLI(),这个方法主要完成:
- 设置系统App的一些参数
- 校验签名
- 解析app的provider,校验是否与已有的provider冲突
- 32/64位abi的一些设置
- 四大组件的解析,注册
Apk文件其实只是一个归档zip压缩包,而我们编写的代码最终都编译成了.dex
文件,但为了提高运行性能,android系统并不会直接执行.dex
,而是会在安装过程中执行dexopt
操作来优化.dex
文件,最终android系统执行的时优化后的'odex'文件(注意:这个odex文件的后缀也是.dex,其路径在data/dalvik-cache
)。对于dalvik
虚拟机,dexopt
就是优化操作,而对于art
虚拟机,dexopt
执行的则是dex2oat
操作,既将.dex
文件翻译成oat
文件。
最终守护进程installd
会调用Commands.c
文件(位于/source/framework/native/cmds/installd
)的dexopt
方法。
installd
在做了些操作后,fork
出了一个新的进程,根据虚拟机的类型为libdvm
或libart
分别执行run_dexopt
或run_dex2oat
(如果为is_patchoat,则是run_patchoat
)操作。
dexopt
操作执行完后,installNewPackageLI()
方法就会走到updateSettingsLI()
来更新设置信息,而更新设置信息主要是权限信息,所以直接来看updatePermissionsLPw()
;
在apk的安装时PMS
会将该app的所有权限都记录下来并更新到PMS
的mAppOpPermissionPackages
成员变量里面,并判定是否授予该app请求的权限。
调用PMS
的finishPackageInstall
方法,而此方法最终会发送Intent.ACTION_PACKAGE_ADDED
广播,apk的安装就到到此结束了。