💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
UserManager是Andorid 4.0新增的一个功能,其作用是管理手机上的不同用户。这一点和PC上的Windows系统比较相似,例如,在Windows上安装程序时,都会提示是安装给本人使用还是安装给系统所有用户使用。非常遗憾的是,在目前的Andorid版本中,该功能尚未完全实现,在SDK中也没有相关说明。不过从现有代码中,也能发现一些蛛丝马迹。 * * * * * **提示**:小米手机的访客模式和UserManager比较相似。 * * * * * 1. UserManager构造函数分析 在PKMS中,创建UserManager调用的代码如下: ~~~ //mUserAppDataDir指向/data/app。该目录中包含的是非系统APK文件 mUserManager = new UserManager(mInstaller,mUserAppDataDir); ~~~ **UserManager.java** ~~~ public UserManager(Installer installer, FilebaseUserPath) { this(Environment.getDataDirectory(), baseUserPath); mInstaller = installer; } UserManager(File dataDir, File baseUserPath) { //mUsersDir指向/data/system/users目录 mUsersDir = new File(dataDir, USER_INFO_DIR); mUsersDir.mkdirs();//创建该目录 mBaseUserPath = baseUserPath; FileUtils.setPermissions(mUsersDir.toString(), FileUtils.S_IRWXU|FileUtils.S_IRWXG |FileUtils.S_IROTH|FileUtils.S_IXOTH, -1, -1); //mUserListFile指向/data/system/user/userlist.xml mUserListFile = new File(mUsersDir, USER_LIST_FILENAME); readUserList();//解析userlist.xml文件 } ~~~ 此处不深入readUserList代码了,只介绍其内部工作流程。 - userlist.xml保存每个用户的id。 - readUserList到/data/system/users下解析id.xml,将最终得到的信息保存在UserInfo对象中。 原来用户信息由UserInfo表达,下面是UserInfo的定义。 **UserInfo** ~~~ public class UserInfo implements Parcelable { //主用户,全系统只能有一个这样的用户 publicstatic final int FLAG_PRIMARY = 0x00000001; //管理员,可以创建、删除其他用户信息 publicstatic final int FLAG_ADMIN =0x00000002; //访客用户 publicstatic final int FLAG_GUEST =0x00000004; publicint id; //id publicString name;//用户名 publicint flags; //属性标志 ......//其他函数 } ~~~ UserInfo信息比较简单,笔者觉得UserManager的功能暂时还不能企业用户的需求。感兴趣的读者不妨关注Android未来版本在此方面的变化。 2. installPackageForAllUsers分析 PKMS在扫描非系统APK的时候,每扫描完一个APK都会调用installPackageForAllUsers,调用代码如下: `mUserManager.installPackageForAllUsers(pkgName,pkg.applicationInfo.uid);` **UserManager.java::installPackageForAllUsers** ~~~ public void installPackageForAllUsers(StringpackageName, int uid) { for (intuserId : mUserIds) { if(userId == 0) continue; //向installd发送命令,其中getUid将组合userId和uid为一个整型值 //installd将在/data/对应user/目录下创建相应的package子目录 mInstaller.createUserData(packageName, PackageManager.getUid(userId,uid), userId); } } ~~~