背景知识
1)PackageManagerService是由SystemServer启动,PMS负责应用的安装,卸载和权限检查等工作
2)/system/app和/data/app目录下的apk文件,PMS启动过程中,都会扫描安装;
apk安装流程
1)拷贝apk到指定的目录:用户安装的apk会拷贝到/data/app下,但是系统apk会放在/system/app, /system/vendor/app以及/system/priv-app下
2)拷贝dex文件:为加快启动速度,将dex文件拷贝到/data/dalvik-cache/目录缓存。art平台会采用AOT(Ahead of Time)技术,将字节码预编译成机器码(dex编程odex),存储空间增加大约20%,安装时间变长
3)创建应用数据目录:创建/data/data/[packageName]目录,用来存放数据库,cache,so动态库。6.0由于支持多用户,/data/user/0/[packageName]是/data/data/[packageName]的软连接。猜想同时会创建/sdcard/Android/data/[packageName]/目录
4)解析AndroidManifest.xml文件:将apk的权限、应用包名、apk的安装位置、版本、userID等信息保存在/data/system/packages.xml文件中,将解析出的四大组件信息注册到PackageManagerServices
出现的问题
1.从安装器打开app存在系统bug
从安装器直接打开应用,当应用退到后台时,点击桌面启动app,并不是回到了之前的页面,而是像第一次打开应用时,比如导航页启动、再到主界面。而当你返回键退出时,又会发现,你又回到了之前Home键退到后台的页面。
原因:通过安装器启动并没有携带category信息
解决方式
if(!this.isTaskRoot()) {
Intent mainIntent=getIntent();
String action=mainIntent.getAction();
if(mainIntent.hasCategory(Intent.CATEGORY_LAUNCHER) && action.equals(Intent.ACTION_MAIN)) {
finish();
return;
}