Android adb指令实现应用双开功能
最终实现界面
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指令实现应用双开功能相关推荐
- Android 常用adb指令记录总结
Android 日常开发adb指令记录(不断更新): 注:这里包名均使用com.redsun.phone代替. 一.java -version: 查看java安装版本 二.adb shell: 查看 ...
- android仿卷皮框架,Android刷机常用adb指令集合
Android刷机最常用到的就是adb命令,不过adb命令也跟程序员敲代码一样分为很多种,不同的指令执行之后会起到不同的效果.刷机常用的adb指令有哪些相信同学们也多少能猜到一点点皮毛了,小编今天就为 ...
- Android adb使用总结记录
文章转自:https://github.com/mzlogin/awesome-adb 博主做了格式化以及持续补充,作为自己的一个索引使用. 文章目录 1. 基本用法 1.1 命令语法 1.2 为命令 ...
- 【转官方】Android ADB调试命令、支持的命令、ADB文档
ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具. 持续更新中,欢迎提 PR 和 Issue 补充指 ...
- Android系统源码目录及功能介绍
Android的移植按如下流程: 1.android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来. 2.正确挂载文件系统,确保内核启动参数和 android 源代码 ...
- 一步步教你如何简单自定义 ADB 指令
adb 指令相信大家都用得不少,但是自定义 adb 指令不知道大家又试过没有?最近公司有一个需求,需要自定义 adb 指令来对手机硬件进行测试,这篇博客我们就来一起聊一聊我的实现方法,希望能帮助到有相 ...
- Android手机指令操作释疑
有人问我一个关于Android手机root与否的问题,她说明明iTools显示已取得root权限,但她就是没法在该手机上运行需要root权限的App如钛备份等等.我告诉她最好的确认方式便是以adb指令 ...
- Android adb logcat使用技巧
前言 新买的笔记本E431装了最新版的Eclipse,搞定了Android开发环境,可是logcat里查看东西居然仅仅显示level,没有错误的具体信息.我本身也不是一个愿意折腾图形界面,更喜欢纯命令 ...
- Android Adb 源码分析
扭起屁股得意洋洋 最近,我负责的项目因为临近量产,把之前的userdebug版本关闭,转成了user版本,增加selinux的权限,大家都洋溢在项目准备量产的兴奋和喜悦之中不能自拔 谁知,好景不长,u ...
最新文章
- 《从零开始学Swift》学习笔记(Day5)——我所知道的标识符和关键字
- Webpack 核心开发者 Sean Larkin 盛赞 Vue
- 跟我一起写udev规则
- PAT甲级1126 Eulerian Path:[C++题解] 欧拉路径、并查集,测试点4有问题请进来
- 怎么计算python程序执行时间_【华为云技术分享】计算python程序执行时间
- 安装hadoop2.6.0伪分布式环境
- leetcode - 1143. 最长公共子序列
- Java System.arraycopy()方法示例
- Luogu2279[HNOI2003] 消防局的设立
- 华为2019网络挑战赛初赛网络方向部分模拟题及答案
- 通过 BT 种子 Hash 值从 BitComet 服务器上下载种子文件
- Xshell复制粘贴快捷键设置
- ArcGIS中输出指定比例尺图片
- 微信小程序整合Vant Weapp 步骤
- TCP/IP、 IXP/SPX、 NetBEUI、 AppleTalk协议
- 个人网络信息安全管理方法
- 设计模式第10式:状态模式
- python怎么做游戏主播_做一个游戏主播需要什么条件?详细点。
- Spark学习笔记 --- Spark Streaming 与 Stom 比较
- Python安装包报错ERROR: Could not find a version that satisfies the requirement XXX解决方法
热门文章
- 数字密码锁(数字逻辑大作业)
- 除了四大“门派”菌,一文了解肠道菌群的其它17个小众“门派”细菌
- sysbench 压测 安装
- Basic Level 1035 插入与归并 (25分)
- 【原创】常用元器件(电阻)选型之阻值有多少-cayden20220910
- bit.ly短网址API
- 我不服!这开源项目居然才888个星!?
- python实验收获与反思 100字_语文考试反思总结100字7篇
- [Mugeda HTML5技术教程之2] Mugeda HTML5富媒体平台简介
- Excel文件转换为txt文本第一次更新