最终实现界面

adb实现步骤

//新建user0 的profile工作区
adb shell pm create-user --profileOf 0  --managed test
//查看新建user id = 12
lito:/ # pm list users
Users:UserInfo{0:机主:c13} runningUserInfo{12:test:1020}//启动user 12
am start-user 12
lito:/ # am start-user 12
Success: user started
lito:/ # pm list users
Users:UserInfo{0:机主:c13} runningUserInfo{12:test:1030} running
lito:/ #

清除launcher3数据

adb shell pm clear com.android.launcher3

开机后Profiles工作区启动流程

ActivityManagerService.java finishBooting() 中调用mUserController.scheduleStartProfiles(); 来启动profiles工作区。
下面是finishBooting的调用栈。

01-02 07:44:11.053 W/System.err( 1027): java.lang.Exception: startProfile
01-02 07:44:11.053 W/System.err( 1027):     at com.android.server.am.ActivityManagerService.finishBooting(ActivityManagerService.java:5650)
01-02 07:44:11.053 W/System.err( 1027):     at com.android.server.am.ActivityManagerService.bootAnimationComplete(ActivityManagerService.java:5697)
01-02 07:44:11.053 W/System.err( 1027):     at com.android.server.wm.WindowManagerService.performEnableScreen(WindowManagerService.java:3492)
01-02 07:44:11.053 W/System.err( 1027):     at com.android.server.wm.WindowManagerService.access$1100(WindowManagerService.java:318)
01-02 07:44:11.053 W/System.err( 1027):     at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:4936)
01-02 07:44:11.053 W/System.err( 1027):     at android.os.Handler.dispatchMessage(Handler.java:106)
01-02 07:44:11.054 W/System.err( 1027):     at android.os.Looper.loop(Looper.java:223)
01-02 07:44:11.054 W/System.err( 1027):     at android.os.HandlerThread.run(HandlerThread.java:67)

