Android多用户原理及流程分析

一、 问题描述

ActivityManager.getService().registerUserSwitchObserver这个API的回调是一个阻塞式接口,也就是说框架那边遍历注册的observer,依次回调,每个observer执行完后框架才会回调下一个,直到全部执行结束,才会以安全的状态切换多用户。

当任意一处回调出现了耗时严重、卡顿、ANR问题甚至超时,都会严重影响系统切换多用户的过程。


二、 流程分析

2.1 基本概念

多用户相关逻辑,由AMS委派给UserController类控制:

// 注册的IUserSwitchObserver接口保存在其中
private final RemoteCallbackList<IUserSwitchObserver> mUserSwitchObservers
        = new RemoteCallbackList<>();

UserController(Injector injector) {
   
    mInjector = injector;
    // 回调所使用的Handler在构造方法中赋值
    mHandler = mInjector.getHandler(this);
    mUiHandler = mInjector.getUiHandler(this);
    // User 0 is the first and only user that runs at boot.
    final UserState uss = new UserState(UserHandle.SYSTEM);
    // ...
}

/**
 * 这四个dispatch方法分别对应UserSwitchObserver的四个回调方法
 */
public boolean handleMessage(Message msg) {
   
    switch (msg.what) {
   
        case REPORT_USER_SWITCH_MSG:
            dispatchUserSwitch((UserState) msg.obj, msg.arg1, msg.arg2);
            break;
        case FOREGROUND_PROFILE_CHANGED_MSG:
            dispatchForegroundProfileChanged(msg.arg1);
            break;
        case REPORT_USER_SWITCH_COMPLETE_MSG:
            dispatchUserSwitchComplete(msg.arg1);
            break;
        case REPORT_LOCKED_BOOT_COMPLETE_MSG:
            dispatchLockedBootComplete(msg.arg1);
            break;
        // ...
    }
}

RemoteCallbackList由名字可知是跟binder相关:

// 保存的应用层注册的binder回调
public class RemoteCallbackList<E extends IInterface> {
   
    /*package*/ ArrayMap<IBinder, Callback> mCallbacks
            = new ArrayMap<IBinder, Callback>();
}

InjectorUserController的内部类:

static class Injector {
   
    private final ActivityManagerService mService;
    private UserManagerService mUserManager;
    private UserManagerInternal mUserManagerInternal;

    Injector(ActivityManagerService service) {
   
        mService = service;
    }

    protected Handler getHandler(Handler.Callback callback) {
   
        return new Handler(mService.mHandlerThread.getLooper(), callback);
    }

    protected Handler getUiHandler(Handler.Callback callback) {
   
        return new Handler(mService.mUiHandler.getLooper(), callback);
    }
}

mService.mHandlerThread是AMS中用于执行业务的子线程:

public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
   
    mInjector = new Injector();
    mHandlerThread = new ServiceThread(TAG,
            THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
    mHandlerThread.start();
    mHandler = new MainHandler(mHandlerThread.getLooper());
    mUiHandler = mInjector.getUiHandler(this);
    // ...
}

下面分析多用户切换整个过程,以首次创建子用户为例。


2.2 创建用户

选择新建子用户时,执行UserManager#createUser,在UserManagerService中经过权限校验,最后调用到了createUserInternalUnchecked方法:

private UserInfo createUserInternalUnchecked(...) {
   
    // ...
    // 分配UserId,从10开始
    userId = getNextAvailableId();
    // 以UserId为文件夹名创建子用户的系统数据根目录
    Environment.getUserSystemDirectory(userId).mkdirs();
    // ...
    // 写入用户配置文件数据
    writeUserLP(userData);
    writeUserListLP();
    // ...
    // 创建用户密钥
    final StorageManager storage = mContext.getSystemService(StorageManager
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android开发教程是一套由谷歌提供的指南,旨在帮助开发者学习如何创建应用程序并了解Android平台的工作原理。建议先学习Java编程语言,因为Android应用程序主要使用Java语言编写。 该教程包含了对Android操作系统、应用生命周期、界面设计、流程控制、数据存储和访问等方面的深度讲解,为开发者提供了许多实用的工具和技巧。 在学习Android开发教程过程中,需要安装Android Studio,它是用于编写Android应用程序的官方IDE。教程为初学者提供了代码和样例,并且通过实际使用这些样例来帮助开发者理解和掌握技能。 重要的一点是,在开发Android应用程序之前,需要深入了解Android平台和其生态系统,以便能够创建出高质量、用户友好且有用的应用程序。 总之,Android开发教程不仅提供了技术方面的知识和工具,还为开发者提供了全面的指导和支持,从而让他们能够更好地建立和设计出出色的Android应用程序。 ### 回答2: Android开发教程是指教授新手或者有基础的程序员学习Android应用程序开发的学习资源。Android开发是一个广泛的话题,因此教程的范围可以覆盖从初步的安装和配置到高级的应用程序设计和开发。 对于初学者,他们需要理解Java语言、Android SDK和Eclipse等软件的基础知识。一旦他们掌握了这些基础,他们可以开始学习Android的核心概念,如Android Activity、Intent、Broadcast Receiver和ContentProvider等。并能够使用Android Studio等集成开发环境进行开发。 同时,教程应该涵盖许多实践项目,以便学生可以根据自己的兴趣和需求进行实践开发。诸如计算器应用程序、图库应用程序、音乐播放器等应用程序都是很好的练习项目。 此外,诸如在应用程序中使用数据库、网络通信、地理位置服务和多媒体等方面的高级话题也应该得到关注。这些话题可以使学生了解如何在应用程序中实现复杂和高级的功能。 总之,Android开发教程应该是全面的,涵盖从基础知识到高级主题的广泛知识,并且应该具有良好的练习资源来帮助学生实践这些技能。 ### 回答3: Android开发教程是指为学习者提供Android开发基础知识以及实践经验的教程,包括各种专业的编程语言、开发工具、框架、平台以及和软件设计相关的概念等等。它是帮助初学者快速掌握Android开发技术的一个非常有用的资源。 Android开发教程从不同的技术水平和软件开发经验出发,针对不同的开发人员提供了丰富多样的学习方式和途径。一些教程特意为Android开发初学者准备,这些教程通常包含基本的概念、语法、应用程序开发、调试、运行等等。此外,还有一些高级教程,适用于那些已经有一些Android开发经验的开发人员。 在学习Android开发教程时,我们必须了解Android应用程序分为四个核心节点:Android SDK、Android的Java API、Android图形用户界面元素和Android模拟器。此外,学习者还要熟悉一些常用的开发工具,例如:IDE工具(如Android Studio或Eclipse),版本控制工具(如GitHub),性能分析工具(例如Traceview,Hierarchy Viewer等) 总之,Android开发教程是一个极其重要的学习资源,对于想要学习Android开发的人来说,它是必不可少的。通过不断学习,我们可以掌握越来越深入的知识,实现自己的创意和理想。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值