PMS构造方法中任务阶段性trace Tag
BOOT_PROGRESS_PMS_START
BOOT_PROGRESS_PMS_SYSTEM_SCAN_START
BOOT_PROGRESS_PMS_DATA_SCAN_START
BOOT_PROGRESS_PMS_SCAN_END
BOOT_PROGRESS_PMS_READY
PMS主要工作:包解析、签名校验、应用安装卸载,如下时序图仅为包解析流程
首次开机完整流程为未提及cache的路径,非首次开机,则会涉及到ParsedPackage的cache流程,即当应用被解析完成后会存储很多配置文件,例如package.xml,package_list等,其中包解析的内容会被存贮在data/system/package_cache/目录下,当机器重启后,此类配置文件信息会在PMS构造方法中preparePackageParserCache中构建cache对象。当cache对象存在后,包解析ParsingPackageUtils中的方法就不会再执行,直接从cache文件中构建出parsedPackage包。这也是为啥reboot会比首次开机快一些的一个原因。
经上述流程,故icon替换就可以在parseBaseApplication方法中去做出来,当前包为定制icon应用时,则将其icon替换,这里要注意,有时我们获取可能从acitivityInfo信息中获取icon,所以ParsedActivityUtils.parseActivityOrReceiver中也需要做icon替换。当前项目高通di5 laucnher调用中相册、智慧充电就存在该情况
在包解析处做修改优点:
即此时修改应用icon后,不论其他应用如何调用,都能保证获取到的即为定制后的icon,否则
1. 在APPlicationPackageManager接口处做修改,则需要保证应用必须调用此接口,且代码替换代码会重复走很多遍。
2.在PackageInfoWithoutStateUtils中调用generateApplicationInfoUnchecked或generateAcitivtyInfoUnchecked生成ApplicationInfo或ActivityInfo的时候修改,这里比起APMS未限制应用的接口调用,但是依旧走很多遍。
在包解析处修改的缺点:
当应用icon是根据某个属性值取不同icon图片时,则会出现修改persist属性值重启后,样式修改未生效,原因即为上述情况说到的cache,重启后,cache不为空,解析流程会直接返回不会重新走一次包解析,此时可以考虑执行恢复出厂设置,但是要注意看恢复出厂设置,是否有去清data/system/package_cache目录,若未做清除,则也是不会生效。如果这里需要做改动,可以考虑修改bootable/recovery/recovery.cpp将此目录在恢复出厂设置的时候清掉。
在此处修改的缺点:
当应用icon是根据某个属性值取不同icon图片时,则会出现修改persist属性值重启后,样式修改未生效,原因即为上述情况说到的cache,重启后,cache不为空,解析流程会直接返回不会重新走一次包解析,此时可以考虑执行恢复出厂设置,但是要注意看恢复出厂设置,是否有去清data/system/package_cache目录,若未做清除,则也是不会生效。如果这里需要做改动,可以考虑修改bootable/recovery/recovery.cpp将此目录在恢复出厂设置的时候清掉。
https://download.csdn.net/download/kanghongxia_021/85405257https://download.csdn.net/download/kanghongxia_021/85405257
原图,可用https://www.diagrams.net/,draw.io该工具打开