Jimmy Chen

A Programmer

(原创)基于Android 8.1之PackageInstaller源码分析(二)

  上一篇讲到如果允许安装未知源程序,并且应用属于未知源程序,就会调用initiateInstall进行安装,而initiateInstall最后会调用startInstallConfirm进行安装确认。这一篇就从startInstallConfirm方法开始讲解。

PackageInstallerActivity.java

  上面安装应用的界面大致如下,升级应用或者应用不需要额外权限的界面大致类似,只是提示信息不同而已:

《(原创)基于Android 8.1之PackageInstaller源码分析(二)》 《(原创)基于Android 8.1之PackageInstaller源码分析(二)》

  应用相关信息读取到这里,接下来就到了点击INSTALL确认安装的时候了。


PackageInstallerActivity.onClick


PackageInstallerActivity.startInstall

  这里并没有立刻开始进行实际的安装动作,而是将相关信息添加到一个Intent中,然后跳转到InstallInstalling这个Activity进行安装,下面我们去阅读这个类的代码来看实际安装所完成的操作。

InstallInstalling.java

  onCreate只是做一些基本的设置和注册动作,接着我们查看onResume的代码。


onResume

  上述SessionInfo代表的是一个安装绘画的详细信息,如果我们安装应用第一次到这里的话,那么这个sessionInfo是处于非活动状态的。接着看InstallingAsyncTask完成什么类型工作。


InstallingAsyncTask

接下来分析PackageInstaller.Session的commit方法完成的事情。


commit

  上述mSession定义如下为private IPackageInstallerSession mSession;,代表mSession是一个IPackageInstallSession代理对象,通过这个代理可以和PackageInstallerSession进行binder通信。


PackageInstallSession.java

  上面的代码最主要的是在最后的部分通过mHandler发送MSG_COMMIT消息。mHandler是Handler对象,其通过mHandler = new Handler(looper, mHandlerCallback);进行初始化。


mHandlerCallback

  上面的代码处理起来比较简单,主要调用commitLocked来完成。下面直接来看commitLocked方法的代码。


commitLocked

  上面的代码到最后PackageInstallerSession的使命就到此结束了,最后会跳转到PackageManagerServic中执行。这一篇就先到这里了,之后PackageManagerServic的处理到下一篇再讲述。

小结

下面是这篇文章的简单总结:

  1. 在startInstallConfirm中会显示安装包内定义所需的权限信息
  2. 在点击Install后APK的内容会通过IO流的方式写到PackageInsaller.Session中
  3. 最后会调用PackageInstaller.Session的commit方法将请求到PKMS中

最后在PKMS中的处理我们留待下一篇再分析。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注