【源码剖析2】framework 源码 3——UserManagerService之多用户的创建代码详解

本文详细剖析了Android系统中创建用户的过程,重点讲解了`UserManagerService`的`createUserInternalUnchecked`方法。该方法涉及用户类型的判断、存储空间检查、用户特性的统计以及用户数据的创建和保存。创建用户时,会分配唯一的userId,并创建对应的UserInfo和UserData对象。同时,文章强调了创建用户并不直接显示,需通过多用户切换实现。最后,文章提到了如何利用不同的标志位(flag)来定制用户特性,并预告了下篇将讨论用户切换的流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上文提到创建用户的方法:

核心代码是 createUserInternalUnchecked

在此方法中要完成一个用户的创建。首先是通过flag区分需要创建用户的类型,然后不同类型在信息的使用上会有不同差别。 总的来说,创建时兼顾了各种类型的user,并且给新用户提供userId和UserInfo两个重要参数。

 

需要注意的是,创建用户并不会使用户显示出来。要显示用户是通过多用户切换功能完成。

我们平常一创建多用户就跳转到新用户的界面,那是由创建用户和切换用户共同完成。

 

下面是createUserInternalUnchecked 完整源码和讲解。

代码地址:http://androidxref.com/9.0.0_r3/xref/frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java#2600

 

private UserInfo createUserInternalUnchecked(String name, int flags, int parentId,String[] disallowedPackages) {

        //首先如同上一章所讲,传入参数为 用户的名字name  ,  用户的类型/特性 flags  , 主用户的识别码 parentId, 和新创建用户时的禁用应用表。  如果单纯创建一个新用户, 那么这4个参数,分别是: createUserInternalUnchecked(“自定义的名称”,  0,    USER.NULL , null)

 

        //接着进行第一个判断,手机是否有足够空间支持新用户的创建,如果没有足够空间,则终止创建,return null

        DeviceStorageMonitorInternal dsm = LocalServices.getService(DeviceStorageMonitorInternal.class);

        if (dsm.isMemoryLow()) {

            Log.w(LOG_TAG, "Cannot add user. Not enough space on disk.");

            return null;

        }

        //随后对用户的特性进行一下统计,方面后续涉及到的部分进行快速判断。这里没有统计所有特性,且特性可以自己在UserInfo类里面,自己手动添加一些。

 

        //特性1:访客用户

        final boolean isGuest = (flags & UserInfo.FLAG_GUEST) != 0;

 

        //特性2:工作用户(工作用户一定是子用户)

        final boolean isManagedProfile = (flags & UserInfo.FLAG_MANAGED_PROFILE) != 0;

 

        //特性3:受限制

        final boolean isRestricted = (flags & UserInfo.FLAG_RESTRICTED) != 0;

 

        //特性4:演示用户

        final boolean isDemo = (flags & UserInfo.FLAG_DEMO) != 0;

 

        //接来下是最关注的几个对象,其中userInfo和userId是在多用户过程中,非常频繁使用的。

        final long ident = Binder.clearCallingIdentity();

        UserInfo userInfo;

        UserData userData;

        final int userId;

        

        try {

            synchronized (mPackagesLock) {

                UserData parent = null;

 //确认传入的主用户参数是否存在,当主用户存在,则获取parent。后面创建子用户过程中,部分信息会依赖于parent

                if (parentId != UserHandle.USER_NULL) {

                    synchronized (mUsersLock) {

                        parent = getUserDataLU(parentId);

                    }

                    if (parent == null) return null;

                }

       //确认工作用户能够被创建

                if (isManagedProfile && !canAddMoreManagedProfiles(parentId, false)) {

                   &n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值