APK安装流程

在这里插入图片描述

总体来看是PackageInstaller应用程序通过binder和system_server进程间通信,安装的一系列操作都在system_server进程中处理。

细致得看一遍流程,InstallInstalling在onCreate()方法中会通过ApplicationPackageManager初始化一个PackageInstaller实例对象。

PackageInstaller

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jDGWMxpS-1617095242397)(/home/ubuntu/files/notes/PackageInstaller.png)]

PackageInstalller在ApplicationPackageManager中初始化,构造方法中通过PackageManagerService.getPackageInstaller()返回的IPackageInstaller实例初始化类变量mInstaller。

openSession()方法中通过createSession()返回的sessionID为参数,通过mInstaller.openSession(sessionID)返回IPackageInstallerSession实例初始化mSession。

PackageInstaller安装APK的一系列操作都是通过mInstaller和mSession来执行的。

PackageInstallerSession,PackageInstallerService

PackageInstallerSession在packageInstallService的createSessionInternal()方法中被实例化,

session = new PackageInstallerSession(mInternalCallback, mContext, mPm, this,
        mInstallThread.getLooper(), mStagingManager, sessionId, userId, callingUid,
        installSource, params, createdMillis,
        stageDir, stageCid, null, false, false, false, false, null, SessionInfo.INVALID_ID,
        false, false, false, SessionInfo.STAGED_SESSION_NO_ERROR, "");

PackageInstallerSession通过mInstallThread.getLooper()返回的Looper对象重新初始化自己的Handler对象:类变量mHandler。

public PackageInstallerSession( .., .., looper, ..,.. ) {
    
    
    ...
    mHandler = new Handler(looper, mHandlerCallback);
    ...
}

mHandler在之后的流程中dispatchStreamValidateAndCommit()方法和handleStreamValidateAndCommit()等方法中会用到。

而mInstallThread是在PackageInstallerService构造方法中被初始化的:

private static final String TAG = "PackageInstaller";

public PackageInstallerService(Context context, PackageManagerService pm,
        Supplier<PackageParser2> apexParserSupplier) {
    
    
        ...
        mInstallThread = new HandlerThread(TAG);
        mInstallThread.start();
        ...
        }

当然PackageInstallerService是在PackageManagerService的构造方法中初始化。

PackageManager

installStage()方法中通过mHandler发送INIT_COPY消息,将耗时操作放在“PackageManager”线程中执行。

void installStage(List<ActiveInstallSession> children)
        throws PackageManagerException {
    
    
    final Message msg = mHandler.obtainMessage(INIT_COPY);
	...
    mHandler.sendMessage(msg);
}

mHandler在PackageManagerService构造方法中被初始化:

static final String TAG = "PackageManager";

public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) {
    
    
    ...
    synchronized (mInstallLock) {
    
    
        synchronized (mLock) {
    
    
            mHandlerThread = new ServiceThread(TAG,
                    Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);
            mHandlerThread.start();
            mHandler = new PackageHandler(mHandlerThread.getLooper());
            mProcessLoggingHandler = new ProcessLoggingHandler();
            Watchdog.getInstance().addThread(mHandler, WATCHDOG_TIMEOUT)
                ...
        }
    }
    ...
}

下图在代码中打印了代码执行在当前进程和线程的信息:
在这里插入图片描述

关于更多PackageManagerService安装APK的信息:

https://duanqz.github.io/2017-01-04-Package-Manage-Mechanism

猜你喜欢

转载自blog.csdn.net/qq_36063677/article/details/115330615