PackageManager
2016-03-03 11:32:22 4 举报
PackageManager是Android系统中一个重要的类,它用于管理应用程序的安装、卸载、升级等操作。通过PackageManager可以获取到设备上已安装的所有应用程序信息,包括应用程序的名称、图标、版本号等。同时,还可以根据应用程序的包名来查找对应的应用程序,并进行相应的操作。除此之外,PackageManager还提供了一些系统级别的功能,例如获取设备的CPU架构、屏幕分辨率等信息。在开发Android应用时,我们经常需要使用到PackageManager这个类来实现各种功能。
作者其他创作
大纲/内容
processPendingInstall
1.判断若没有等待安装信息,并且没有等待验证信息,且在bind状态,则断开同DefaultContainerService 连接。若,等待安装信息不为空,则发送MCS_BOUND 消息进行处理。
SharedUserSetting.java
createSessionInternal
handleStartCopy
mPm.isUserRestricted
runInstall
PackageInstallerService
handleReturnCode
onCommand
继承关系:
onShellCommand
POST_INSTALL
startCopy
PackageManagerService
adb install 过程
INIT_COPY
Settings
启动流程:
Installd-----patchoat
connectToService
安装应用:
PackageManagerServiceinstallPackageAsUser
installStage
Start
PackageInstallerSession
MCS_UNBOUND
exec
.PackageManagerService
1.提供createSession接口创建session 分配唯一的SessionId2.Checks if the request is from the system or an app that has INTERACT_ACROSS_USERS3. mPm.isUserRestricted-- 是否有用户限制4.params.installFlags---检查安装 flag --Shell Or Root Or Other5.Only system components can circumvent runtime permissions when installing6.Defensively resize giant app icons ----app icon 赋值7. 检测安装方式8.检测内置,外置 sd卡是否有安装空间9.PackageInstallerSession 实例化
SettingBase
PackageManagerShellCommand
PackageManagerService.DefaultContainerConnection
PackageManagerService.PackageHandler
Installd-----main
PackageManagerServicePackageHandlerdoHandleMessage
PackageManagerServicePackageHandlerhandleMessage
copyApk()
MCS_BOUND
bindServiceAsUser
mHandlerCallback
PackageManagerService.InstallParams
init.rc
doCreateSession
1.检查userId代表的用户是否有权限删除这个应用 2.获取应用在mSettings中的包的信息 3.检查并记录系统中所有用户是否都安装了这个应用 4.调用deletePackageLI方法来卸载应用 5.如果卸载的应用是某个系统应用的升级包,卸载它将导致低版本的系统应用重新使用;因此需要发送广播通知这种变化 6.Force a gc here. 7.调用FileInstallArgs的方法做清理工作 总结:deletePackageX()方法收集了应用在不同用户下的安装情况后,调用deletePackageLI方法继续卸载。如果删除的是某个系统应用的升级包,这里还会发出广播通知以前的应用又重新使用了
zygote
commitLocked
PackageManagerService deletePackageX
createSession
PackageManagerInstallService createSessionInternal
PackageManagerInstallService createSession
PackageManagerService installPackage
1.检查调用进程权限2.检查调用进程是否有权限安装应用3.检查用户是否被限制安装应用4.处理installFlags 标记5.判断是否是系统app ,若是,则可绕过运行是权限5. verificationParams.setInstallerUid(callingUid);6.保存参数到InstallParams 对象并发送消息 INIT_COPY
PackageSetting
PendingPackage
.MCS_BOUND 消息的处理过程就是调用InstallParams 类的startCopy()方法来执行安装。只要mPendingInstalls 中还有消息,就会重复发送MCS_BOUND消息,知道所有应用都安装完毕,然后发送一个延时10秒的MCS_UNBOUND消息1.判断是否连接成功DefaultContainerService2.成功连接后判断mPendingInstalls 中是否还有安装信息,若有,执行安装,安装完成,将其信息删除。若没有,发送一个延时10秒的MCS_UNBOUND,若有则继续发送MCS_BOUND 消息进行处理
startCopy()
PackageSettingBase.java
mSettings = new Settings(mPackages); mSettings.addSharedUserLPw(\"android.uid.system\
PackageManagerService deletePackage
Installd:1.installd 模块的源码位于 frameworks/native/cmds/installd
PackageManagerService 的初始化:
system_server
PackageManagerService deletePackageLI
Installd-----install
ShellCommand
0 条评论
下一页