写的超级省超级烂
PKMS简介
pkms叫packageManageserver,主要功能是1.解析AndroidNanifest.xml清单文件,解析清单文件中的所有节点信息2.扫描.apk文件,安装系统应用,安装本地应用等3.管理本地应用,主要有, 安装,卸载,应用信息查询 等
简单启动流程
android手机开机解析init.rc进入init方法启动zygote,然后调用通过fork出进程启动system.run方法启动systemserver方法,然后启动startBootstrapServices();引导服务startCoreServices();核心服务startOtherServices();其他服务,pkms主要先看startBootstrapServices和startOtherServices服务
初始化流程
主要看pkms构造函数:
mSettings =new Settings();//创建 Settings 对象,其内部创建了 packages.xml、packages-backup.xml、 packages.list 等文件,用于存储应用信息
添加SharedUserSetting对象到mSettings中mSettings.readLPw(sUserManager.getUsers(false))//从packages.xml文件中解析出信息(如果该文件存在),并保存到 Settings相应的字段中
scanDirLI//扫描指定文件目录下的Apk包,解析其内部的Manifest.xml文件,将值赋值给PMS和Settings、Package中;主要包括androidManifest.xml里面activity,application广播啥乱七八糟东西
// 这里扫描用户应用:mAppInstallDir = "/data/app"
scanDirLI(mAppInstallDir, 0, scanFlags | SCAN_REQUIRE_KNOWN, 0);
// 这里扫描用户应用:mDrmAppPrivateInstallDir = "/data/app-private"
scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK, scanFlags | SCAN_REQUIRE_KNOWN, 0);一堆代码,最后mSettings.writeLPr(); 重新记录一下
然后启动startotherservices执行performdexoptupdate完成的dex优化(耗时)然后完成磁盘维护performfstrimifneed()然后调用pkms.systemready()准备就绪
androidapp简单安装流程
主要看PackageInstallerActivity类
installingasynctask-》commit然后binder丢给pkms通过handlermessage(INIT_COPUY)-〉执行startcopy
startcopy就是把apk copy到data/app/包名下面,apk中的dex文件安装在data/dalvik-cache下面
网友评论