Android Framework

PackageManagerService流程

2017-11-22  本文已影响51人  xiabodan

PMS安装应用程序流程

一、启动时安装

1、查看PMS的功能与启动过程,首先PMS是在systemserver中启动的。之后分为两大部分启动

注意:

二、用户安装

adb install xxx.apk

PM : pm.java---->run()---->runInstall()
                |
            .....binder.....
                |
PMS :      installPackageAsUser()
                |
                  消息机制
                final Message msg = mHandler.obtainMessage(INIT_COPY);
                msg.obj = new InstallParams(origin, observer, installFlags,
                    installerPackageName, verificationParams, user, packageAbiOverride);
                mHandler.sendMessage(msg)
                |
            doHandleMessage(Message msg) 
                |
            case INIT_COPY
                |
            connectToService()流程
            然后再发送一个消息到 MCS_BOUND
                |
            case  MCS_BOUND
                |
            params.startCopy()
                |
            handleReturnCode()
                |
            processPendingInstall(mArgs, mRet)
                |
            installPackageLI(args, res)
                |
            pkg = pp.parsePackage(tmpPackageFile, parseFlags) //用parsePackage解析APK
                |
            installNewPackageLI()
                |
            scanPackageLI() //重载
                |
            接下你就和启动时安装应用流程一样
                  .....

MCS_BOUND 消息发送流程
connectToService()的最后会在AMS中的publishServiceLocked()函数中通过ContextImpl传过去的connection的IBinder接口,调用connected()函数

注意:

重载的scanPackageLI()函数

发现问题:

Message消息循环
问题:sendMessage与handleMessage是怎么实现的???
Android应用程序在每一个线程启动的时,都会在内部创建一个消息队列,然后进入到无限循环中,不断检查消息队列是否有新消息需要处理。如果有则会从消息队列中取出来,处理。否则线程就会进入睡眠状态

connectToService()流程

doHandleMessage             ----PMS
    | 
connectToService()      
    |
mContext.bindServiceAsUser()        ----ContextImpl.java
    |
ActivityManagerNative.getDefault().bindService()    ----ContextImpl.java
    |
{Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>()
IBinder b = ServiceManager.getService("activity")
IActivityManager am = asInterface(b)}
    |
IActivityManager.bindService()      ----ActivityManagerNative
    |
   ...binder...
    |
ActivityManagerService.bindService()    ----AMS
    |
mServices.bindServiceLocked()       ----ActiveServices.java
    |
retrieveServiceLocked()
bringUpServiceLocked()
    |
startProcessLocked()
    |
启动com.android.defcontainer/.DefaultContainerService   比较核心的拷贝/重命名/删除都会在这个service中进行
上一篇 下一篇

猜你喜欢

热点阅读