前两篇已经对新应用安装和开机加载应用安装信息的流程做了详细梳理,下面来看一个需求。在说这个需求之前,我们了解一个背景:多用户下,如果使用adb install xxx.apk的话,会导致全用户安装。聪明的读者可能就知道了,这实际上破坏了多用户的独立性。而我所在的项目即利用到了多用户,这显然不能让人接受,尤其是很多pc上的android应用安装工具,会直接把一些应用安装到另外一个用户里。实际上这也是我调研这个问题的原因。
下面来分析全用户安装的原因:
1. packagemanagerservice安装入口installPackageWithVerificationAndEncryption()里:
UserHandle user;
if ((flags&PackageManager.INSTALL_ALL_USERS) != 0) {
user = UserHandle.ALL;
} else {
user = new UserHandle(UserHandle.getUserId(uid));
}
看到这里,可以大致猜测就是这个UserHandle.ALL导致的全用户安装的,实际的情况也确实是这样的,在层层传递之后,会进入com.android.server.pm.Settings.getPackageLPw(): 有一段逻辑是这样的:
List<UserInfo> users = g