Android(安卓)APK文件安装过程小结
16lz
2022-01-12
单击apk文件,系统发送intent,packageInstallActivity进行接收
1.packageinstallActivity
onCreate() 获取intent内容,识别scheme,
-->调用PackageUtil.getPackageInfo获取相关apk的资源信息和清单信息
-->调用initiateInstall()判断包名是否重复
-->调用startInstallCOnfirm(),获取权限信息,并绘制权限视图及按钮
,单击确定按钮时跳转至InstallAppProgress
2.InstallAppProgress
onCreate() 获取intent内容,识别scheme
-->调用initView() 设置界面视图,调用PackageManager的intallPackageWithVerficationAndEncryPtionAndENcryption方法安装
packageManage会调用packageManagerService的insatll...AndEncryption方法
3.install...AndEncryption()根据uid判断是否为ADB安装,同时packagehandler发送INIT_COPY消息
->调用doHandleMessage处理,判断是否绑定ContainerService,绑定后,将相关参数信息添加到PendingInstall列表,并发送MCS_BOUND消息,
->dohanleMessage处理MCS_BOUND,解析参数HandlerParams,调用其startCopy(),同时如果列表不为空,继续发送MCS——BOUND消息
--->startCopy()判断处理次数,调用handleStartCopy(),判断安装位置,计算内部存储大小,安装drm,计算安装包大小,当内存不足时释放存储空间,最终确定相关状态。建立InstallArgs对象(FileInstallArgs/AsecINstallArgs),并调用copyApk()
---> copyApk():
-->1.FileInstallArgs:调用CreateCopyFIle()『在/data/app下创建一个以"vmdl"开始,并以".tmp"结尾的临时文件,获取该文件路径名以及/data/app-lib/vmdl**路径』,并将源文件复制到临时文件中,将其中库文件拷贝到app-lib/vmdl**中
-->2.AsecInstallArgs
--->调用handleReturnCode(),其中调用processPendingInstall()
processPendingInstall()
-->installPackageLI(),解析清单文件信息,调用rename()和installnewPackageLI()
-->doRename(),将.tmp等临时文件及路径更名。例如包名-num.apk
-->installnewpackageLI(),将新的package文件里面的资源加入到PMS的数据结构中,让PMS来管理这些activity、service、receiver
-->scanPackageLI()把新package的资源归入到PMS中,并创建一个PackageSettings对象,加入到Settings中的mPackages这个map中
-->createDataDirsLI(),创建data目录
-->installer.install()调用installd.install()先构造几个目录名:pkgdir为/data/data/包名,libsymlink为/data/data/包名/lib,applibdir为/data/app-lib/包名。然后创建pkgdir的目录,并修改相应的权限。然后创建/data/data/包名/lib指向/data/app-lib/包名的符号链接
-->performDexOptLI()对APK安装包中的dex文件做优化
-->updateSettingsLI去更新Settings中的设置
-->发送"POST_INSTALL"消息,接收后发送安装成功广播
1.packageinstallActivity
onCreate() 获取intent内容,识别scheme,
-->调用PackageUtil.getPackageInfo获取相关apk的资源信息和清单信息
-->调用initiateInstall()判断包名是否重复
-->调用startInstallCOnfirm(),获取权限信息,并绘制权限视图及按钮
,单击确定按钮时跳转至InstallAppProgress
2.InstallAppProgress
onCreate() 获取intent内容,识别scheme
-->调用initView() 设置界面视图,调用PackageManager的intallPackageWithVerficationAndEncryPtionAndENcryption方法安装
packageManage会调用packageManagerService的insatll...AndEncryption方法
3.install...AndEncryption()根据uid判断是否为ADB安装,同时packagehandler发送INIT_COPY消息
->调用doHandleMessage处理,判断是否绑定ContainerService,绑定后,将相关参数信息添加到PendingInstall列表,并发送MCS_BOUND消息,
->dohanleMessage处理MCS_BOUND,解析参数HandlerParams,调用其startCopy(),同时如果列表不为空,继续发送MCS——BOUND消息
--->startCopy()判断处理次数,调用handleStartCopy(),判断安装位置,计算内部存储大小,安装drm,计算安装包大小,当内存不足时释放存储空间,最终确定相关状态。建立InstallArgs对象(FileInstallArgs/AsecINstallArgs),并调用copyApk()
---> copyApk():
-->1.FileInstallArgs:调用CreateCopyFIle()『在/data/app下创建一个以"vmdl"开始,并以".tmp"结尾的临时文件,获取该文件路径名以及/data/app-lib/vmdl**路径』,并将源文件复制到临时文件中,将其中库文件拷贝到app-lib/vmdl**中
-->2.AsecInstallArgs
--->调用handleReturnCode(),其中调用processPendingInstall()
processPendingInstall()
-->installPackageLI(),解析清单文件信息,调用rename()和installnewPackageLI()
-->doRename(),将.tmp等临时文件及路径更名。例如包名-num.apk
-->installnewpackageLI(),将新的package文件里面的资源加入到PMS的数据结构中,让PMS来管理这些activity、service、receiver
-->scanPackageLI()把新package的资源归入到PMS中,并创建一个PackageSettings对象,加入到Settings中的mPackages这个map中
-->createDataDirsLI(),创建data目录
-->installer.install()调用installd.install()先构造几个目录名:pkgdir为/data/data/包名,libsymlink为/data/data/包名/lib,applibdir为/data/app-lib/包名。然后创建pkgdir的目录,并修改相应的权限。然后创建/data/data/包名/lib指向/data/app-lib/包名的符号链接
-->performDexOptLI()对APK安装包中的dex文件做优化
-->updateSettingsLI去更新Settings中的设置
-->发送"POST_INSTALL"消息,接收后发送安装成功广播
更多相关文章
- android发送post请求出现问题
- Android(安卓)NDK-r4 sample--准备(一)
- 升级Android(安卓)ADT 和SDK
- 详解 Android(安卓)的 Activity 组件
- Android(java)学习笔记86:案例短信发送器
- Android(安卓)IPC 通讯机制源码分析 二
- Android的IPC机制Binder的详解(转发)
- location of the android sdk has not been setup in the prefer
- Android(安卓)无线启动过程分析 无线启动过程分析