具体的start user在UserController.java 中

    void scheduleStartProfiles() {// Parent user transition to RUNNING_UNLOCKING happens on FgThread, so it is busy, there is// a chance the profile will reach RUNNING_LOCKED while parent is still locked, so no// attempt will be made to unlock the profile. If we go via FgThread, this will be executed// after the parent had chance to unlock fully.FgThread.getHandler().post(() -> {if (!mHandler.hasMessages(START_PROFILES_MSG)) {mHandler.sendMessageDelayed(mHandler.obtainMessage(START_PROFILES_MSG),DateUtils.SECOND_IN_MILLIS);}});}void startProfiles() {int currentUserId = getCurrentUserId();if (DEBUG_MU) Slog.i(TAG, "startProfilesLocked");List<UserInfo> profiles = mInjector.getUserManager().getProfiles(currentUserId, false /* enabledOnly */);List<UserInfo> profilesToStart = new ArrayList<>(profiles.size());for (UserInfo user : profiles) {if ((user.flags & UserInfo.FLAG_INITIALIZED) == UserInfo.FLAG_INITIALIZED&& user.id != currentUserId && !user.isQuietModeEnabled()) {profilesToStart.add(user);}}final int profilesToStartSize = profilesToStart.size();int i = 0;for (; i < profilesToStartSize && i < (getMaxRunningUsers() - 1); ++i) {startUser(profilesToStart.get(i).id, /* foreground= */ false);}if (i < profilesToStartSize) {Slog.w(TAG, "More profiles than MAX_RUNNING_USERS");}}boolean startUser(final @UserIdInt int userId,final boolean foreground,@Nullable IProgressListener unlockListener) {checkCallingPermission(INTERACT_ACROSS_USERS_FULL, "startUser");TimingsTraceAndSlog t = new TimingsTraceAndSlog();t.traceBegin("startUser-" + userId + "-" + (foreground ? "fg" : "bg"));try {return startUserInternal(userId, foreground, unlockListener, t);} finally {t.traceEnd();}}

Android adb指令实现应用双开功能相关推荐

  1. Android 常用adb指令记录总结

    Android 日常开发adb指令记录(不断更新): 注:这里包名均使用com.redsun.phone代替. 一.java -version: 查看java安装版本 二.adb  shell: 查看 ...

  2. android仿卷皮框架,Android刷机常用adb指令集合

    Android刷机最常用到的就是adb命令,不过adb命令也跟程序员敲代码一样分为很多种,不同的指令执行之后会起到不同的效果.刷机常用的adb指令有哪些相信同学们也多少能猜到一点点皮毛了,小编今天就为 ...

  3. Android adb使用总结记录

    文章转自:https://github.com/mzlogin/awesome-adb 博主做了格式化以及持续补充,作为自己的一个索引使用. 文章目录 1. 基本用法 1.1 命令语法 1.2 为命令 ...

  4. 【转官方】Android ADB调试命令、支持的命令、ADB文档

    ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具. 持续更新中,欢迎提 PR 和 Issue 补充指 ...

  5. Android系统源码目录及功能介绍

    Android的移植按如下流程:     1.android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     2.正确挂载文件系统,确保内核启动参数和 android 源代码 ...

  6. 一步步教你如何简单自定义 ADB 指令

    adb 指令相信大家都用得不少,但是自定义 adb 指令不知道大家又试过没有?最近公司有一个需求,需要自定义 adb 指令来对手机硬件进行测试,这篇博客我们就来一起聊一聊我的实现方法,希望能帮助到有相 ...

  7. Android手机指令操作释疑

    有人问我一个关于Android手机root与否的问题,她说明明iTools显示已取得root权限,但她就是没法在该手机上运行需要root权限的App如钛备份等等.我告诉她最好的确认方式便是以adb指令 ...

  8. Android adb logcat使用技巧

    前言 新买的笔记本E431装了最新版的Eclipse,搞定了Android开发环境,可是logcat里查看东西居然仅仅显示level,没有错误的具体信息.我本身也不是一个愿意折腾图形界面,更喜欢纯命令 ...

  9. Android Adb 源码分析

    扭起屁股得意洋洋 最近,我负责的项目因为临近量产,把之前的userdebug版本关闭,转成了user版本,增加selinux的权限,大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔 谁知,好景不长,u ...

最新文章

  1. 《从零开始学Swift》学习笔记(Day5)——我所知道的标识符和关键字
  2. Webpack 核心开发者 Sean Larkin 盛赞 Vue
  3. 跟我一起写udev规则
  4. PAT甲级1126 Eulerian Path:[C++题解] 欧拉路径、并查集,测试点4有问题请进来
  5. 怎么计算python程序执行时间_【华为云技术分享】计算python程序执行时间
  6. 安装hadoop2.6.0伪分布式环境
  7. leetcode - 1143. 最长公共子序列
  8. Java System.arraycopy()方法示例
  9. Luogu2279[HNOI2003] 消防局的设立
  10. 华为2019网络挑战赛初赛网络方向部分模拟题及答案
  11. 通过 BT 种子 Hash 值从 BitComet 服务器上下载种子文件
  12. Xshell复制粘贴快捷键设置
  13. ArcGIS中输出指定比例尺图片
  14. 微信小程序整合Vant Weapp 步骤
  15. TCP/IP、 IXP/SPX、 NetBEUI、 AppleTalk协议
  16. 个人网络信息安全管理方法
  17. 设计模式第10式:状态模式
  18. python怎么做游戏主播_做一个游戏主播需要什么条件?详细点。
  19. Spark学习笔记 --- Spark Streaming 与 Stom 比较
  20. Python安装包报错ERROR: Could not find a version that satisfies the requirement XXX解决方法

热门文章

  1. 数字密码锁(数字逻辑大作业)
  2. 除了四大“门派”菌,一文了解肠道菌群的其它17个小众“门派”细菌
  3. sysbench 压测 安装
  4. Basic Level 1035 插入与归并 (25分)
  5. 【原创】常用元器件(电阻)选型之阻值有多少-cayden20220910
  6. bit.ly短网址API
  7. 我不服!这开源项目居然才888个星!?
  8. python实验收获与反思 100字_语文考试反思总结100字7篇
  9. [Mugeda HTML5技术教程之2] Mugeda HTML5富媒体平台简介
  10. Excel文件转换为txt文本第一次更新