大厂面试,我们主要是 AMS ,这个要理解透。
PKMS 是啥? PackageManagerService。这里要区分 PMS (PowerManagerService)
Launcher查询PKMS 就能得到所有的安装应用。PKMS 的主要职责:
- 解析 AndroidManifest.xml 文件,解析清单文件中的所有节点信息
- 扫描 apk 文件,安装系统应用,本地应用等
- 管理本地应用:包括安装、卸载、应用信息查询
细节点:为什么大家看源码不使用 AS ,主要是因为使用 AS 看源码有很多文件是被阉割过的,比如你想找 PKMS 中 Binder 通信用到的 aidl 文件,是找不到的,必须要下载完整源码(10个多G),AS 上的源码是找不到的。
Android 三大命脉——AMS、BInder、Handler
现在的桌面一般都是 Launcher3 。面试题:桌面上的应用是怎么展示的?
Launcher3 是系统应用,在 packages/app/Launcher3.apk 路径下跨进程通信向 PKMS 请求获得
手机开机很慢,大概什么问题?
开机过程service 启动总共有7部曲:
startBootstrapService中做的事情:
- 启动 installer 服务
- 获取设备是否加密
- 调用 PKMS.main 实例化 PKMS (启动 30s ,将近有20s都在这里)
- 设备的加密操作
startOtherService中做的事情:
- dex 优化操作
- 磁盘优化维护操作
- PKMS准备就绪
上面总共 7 个步骤,7个步骤中PKMS 的构造函数很耗时,dex 优化很耗时,要着重关注。
ROM 开发代码改动很少的,可能看代码2周,改了1行代码。编译都要1晚上,所以我们一般不能用调试的方法去发现问题,需要认真看日志,会看日志,正确打印日志。
为什么PKMS源码?
ROM定制开发
Launcher 开发
PKMS 扫描所有的系统应用,接着扫描用户应用,将这些安装信息保存在内存中,PKMS 就会保存这些安装的应用。
Android 安装APK 的原理?
- 第一步:Copy apk
- 第二步:扫描指定目录的 apk
所以,每次系统启动,都会扫描所有应用,安装的应用越多,启动越慢
MainActivity 跳转 SecondActivity (在 AndroidManifest.xml 中指定了 Launchmode了),请问,是在哪里解析这个 launchMode 的?
答:在 PKMS 扫描APp 的时候,就已经解析出来了
为什么手机开机后,我能收到开机广播?
因为开机时,PKMS 构造函数中已经扫描了所有 APK清单文件了,(静态广播)已经注册了。
新应用安装时间很长,是为什么?
安装完成后需要 App 扫描,还有更耗时的 APK 优化