安卓多用户学习笔记

来源:互联网 发布:围棋编程形势判断算法 编辑:程序博客网 时间:2024/05/04 04:33

一.背景

多用户是Android4.2被引入的

二.用户创建切换删除

相关类(基于Android6.0来分析)

frameworks/base/core/java/android/os/UserManager.java
frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java
frameworks/base/core/java/android/content/pm/UserInfo.java
frameworks/base/core/java/android/os/UserHandle.java
frameworks/base/core/java/com/android/server/pm/PackageManagerService.java
frameworks/base/core/java/com/android/server/wm/WindowManagerService.java
frameworks/base/core/java/com/android/server/am/ActivityManagerService.java
frameworks/base/core/java/android/os/Process.java

UserManager

UserManager可以称为 UMS 的代理对象,它通过IUserManager mService来与 UMS 进行进程间的通信。
UserManager是暴露出来的应用程序接口。对于普通应用程序,提供用户数查询,用户状态判断和用户序列号查询等基本功能。普通应用没有用户操作权限。
对于系统应用,UserManager提供了创建/删除/擦除用户、用户信息获取、用户句柄获取等用户操作的接口。
这些操作均由远程调用 UMS 服务的对应方法实现。

UserManagerService

UserManagerService:继承于IUserManager.Stub,PMS初始化对象时被创建UMS对象

UserManagerService构造函数如下:

206    /**207     * Available for testing purposes.208     */209    private UserManagerService(Context context, PackageManagerService pm,210            Object installLock, Object packagesLock,211            File dataDir, File baseUserPath) {212        mContext = context;213        mPm = pm;214        mInstallLock = installLock;215        mPackagesLock = packagesLock;216        mHandler = new MainHandler();217        synchronized (mInstallLock) {218            synchronized (mPackagesLock) {219                mUsersDir = new File(dataDir, USER_INFO_DIR);220                mUsersDir.mkdirs();221                // Make zeroth user directory, for services to migrate their files to that location222                File userZeroDir = new File(mUsersDir, "0");223                userZeroDir.mkdirs();224                FileUtils.setPermissions(mUsersDir.toString(),225                        FileUtils.S_IRWXU|FileUtils.S_IRWXG226                        |FileUtils.S_IROTH|FileUtils.S_IXOTH,227                        -1, -1);228                mUserListFile = new File(mUsersDir, USER_LIST_FILENAME);229                initDefaultGuestRestrictions();230                readUserListLocked();231                sInstance = this;232            }233        }234    }

UMS初始化过程中做了如下工作:

(1).创建用户相关目录

创建目录mUsersDir: /data/system/users

root@cancro:/data/system/users # ls00.xml1010.xmluserlist.xml

root@cancro:/data/system/users # ls00.xml1010.xmluserlist.xml

创建主用户目录userZeroDir:/data/system/users/0.该目录下存放了针对当前用户的各种设置数据,不同用户下的设置数据是独立的,即每个用户都有属于当前用户自己的设置数据

root@cancro:/data/system/users/0 # lsaccounts.dbaccounts.db-journalapp_idle_stats.xmlappwidgets.xmlpackage-restrictions.xmlregistered_servicesruntime-permissions.xmlsettings_global.xmlsettings_secure.xmlsettings_system.xmlwallpaper_info.xml

创建文件mUserListFile :userlist.xml记录当前手机所有用户id

root@cancro:/data/system/users # cat userlist.xml<?xml version='1.0' encoding='utf-8' standalone='yes' ?><users nextSerialNumber="29" version="5">    <guestRestrictions>        <restrictions no_outgoing_calls="true" no_sms="true" />    </guestRestrictions>    <user id="0" />    <user id="10" /></users>


(2).解析userlist.xml得到用户id,然后解析用户注册信息0.xml 10.xml创建用户信息,(x.id.xml是用户注册信息)。

保存在全局变量private final SparseArray<UserInfo> mUsers = new SparseArray<UserInfo>();中,mUsers维护所有的用户状态。

mUsers在系统启动时由/data/system/users/userlist.xml读取生成,并在运行期间动态改变。所有用户的添加、删 除操作,都最终序列化回此文件中。

0.xml示例:

root@cancro:/data/system/users # cat 0.xml<?xml version='1.0' encoding='utf-8' standalone='yes' ?><user id="0" serialNumber="0" flags="19" created="0" lastLoggedIn="1503215177716">    <name>机主</name>    <restrictions /></user>

10.xml示例:

root@cancro:/data/system/users # cat 10.xml<?xml version='1.0' encoding='utf-8' standalone='yes' ?><user id="10" serialNumber="28" flags="17" created="1503294153287" lastLoggedIn="1503212178258">    <name>test</name>    <restrictions no_install_unknown_sources="false" no_usb_file_transfer="false" no_debugging_features="false" /></user>

总结:UMS的构造函数主要是解析了userlist.xml文件,生成了全局的UserInfo对象。

0 0
原创粉丝点击