导引
AppError:
03-12 13:57:01.075 E/****( 5625): java.lang.NoClassDefFoundError: Failed resolution of:
pm 对于一些apk 的安装和鉴权有了解
PKMS服务,主要用来管理apk的安装,解析,验签,删除,升级等功能
当安卓系统要安装某个应用时,apk文件会被加载到/data/app目录下,然后PMS就对该目录下的apk缓存文件进行扫描。
PMS就会在/data/app目录里对这个apk文件进行解析,apk文件里是有很多文件的,因此要让系统迅速定位到这么多类(四大组件等),就应该有个服务事先把它们的包名路径等信息加载好,这样就可以快速地定位到这些类(比如入口Activity等),而这个服务就是PMS,然后AMS即ActivityManagerService就能根据PMS里面的这些类信息来进行创建入口Activity等四大组件类并启动。
当手机开机时,PMS也会去扫描加载/data/app目录和system/app里每个apk里的所有类信息并且进行解析,然后缓存到PMS它自己里面定义好的集合里,供AMS使用
PMS加载每个apk(包括系统apk)里的清单文件,然后把里面相应的类(节点)信息进行分类存储:
image.png
每个apk对应一个缓存对象Package,而PMS是一个单独进程,来管理这些Package对象。
当用户点击app图标的那一刻,AMS就根据PMS里Package里的这些集合里的类信息以及intent里设置的意图信息,然后定位到要显示的类,创建然后启动它
图画的太好了,忍不住赞叹
AMS从PMS里拿到这个启动类的信息数据之后,就缓存到它自己的ActivityThread里的ActivityClientRecord集合里,也就是跳转记录集合里
image.png
引导
第三方应用安装
Android 8.1 源码_核心篇 - 深入研究 PackageManagerService 系列(3)
android系统启动过程中解析Manifest的流程是通过PackageManagerService服务来实现的
12 系统启动并解析Manifest的流程.md ·
应用的开端--PackageManagerService(PMS)
- 开机启动应用
PMS构造方法里去扫描
scanPackageTracedLI
scanPackageLI
PackageParser.parsePackage
parseMonolithicPackage
parseBaseApk //解析清单文件AndroidManifest.xml
parseBaseApkCommon
getApplicationInfo
getApplicationInfoInternal
PackageParser.generateApplicationInfo
AMS.systemReady
AMS.startHomeActivityLocked
resolveActivityInfo
PKMS.getActivityInfo
getActivityInfoInternal
generateActivityInfo
example:
AMS.resolveActivity
PKMS.resolveIntent
resolveIntentInternal
queryIntentActivitiesInternal
getActivityInfo
网友评论