4.6.2 UserManager介绍

UserManager是Android 4.0新增的一个功能,其作用是管理手机上的不同用户。这一点和PC上的Windows系统比较相似,例如,在Windows上安装程序时,都会提示是安装给本人使用还是安装给系统所有用户使用。非常遗憾的是,在目前的Android版本中,该功能尚未完全实现,在SDK中也没有相关说明。不过从现有代码中,也能发现一些蛛丝马迹。

提示 小米手机的访客模式和UserManager比较相似。

1.UserManager构造函数分析

在PKMS中,创建UserManager调用的代码如下:


//mUserAppDataDir指向/data/app目录。该目录中包含的是非系统APK文件

mUserManager=new UserManager(mInstaller, mUserAppDataDir);

[—>UserManager.java:UserManager]

public UserManager(Installer installer, File baseUserPath){

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.java]

public class UserInfo implements Parcelable{

//主用户,全系统只能有一个这样的用户

public static final int FLAG_PRIMARY=0x00000001;

//管理员,可以创建、删除其他用户信息

public static final int FLAG_ADMIN=0x00000002;

//访客用户

public static final int FLAG_GUEST=0x00000004;

public int id;//ID

public String name;//用户名

public int flags;//属性标志

……//其他函数

}


UserInfo信息比较简单,笔者觉得UserManager的功能暂时还不能满足企业用户的需求。感兴趣的读者不妨关注Android未来版本在此方面的变化。

2.installPackageForAllUsers分析

PKMS在扫描非系统APK的时候,每扫描完一个APK都会调用installPackage-ForAllUsers,调用代码如下:


mUserManager.installPackageForAllUsers(pkgName, pkg.applicationInfo.uid);


[—>UserManager.java:installPackageForAllUsers]


public void installPackageForAllUsers(String packageName, int uid){

for(int userId:mUserIds){

if(userId==0)

continue;

//向installd发送命令,其中getUid将userId和uid组合为一个整型值

//installd将在/data对应的user/目录下创建相应的package子目录

mInstaller.createUserData(packageName, PackageManager.getUid(userId, uid),

userId);

}

}