总体来看是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