学习笔记,整理中;做应用用到的概率小。做room需要很懂。
面:
自己思路整理:
开机的时候会把所有APP安装一遍,packagemanageservice.main构造函数很耗时 ;扫描耗时;dex优化耗时。
静态广播在开机的时候pkms构造函数就扫描了,在package再进行的注册。
静默安装需要厂商签名,智能安装有密码就没意义。
apk安装步骤:
- 把apk的信息通过io流的形式写入到PackageInstaller.Session中
- 调用PackageInstaller.Session的commit方法,把apk的信息交给PKMS处理
- 进行apk的copy操作
PKMS7步骤
- SystemServer.startBootstrapServices函数中启动PKMS服务
- 启动 Installer服务
mSystemServiceManager.startService(Installer.class); - 获取设备是否加密:比如手机设置了密码。
VoldProperties.desrypt().orElse(""); - 调用PKMS.main方法 实例化PKMS
PKMS.main
PackageManagerService m = new PackageManagerService(param1,param2 installer);执行PKMS构造函数
ServiceManager.addService("package",m); 把实例化出来的PKMS丢给ServiceManager进行注册
final PackageManagerNative pmn= m.new PackageManagerNative();??
ServiceManager.addService("package_native",pmn);?? - 如果设备没有加密,操作它,管理A/B OTA dexopting
- SystemServer启动其他服务,使核心服务处于ready状态
startOtherServices
- 如果设备没有加密,执行performDexOptUpdate 完成dex优化
PackageManageService.updatePackageIfNeeded() - 执行performFstrim 完成磁盘维护
PackageManageService.performFstrimIfNeed()
7.PackageManageService 准备就绪 PackageManageService.systemReady()
DefaultPermissionGrantPolicy.grantDefaultPermissions()
PKMS 构造方法
- Boot_PROGRESS_PMS_START
构造displaymetrics来保存分辨率等信息,创建permissionmanager来进行权限管理,创建Settings来保存安装包信息(如:packages.xml,packages-backup.xml...) - BOOT_PROGRESS_PMS_SYSTEM_SCAN_START
扫描apk目录;清除安装时零时文件以及其他不必要的信息 - BOOT_PROGRESS_PMS_DATA_SCAN_START
处理data目录的应用信息,及时更新,取出不必要的数据 - BOOT_PROGRESS_PMS_SCAN_END
OTA 升级后首次启动要清除不必要的缓存数据,权限等默认项更新后要清理相关数据,更新package.xml - BOOT_PROGRESS_PMS_READY
GC回收内存
APK扫描
- scanDirTracedLi
被pkms构造方法调用,开起来扫描apk的起点 - scanDirLi
收集apk交付给submit - ParallelPackageParser.submit
把packageparser 封装好的信息交给parsepackage(pp,param2,param3) - packageparser.parserPackage
进行apk解析;
若传入packageFile是目录
若传入packageFile是apk文件 - parseMonolithicPackage
主要是解析给定的apk文件,具体调用了parseBaseApk来解析 - PackageParse.parseBaseApk
对AndroidMainfest.xml进行解析,解析的所有信息存放在Package对象中 - PackageParser.parseBaseApkCommon
获取标签 application,permission,package,manifest - PackageParser.parseBaseApplication
增对application进行全面解析
如application里面的四大组建
8.得到package对象
apk安装流程
- PackageInstallerActivity.bindUi-->startInstall
- InstallInstalling-->oncreate-->onresume-->installingAsyncTask
- PackageInstaller.Session
- PKMS-->installStage-->sendMessage
- PackageHandler-->INIT_COPY
- HandlerParams-->startCopy
-----下面是路过pkms的--------
危险权限封装思路
- 普通程序员用户端
用3个注解来处理:传入权限,做得到权限,拒绝权限,再次确认权限的注解函数。 - 架构封装程序员端
- 提供一个透明中转activity
- 提供一个接口:含获得、拒绝、再次确认接口
- 在该activity中提供对外的static函数加上接口调用
- 关键:利用AspectJ来处理注解
- 切点:从注解获得开始处理
- 切面:处理该获得权限函数。(为了方便,另外两个注解函数用反射来处理)
权限申请源码
- MainActivity 调用 ActivityCompat.requestPermissions 进行动态权限申请
- requestPermissions函数通过隐式调用,激活PackageInstaller的GrantPermissionsActivity界
面,让用户选择是否授权 - 经过PKMS把相关信息传递给PermissionManagerService处理
- PermissionManagerService处理结束后回调给---->PKMS中的onPermissionGranted方法把处
理结果返回 - PKMS通知过程中权限变化,并调用writeRuntimePermissionsForUserLPr函数让
PackageManager的settings记录下相关授 权信息
检查权限
- MainActivity会调用ContextCompat.checkSelfPermission方法检测是否具有权限
- 通过实现类ContextImpl的checkPermission方法经由ActivityManager和
ActivityManagerService处理 - 经过ActivityManager处理后会调用PKMS的checkUidPermission方法把数据传递给
PermissionManagerService处理 - 在PermissionManagerService.checkUidPermission中经过一系列查询返回权限授权的状态